From f8ec8903b66fad1355f90316bf46b7ca2be43762 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 15 May 2010 01:20:33 +0100 Subject: Passport 3.0 authentication turns out to be slightly different from what the msnpiki MSNP13 doc says and stuff is breaking now. This should fix the main problem now. --- protocols/msn/passport.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/protocols/msn/passport.c b/protocols/msn/passport.c index 565d15f3..7c896db1 100644 --- a/protocols/msn/passport.c +++ b/protocols/msn/passport.c @@ -144,7 +144,9 @@ static xt_status passport_xt_extract_token( struct xt_node *node, gpointer data struct msn_auth_data *mad = data; char *s; - if( ( s = xt_find_attr( node, "Id" ) ) && strcmp( s, "PPToken1" ) == 0 ) + if( ( s = xt_find_attr( node, "Id" ) ) && + ( strncmp( s, "Compact", 7 ) == 0 || + strncmp( s, "PPToken", 7 ) == 0 ) ) mad->token = g_memdup( node->text, node->text_len + 1 ); return XT_HANDLED; -- cgit v1.2.3 From df1ae6223a5fdb3c18d5438670834285101c6213 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 15 May 2010 12:53:09 +0100 Subject: 1.2.7 changelog. Have to release soon, now that 1.2.6a is mostly broken for MSN Messenger for everyone. --- bitlbee.h | 4 ++-- doc/CHANGES | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/bitlbee.h b/bitlbee.h index f4e03d76..2f4fa6be 100644 --- a/bitlbee.h +++ b/bitlbee.h @@ -34,10 +34,10 @@ #define _WIN32_WINNT 0x0501 #define PACKAGE "BitlBee" -#define BITLBEE_VERSION "1.2.6a" +#define BITLBEE_VERSION "1.2.7" #define VERSION BITLBEE_VERSION #define BITLBEE_VER(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -#define BITLBEE_VERSION_CODE BITLBEE_VER(1, 2, 6) +#define BITLBEE_VERSION_CODE BITLBEE_VER(1, 2, 7) #define MAX_STRING 511 diff --git a/doc/CHANGES b/doc/CHANGES index 45b16e28..7359a050 100644 --- a/doc/CHANGES +++ b/doc/CHANGES @@ -3,6 +3,20 @@ found in the bzr commit logs, for example you can try: http://bugs.bitlbee.org/bitlbee/timeline?daysback=90&changeset=on +Version 1.2.7: +- Fixed problems with MSN Messenger authentication. ("Could not parse + Passport server response") +- Fixed broken typing notifications when talking to GTalk contacts. +- Fixed an issue with non-anonymous Jabber chatrooms polluting the nick + namespace, sometimes generating odd warning messages. +- Restored ability to start groupchats on ICQ. +- Added show_offline setting that will also show offline contacts in the + control channel. +- OAuth support for Twitter: This means the module will keep working after + June (this also changes "via API" under your tweets into "via BitlBee"). + +Finished 15 May 2010 + Version 1.2.6a: - Fixed a typo that renders the Twitter groupchat mode unusable. A last- minute change that came a few minutes late. -- cgit v1.2.3 From 6be46b37a167031f7a6888be03c2611f0762639a Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 15 May 2010 16:32:43 +0100 Subject: Debian update for 1.2.7. --- debian/changelog | 7 +++++++ debian/rules | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/debian/changelog b/debian/changelog index 56d0a551..ca592229 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +bitlbee (1.2.7-1) unstable; urgency=high + + * New upstream version. + * Fixes MSN Messenger login issues, so uploading at high priority. + + -- Wilmer van der Gaast Sat, 15 May 2010 16:15:57 +0100 + bitlbee (1.2.6a-1) unstable; urgency=low * New upstream version. diff --git a/debian/rules b/debian/rules index 0c656fd8..ae6463fc 100755 --- a/debian/rules +++ b/debian/rules @@ -98,7 +98,11 @@ binary-indep: install-indep cd debian/bitlbee-dev; \ find usr -type f -exec md5sum {} \; > DEBIAN/md5sums +ifdef BITLBEE_FORCE_VERSION dpkg-gencontrol -ldebian/changelog -isp -pbitlbee-dev -Pdebian/bitlbee-dev -v1:$(BITLBEE_VERSION)-0 +else + dpkg-gencontrol -ldebian/changelog -isp -pbitlbee-dev -Pdebian/bitlbee-dev +endif dpkg --build debian/bitlbee-dev .. -- cgit v1.2.3 From d4bc2d90d88527f434f910b9821c145394434d71 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 16 May 2010 10:46:27 +0100 Subject: Handle AIM_CAPS_ICQRTF messages (sometimes sent by certain mobile clients). Not sure if this needs any stripping but I guess we'll find out. --- protocols/oscar/oscar.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index 00c5e5ef..9f568c44 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -1029,16 +1029,20 @@ static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_ *exch = args->info.chat.roominfo.exchange; m = g_list_append(m, exch); - g_snprintf( txt, 1024, "Got an invitation to chatroom %s from %s: %s", name, userinfo->sn, args->msg ); + g_snprintf(txt, 1024, "Got an invitation to chatroom %s from %s: %s", name, userinfo->sn, args->msg); inv->ic = ic; inv->exchange = *exch; inv->name = g_strdup(name); - imcb_ask( ic, txt, inv, oscar_accept_chat, oscar_reject_chat); + imcb_ask(ic, txt, inv, oscar_accept_chat, oscar_reject_chat); if (name) g_free(name); + } else if (args->reqclass & AIM_CAPS_ICQRTF) { + // TODO: constify + char *text = g_strdup(args->info.rtfmsg.rtfmsg); + imcb_buddy_msg(ic, normalize(userinfo->sn), text, 0, 0); } return 1; -- cgit v1.2.3 From 2334048eaa9ab26fcdab781dbfb1bacb1c01ba8d Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 16 May 2010 10:50:57 +0100 Subject: Oi, don't leak that precious memory! --- protocols/oscar/oscar.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index 9f568c44..9f33f320 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -1041,7 +1041,8 @@ static int incomingim_chan2(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_ g_free(name); } else if (args->reqclass & AIM_CAPS_ICQRTF) { // TODO: constify - char *text = g_strdup(args->info.rtfmsg.rtfmsg); + char text[strlen(args->info.rtfmsg.rtfmsg)+1]; + strncpy(text, args->info.rtfmsg.rtfmsg, sizeof(text)); imcb_buddy_msg(ic, normalize(userinfo->sn), text, 0, 0); } -- cgit v1.2.3 From 0b3ffb13172c211eed561288d0fd04d76506bb02 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 19 May 2010 20:46:43 +0100 Subject: Setting the HTML flag on a connection has a nasty side effect of escaping a lot of "special" characters, and these HTML entities are not counted as one character. :-( So just strip HTML of incoming stuff and don't do anything with what goes out. It's not required. The story may actually be more complicated this, let's find out. --- lib/misc.c | 5 ++--- protocols/twitter/twitter.c | 1 - protocols/twitter/twitter_lib.c | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/misc.c b/lib/misc.c index c56b31f3..d77972e3 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -153,11 +153,11 @@ static const htmlentity_t ent[] = void strip_html( char *in ) { char *start = in; - char *out = g_malloc( strlen( in ) + 1 ); + char out[strlen(in)+1]; char *s = out, *cs; int i, matched; - memset( out, 0, strlen( in ) + 1 ); + memset( out, 0, sizeof( out ) ); while( *in ) { @@ -219,7 +219,6 @@ void strip_html( char *in ) } strcpy( start, out ); - g_free( out ); } char *escape_html( const char *html ) diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index 98e85641..a9b38a2f 100644 --- a/protocols/twitter/twitter.c +++ b/protocols/twitter/twitter.c @@ -179,7 +179,6 @@ static void twitter_login( account_t *acc ) twitter_connections = g_slist_append( twitter_connections, ic ); ic->proto_data = td; - ic->flags |= OPT_DOES_HTML; td->user = acc->user; if( !set_getbool( &acc->set, "oauth" ) ) diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index ee6e39fe..3becc67e 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -433,6 +433,8 @@ static void twitter_groupchat(struct im_connection *ic, GSList *list) status = l->data; twitter_add_buddy(ic, status->user->screen_name, status->user->name); + strip_html(status->text); + // Say it! if (g_strcasecmp(td->user, status->user->screen_name) == 0) imcb_chat_log (gc, "Your Tweet: %s", status->text); @@ -470,6 +472,7 @@ static void twitter_private_message_chat(struct im_connection *ic, GSList *list) status = l->data; + strip_html( status->text ); if( mode_one ) text = g_strdup_printf( "\002<\002%s\002>\002 %s", status->user->screen_name, status->text ); -- cgit v1.2.3 From 907afe184215a7ba15b09ef5f130768703cd89bd Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 19 May 2010 21:01:33 +0100 Subject: Minor doc update. --- debian/control | 6 ++++-- doc/bitlbee.8 | 5 ++--- doc/user-guide/quickstart.xml | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/debian/control b/debian/control index 86488c8a..25a90506 100644 --- a/debian/control +++ b/debian/control @@ -14,13 +14,15 @@ Architecture: any Depends: ${shlibs:Depends}, adduser, net-tools, ${debconf-depends}, debianutils (>= 1.16) Description: An IRC to other chat networks gateway This program can be used as an IRC server which forwards everything you - say to people on other chat networks: Jabber, ICQ, AIM, MSN and Yahoo. + say to people on other chat networks: Jabber, ICQ, AIM, MSN, Yahoo! and + Twitter. Package: bitlbee-dev Architecture: all Depends: bitlbee (>= ${source:Version}), bitlbee (<< ${source:Version}.1~) Description: An IRC to other chat networks gateway This program can be used as an IRC server which forwards everything you - say to people on other chat networks: Jabber, ICQ, AIM, MSN and Yahoo. + say to people on other chat networks: Jabber, ICQ, AIM, MSN, Yahoo! and + Twitter. . This package holds development stuff for compiling plug-ins. diff --git a/doc/bitlbee.8 b/doc/bitlbee.8 index 9e634844..36576e59 100644 --- a/doc/bitlbee.8 +++ b/doc/bitlbee.8 @@ -38,9 +38,8 @@ BitlBee \- IRC gateway to IM chat networks BitlBee is an IRC daemon that can talk to instant messaging networks and acts as a gateway. Users can connect to the server with any normal IRC client and see their 'buddy list' in -&bitlbee. BitlBee's protocol support is based on the gaim -protocol plugins. BitlBee currently supports Oscar (aim and icq), -MSN, Jabber and Yahoo. +&bitlbee. It currently supports Oscar (AIM and ICQ), +MSN, Jabber, Yahoo! and Twitter. \fBbitlbee\fP should be called by .BR inetd (8), diff --git a/doc/user-guide/quickstart.xml b/doc/user-guide/quickstart.xml index 0539a7c7..80c16ffb 100644 --- a/doc/user-guide/quickstart.xml +++ b/doc/user-guide/quickstart.xml @@ -2,7 +2,7 @@ Quickstart -Welcome to BitlBee, your IRC gateway to ICQ, MSN, AOL, Jabber and Yahoo Instant Messaging Systems. +Welcome to BitlBee, your IRC gateway to ICQ, MSN, AOL, Jabber, Yahoo! and Twitter. @@ -42,7 +42,7 @@ For instance, suppose you have a Jabber account at jabber.org with handle -Other available IM protocols are msn, oscar, and yahoo. OSCAR is the protocol used by ICQ and AOL. For more information about the account add command, see help account add. +Other available IM protocols are msn, oscar, yahoo and twitter. OSCAR is the protocol used by ICQ and AOL. For more information about the account add command, see help account add. -- cgit v1.2.3 From c01bbd100fb460e34e10635ad43dc0f8f05b535d Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sat, 22 May 2010 16:00:36 +0100 Subject: Use HTTPS for the browser part of Twitter OAuth login. --- protocols/twitter/twitter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index a9b38a2f..f934f791 100644 --- a/protocols/twitter/twitter.c +++ b/protocols/twitter/twitter.c @@ -69,7 +69,7 @@ static const struct oauth_service twitter_oauth = { "http://api.twitter.com/oauth/request_token", "http://api.twitter.com/oauth/access_token", - "http://api.twitter.com/oauth/authorize", + "https://api.twitter.com/oauth/authorize", .consumer_key = "xsDNKJuNZYkZyMcu914uEA", .consumer_secret = "FCxqcr0pXKzsF9ajmP57S3VQ8V6Drk4o2QYtqMcOszo", }; -- cgit v1.2.3 From f9110b483d89b6dbc15d980f8b431863e8a872f3 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 23 May 2010 00:44:00 +0100 Subject: Fixed documented default for ignore_auth_requests setting. --- doc/user-guide/commands.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/user-guide/commands.xml b/doc/user-guide/commands.xml index ba2b4e70..15ed4c34 100644 --- a/doc/user-guide/commands.xml +++ b/doc/user-guide/commands.xml @@ -619,7 +619,7 @@ - true + false -- cgit v1.2.3 From bb5ce4d1ad2aa6cbcf1042ccf87cf280d9645d4c Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 23 May 2010 13:50:51 +0100 Subject: Added base_url settting to Twitter module so other services using the Twitter API can be used. Only with Basic authentication though. --- protocols/twitter/twitter.c | 31 +++++++++--- protocols/twitter/twitter.h | 5 ++ protocols/twitter/twitter_http.c | 103 +++++++++++++-------------------------- protocols/twitter/twitter_http.h | 4 +- protocols/twitter/twitter_lib.c | 10 ++-- protocols/twitter/twitter_lib.h | 54 ++++++++++---------- 6 files changed, 99 insertions(+), 108 deletions(-) diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index f934f791..10b09da4 100644 --- a/protocols/twitter/twitter.c +++ b/protocols/twitter/twitter.c @@ -26,6 +26,7 @@ #include "twitter.h" #include "twitter_http.h" #include "twitter_lib.h" +#include "url.h" /** * Main loop function @@ -159,6 +160,9 @@ static void twitter_init( account_t *acc ) { set_t *s; + s = set_add( &acc->set, "base_url", TWITTER_API_URL, NULL, acc ); + s->flags |= ACC_SET_OFFLINE_ONLY; + s = set_add( &acc->set, "message_length", "140", set_eval_int, acc ); s = set_add( &acc->set, "mode", "one", set_eval_mode, acc ); @@ -174,24 +178,39 @@ static void twitter_init( account_t *acc ) static void twitter_login( account_t *acc ) { struct im_connection *ic = imcb_new( acc ); - struct twitter_data *td = g_new0( struct twitter_data, 1 ); + struct twitter_data *td; char name[strlen(acc->user)+9]; + url_t url; + if( !url_set( &url, set_getstr( &ic->acc->set, "base_url" ) ) || + ( url.proto != PROTO_HTTP && url.proto != PROTO_HTTPS ) ) + { + imcb_error( ic, "Incorrect API base URL: %s", set_getstr( &ic->acc->set, "base_url" ) ); + imc_logout( ic, FALSE ); + return; + } + twitter_connections = g_slist_append( twitter_connections, ic ); + td = g_new0( struct twitter_data, 1 ); ic->proto_data = td; + td->url_ssl = url.proto == PROTO_HTTPS; + td->url_port = url.port; + td->url_host = g_strdup( url.host ); + if( strcmp( url.file, "/" ) != 0 ) + td->url_path = g_strdup( url.file ); + else + td->url_path = g_strdup( "" ); + td->user = acc->user; - if( !set_getbool( &acc->set, "oauth" ) ) - td->pass = g_strdup( acc->pass ); - else if( strstr( acc->pass, "oauth_token=" ) ) + if( strstr( acc->pass, "oauth_token=" ) ) td->oauth_info = oauth_from_string( acc->pass, &twitter_oauth ); - td->home_timeline_id = 0; sprintf( name, "twitter_%s", acc->user ); imcb_add_buddy( ic, name, NULL ); imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL ); - if( td->pass || td->oauth_info ) + if( td->oauth_info || !set_getbool( &acc->set, "oauth" ) ) twitter_main_loop_start( ic ); else twitter_oauth_start( ic ); diff --git a/protocols/twitter/twitter.h b/protocols/twitter/twitter.h index 24f61e42..614919f9 100644 --- a/protocols/twitter/twitter.h +++ b/protocols/twitter/twitter.h @@ -41,6 +41,11 @@ struct twitter_data gint main_loop_id; struct groupchat *home_timeline_gc; gint http_fails; + + gboolean url_ssl; + int url_port; + char *url_host; + char *url_path; }; /** diff --git a/protocols/twitter/twitter_http.c b/protocols/twitter/twitter_http.c index 51f437df..ff17f5f4 100644 --- a/protocols/twitter/twitter_http.c +++ b/protocols/twitter/twitter_http.c @@ -40,45 +40,21 @@ #include "twitter_http.h" -char *twitter_url_append(char *url, char *key, char* value); +static char *twitter_url_append(char *url, char *key, char* value); /** * Do a request. * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c */ -void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, char* user, char* pass, struct oauth_info* oi, char** arguments, int arguments_len) +void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, gpointer data, int is_post, char** arguments, int arguments_len) { - url_t *url = g_new0( url_t, 1 ); + struct twitter_data *td = ic->proto_data; char *tmp; - char *request; + GString *request = g_string_new(""); void *ret; - char *userpass = NULL; - char *userpass_base64; char *url_arguments; - // Fill the url structure. - if( !url_set( url, url_string ) ) - { - g_free( url ); - return NULL; - } - - if( url->proto != PROTO_HTTP && url->proto != PROTO_HTTPS ) - { - g_free( url ); - return NULL; - } - - // Concatenate user and pass - if (user && pass) { - userpass = g_strdup_printf("%s:%s", user, pass); - userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass)); - } else { - userpass_base64 = NULL; - } - - url_arguments = g_malloc(1); - url_arguments[0] = '\0'; + url_arguments = g_strdup(""); // Construct the url arguments. if (arguments_len != 0) @@ -92,70 +68,61 @@ void *twitter_http(char *url_string, http_input_function func, gpointer data, in } } - // Do GET stuff... - if (!is_post) - { - // Find the char-pointer of the end of the string. - tmp = url->file + strlen(url->file); - tmp[0] = '?'; - // append the url_arguments to the end of the url->file. - // TODO GM: Check the length? - g_stpcpy (tmp+1, url_arguments); - } - - // Make the request. - request = g_strdup_printf( "%s %s HTTP/1.0\r\n" - "Host: %s\r\n" - "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n", - is_post ? "POST" : "GET", url->file, url->host ); + g_string_printf(request, "%s %s%s%s%s HTTP/1.0\r\n" + "Host: %s\r\n" + "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n", + is_post ? "POST" : "GET", + td->url_path, url_string, + is_post ? "" : "?", is_post ? "" : url_arguments, + td->url_host); // If a pass and user are given we append them to the request. - if (oi) + if (td->oauth_info) { char *full_header; + char *full_url; - full_header = oauth_http_header(oi, is_post ? "POST" : "GET", - url_string, url_arguments); + full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url" ), url_string, NULL); + full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET", + full_url, url_arguments); - tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header); - g_free(request); + g_string_append_printf(request, "Authorization: %s\r\n", full_header); g_free(full_header); - request = tmp; + g_free(full_url); } - else if (userpass_base64) + else { - tmp = g_strdup_printf("%sAuthorization: Basic %s\r\n", request, userpass_base64); - g_free(request); - request = tmp; + char userpass[strlen(ic->acc->user)+2+strlen(ic->acc->pass)]; + char *userpass_base64; + + g_snprintf(userpass, sizeof(userpass), "%s:%s", ic->acc->user, ic->acc->pass); + userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass)); + g_string_append_printf(request, "Authorization: Basic %s\r\n", userpass_base64); + g_free( userpass_base64 ); } // Do POST stuff.. if (is_post) { // Append the Content-Type and url-encoded arguments. - tmp = g_strdup_printf("%sContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %zd\r\n\r\n%s", - request, strlen(url_arguments), url_arguments); - g_free(request); - request = tmp; + g_string_append_printf(request, + "Content-Type: application/x-www-form-urlencoded\r\n" + "Content-Length: %zd\r\n\r\n%s", + strlen(url_arguments), url_arguments); } else { // Append an extra \r\n to end the request... - tmp = g_strdup_printf("%s\r\n", request); - g_free(request); - request = tmp; + g_string_append(request, "\r\n"); } - ret = http_dorequest( url->host, url->port, url->proto == PROTO_HTTPS, request, func, data ); + ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data); - g_free( url ); - g_free( userpass ); - g_free( userpass_base64 ); g_free( url_arguments ); - g_free( request ); + g_string_free( request, TRUE ); return ret; } -char *twitter_url_append(char *url, char *key, char* value) +static char *twitter_url_append(char *url, char *key, char* value) { char *key_encoded = g_strndup(key, 3 * strlen(key)); http_encode(key_encoded); diff --git a/protocols/twitter/twitter_http.h b/protocols/twitter/twitter_http.h index 5ef2530f..393a1c26 100644 --- a/protocols/twitter/twitter_http.h +++ b/protocols/twitter/twitter_http.h @@ -29,8 +29,8 @@ struct oauth_info; -void *twitter_http(char *url_string, http_input_function func, gpointer data, int is_post, - char* user, char* pass, struct oauth_info *oi, char** arguments, int arguments_len); +void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, + gpointer data, int is_post, char** arguments, int arguments_len); #endif //_TWITTER_HTTP_H diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index 3becc67e..d3f0d718 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -129,7 +129,7 @@ void twitter_get_friends_ids(struct im_connection *ic, int next_cursor) char* args[2]; args[0] = "cursor"; args[1] = g_strdup_printf ("%d", next_cursor); - twitter_http(TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, td->oauth_info, args, 2); + twitter_http(ic, TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, args, 2); g_free(args[1]); } @@ -395,7 +395,7 @@ void twitter_get_home_timeline(struct im_connection *ic, int next_cursor) args[3] = g_strdup_printf ("%llu", (long long unsigned int) td->home_timeline_id); } - twitter_http(TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, td->user, td->pass, td->oauth_info, args, td->home_timeline_id ? 4 : 2); + twitter_http(ic, TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, args, td->home_timeline_id ? 4 : 2); g_free(args[1]); if (td->home_timeline_id) { @@ -622,7 +622,7 @@ void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor) args[0] = "cursor"; args[1] = g_strdup_printf ("%d", next_cursor); - twitter_http(TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, td->oauth_info, args, 2); + twitter_http(ic, TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, args, 2); g_free(args[1]); } @@ -656,7 +656,7 @@ void twitter_post_status(struct im_connection *ic, char* msg) char* args[2]; args[0] = "status"; args[1] = msg; - twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 2); + twitter_http(ic, TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, args, 2); // g_free(args[1]); } @@ -674,7 +674,7 @@ void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg) args[2] = "text"; args[3] = msg; // Use the same callback as for twitter_post_status, since it does basically the same. - twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 4); + twitter_http(ic, TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, args, 4); // g_free(args[1]); // g_free(args[3]); } diff --git a/protocols/twitter/twitter_lib.h b/protocols/twitter/twitter_lib.h index e47bfd95..a4abac6f 100644 --- a/protocols/twitter/twitter_lib.h +++ b/protocols/twitter/twitter_lib.h @@ -31,49 +31,49 @@ #define TWITTER_API_URL "http://twitter.com" /* Status URLs */ -#define TWITTER_STATUS_UPDATE_URL TWITTER_API_URL "/statuses/update.xml" -#define TWITTER_STATUS_SHOW_URL TWITTER_API_URL "/statuses/show/" -#define TWITTER_STATUS_DESTROY_URL TWITTER_API_URL "/statuses/destroy/" +#define TWITTER_STATUS_UPDATE_URL "/statuses/update.xml" +#define TWITTER_STATUS_SHOW_URL "/statuses/show/" +#define TWITTER_STATUS_DESTROY_URL "/statuses/destroy/" /* Timeline URLs */ -#define TWITTER_PUBLIC_TIMELINE_URL TWITTER_API_URL "/statuses/public_timeline.xml" -#define TWITTER_FEATURED_USERS_URL TWITTER_API_URL "/statuses/featured.xml" -#define TWITTER_FRIENDS_TIMELINE_URL TWITTER_API_URL "/statuses/friends_timeline.xml" -#define TWITTER_HOME_TIMELINE_URL TWITTER_API_URL "/statuses/home_timeline.xml" -#define TWITTER_MENTIONS_URL TWITTER_API_URL "/statuses/mentions.xml" -#define TWITTER_USER_TIMELINE_URL TWITTER_API_URL "/statuses/user_timeline.xml" +#define TWITTER_PUBLIC_TIMELINE_URL "/statuses/public_timeline.xml" +#define TWITTER_FEATURED_USERS_URL "/statuses/featured.xml" +#define TWITTER_FRIENDS_TIMELINE_URL "/statuses/friends_timeline.xml" +#define TWITTER_HOME_TIMELINE_URL "/statuses/home_timeline.xml" +#define TWITTER_MENTIONS_URL "/statuses/mentions.xml" +#define TWITTER_USER_TIMELINE_URL "/statuses/user_timeline.xml" /* Users URLs */ -#define TWITTER_SHOW_USERS_URL TWITTER_API_URL "/users/show.xml" -#define TWITTER_SHOW_FRIENDS_URL TWITTER_API_URL "/statuses/friends.xml" -#define TWITTER_SHOW_FOLLOWERS_URL TWITTER_API_URL "/statuses/followers.xml" +#define TWITTER_SHOW_USERS_URL "/users/show.xml" +#define TWITTER_SHOW_FRIENDS_URL "/statuses/friends.xml" +#define TWITTER_SHOW_FOLLOWERS_URL "/statuses/followers.xml" /* Direct messages URLs */ -#define TWITTER_DIRECT_MESSAGES_URL TWITTER_API_URL "/direct_messages.xml" -#define TWITTER_DIRECT_MESSAGES_NEW_URL TWITTER_API_URL "/direct_messages/new.xml" -#define TWITTER_DIRECT_MESSAGES_SENT_URL TWITTER_API_URL "/direct_messages/sent.xml" -#define TWITTER_DIRECT_MESSAGES_DESTROY_URL TWITTER_API_URL "/direct_messages/destroy/" +#define TWITTER_DIRECT_MESSAGES_URL "/direct_messages.xml" +#define TWITTER_DIRECT_MESSAGES_NEW_URL "/direct_messages/new.xml" +#define TWITTER_DIRECT_MESSAGES_SENT_URL "/direct_messages/sent.xml" +#define TWITTER_DIRECT_MESSAGES_DESTROY_URL "/direct_messages/destroy/" /* Friendships URLs */ -#define TWITTER_FRIENDSHIPS_CREATE_URL TWITTER_API_URL "/friendships/create.xml" -#define TWITTER_FRIENDSHIPS_DESTROY_URL TWITTER_API_URL "/friendships/destroy.xml" -#define TWITTER_FRIENDSHIPS_SHOW_URL TWITTER_API_URL "/friendships/show.xml" +#define TWITTER_FRIENDSHIPS_CREATE_URL "/friendships/create.xml" +#define TWITTER_FRIENDSHIPS_DESTROY_URL "/friendships/destroy.xml" +#define TWITTER_FRIENDSHIPS_SHOW_URL "/friendships/show.xml" /* Social graphs URLs */ -#define TWITTER_FRIENDS_IDS_URL TWITTER_API_URL "/friends/ids.xml" -#define TWITTER_FOLLOWERS_IDS_URL TWITTER_API_URL "/followers/ids.xml" +#define TWITTER_FRIENDS_IDS_URL "/friends/ids.xml" +#define TWITTER_FOLLOWERS_IDS_URL "/followers/ids.xml" /* Account URLs */ -#define TWITTER_ACCOUNT_RATE_LIMIT_URL TWITTER_API_URL "/account/rate_limit_status.xml" +#define TWITTER_ACCOUNT_RATE_LIMIT_URL "/account/rate_limit_status.xml" /* Favorites URLs */ -#define TWITTER_FAVORITES_GET_URL TWITTER_API_URL "/favorites.xml" -#define TWITTER_FAVORITE_CREATE_URL TWITTER_API_URL "/favorites/create/" -#define TWITTER_FAVORITE_DESTROY_URL TWITTER_API_URL "/favorites/destroy/" +#define TWITTER_FAVORITES_GET_URL "/favorites.xml" +#define TWITTER_FAVORITE_CREATE_URL "/favorites/create/" +#define TWITTER_FAVORITE_DESTROY_URL "/favorites/destroy/" /* Block URLs */ -#define TWITTER_BLOCKS_CREATE_URL TWITTER_API_URL "/blocks/create/" -#define TWITTER_BLOCKS_DESTROY_URL TWITTER_API_URL "/blocks/destroy/" +#define TWITTER_BLOCKS_CREATE_URL "/blocks/create/" +#define TWITTER_BLOCKS_DESTROY_URL "/blocks/destroy/" void twitter_get_friends_ids(struct im_connection *ic, int next_cursor); void twitter_get_home_timeline(struct im_connection *ic, int next_cursor); -- cgit v1.2.3 From a7b9ec7011cb649be3c34ec681ab98e103dfc686 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 23 May 2010 14:49:54 +0100 Subject: Improved error reporting (get textual HTTP error message and error message from Twitter API response if possible). --- protocols/twitter/twitter_lib.c | 48 ++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index d3f0d718..ad09bbc5 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -116,6 +116,38 @@ static void twitter_add_buddy(struct im_connection *ic, char *name, const char * } } +/* Warning: May return a malloc()ed value, which will be free()d on the next + call. Only for short-term use. */ +static char *twitter_parse_error(struct http_request *req) +{ + static char *ret = NULL; + struct xt_parser *xp; + struct xt_node *node; + char *err_s = NULL; + + g_free(ret); + ret = NULL; + + xp = xt_new(NULL, NULL); + xt_feed(xp, req->reply_body, req->body_size); + + if ((node = xt_find_node(xp->root, "hash")) && + (node = xt_find_node(node->children, "error")) && + node->text_len > 0) + err_s = node->text; + + if (err_s) + { + ret = g_strdup_printf("%s (%s)", req->status_string, err_s); + xt_free(xp); + return ret; + } + else + { + return req->status_string; + } +} + static void twitter_http_get_friends_ids(struct http_request *req); /** @@ -123,8 +155,6 @@ static void twitter_http_get_friends_ids(struct http_request *req); */ void twitter_get_friends_ids(struct im_connection *ic, int next_cursor) { - struct twitter_data *td = ic->proto_data; - // Primitive, but hey! It works... char* args[2]; args[0] = "cursor"; @@ -195,7 +225,7 @@ static void twitter_http_get_friends_ids(struct http_request *req) if (req->status_code != 200) { // It didn't go well, output the error and return. if (++td->http_fails >= 5) - imcb_error(ic, "Could not retrieve friends. HTTP STATUS: %d", req->status_code); + imcb_error(ic, "Could not retrieve friends: %s", twitter_parse_error(req)); return; } else { @@ -525,7 +555,7 @@ static void twitter_http_get_home_timeline(struct http_request *req) { // It didn't go well, output the error and return. if (++td->http_fails >= 5) - imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ". HTTP STATUS: %d", req->status_code); + imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ": %s", twitter_parse_error(req)); return; } @@ -577,7 +607,7 @@ static void twitter_http_get_statuses_friends(struct http_request *req) if (req->status_code != 200) { // It didn't go well, output the error and return. if (++td->http_fails >= 5) - imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL " HTTP STATUS: %d", req->status_code); + imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL ": %s", twitter_parse_error(req)); return; } else { @@ -616,8 +646,6 @@ static void twitter_http_get_statuses_friends(struct http_request *req) */ void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor) { - struct twitter_data *td = ic->proto_data; - char* args[2]; args[0] = "cursor"; args[1] = g_strdup_printf ("%d", next_cursor); @@ -641,7 +669,7 @@ static void twitter_http_post_status(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not post message... HTTP STATUS: %d", req->status_code); + imcb_error(ic, "Could not post message: %s", twitter_parse_error(req)); return; } } @@ -651,8 +679,6 @@ static void twitter_http_post_status(struct http_request *req) */ void twitter_post_status(struct im_connection *ic, char* msg) { - struct twitter_data *td = ic->proto_data; - char* args[2]; args[0] = "status"; args[1] = msg; @@ -666,8 +692,6 @@ void twitter_post_status(struct im_connection *ic, char* msg) */ void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg) { - struct twitter_data *td = ic->proto_data; - char* args[4]; args[0] = "screen_name"; args[1] = who; -- cgit v1.2.3 From 186bd04be06297c1dd480f730eef8fcede9a3991 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 23 May 2010 15:14:16 +0100 Subject: Don't whine on "incomplete" incoming IQ-set packets either, those also happen. --- protocols/jabber/iq.c | 1 - 1 file changed, 1 deletion(-) diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c index 1b76a761..95b21e1e 100644 --- a/protocols/jabber/iq.c +++ b/protocols/jabber/iq.c @@ -126,7 +126,6 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data ) if( !( c = xt_find_node( node->children, "query" ) ) || !( s = xt_find_attr( c, "xmlns" ) ) ) { - imcb_log( ic, "Warning: Received incomplete IQ-%s packet", type ); return XT_HANDLED; } -- cgit v1.2.3 From 228fc188af4cc292a14672abe519d557d57bb1e6 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 23 May 2010 15:31:30 +0100 Subject: Allow nick changes. (Based on patch from zibri) This mostly closes #6! --- irc_commands.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/irc_commands.c b/irc_commands.c index 319d549a..7a286ce2 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -72,19 +72,29 @@ static void irc_cmd_user( irc_t *irc, char **cmd ) static void irc_cmd_nick( irc_t *irc, char **cmd ) { - if( irc->nick ) + if( irc->status & USTATUS_IDENTIFIED && irc->nick ) { - irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); + irc_reply( irc, 438, "%s %s :You can only change your nick if you're not " + "logged in (i.e. pre-identify)", irc->nick, cmd[1] ); } /* This is not clean, but for now it'll have to be like this... */ - else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) ) + else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) || ( user_find( irc, cmd[1] ) != NULL ) ) { - irc_reply( irc, 433, ":This nick is already in use" ); + irc_reply( irc, 433, "%s :This nick is already in use", cmd[1] ); } else if( !nick_ok( cmd[1] ) ) { /* [SH] Invalid characters. */ - irc_reply( irc, 432, ":This nick contains invalid characters" ); + irc_reply( irc, 432, "%s :This nick contains invalid characters", cmd[1] ); + } + else if(irc->nick) + { + if( user_find( irc, irc->nick ) ) + user_rename(irc, irc->nick, cmd[1]); + + irc_write( irc, ":%s!%s@%s NICK %s", irc->nick, irc->user, irc->host, cmd[1] ); + g_free(irc->nick); + irc->nick = g_strdup( cmd[1] ); } else { -- cgit v1.2.3 From 3d93aed32d49bae6c608a71858f00127dccd28e9 Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Sun, 23 May 2010 15:52:41 +0100 Subject: Restructure Twitter error parser a bit, it fed a NULL pointer to the XML parser sometimes (which fails safely but is a bad idea anyway). --- protocols/twitter/twitter_lib.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index ad09bbc5..e4dfc595 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -121,31 +121,30 @@ static void twitter_add_buddy(struct im_connection *ic, char *name, const char * static char *twitter_parse_error(struct http_request *req) { static char *ret = NULL; - struct xt_parser *xp; + struct xt_parser *xp = NULL; struct xt_node *node; - char *err_s = NULL; g_free(ret); ret = NULL; - xp = xt_new(NULL, NULL); - xt_feed(xp, req->reply_body, req->body_size); - - if ((node = xt_find_node(xp->root, "hash")) && - (node = xt_find_node(node->children, "error")) && - node->text_len > 0) - err_s = node->text; - - if (err_s) + if (req->body_size > 0) { - ret = g_strdup_printf("%s (%s)", req->status_string, err_s); + xp = xt_new(NULL, NULL); + xt_feed(xp, req->reply_body, req->body_size); + + if ((node = xt_find_node(xp->root, "hash")) && + (node = xt_find_node(node->children, "error")) && + node->text_len > 0) + { + ret = g_strdup_printf("%s (%s)", req->status_string, node->text); + xt_free(xp); + return ret; + } + xt_free(xp); - return ret; - } - else - { - return req->status_string; } + + return req->status_string; } static void twitter_http_get_friends_ids(struct http_request *req); -- cgit v1.2.3 From 7d53efb7ec5310b2710757cef03d7f53c94a7797 Mon Sep 17 00:00:00 2001 From: Geert Mulders Date: Sat, 29 May 2010 14:40:17 +0200 Subject: Added functionality to add and remove friendships. --- protocols/twitter/twitter.c | 2 ++ protocols/twitter/twitter_lib.c | 23 ++++++++++++++++++----- protocols/twitter/twitter_lib.h | 1 + 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/protocols/twitter/twitter.c b/protocols/twitter/twitter.c index 98e85641..2f07adbb 100644 --- a/protocols/twitter/twitter.c +++ b/protocols/twitter/twitter.c @@ -267,10 +267,12 @@ static void twitter_get_info(struct im_connection *ic, char *who) static void twitter_add_buddy( struct im_connection *ic, char *who, char *group ) { + twitter_friendships_create_destroy(ic, who, 1); } static void twitter_remove_buddy( struct im_connection *ic, char *who, char *group ) { + twitter_friendships_create_destroy(ic, who, 0); } static void twitter_chat_msg( struct groupchat *c, char *message, int flags ) diff --git a/protocols/twitter/twitter_lib.c b/protocols/twitter/twitter_lib.c index ee6e39fe..3ea694e6 100644 --- a/protocols/twitter/twitter_lib.c +++ b/protocols/twitter/twitter_lib.c @@ -625,9 +625,9 @@ void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor) } /** - * Callback after sending a new update to twitter. + * Callback to use after sending a post request to twitter. */ -static void twitter_http_post_status(struct http_request *req) +static void twitter_http_post(struct http_request *req) { struct im_connection *ic = req->data; @@ -638,7 +638,7 @@ static void twitter_http_post_status(struct http_request *req) // Check if the HTTP request went well. if (req->status_code != 200) { // It didn't go well, output the error and return. - imcb_error(ic, "Could not post message... HTTP STATUS: %d", req->status_code); + imcb_error(ic, "HTTP Error... STATUS: %d", req->status_code); return; } } @@ -653,7 +653,7 @@ void twitter_post_status(struct im_connection *ic, char* msg) char* args[2]; args[0] = "status"; args[1] = msg; - twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 2); + twitter_http(TWITTER_STATUS_UPDATE_URL, twitter_http_post, ic, 1, td->user, td->pass, td->oauth_info, args, 2); // g_free(args[1]); } @@ -671,7 +671,20 @@ void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg) args[2] = "text"; args[3] = msg; // Use the same callback as for twitter_post_status, since it does basically the same. - twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post_status, ic, 1, td->user, td->pass, td->oauth_info, args, 4); + twitter_http(TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post, ic, 1, td->user, td->pass, td->oauth_info, args, 4); // g_free(args[1]); // g_free(args[3]); } + +void twitter_friendships_create_destroy(struct im_connection *ic, char *who, int create) +{ + struct twitter_data *td = ic->proto_data; + + char* args[2]; + args[0] = "screen_name"; + args[1] = who; + twitter_http(create ? TWITTER_FRIENDSHIPS_CREATE_URL : TWITTER_FRIENDSHIPS_DESTROY_URL, twitter_http_post, ic, 1, td->user, td->pass, td->oauth_info, args, 2); +} + + + diff --git a/protocols/twitter/twitter_lib.h b/protocols/twitter/twitter_lib.h index e47bfd95..85ba70fc 100644 --- a/protocols/twitter/twitter_lib.h +++ b/protocols/twitter/twitter_lib.h @@ -81,6 +81,7 @@ void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor); void twitter_post_status(struct im_connection *ic, char *msg); void twitter_direct_messages_new(struct im_connection *ic, char *who, char *message); +void twitter_friendships_create_destroy(struct im_connection *ic, char *who, int create); #endif //_TWITTER_LIB_H -- cgit v1.2.3 From 3dc6d86076dbea16c313bb87aa2f37166f289a8e Mon Sep 17 00:00:00 2001 From: Wilmer van der Gaast Date: Wed, 2 Jun 2010 09:47:18 +0100 Subject: Disable old-style ICQ authentication. It looks like AOL or whoever is slowly taking down support for it. Just to be sure, it can be re-enabled with a setting, I'll remove that after the next release. --- protocols/oscar/auth.c | 3 ++- protocols/oscar/oscar.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/protocols/oscar/auth.c b/protocols/oscar/auth.c index eb6a9d64..0f7c8d0f 100644 --- a/protocols/oscar/auth.c +++ b/protocols/oscar/auth.c @@ -119,11 +119,12 @@ int aim_request_login(aim_session_t *sess, aim_conn_t *conn, const char *sn) aim_frame_t *fr; aim_snacid_t snacid; aim_tlvlist_t *tl = NULL; + struct im_connection *ic = sess->aux_data; if (!sess || !conn || !sn) return -EINVAL; - if ((sn[0] >= '0') && (sn[0] <= '9')) + if (isdigit(sn[0]) && set_getbool(&ic->acc->set, "old_icq_auth")) return goddamnicq(sess, conn, sn); sess->flags |= AIM_SESS_FLAGS_SNACLOGIN; diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index 9f33f320..9602a496 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -373,6 +373,7 @@ static void oscar_init(account_t *acc) if (isdigit(acc->user[0])) { set_add(&acc->set, "ignore_auth_requests", "false", set_eval_bool, acc); + set_add(&acc->set, "old_icq_auth", "false", set_eval_bool, acc); } s = set_add(&acc->set, "server", AIM_DEFAULT_LOGIN_SERVER, set_eval_account, acc); -- cgit v1.2.3