1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Merge branch 'master' into pgp

Conflicts:
	src/config/account.h
This commit is contained in:
James Booth 2015-04-23 23:48:43 +01:00
commit 7a44e17141
5 changed files with 79 additions and 60 deletions

View File

@ -206,17 +206,42 @@ cmd_connect(gchar **args, struct cmd_help_t help)
char *jid; char *jid;
g_free(def); g_free(def);
// connect with account
ProfAccount *account = accounts_get_account(lower); ProfAccount *account = accounts_get_account(lower);
if (account) { if (account) {
jid = account_create_full_jid(account); // use password if set
gboolean res = client_connect_account(account, &conn_status); if (account->password) {
if (!res) { conn_status = client_connect_account(account);
g_free(lower);
return TRUE; // use eval_password if set
} else if (account->eval_password) {
gboolean res = account_eval_password(account);
if (res) {
conn_status = client_connect_account(account);
free(account->password);
account->password = NULL;
} else {
cons_show("Error evaluating password, see logs for details.");
g_free(lower);
return TRUE;
}
// no account password setting, prompt
} else {
account->password = ui_ask_password();
conn_status = client_connect_account(account);
free(account->password);
account->password = NULL;
} }
jid = account_create_full_jid(account);
// connect with JID
} else { } else {
jid = strdup(lower); jid = strdup(lower);
conn_status = client_connect_jid(jid, altdomain, port); char *passwd = ui_ask_password();
conn_status = client_connect_jid(jid, passwd, altdomain, port);
free(passwd);
} }
if (conn_status == JABBER_DISCONNECTED) { if (conn_status == JABBER_DISCONNECTED) {

View File

@ -34,12 +34,14 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <assert.h>
#include <glib.h> #include <glib.h>
#include "jid.h" #include "jid.h"
#include "config/account.h" #include "config/account.h"
#include "common.h" #include "common.h"
#include "log.h"
ProfAccount* ProfAccount*
account_new(const gchar * const name, const gchar * const jid, account_new(const gchar * const name, const gchar * const jid,
@ -161,6 +163,44 @@ account_create_full_jid(ProfAccount *account)
} }
} }
gboolean
account_eval_password(ProfAccount *account)
{
assert(account != NULL);
assert(account->eval_password != NULL);
// Evaluate as shell command to retrieve password
GString *cmd = g_string_new("");
g_string_append_printf(cmd, "%s 2>/dev/null", account->eval_password);
FILE *stream = popen(cmd->str, "r");
g_string_free(cmd, TRUE);
if (stream) {
// Limit to READ_BUF_SIZE bytes to prevent overflows in the case of a poorly chosen command
account->password = g_malloc(READ_BUF_SIZE);
if (!account->password) {
log_error("Failed to allocate enough memory to read eval_password output");
return FALSE;
}
account->password = fgets(account->password, READ_BUF_SIZE, stream);
pclose(stream);
if (!account->password) {
log_error("No result from eval_password.");
return FALSE;
}
// strip trailing newline
if (g_str_has_suffix(account->password, "\n")) {
account->password[strlen(account->password)-1] = '\0';
}
} else {
log_error("popen failed when running eval_password.");
return FALSE;
}
return TRUE;
}
void void
account_free(ProfAccount *account) account_free(ProfAccount *account)
{ {

View File

@ -70,9 +70,8 @@ ProfAccount* account_new(const gchar * const name, const gchar * const jid,
const gchar * const muc_service, const gchar * const muc_nick, const gchar * const muc_service, const gchar * const muc_nick,
const gchar * const otr_policy, GList *otr_manual, GList *otr_opportunistic, const gchar * const otr_policy, GList *otr_manual, GList *otr_opportunistic,
GList *otr_always, const gchar * const pgp_keyid); GList *otr_always, const gchar * const pgp_keyid);
char* account_create_full_jid(ProfAccount *account); char* account_create_full_jid(ProfAccount *account);
gboolean account_eval_password(ProfAccount *account);
void account_free(ProfAccount *account); void account_free(ProfAccount *account);
#endif #endif

View File

@ -43,65 +43,20 @@
#endif #endif
jabber_conn_status_t jabber_conn_status_t
client_connect_jid(const char * const jid, const char * const altdomain, const int port) client_connect_jid(const char * const jid, const char * const passwd, const char * const altdomain, const int port)
{ {
cons_show("Connecting as %s", jid); cons_show("Connecting as %s", jid);
char *passwd = ui_ask_password(); return jabber_connect_with_details(jid, passwd, altdomain, port);
jabber_conn_status_t conn_status = jabber_connect_with_details(jid, passwd, altdomain, port);
free(passwd);
return conn_status;
} }
gboolean jabber_conn_status_t
client_connect_account(ProfAccount *account, jabber_conn_status_t *conn_status) client_connect_account(ProfAccount *account)
{ {
if (account->eval_password) {
// Evaluate as shell command to retrieve password
GString *cmd = g_string_new("");
g_string_append_printf(cmd, "%s 2>/dev/null", account->eval_password);
FILE *stream = popen(cmd->str, "r");
g_string_free(cmd, TRUE);
if (stream) {
// Limit to READ_BUF_SIZE bytes to prevent overflows in the case of a poorly chosen command
account->password = g_malloc(READ_BUF_SIZE);
if (!account->password) {
log_error("Failed to allocate enough memory to read eval_password output");
cons_show("Error evaluating password, see logs for details.");
return FALSE;
}
account->password = fgets(account->password, READ_BUF_SIZE, stream);
pclose(stream);
if (!account->password) {
log_error("No result from eval_password.");
cons_show("Error evaluating password, see logs for details.");
return FALSE;
}
// strip trailing newline
if (g_str_has_suffix(account->password, "\n")) {
account->password[strlen(account->password)-1] = '\0';
}
} else {
log_error("popen failed when running eval_password.");
cons_show("Error evaluating password, see logs for details.");
return FALSE;
}
} else if (!account->password) {
account->password = ui_ask_password();
}
char *jid = account_create_full_jid(account); char *jid = account_create_full_jid(account);
cons_show("Connecting with account %s as %s", account->name, jid); cons_show("Connecting with account %s as %s", account->name, jid);
free(jid); free(jid);
*conn_status = jabber_connect_with_account(account); return jabber_connect_with_account(account);
account_free(account);
return TRUE;
} }
void void

View File

@ -35,8 +35,8 @@
#ifndef CLIENT_EVENTS_H #ifndef CLIENT_EVENTS_H
#define CLIENT_EVENTS_H #define CLIENT_EVENTS_H
jabber_conn_status_t client_connect_jid(const char * const jid, const char * const altdomain, const int port); jabber_conn_status_t client_connect_jid(const char * const jid, const char * const passwd, const char * const altdomain, const int port);
gboolean client_connect_account(ProfAccount *account, jabber_conn_status_t *conn_status); jabber_conn_status_t client_connect_account(ProfAccount *account);
void client_send_msg(const char * const barejid, const char * const msg); void client_send_msg(const char * const barejid, const char * const msg);
void client_send_muc_msg(const char * const roomjid, const char * const msg); void client_send_muc_msg(const char * const roomjid, const char * const msg);