diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/command/command.c | 31 | ||||
-rw-r--r-- | src/config/accounts.c | 12 | ||||
-rw-r--r-- | src/config/accounts.h | 1 | ||||
-rw-r--r-- | src/ui/console.c | 3 | ||||
-rw-r--r-- | src/xmpp/connection.c | 9 | ||||
-rw-r--r-- | src/xmpp/xmpp.h | 3 |
6 files changed, 44 insertions, 15 deletions
diff --git a/src/command/command.c b/src/command/command.c index e8232405..35bcd4f7 100644 --- a/src/command/command.c +++ b/src/command/command.c @@ -20,6 +20,7 @@ * */ +#include <assert.h> #include <errno.h> #include <limits.h> #include <stdlib.h> @@ -68,6 +69,7 @@ typedef struct cmd_t { typedef char*(*autocompleter)(char*, int*); +static char * _ask_password(void); static void _update_presence(const resource_presence_t presence, const char * const show, gchar **args); static gboolean _cmd_set_boolean_preference(gchar *arg, struct cmd_help_t help, @@ -1347,13 +1349,6 @@ _cmd_connect(gchar **args, struct cmd_help_t help) char *lower = g_utf8_strdown(user, -1); char *jid; - status_bar_get_password(); - status_bar_refresh(); - char passwd[21]; - inp_block(); - inp_get_password(passwd); - inp_non_block(); - ProfAccount *account = accounts_get_account(lower); if (account != NULL) { if (account->resource != NULL) { @@ -1361,12 +1356,18 @@ _cmd_connect(gchar **args, struct cmd_help_t help) } else { jid = strdup(account->jid); } + + if (account->password == NULL) { + account->password = _ask_password(); + } cons_show("Connecting with account %s as %s", account->name, jid); - conn_status = jabber_connect_with_account(account, passwd); + conn_status = jabber_connect_with_account(account); } else { + char *passwd = _ask_password(); jid = strdup(lower); cons_show("Connecting as %s", jid); conn_status = jabber_connect_with_details(jid, passwd, altdomain); + free(passwd); } g_free(lower); @@ -3525,6 +3526,20 @@ _cmd_xa(gchar **args, struct cmd_help_t help) return TRUE; } +// helper function that asks the user for a password and saves it in passwd + +static char * +_ask_password(void) { + char *passwd = malloc(sizeof(char) * 21); + status_bar_get_password(); + status_bar_refresh(); + inp_block(); + inp_get_password(passwd); + inp_non_block(); + + return passwd; +} + // helper function for status change commands static void diff --git a/src/config/accounts.c b/src/config/accounts.c index 4eb4b8e3..3150686b 100644 --- a/src/config/accounts.c +++ b/src/config/accounts.c @@ -39,10 +39,12 @@ static GKeyFile *accounts; static Autocomplete all_ac; static Autocomplete enabled_ac; +// used to rename account (copies properties to new account) static gchar *string_keys[] = { "jid", "server", "resource", + "password", "presence.last", "presence.login", "muc.service", @@ -191,6 +193,14 @@ accounts_get_account(const char * const name) _save_accounts(); } + gchar *password = g_key_file_get_string(accounts, name, "password", NULL); + if (password != NULL) { + account->password = strdup(password); + g_free(password); + } else { + account->password = NULL; + } + account->enabled = g_key_file_get_boolean(accounts, name, "enabled", NULL); gchar *server = g_key_file_get_string(accounts, name, "server", NULL); @@ -288,6 +298,7 @@ accounts_free_account(ProfAccount *account) if (account != NULL) { free(account->name); free(account->jid); + free(account->password); free(account->resource); free(account->server); free(account->last_presence); @@ -349,6 +360,7 @@ accounts_rename(const char * const account_name, const char * const new_name) g_key_file_set_integer(accounts, new_name, "priority.dnd", g_key_file_get_boolean(accounts, account_name, "priority.dnd", NULL)); + // copy other string properties int i; for (i = 0; i < ARRAY_SIZE(string_keys); i++) { char *value = g_key_file_get_string(accounts, account_name, string_keys[i], NULL); diff --git a/src/config/accounts.h b/src/config/accounts.h index 4c74a523..ba282eac 100644 --- a/src/config/accounts.h +++ b/src/config/accounts.h @@ -28,6 +28,7 @@ typedef struct prof_account_t { gchar *name; gchar *jid; + gchar *password; gchar *resource; gchar *server; gchar *last_presence; diff --git a/src/ui/console.c b/src/ui/console.c index 732fc53b..1de7cf51 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -793,6 +793,9 @@ cons_show_account(ProfAccount *account) cons_show ("enabled : FALSE"); } cons_show ("jid : %s", account->jid); + if (account->password != NULL) { + cons_show ("password : [redacted]"); + } if (account->resource != NULL) { cons_show ("resource : %s", account->resource); } diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c index 40a1ea05..a1cb31c4 100644 --- a/src/xmpp/connection.c +++ b/src/xmpp/connection.c @@ -109,21 +109,20 @@ jabber_init(const int disable_tls) } jabber_conn_status_t -jabber_connect_with_account(const ProfAccount * const account, - const char * const passwd) +jabber_connect_with_account(const ProfAccount * const account) { assert(account != NULL); - assert(passwd != NULL); log_info("Connecting using account: %s", account->name); // save account name and password for reconnect saved_account.name = strdup(account->name); - saved_account.passwd = strdup(passwd); + saved_account.passwd = strdup(account->password); // connect with fulljid Jid *jidp = jid_create_from_bare_and_resource(account->jid, account->resource); - jabber_conn_status_t result = _jabber_connect(jidp->fulljid, passwd, account->server); + jabber_conn_status_t result = + _jabber_connect(jidp->fulljid, account->password, account->server); jid_destroy(jidp); return result; diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 61f07e5e..407fe0e2 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -78,8 +78,7 @@ typedef struct disco_identity_t { void jabber_init(const int disable_tls); jabber_conn_status_t jabber_connect_with_details(const char * const jid, const char * const passwd, const char * const altdomain); -jabber_conn_status_t jabber_connect_with_account(const ProfAccount * const account, - const char * const passwd); +jabber_conn_status_t jabber_connect_with_account(const ProfAccount * const account); void jabber_disconnect(void); void jabber_shutdown(void); void jabber_process_events(void); |