mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Handle logins using accounts
This commit is contained in:
parent
324a85a2a5
commit
ce6f227651
@ -24,6 +24,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
|
#include "accounts.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "prof_autocomplete.h"
|
#include "prof_autocomplete.h"
|
||||||
@ -108,6 +110,54 @@ accounts_get_list(void)
|
|||||||
return g_key_file_get_groups(accounts, NULL);
|
return g_key_file_get_groups(accounts, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProfAccount*
|
||||||
|
accounts_get_account(const char * const name)
|
||||||
|
{
|
||||||
|
if (!g_key_file_has_group(accounts, name)) {
|
||||||
|
return NULL;
|
||||||
|
} else {
|
||||||
|
ProfAccount *account = malloc(sizeof(ProfAccount));
|
||||||
|
account->name = strdup(name);
|
||||||
|
gchar *jid = g_key_file_get_string(accounts, name, "jid", NULL);
|
||||||
|
if (jid != NULL) {
|
||||||
|
account->jid = strdup(jid);
|
||||||
|
} else {
|
||||||
|
account->jid = strdup(name);
|
||||||
|
g_key_file_set_string(accounts, name, "jid", name);
|
||||||
|
_save_accounts();
|
||||||
|
}
|
||||||
|
account->enabled = g_key_file_get_boolean(accounts, name, "enabled", NULL);
|
||||||
|
gchar *server = g_key_file_get_string(accounts, name, "server", NULL);
|
||||||
|
if (server != NULL) {
|
||||||
|
account->server = strdup(server);
|
||||||
|
} else {
|
||||||
|
account->server = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return account;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
accounts_free_account(ProfAccount *account)
|
||||||
|
{
|
||||||
|
if (account != NULL) {
|
||||||
|
if (account->name != NULL) {
|
||||||
|
free(account->name);
|
||||||
|
account->name = NULL;
|
||||||
|
}
|
||||||
|
if (account->jid != NULL) {
|
||||||
|
free(account->jid);
|
||||||
|
account->jid = NULL;
|
||||||
|
}
|
||||||
|
if (account->server != NULL) {
|
||||||
|
free(account->server);
|
||||||
|
account->server = NULL;
|
||||||
|
}
|
||||||
|
account = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_save_accounts(void)
|
_save_accounts(void)
|
||||||
{
|
{
|
||||||
|
@ -23,6 +23,13 @@
|
|||||||
#ifndef ACCOUNTS_H
|
#ifndef ACCOUNTS_H
|
||||||
#define ACCOUNTS_H
|
#define ACCOUNTS_H
|
||||||
|
|
||||||
|
typedef struct prof_account_t {
|
||||||
|
gchar *name;
|
||||||
|
gchar *jid;
|
||||||
|
gchar *server;
|
||||||
|
gboolean enabled;
|
||||||
|
} ProfAccount;
|
||||||
|
|
||||||
void accounts_load(void);
|
void accounts_load(void);
|
||||||
void accounts_close(void);
|
void accounts_close(void);
|
||||||
|
|
||||||
@ -30,5 +37,7 @@ char * accounts_find_login(char *prefix);
|
|||||||
void accounts_reset_login_search(void);
|
void accounts_reset_login_search(void);
|
||||||
void accounts_add_login(const char *jid, const char *altdomain);
|
void accounts_add_login(const char *jid, const char *altdomain);
|
||||||
gchar** accounts_get_list(void);
|
gchar** accounts_get_list(void);
|
||||||
|
ProfAccount* accounts_get_account(const char * const name);
|
||||||
|
void accounts_free_account(ProfAccount *account);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -910,6 +910,7 @@ _cmd_connect(gchar **args, struct cmd_help_t help)
|
|||||||
char *user = args[0];
|
char *user = args[0];
|
||||||
char *altdomain = args[1];
|
char *altdomain = args[1];
|
||||||
char *lower = g_utf8_strdown(user, -1);
|
char *lower = g_utf8_strdown(user, -1);
|
||||||
|
char *jid;
|
||||||
|
|
||||||
status_bar_get_password();
|
status_bar_get_password();
|
||||||
status_bar_refresh();
|
status_bar_refresh();
|
||||||
@ -918,18 +919,29 @@ _cmd_connect(gchar **args, struct cmd_help_t help)
|
|||||||
inp_get_password(passwd);
|
inp_get_password(passwd);
|
||||||
inp_non_block();
|
inp_non_block();
|
||||||
|
|
||||||
log_debug("Connecting as %s", lower);
|
ProfAccount *account = accounts_get_account(lower);
|
||||||
|
if (account != NULL) {
|
||||||
|
jid = strdup(account->jid);
|
||||||
|
log_debug("Connecting as %s", jid);
|
||||||
|
conn_status = jabber_connect_with_account(account, passwd);
|
||||||
|
} else {
|
||||||
|
jid = strdup(lower);
|
||||||
|
log_debug("Connecting as %s", jid);
|
||||||
|
conn_status = jabber_connect(jid, passwd, altdomain);
|
||||||
|
}
|
||||||
|
|
||||||
conn_status = jabber_connect(lower, passwd, altdomain);
|
|
||||||
if (conn_status == JABBER_CONNECTING) {
|
if (conn_status == JABBER_CONNECTING) {
|
||||||
cons_show("Connecting...");
|
cons_show("Connecting...");
|
||||||
log_debug("Connecting...");
|
log_debug("Connecting...");
|
||||||
}
|
}
|
||||||
if (conn_status == JABBER_DISCONNECTED) {
|
if (conn_status == JABBER_DISCONNECTED) {
|
||||||
cons_bad_show("Connection to server failed.");
|
cons_bad_show("Connection to server failed.");
|
||||||
log_debug("Connection using %s failed", lower);
|
log_debug("Connection for %s failed", jid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
accounts_free_account(account);
|
||||||
|
free(jid);
|
||||||
|
|
||||||
result = TRUE;
|
result = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
46
src/jabber.c
46
src/jabber.c
@ -47,6 +47,7 @@ static struct _jabber_conn_t {
|
|||||||
} jabber_conn;
|
} jabber_conn;
|
||||||
|
|
||||||
// for auto reconnect
|
// for auto reconnect
|
||||||
|
static char *saved_account;
|
||||||
static char *saved_user;
|
static char *saved_user;
|
||||||
static char *saved_password;
|
static char *saved_password;
|
||||||
static char *saved_altdomain;
|
static char *saved_altdomain;
|
||||||
@ -102,6 +103,46 @@ jabber_restart(void)
|
|||||||
jabber_conn.status = NULL;
|
jabber_conn.status = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jabber_conn_status_t
|
||||||
|
jabber_connect_with_account(ProfAccount *account, const char * const passwd)
|
||||||
|
{
|
||||||
|
saved_account = strdup(account->name);
|
||||||
|
if (saved_user == NULL) {
|
||||||
|
saved_user = strdup(account->jid);
|
||||||
|
}
|
||||||
|
if (saved_password == NULL) {
|
||||||
|
saved_password = strdup(passwd);
|
||||||
|
}
|
||||||
|
if (saved_altdomain == NULL) {
|
||||||
|
if (account->server != NULL) {
|
||||||
|
saved_altdomain = strdup(account->server);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("Connecting with account:%s, jid: %s", account->name, account->jid);
|
||||||
|
xmpp_initialize();
|
||||||
|
|
||||||
|
jabber_conn.log = _xmpp_get_file_logger();
|
||||||
|
jabber_conn.ctx = xmpp_ctx_new(NULL, jabber_conn.log);
|
||||||
|
jabber_conn.conn = xmpp_conn_new(jabber_conn.ctx);
|
||||||
|
|
||||||
|
xmpp_conn_set_jid(jabber_conn.conn, account->jid);
|
||||||
|
xmpp_conn_set_pass(jabber_conn.conn, passwd);
|
||||||
|
|
||||||
|
if (jabber_conn.tls_disabled)
|
||||||
|
xmpp_conn_disable_tls(jabber_conn.conn);
|
||||||
|
|
||||||
|
int connect_status = xmpp_connect_client(jabber_conn.conn, account->server, 0,
|
||||||
|
_connection_handler, jabber_conn.ctx);
|
||||||
|
|
||||||
|
if (connect_status == 0)
|
||||||
|
jabber_conn.conn_status = JABBER_CONNECTING;
|
||||||
|
else
|
||||||
|
jabber_conn.conn_status = JABBER_DISCONNECTED;
|
||||||
|
|
||||||
|
return jabber_conn.conn_status;
|
||||||
|
}
|
||||||
|
|
||||||
jabber_conn_status_t
|
jabber_conn_status_t
|
||||||
jabber_connect(const char * const user,
|
jabber_connect(const char * const user,
|
||||||
const char * const passwd, const char * const altdomain)
|
const char * const passwd, const char * const altdomain)
|
||||||
@ -697,8 +738,13 @@ _connection_handler(xmpp_conn_t * const conn,
|
|||||||
|
|
||||||
// login success
|
// login success
|
||||||
if (status == XMPP_CONN_CONNECT) {
|
if (status == XMPP_CONN_CONNECT) {
|
||||||
|
if (saved_account != NULL) {
|
||||||
|
prof_handle_login_account_success(saved_account);
|
||||||
|
} else {
|
||||||
const char *jid = xmpp_conn_get_jid(conn);
|
const char *jid = xmpp_conn_get_jid(conn);
|
||||||
prof_handle_login_success(jid, saved_altdomain);
|
prof_handle_login_success(jid, saved_altdomain);
|
||||||
|
}
|
||||||
|
|
||||||
chat_sessions_init();
|
chat_sessions_init();
|
||||||
|
|
||||||
xmpp_handler_add(conn, _message_handler, NULL, STANZA_NAME_MESSAGE, NULL, ctx);
|
xmpp_handler_add(conn, _message_handler, NULL, STANZA_NAME_MESSAGE, NULL, ctx);
|
||||||
|
@ -23,6 +23,8 @@
|
|||||||
#ifndef JABBER_H
|
#ifndef JABBER_H
|
||||||
#define JABBER_H
|
#define JABBER_H
|
||||||
|
|
||||||
|
#include "accounts.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
JABBER_STARTED,
|
JABBER_STARTED,
|
||||||
JABBER_CONNECTING,
|
JABBER_CONNECTING,
|
||||||
@ -49,6 +51,8 @@ typedef enum {
|
|||||||
void jabber_init(const int disable_tls);
|
void jabber_init(const int disable_tls);
|
||||||
jabber_conn_status_t jabber_connect(const char * const user,
|
jabber_conn_status_t jabber_connect(const char * const user,
|
||||||
const char * const passwd, const char * const altdomain);
|
const char * const passwd, const char * const altdomain);
|
||||||
|
jabber_conn_status_t jabber_connect_with_account(ProfAccount *account,
|
||||||
|
const char * const passwd);
|
||||||
void jabber_disconnect(void);
|
void jabber_disconnect(void);
|
||||||
void jabber_process_events(void);
|
void jabber_process_events(void);
|
||||||
void jabber_join(const char * const room, const char * const nick);
|
void jabber_join(const char * const room, const char * const nick);
|
||||||
|
@ -189,6 +189,22 @@ prof_handle_subscription(const char *from, jabber_subscr_t type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
prof_handle_login_account_success(char *account_name)
|
||||||
|
{
|
||||||
|
ProfAccount *account = accounts_get_account(account_name);
|
||||||
|
|
||||||
|
const char *msg = "logged in successfully.";
|
||||||
|
cons_show("%s %s", account->jid, msg);
|
||||||
|
title_bar_set_status(PRESENCE_ONLINE);
|
||||||
|
log_info("%s %s", account->jid, msg);
|
||||||
|
win_current_page_off();
|
||||||
|
status_bar_print_message(account->jid);
|
||||||
|
status_bar_refresh();
|
||||||
|
|
||||||
|
accounts_free_account(account);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
prof_handle_login_success(const char *jid, const char *altdomain)
|
prof_handle_login_success(const char *jid, const char *altdomain)
|
||||||
{
|
{
|
||||||
@ -199,6 +215,7 @@ prof_handle_login_success(const char *jid, const char *altdomain)
|
|||||||
win_current_page_off();
|
win_current_page_off();
|
||||||
status_bar_print_message(jid);
|
status_bar_print_message(jid);
|
||||||
status_bar_refresh();
|
status_bar_refresh();
|
||||||
|
|
||||||
accounts_add_login(jid, altdomain);
|
accounts_add_login(jid, altdomain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
void prof_run(const int disable_tls, char *log_level);
|
void prof_run(const int disable_tls, char *log_level);
|
||||||
|
|
||||||
void prof_handle_login_success(const char *jid, const char *altdomain);
|
void prof_handle_login_success(const char *jid, const char *altdomain);
|
||||||
|
void prof_handle_login_account_success(char *account_name);
|
||||||
void prof_handle_lost_connection(void);
|
void prof_handle_lost_connection(void);
|
||||||
void prof_handle_disconnect(const char * const jid);
|
void prof_handle_disconnect(const char * const jid);
|
||||||
void prof_handle_failed_login(void);
|
void prof_handle_failed_login(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user