diff options
-rw-r--r-- | account.c | 12 | ||||
-rw-r--r-- | account.h | 2 | ||||
-rw-r--r-- | protocols/jabber/jabber.c | 89 | ||||
-rw-r--r-- | protocols/nogaim.h | 1 | ||||
-rw-r--r-- | protocols/oscar/oscar.c | 15 |
5 files changed, 84 insertions, 35 deletions
@@ -27,8 +27,6 @@ #include "bitlbee.h" #include "account.h" -char *set_eval_account( set_t *set, char *value ); - account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass ) { account_t *a; @@ -50,19 +48,21 @@ account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass ) a->auto_connect = 1; a->irc = irc; - s = set_add( &a->set, "auto_connect", NULL, set_eval_account, a ); + s = set_add( &a->set, "auto_connect", "true", set_eval_account, a ); s->flags |= ACC_SET_NOSAVE; s = set_add( &a->set, "password", NULL, set_eval_account, a ); s->flags |= ACC_SET_NOSAVE; - s = set_add( &a->set, "server", NULL, set_eval_account, a ); - s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; - s = set_add( &a->set, "username", NULL, set_eval_account, a ); s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; set_setstr( &a->set, "username", user ); + /* This function adds some more settings (and might want to do more + things that have to be done now, although I can't think of anything. */ + if( prpl->acc_init ) + prpl->acc_init( a ); + return( a ); } @@ -49,6 +49,8 @@ void account_del( irc_t *irc, account_t *acc ); void account_on( irc_t *irc, account_t *a ); void account_off( irc_t *irc, account_t *a ); +char *set_eval_account( set_t *set, char *value ); + #define ACC_SET_NOSAVE 1 #define ACC_SET_OFFLINE_ONLY 2 diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index c8e8ceca..e7f4534e 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -562,35 +562,17 @@ static void gjab_start(gjconn gjc) { account_t *acc; int port = -1, ssl = 0; - char *server = NULL, *s; + char *server = NULL; if (!gjc || gjc->state != JCONN_STATE_OFF) return; acc = GJ_GC(gjc)->acc; - if (acc->server) { - /* If there's a dot, assume there's a hostname in the beginning */ - if (strchr(acc->server, '.')) { - server = g_strdup(acc->server); - if ((s = strchr(server, ':'))) - *s = 0; - } - - /* After the hostname, there can be a port number */ - s = strchr(acc->server, ':'); - if (s && isdigit(s[1])) - sscanf(s + 1, "%d", &port); - - /* And if there's the string ssl, the user wants an SSL-connection */ - if (strstr(acc->server, ":ssl") || g_strcasecmp(acc->server, "ssl") == 0) - ssl = 1; - } + server = acc->server; + port = set_getint(&acc->set, "port"); + ssl = set_getbool(&acc->set, "ssl"); - if (port == -1 && !ssl) - port = DEFAULT_PORT; - else if (port == -1 && ssl) - port = DEFAULT_PORT_SSL; - else if (port < JABBER_PORT_MIN || port > JABBER_PORT_MAX) { + if (port < JABBER_PORT_MIN || port > JABBER_PORT_MAX) { serv_got_crap(GJ_GC(gjc), "For security reasons, the Jabber port number must be in the %d-%d range.", JABBER_PORT_MIN, JABBER_PORT_MAX); STATE_EVT(JCONN_STATE_OFF) return; @@ -613,8 +595,6 @@ static void gjab_start(gjconn gjc) gjc->fd = proxy_connect(server, port, gjab_connected, GJ_GC(gjc)); } - g_free(server); - if (!acc->gc || (gjc->fd < 0)) { STATE_EVT(JCONN_STATE_OFF) return; @@ -1515,12 +1495,62 @@ static void jabber_handlestate(gjconn gjc, int state) return; } -static void jabber_login(account_t *acc) +static void jabber_acc_init(account_t *acc) { - struct gaim_connection *gc = new_gaim_conn(acc); - struct jabber_data *jd = gc->proto_data = g_new0(struct jabber_data, 1); - char *loginname = create_valid_jid(acc->user, DEFAULT_SERVER, "BitlBee"); + set_t *s; + + s = set_add( &acc->set, "port", "5222", set_eval_int, acc ); + s->flags |= ACC_SET_OFFLINE_ONLY; + + s = set_add( &acc->set, "resource", "BitlBee", NULL, acc ); + s->flags |= ACC_SET_OFFLINE_ONLY; + + s = set_add( &acc->set, "server", NULL, set_eval_account, acc ); + s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; + + s = set_add( &acc->set, "ssl", "false", set_eval_bool, acc ); + s->flags |= ACC_SET_OFFLINE_ONLY; +} +static void jabber_login(account_t *acc) +{ + struct gaim_connection *gc; + struct jabber_data *jd; + char *resource, *loginname; + + /* Time to move some data/things from the old syntax to the new one: */ + if (acc->server) { + char *s, *tmp_server; + int port; + + if (g_strcasecmp(acc->server, "ssl") == 0) { + set_setstr(&acc->set, "server", ""); + set_setint(&acc->set, "port", DEFAULT_PORT_SSL); + set_setstr(&acc->set, "ssl", "true"); + + g_free(acc->server); + acc->server = NULL; + } else if ((s = strchr(acc->server, ':'))) { + if (strstr(acc->server, ":ssl")) { + set_setint(&acc->set, "port", DEFAULT_PORT_SSL); + set_setstr(&acc->set, "ssl", "true"); + } + if (isdigit(s[1])) { + if (sscanf(s + 1, "%d", &port) == 1) + set_setint(&acc->set, "port", port); + } + tmp_server = g_strndup(acc->server, s - acc->server); + set_setstr(&acc->set, "server", tmp_server); + g_free(tmp_server); + } + } + + gc = new_gaim_conn(acc); + jd = gc->proto_data = g_new0(struct jabber_data, 1); + + resource = set_getstr(&acc->set, "resource"); + loginname = create_valid_jid(acc->user, DEFAULT_SERVER, resource); + jd->hash = g_hash_table_new(g_str_hash, g_str_equal); jd->chats = NULL; /* we have no chats yet */ @@ -2336,6 +2366,7 @@ void jabber_init() ret->name = "jabber"; ret->away_states = jabber_away_states; + ret->acc_init = jabber_acc_init; ret->login = jabber_login; ret->close = jabber_close; ret->send_im = jabber_send_im; diff --git a/protocols/nogaim.h b/protocols/nogaim.h index 8c6519c1..c0a867d6 100644 --- a/protocols/nogaim.h +++ b/protocols/nogaim.h @@ -128,6 +128,7 @@ struct prpl { int options; const char *name; + void (* acc_init) (account_t *); void (* login) (account_t *); void (* keepalive) (struct gaim_connection *); void (* close) (struct gaim_connection *); diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index d55ce3f2..28239812 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -355,6 +355,14 @@ static gboolean oscar_login_connect(gpointer data, gint source, b_input_conditio return FALSE; } +static void oscar_acc_init(account_t *acc) +{ + set_t *s; + + s = set_add( &acc->set, "server", NULL, set_eval_account, acc ); + s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; +} + static void oscar_login(account_t *acc) { aim_session_t *sess; aim_conn_t *conn; @@ -389,6 +397,12 @@ static void oscar_login(account_t *acc) { return; } + if (acc->server == NULL) { + hide_login_progress(gc, "No servername specified"); + signoff(gc); + return; + } + if (g_strcasecmp(acc->server, "login.icq.com") != 0 && g_strcasecmp(acc->server, "login.oscar.aol.com") != 0) { serv_got_crap(gc, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",acc->server); @@ -2648,6 +2662,7 @@ void oscar_init() ret->name = "oscar"; ret->away_states = oscar_away_states; ret->login = oscar_login; + ret->acc_init = oscar_acc_init; ret->close = oscar_close; ret->send_im = oscar_send_im; ret->get_info = oscar_get_info; |