Changes in / [7d53efb:ba3233c]
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
bitlbee.h
r7d53efb rba3233c 35 35 36 36 #define PACKAGE "BitlBee" 37 #define BITLBEE_VERSION "1.2. 6a"37 #define BITLBEE_VERSION "1.2.7" 38 38 #define VERSION BITLBEE_VERSION 39 39 #define BITLBEE_VER(a,b,c) (((a) << 16) + ((b) << 8) + (c)) 40 #define BITLBEE_VERSION_CODE BITLBEE_VER(1, 2, 6)40 #define BITLBEE_VERSION_CODE BITLBEE_VER(1, 2, 7) 41 41 42 42 #define MAX_STRING 511 -
debian/changelog
r7d53efb rba3233c 1 bitlbee (1.2.7-1) unstable; urgency=high 2 3 * New upstream version. 4 * Fixes MSN Messenger login issues, so uploading at high priority. 5 6 -- Wilmer van der Gaast <wilmer@gaast.net> Sat, 15 May 2010 16:15:57 +0100 7 1 8 bitlbee (1.2.6a-1) unstable; urgency=low 2 9 -
debian/control
r7d53efb rba3233c 15 15 Description: An IRC to other chat networks gateway 16 16 This program can be used as an IRC server which forwards everything you 17 say to people on other chat networks: Jabber, ICQ, AIM, MSN and Yahoo. 17 say to people on other chat networks: Jabber, ICQ, AIM, MSN, Yahoo! and 18 Twitter. 18 19 19 20 Package: bitlbee-dev … … 22 23 Description: An IRC to other chat networks gateway 23 24 This program can be used as an IRC server which forwards everything you 24 say to people on other chat networks: Jabber, ICQ, AIM, MSN and Yahoo. 25 say to people on other chat networks: Jabber, ICQ, AIM, MSN, Yahoo! and 26 Twitter. 25 27 . 26 28 This package holds development stuff for compiling plug-ins. -
debian/rules
r7d53efb rba3233c 99 99 find usr -type f -exec md5sum {} \; > DEBIAN/md5sums 100 100 101 ifdef BITLBEE_FORCE_VERSION 101 102 dpkg-gencontrol -ldebian/changelog -isp -pbitlbee-dev -Pdebian/bitlbee-dev -v1:$(BITLBEE_VERSION)-0 103 else 104 dpkg-gencontrol -ldebian/changelog -isp -pbitlbee-dev -Pdebian/bitlbee-dev 105 endif 102 106 103 107 dpkg --build debian/bitlbee-dev .. -
doc/CHANGES
r7d53efb rba3233c 3 3 4 4 http://bugs.bitlbee.org/bitlbee/timeline?daysback=90&changeset=on 5 6 Version 1.2.7: 7 - Fixed problems with MSN Messenger authentication. ("Could not parse 8 Passport server response") 9 - Fixed broken typing notifications when talking to GTalk contacts. 10 - Fixed an issue with non-anonymous Jabber chatrooms polluting the nick 11 namespace, sometimes generating odd warning messages. 12 - Restored ability to start groupchats on ICQ. 13 - Added show_offline setting that will also show offline contacts in the 14 control channel. 15 - OAuth support for Twitter: This means the module will keep working after 16 June (this also changes "via API" under your tweets into "via BitlBee"). 17 18 Finished 15 May 2010 5 19 6 20 Version 1.2.6a: -
doc/bitlbee.8
r7d53efb rba3233c 39 39 networks and acts as a gateway. Users can connect to the server 40 40 with any normal IRC client and see their 'buddy list' in 41 &bitlbee. BitlBee's protocol support is based on the gaim 42 protocol plugins. BitlBee currently supports Oscar (aim and icq), 43 MSN, Jabber and Yahoo. 41 &bitlbee. It currently supports Oscar (AIM and ICQ), 42 MSN, Jabber, Yahoo! and Twitter. 44 43 45 44 \fBbitlbee\fP should be called by -
doc/user-guide/commands.xml
r7d53efb rba3233c 620 620 621 621 <bitlbee-setting name="ignore_auth_requests" type="boolean" scope="account"> 622 <default> true</default>622 <default>false</default> 623 623 624 624 <description> -
doc/user-guide/quickstart.xml
r7d53efb rba3233c 3 3 4 4 <para> 5 Welcome to BitlBee, your IRC gateway to ICQ, MSN, AOL, Jabber and Yahoo Instant Messaging Systems.5 Welcome to BitlBee, your IRC gateway to ICQ, MSN, AOL, Jabber, Yahoo! and Twitter. 6 6 </para> 7 7 … … 43 43 44 44 <para> 45 Other available IM protocols are msn, oscar, and yahoo. OSCAR is the protocol used by ICQ and AOL. For more information about the <emphasis>account add</emphasis> command, see <emphasis>help account add</emphasis>.45 Other available IM protocols are msn, oscar, yahoo and twitter. OSCAR is the protocol used by ICQ and AOL. For more information about the <emphasis>account add</emphasis> command, see <emphasis>help account add</emphasis>. 46 46 </para> 47 47 -
irc_commands.c
r7d53efb rba3233c 73 73 static void irc_cmd_nick( irc_t *irc, char **cmd ) 74 74 { 75 if( irc->nick ) 76 { 77 irc_reply( irc, 438, ":The hand of the deity is upon thee, thy nick may not change" ); 75 if( irc->status & USTATUS_IDENTIFIED && irc->nick ) 76 { 77 irc_reply( irc, 438, "%s %s :You can only change your nick if you're not " 78 "logged in (i.e. pre-identify)", irc->nick, cmd[1] ); 78 79 } 79 80 /* This is not clean, but for now it'll have to be like this... */ 80 else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) )81 { 82 irc_reply( irc, 433, " :This nick is already in use");81 else if( ( nick_cmp( cmd[1], irc->mynick ) == 0 ) || ( nick_cmp( cmd[1], NS_NICK ) == 0 ) || ( user_find( irc, cmd[1] ) != NULL ) ) 82 { 83 irc_reply( irc, 433, "%s :This nick is already in use", cmd[1] ); 83 84 } 84 85 else if( !nick_ok( cmd[1] ) ) 85 86 { 86 87 /* [SH] Invalid characters. */ 87 irc_reply( irc, 432, ":This nick contains invalid characters" ); 88 irc_reply( irc, 432, "%s :This nick contains invalid characters", cmd[1] ); 89 } 90 else if(irc->nick) 91 { 92 if( user_find( irc, irc->nick ) ) 93 user_rename(irc, irc->nick, cmd[1]); 94 95 irc_write( irc, ":%s!%s@%s NICK %s", irc->nick, irc->user, irc->host, cmd[1] ); 96 g_free(irc->nick); 97 irc->nick = g_strdup( cmd[1] ); 88 98 } 89 99 else -
lib/misc.c
r7d53efb rba3233c 154 154 { 155 155 char *start = in; 156 char *out = g_malloc( strlen( in ) + 1 );156 char out[strlen(in)+1]; 157 157 char *s = out, *cs; 158 158 int i, matched; 159 159 160 memset( out, 0, s trlen( in ) + 1);160 memset( out, 0, sizeof( out ) ); 161 161 162 162 while( *in ) … … 220 220 221 221 strcpy( start, out ); 222 g_free( out );223 222 } 224 223 -
lib/xmltree.c
r7d53efb rba3233c 449 449 while( node ) 450 450 { 451 if( g_strcasecmp( node->name, name ) == 0 ) 451 char *colon; 452 453 if( g_strcasecmp( node->name, name ) == 0 || 454 ( ( colon = strchr( node->name, ':' ) ) && 455 g_strcasecmp( colon + 1, name ) == 0 ) ) 452 456 break; 453 457 … … 461 465 { 462 466 int i; 467 char *colon; 463 468 464 469 if( !node ) … … 468 473 if( g_strcasecmp( node->attr[i].key, key ) == 0 ) 469 474 break; 475 476 /* This is an awful hack that only takes care of namespace prefixes 477 inside a tag. Since IMHO excessive namespace usage in XMPP is 478 massive overkill anyway (this code exists for almost four years 479 now and never really missed it): Meh. */ 480 if( !node->attr[i].key && strcmp( key, "xmlns" ) == 0 && 481 ( colon = strchr( node->name, ':' ) ) ) 482 { 483 *colon = '\0'; 484 for( i = 0; node->attr[i].key; i ++ ) 485 if( strncmp( node->attr[i].key, "xmlns:", 6 ) == 0 && 486 strcmp( node->attr[i].key + 6, node->name ) == 0 ) 487 break; 488 *colon = ':'; 489 } 470 490 471 491 return node->attr[i].value; -
protocols/jabber/conference.c
r7d53efb rba3233c 272 272 } 273 273 274 if( bud != jc->me ) 275 { 274 if( bud != jc->me && bud->flags & JBFLAG_IS_ANONYMOUS ) 275 { 276 /* If JIDs are anonymized, add them to the local 277 list for the duration of this chat. */ 276 278 imcb_add_buddy( ic, bud->ext_jid, NULL ); 277 279 imcb_buddy_nick_hint( ic, bud->ext_jid, bud->resource ); -
protocols/jabber/iq.c
r7d53efb rba3233c 127 127 !( s = xt_find_attr( c, "xmlns" ) ) ) 128 128 { 129 imcb_log( ic, "Warning: Received incomplete IQ-%s packet", type );130 129 return XT_HANDLED; 131 130 } -
protocols/msn/passport.c
r7d53efb rba3233c 145 145 char *s; 146 146 147 if( ( s = xt_find_attr( node, "Id" ) ) && strcmp( s, "PPToken1" ) == 0 ) 147 if( ( s = xt_find_attr( node, "Id" ) ) && 148 ( strncmp( s, "Compact", 7 ) == 0 || 149 strncmp( s, "PPToken", 7 ) == 0 ) ) 148 150 mad->token = g_memdup( node->text, node->text_len + 1 ); 149 151 -
protocols/msn/sb.c
r7d53efb rba3233c 328 328 struct msn_data *md = ic->proto_data; 329 329 330 if( msn_handler( sb->handler ) == -1 ) 330 if( msn_handler( sb->handler ) != -1 ) 331 return TRUE; 332 333 if( sb->msgq != NULL ) 331 334 { 332 335 time_t now = time( NULL ); 336 char buf[1024]; 333 337 334 338 if( now - md->first_sb_failure > 600 ) … … 347 351 "There might be problems delivering your messages." ); 348 352 349 if( sb->msgq != NULL ) 350 { 351 char buf[1024]; 352 353 if( md->msgq == NULL ) 354 { 355 md->msgq = sb->msgq; 356 } 357 else 358 { 359 GSList *l; 360 361 for( l = md->msgq; l->next; l = l->next ); 362 l->next = sb->msgq; 363 } 364 sb->msgq = NULL; 365 366 debug( "Moved queued messages back to the main queue, creating a new switchboard to retry." ); 367 g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); 368 if( !msn_write( ic, buf, strlen( buf ) ) ) 369 return FALSE; 370 } 371 372 msn_sb_destroy( sb ); 373 374 return FALSE; 375 } 376 else 377 { 378 return TRUE; 379 } 353 if( md->msgq == NULL ) 354 { 355 md->msgq = sb->msgq; 356 } 357 else 358 { 359 GSList *l; 360 361 for( l = md->msgq; l->next; l = l->next ); 362 l->next = sb->msgq; 363 } 364 sb->msgq = NULL; 365 366 debug( "Moved queued messages back to the main queue, " 367 "creating a new switchboard to retry." ); 368 g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); 369 if( !msn_write( ic, buf, strlen( buf ) ) ) 370 return FALSE; 371 } 372 373 msn_sb_destroy( sb ); 374 return FALSE; 380 375 } 381 376 -
protocols/oscar/oscar.c
r7d53efb rba3233c 205 205 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); 206 206 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); 207 static int gaim_memrequest (aim_session_t *, aim_frame_t *, ...);208 207 static int gaim_selfinfo (aim_session_t *, aim_frame_t *, ...); 209 208 static int gaim_offlinemsg (aim_session_t *, aim_frame_t *, ...); … … 570 569 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ERROR, gaim_parse_genericerr, 0); 571 570 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BOS, AIM_CB_BOS_ERROR, gaim_parse_genericerr, 0); 572 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, 0x1f, gaim_memrequest, 0);573 571 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_SELFINFO, gaim_selfinfo, 0); 574 572 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSG, gaim_offlinemsg, 0); … … 604 602 } 605 603 606 struct pieceofcrap {607 struct im_connection *ic;608 unsigned long offset;609 unsigned long len;610 char *modname;611 int fd;612 aim_conn_t *conn;613 unsigned int inpa;614 };615 616 static gboolean damn_you(gpointer data, gint source, b_input_condition c)617 {618 struct pieceofcrap *pos = data;619 struct oscar_data *od = pos->ic->proto_data;620 char in = '\0';621 int x = 0;622 unsigned char m[17];623 624 while (read(pos->fd, &in, 1) == 1) {625 if (in == '\n')626 x++;627 else if (in != '\r')628 x = 0;629 if (x == 2)630 break;631 in = '\0';632 }633 if (in != '\n') {634 imcb_error(pos->ic, "Gaim was unable to get a valid hash for logging into AIM."635 " You may be disconnected shortly.");636 b_event_remove(pos->inpa);637 closesocket(pos->fd);638 g_free(pos);639 return FALSE;640 }641 /* [WvG] Wheeeee! Who needs error checking anyway? ;-) */642 read(pos->fd, m, 16);643 m[16] = '\0';644 b_event_remove(pos->inpa);645 closesocket(pos->fd);646 aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH);647 g_free(pos);648 649 return FALSE;650 }651 652 static gboolean straight_to_hell(gpointer data, gint source, b_input_condition cond) {653 struct pieceofcrap *pos = data;654 char buf[BUF_LONG];655 656 if (source < 0) {657 imcb_error(pos->ic, "Gaim was unable to get a valid hash for logging into AIM."658 " You may be disconnected shortly.");659 if (pos->modname)660 g_free(pos->modname);661 g_free(pos);662 return FALSE;663 }664 665 g_snprintf(buf, sizeof(buf), "GET " AIMHASHDATA666 "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n",667 pos->offset, pos->len, pos->modname ? pos->modname : "");668 write(pos->fd, buf, strlen(buf));669 if (pos->modname)670 g_free(pos->modname);671 pos->inpa = b_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos);672 return FALSE;673 }674 675 604 /* size of icbmui.ocm, the largest module in AIM 3.5 */ 676 605 #define AIM_MAX_FILE_SIZE 98304 677 678 int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) {679 va_list ap;680 struct pieceofcrap *pos;681 guint32 offset, len;682 char *modname;683 int fd;684 685 va_start(ap, fr);686 offset = (guint32)va_arg(ap, unsigned long);687 len = (guint32)va_arg(ap, unsigned long);688 modname = va_arg(ap, char *);689 va_end(ap);690 691 if (len == 0) {692 aim_sendmemblock(sess, fr->conn, offset, len, NULL,693 AIM_SENDMEMBLOCK_FLAG_ISREQUEST);694 return 1;695 }696 /* uncomment this when you're convinced it's right. remember, it's been wrong before.697 if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) {698 char *buf;699 int i = 8;700 if (modname)701 i += strlen(modname);702 buf = g_malloc(i);703 i = 0;704 if (modname) {705 memcpy(buf, modname, strlen(modname));706 i += strlen(modname);707 }708 buf[i++] = offset & 0xff;709 buf[i++] = (offset >> 8) & 0xff;710 buf[i++] = (offset >> 16) & 0xff;711 buf[i++] = (offset >> 24) & 0xff;712 buf[i++] = len & 0xff;713 buf[i++] = (len >> 8) & 0xff;714 buf[i++] = (len >> 16) & 0xff;715 buf[i++] = (len >> 24) & 0xff;716 aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST);717 g_free(buf);718 return 1;719 }720 */721 722 pos = g_new0(struct pieceofcrap, 1);723 pos->ic = sess->aux_data;724 pos->conn = fr->conn;725 726 pos->offset = offset;727 pos->len = len;728 pos->modname = modname ? g_strdup(modname) : NULL;729 730 fd = proxy_connect("gaim.sourceforge.net", 80, straight_to_hell, pos);731 if (fd < 0) {732 if (pos->modname)733 g_free(pos->modname);734 g_free(pos);735 imcb_error(sess->aux_data, "Gaim was unable to get a valid hash for logging into AIM."736 " You may be disconnected shortly.");737 }738 pos->fd = fd;739 740 return 1;741 }742 606 743 607 static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) { … … 1166 1030 m = g_list_append(m, exch); 1167 1031 1168 g_snprintf( txt, 1024, "Got an invitation to chatroom %s from %s: %s", name, userinfo->sn, args->msg);1032 g_snprintf(txt, 1024, "Got an invitation to chatroom %s from %s: %s", name, userinfo->sn, args->msg); 1169 1033 1170 1034 inv->ic = ic; … … 1172 1036 inv->name = g_strdup(name); 1173 1037 1174 imcb_ask( 1038 imcb_ask(ic, txt, inv, oscar_accept_chat, oscar_reject_chat); 1175 1039 1176 1040 if (name) 1177 1041 g_free(name); 1042 } else if (args->reqclass & AIM_CAPS_ICQRTF) { 1043 // TODO: constify 1044 char text[strlen(args->info.rtfmsg.rtfmsg)+1]; 1045 strncpy(text, args->info.rtfmsg.rtfmsg, sizeof(text)); 1046 imcb_buddy_msg(ic, normalize(userinfo->sn), text, 0, 0); 1178 1047 } 1179 1048 … … 2651 2520 char * chatname; 2652 2521 2653 chatname = g_strdup_printf("%s%d", ic->acc->user, chat_id++); 2522 chatname = g_strdup_printf("%s%s_%d", isdigit(*ic->acc->user) ? "icq_" : "", 2523 ic->acc->user, chat_id++); 2654 2524 2655 2525 ret = oscar_chat_join(ic, chatname, NULL, NULL); -
protocols/twitter/twitter.c
r7d53efb rba3233c 27 27 #include "twitter_http.h" 28 28 #include "twitter_lib.h" 29 #include "url.h" 29 30 30 31 /** … … 70 71 "http://api.twitter.com/oauth/request_token", 71 72 "http://api.twitter.com/oauth/access_token", 72 "http ://api.twitter.com/oauth/authorize",73 "https://api.twitter.com/oauth/authorize", 73 74 .consumer_key = "xsDNKJuNZYkZyMcu914uEA", 74 75 .consumer_secret = "FCxqcr0pXKzsF9ajmP57S3VQ8V6Drk4o2QYtqMcOszo", … … 160 161 set_t *s; 161 162 163 s = set_add( &acc->set, "base_url", TWITTER_API_URL, NULL, acc ); 164 s->flags |= ACC_SET_OFFLINE_ONLY; 165 162 166 s = set_add( &acc->set, "message_length", "140", set_eval_int, acc ); 163 167 … … 175 179 { 176 180 struct im_connection *ic = imcb_new( acc ); 177 struct twitter_data *td = g_new0( struct twitter_data, 1 );181 struct twitter_data *td; 178 182 char name[strlen(acc->user)+9]; 179 183 url_t url; 184 185 if( !url_set( &url, set_getstr( &ic->acc->set, "base_url" ) ) || 186 ( url.proto != PROTO_HTTP && url.proto != PROTO_HTTPS ) ) 187 { 188 imcb_error( ic, "Incorrect API base URL: %s", set_getstr( &ic->acc->set, "base_url" ) ); 189 imc_logout( ic, FALSE ); 190 return; 191 } 192 180 193 twitter_connections = g_slist_append( twitter_connections, ic ); 194 td = g_new0( struct twitter_data, 1 ); 181 195 ic->proto_data = td; 182 ic->flags |= OPT_DOES_HTML; 196 197 td->url_ssl = url.proto == PROTO_HTTPS; 198 td->url_port = url.port; 199 td->url_host = g_strdup( url.host ); 200 if( strcmp( url.file, "/" ) != 0 ) 201 td->url_path = g_strdup( url.file ); 202 else 203 td->url_path = g_strdup( "" ); 183 204 184 205 td->user = acc->user; 185 if( !set_getbool( &acc->set, "oauth" ) ) 186 td->pass = g_strdup( acc->pass ); 187 else if( strstr( acc->pass, "oauth_token=" ) ) 206 if( strstr( acc->pass, "oauth_token=" ) ) 188 207 td->oauth_info = oauth_from_string( acc->pass, &twitter_oauth ); 189 td->home_timeline_id = 0;190 208 191 209 sprintf( name, "twitter_%s", acc->user ); … … 193 211 imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL ); 194 212 195 if( td-> pass || td->oauth_info)213 if( td->oauth_info || !set_getbool( &acc->set, "oauth" ) ) 196 214 twitter_main_loop_start( ic ); 197 215 else -
protocols/twitter/twitter.h
r7d53efb rba3233c 42 42 struct groupchat *home_timeline_gc; 43 43 gint http_fails; 44 45 gboolean url_ssl; 46 int url_port; 47 char *url_host; 48 char *url_path; 44 49 }; 45 50 -
protocols/twitter/twitter_http.c
r7d53efb rba3233c 41 41 42 42 43 char *twitter_url_append(char *url, char *key, char* value);43 static char *twitter_url_append(char *url, char *key, char* value); 44 44 45 45 /** … … 47 47 * This is actually pretty generic function... Perhaps it should move to the lib/http_client.c 48 48 */ 49 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)49 void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, gpointer data, int is_post, char** arguments, int arguments_len) 50 50 { 51 url_t *url = g_new0( url_t, 1 );51 struct twitter_data *td = ic->proto_data; 52 52 char *tmp; 53 char *request;53 GString *request = g_string_new(""); 54 54 void *ret; 55 char *userpass = NULL;56 char *userpass_base64;57 55 char *url_arguments; 58 56 59 // Fill the url structure. 60 if( !url_set( url, url_string ) ) 61 { 62 g_free( url ); 63 return NULL; 64 } 65 66 if( url->proto != PROTO_HTTP && url->proto != PROTO_HTTPS ) 67 { 68 g_free( url ); 69 return NULL; 70 } 71 72 // Concatenate user and pass 73 if (user && pass) { 74 userpass = g_strdup_printf("%s:%s", user, pass); 75 userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass)); 76 } else { 77 userpass_base64 = NULL; 78 } 79 80 url_arguments = g_malloc(1); 81 url_arguments[0] = '\0'; 57 url_arguments = g_strdup(""); 82 58 83 59 // Construct the url arguments. … … 93 69 } 94 70 95 // Do GET stuff...96 if (!is_post)97 {98 // Find the char-pointer of the end of the string.99 tmp = url->file + strlen(url->file);100 tmp[0] = '?';101 // append the url_arguments to the end of the url->file.102 // TODO GM: Check the length?103 g_stpcpy (tmp+1, url_arguments);104 }105 106 107 71 // Make the request. 108 request = g_strdup_printf( "%s %s HTTP/1.0\r\n" 109 "Host: %s\r\n" 110 "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n", 111 is_post ? "POST" : "GET", url->file, url->host ); 72 g_string_printf(request, "%s %s%s%s%s HTTP/1.0\r\n" 73 "Host: %s\r\n" 74 "User-Agent: BitlBee " BITLBEE_VERSION " " ARCH "/" CPU "\r\n", 75 is_post ? "POST" : "GET", 76 td->url_path, url_string, 77 is_post ? "" : "?", is_post ? "" : url_arguments, 78 td->url_host); 112 79 113 80 // If a pass and user are given we append them to the request. 114 if ( oi)81 if (td->oauth_info) 115 82 { 116 83 char *full_header; 84 char *full_url; 117 85 118 full_header = oauth_http_header(oi, is_post ? "POST" : "GET", 119 url_string, url_arguments); 86 full_url = g_strconcat(set_getstr(&ic->acc->set, "base_url" ), url_string, NULL); 87 full_header = oauth_http_header(td->oauth_info, is_post ? "POST" : "GET", 88 full_url, url_arguments); 120 89 121 tmp = g_strdup_printf("%sAuthorization: %s\r\n", request, full_header); 122 g_free(request); 90 g_string_append_printf(request, "Authorization: %s\r\n", full_header); 123 91 g_free(full_header); 124 request = tmp;92 g_free(full_url); 125 93 } 126 else if (userpass_base64)94 else 127 95 { 128 tmp = g_strdup_printf("%sAuthorization: Basic %s\r\n", request, userpass_base64); 129 g_free(request); 130 request = tmp; 96 char userpass[strlen(ic->acc->user)+2+strlen(ic->acc->pass)]; 97 char *userpass_base64; 98 99 g_snprintf(userpass, sizeof(userpass), "%s:%s", ic->acc->user, ic->acc->pass); 100 userpass_base64 = base64_encode((unsigned char*)userpass, strlen(userpass)); 101 g_string_append_printf(request, "Authorization: Basic %s\r\n", userpass_base64); 102 g_free( userpass_base64 ); 131 103 } 132 104 … … 135 107 { 136 108 // Append the Content-Type and url-encoded arguments. 137 tmp = g_strdup_printf("%sContent-Type: application/x-www-form-urlencoded\r\nContent-Length: %zd\r\n\r\n%s",138 request, strlen(url_arguments), url_arguments);139 g_free(request);140 request = tmp;109 g_string_append_printf(request, 110 "Content-Type: application/x-www-form-urlencoded\r\n" 111 "Content-Length: %zd\r\n\r\n%s", 112 strlen(url_arguments), url_arguments); 141 113 } else { 142 114 // Append an extra \r\n to end the request... 143 tmp = g_strdup_printf("%s\r\n", request); 144 g_free(request); 145 request = tmp; 115 g_string_append(request, "\r\n"); 146 116 } 147 117 148 ret = http_dorequest( url->host, url->port, url->proto == PROTO_HTTPS, request, func, data);118 ret = http_dorequest(td->url_host, td->url_port, td->url_ssl, request->str, func, data); 149 119 150 g_free( url );151 g_free( userpass );152 g_free( userpass_base64 );153 120 g_free( url_arguments ); 154 g_ free( request);121 g_string_free( request, TRUE ); 155 122 return ret; 156 123 } 157 124 158 char *twitter_url_append(char *url, char *key, char* value)125 static char *twitter_url_append(char *url, char *key, char* value) 159 126 { 160 127 char *key_encoded = g_strndup(key, 3 * strlen(key)); -
protocols/twitter/twitter_http.h
r7d53efb rba3233c 30 30 struct oauth_info; 31 31 32 void *twitter_http( char *url_string, http_input_function func, gpointer data, int is_post,33 char* user, char* pass, struct oauth_info *oi, char** arguments, int arguments_len);32 void *twitter_http(struct im_connection *ic, char *url_string, http_input_function func, 33 gpointer data, int is_post, char** arguments, int arguments_len); 34 34 35 35 #endif //_TWITTER_HTTP_H -
protocols/twitter/twitter_lib.c
r7d53efb rba3233c 117 117 } 118 118 119 /* Warning: May return a malloc()ed value, which will be free()d on the next 120 call. Only for short-term use. */ 121 static char *twitter_parse_error(struct http_request *req) 122 { 123 static char *ret = NULL; 124 struct xt_parser *xp = NULL; 125 struct xt_node *node; 126 127 g_free(ret); 128 ret = NULL; 129 130 if (req->body_size > 0) 131 { 132 xp = xt_new(NULL, NULL); 133 xt_feed(xp, req->reply_body, req->body_size); 134 135 if ((node = xt_find_node(xp->root, "hash")) && 136 (node = xt_find_node(node->children, "error")) && 137 node->text_len > 0) 138 { 139 ret = g_strdup_printf("%s (%s)", req->status_string, node->text); 140 xt_free(xp); 141 return ret; 142 } 143 144 xt_free(xp); 145 } 146 147 return req->status_string; 148 } 149 119 150 static void twitter_http_get_friends_ids(struct http_request *req); 120 151 … … 124 155 void twitter_get_friends_ids(struct im_connection *ic, int next_cursor) 125 156 { 126 struct twitter_data *td = ic->proto_data;127 128 157 // Primitive, but hey! It works... 129 158 char* args[2]; 130 159 args[0] = "cursor"; 131 160 args[1] = g_strdup_printf ("%d", next_cursor); 132 twitter_http( TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, td->user, td->pass, td->oauth_info, args, 2);161 twitter_http(ic, TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, args, 2); 133 162 134 163 g_free(args[1]); … … 196 225 // It didn't go well, output the error and return. 197 226 if (++td->http_fails >= 5) 198 imcb_error(ic, "Could not retrieve friends . HTTP STATUS: %d", req->status_code);227 imcb_error(ic, "Could not retrieve friends: %s", twitter_parse_error(req)); 199 228 200 229 return; … … 396 425 } 397 426 398 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);427 twitter_http(ic, TWITTER_HOME_TIMELINE_URL, twitter_http_get_home_timeline, ic, 0, args, td->home_timeline_id ? 4 : 2); 399 428 400 429 g_free(args[1]); … … 434 463 twitter_add_buddy(ic, status->user->screen_name, status->user->name); 435 464 465 strip_html(status->text); 466 436 467 // Say it! 437 468 if (g_strcasecmp(td->user, status->user->screen_name) == 0) … … 471 502 status = l->data; 472 503 504 strip_html( status->text ); 473 505 if( mode_one ) 474 506 text = g_strdup_printf( "\002<\002%s\002>\002 %s", … … 523 555 // It didn't go well, output the error and return. 524 556 if (++td->http_fails >= 5) 525 imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL " . HTTP STATUS: %d", req->status_code);557 imcb_error(ic, "Could not retrieve " TWITTER_HOME_TIMELINE_URL ": %s", twitter_parse_error(req)); 526 558 527 559 return; … … 575 607 // It didn't go well, output the error and return. 576 608 if (++td->http_fails >= 5) 577 imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL " HTTP STATUS: %d", req->status_code);609 imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL ": %s", twitter_parse_error(req)); 578 610 579 611 return; … … 614 646 void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor) 615 647 { 616 struct twitter_data *td = ic->proto_data;617 618 648 char* args[2]; 619 649 args[0] = "cursor"; 620 650 args[1] = g_strdup_printf ("%d", next_cursor); 621 651 622 twitter_http( TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, td->user, td->pass, td->oauth_info, args, 2);652 twitter_http(ic, TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, args, 2); 623 653 624 654 g_free(args[1]); … … 639 669 if (req->status_code != 200) { 640 670 // It didn't go well, output the error and return. 641 imcb_error(ic, "HTTP Error... STATUS: %d", req->status_code);671 imcb_error(ic, "HTTP error: %s", twitter_parse_error(req)); 642 672 return; 643 673 } … … 649 679 void twitter_post_status(struct im_connection *ic, char* msg) 650 680 { 651 struct twitter_data *td = ic->proto_data;652 653 681 char* args[2]; 654 682 args[0] = "status"; 655 683 args[1] = msg; 656 twitter_http( TWITTER_STATUS_UPDATE_URL, twitter_http_post, ic, 1, td->user, td->pass, td->oauth_info, args, 2);684 twitter_http(ic, TWITTER_STATUS_UPDATE_URL, twitter_http_post, ic, 1, args, 2); 657 685 // g_free(args[1]); 658 686 } … … 664 692 void twitter_direct_messages_new(struct im_connection *ic, char *who, char *msg) 665 693 { 666 struct twitter_data *td = ic->proto_data;667 668 694 char* args[4]; 669 695 args[0] = "screen_name"; … … 672 698 args[3] = msg; 673 699 // Use the same callback as for twitter_post_status, since it does basically the same. 674 twitter_http( TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post, ic, 1, td->user, td->pass, td->oauth_info, args, 4);700 twitter_http(ic, TWITTER_DIRECT_MESSAGES_NEW_URL, twitter_http_post, ic, 1, args, 4); 675 701 // g_free(args[1]); 676 702 // g_free(args[3]); … … 679 705 void twitter_friendships_create_destroy(struct im_connection *ic, char *who, int create) 680 706 { 681 struct twitter_data *td = ic->proto_data;682 683 707 char* args[2]; 684 708 args[0] = "screen_name"; 685 709 args[1] = who; 686 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); 687 } 688 689 690 710 twitter_http(ic, create ? TWITTER_FRIENDSHIPS_CREATE_URL : TWITTER_FRIENDSHIPS_DESTROY_URL, twitter_http_post, ic, 1, args, 2); 711 } -
protocols/twitter/twitter_lib.h
r7d53efb rba3233c 32 32 33 33 /* Status URLs */ 34 #define TWITTER_STATUS_UPDATE_URL TWITTER_API_URL"/statuses/update.xml"35 #define TWITTER_STATUS_SHOW_URL TWITTER_API_URL"/statuses/show/"36 #define TWITTER_STATUS_DESTROY_URL TWITTER_API_URL"/statuses/destroy/"34 #define TWITTER_STATUS_UPDATE_URL "/statuses/update.xml" 35 #define TWITTER_STATUS_SHOW_URL "/statuses/show/" 36 #define TWITTER_STATUS_DESTROY_URL "/statuses/destroy/" 37 37 38 38 /* Timeline URLs */ 39 #define TWITTER_PUBLIC_TIMELINE_URL TWITTER_API_URL"/statuses/public_timeline.xml"40 #define TWITTER_FEATURED_USERS_URL TWITTER_API_URL"/statuses/featured.xml"41 #define TWITTER_FRIENDS_TIMELINE_URL TWITTER_API_URL"/statuses/friends_timeline.xml"42 #define TWITTER_HOME_TIMELINE_URL TWITTER_API_URL"/statuses/home_timeline.xml"43 #define TWITTER_MENTIONS_URL TWITTER_API_URL"/statuses/mentions.xml"44 #define TWITTER_USER_TIMELINE_URL TWITTER_API_URL"/statuses/user_timeline.xml"39 #define TWITTER_PUBLIC_TIMELINE_URL "/statuses/public_timeline.xml" 40 #define TWITTER_FEATURED_USERS_URL "/statuses/featured.xml" 41 #define TWITTER_FRIENDS_TIMELINE_URL "/statuses/friends_timeline.xml" 42 #define TWITTER_HOME_TIMELINE_URL "/statuses/home_timeline.xml" 43 #define TWITTER_MENTIONS_URL "/statuses/mentions.xml" 44 #define TWITTER_USER_TIMELINE_URL "/statuses/user_timeline.xml" 45 45 46 46 /* Users URLs */ 47 #define TWITTER_SHOW_USERS_URL TWITTER_API_URL"/users/show.xml"48 #define TWITTER_SHOW_FRIENDS_URL TWITTER_API_URL"/statuses/friends.xml"49 #define TWITTER_SHOW_FOLLOWERS_URL TWITTER_API_URL"/statuses/followers.xml"47 #define TWITTER_SHOW_USERS_URL "/users/show.xml" 48 #define TWITTER_SHOW_FRIENDS_URL "/statuses/friends.xml" 49 #define TWITTER_SHOW_FOLLOWERS_URL "/statuses/followers.xml" 50 50 51 51 /* Direct messages URLs */ 52 #define TWITTER_DIRECT_MESSAGES_URL TWITTER_API_URL"/direct_messages.xml"53 #define TWITTER_DIRECT_MESSAGES_NEW_URL TWITTER_API_URL"/direct_messages/new.xml"54 #define TWITTER_DIRECT_MESSAGES_SENT_URL TWITTER_API_URL"/direct_messages/sent.xml"55 #define TWITTER_DIRECT_MESSAGES_DESTROY_URL TWITTER_API_URL"/direct_messages/destroy/"52 #define TWITTER_DIRECT_MESSAGES_URL "/direct_messages.xml" 53 #define TWITTER_DIRECT_MESSAGES_NEW_URL "/direct_messages/new.xml" 54 #define TWITTER_DIRECT_MESSAGES_SENT_URL "/direct_messages/sent.xml" 55 #define TWITTER_DIRECT_MESSAGES_DESTROY_URL "/direct_messages/destroy/" 56 56 57 57 /* Friendships URLs */ 58 #define TWITTER_FRIENDSHIPS_CREATE_URL TWITTER_API_URL"/friendships/create.xml"59 #define TWITTER_FRIENDSHIPS_DESTROY_URL TWITTER_API_URL"/friendships/destroy.xml"60 #define TWITTER_FRIENDSHIPS_SHOW_URL TWITTER_API_URL"/friendships/show.xml"58 #define TWITTER_FRIENDSHIPS_CREATE_URL "/friendships/create.xml" 59 #define TWITTER_FRIENDSHIPS_DESTROY_URL "/friendships/destroy.xml" 60 #define TWITTER_FRIENDSHIPS_SHOW_URL "/friendships/show.xml" 61 61 62 62 /* Social graphs URLs */ 63 #define TWITTER_FRIENDS_IDS_URL TWITTER_API_URL"/friends/ids.xml"64 #define TWITTER_FOLLOWERS_IDS_URL TWITTER_API_URL"/followers/ids.xml"63 #define TWITTER_FRIENDS_IDS_URL "/friends/ids.xml" 64 #define TWITTER_FOLLOWERS_IDS_URL "/followers/ids.xml" 65 65 66 66 /* Account URLs */ 67 #define TWITTER_ACCOUNT_RATE_LIMIT_URL TWITTER_API_URL"/account/rate_limit_status.xml"67 #define TWITTER_ACCOUNT_RATE_LIMIT_URL "/account/rate_limit_status.xml" 68 68 69 69 /* Favorites URLs */ 70 #define TWITTER_FAVORITES_GET_URL TWITTER_API_URL"/favorites.xml"71 #define TWITTER_FAVORITE_CREATE_URL TWITTER_API_URL"/favorites/create/"72 #define TWITTER_FAVORITE_DESTROY_URL TWITTER_API_URL"/favorites/destroy/"70 #define TWITTER_FAVORITES_GET_URL "/favorites.xml" 71 #define TWITTER_FAVORITE_CREATE_URL "/favorites/create/" 72 #define TWITTER_FAVORITE_DESTROY_URL "/favorites/destroy/" 73 73 74 74 /* Block URLs */ 75 #define TWITTER_BLOCKS_CREATE_URL TWITTER_API_URL"/blocks/create/"76 #define TWITTER_BLOCKS_DESTROY_URL TWITTER_API_URL"/blocks/destroy/"75 #define TWITTER_BLOCKS_CREATE_URL "/blocks/create/" 76 #define TWITTER_BLOCKS_DESTROY_URL "/blocks/destroy/" 77 77 78 78 void twitter_get_friends_ids(struct im_connection *ic, int next_cursor); -
protocols/yahoo/yahoo.c
r7d53efb rba3233c 138 138 struct im_connection *ic = imcb_new( acc ); 139 139 struct byahoo_data *yd = ic->proto_data = g_new0( struct byahoo_data, 1 ); 140 char *s; 140 141 141 142 yd->logged_in = FALSE; 142 143 yd->current_status = YAHOO_STATUS_AVAILABLE; 144 145 if( ( s = strchr( acc->user, '@' ) ) && g_strcasecmp( s, "@yahoo.com" ) == 0 ) 146 imcb_error( ic, "Your Yahoo! username should just be a username. " 147 "Do not include any @domain part." ); 143 148 144 149 imcb_log( ic, "Connecting" ); … … 828 833 YList *m; 829 834 835 if( g_strcasecmp( who, ic->acc->user ) == 0 ) 836 /* WTF, Yahoo! seems to echo these now? */ 837 return; 838 830 839 inv = g_malloc( sizeof( struct byahoo_conf_invitation ) ); 831 840 memset( inv, 0, sizeof( struct byahoo_conf_invitation ) );
Note: See TracChangeset
for help on using the changeset viewer.