Changes in / [eb6df6a:3759849]
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
bitlbee.h
reb6df6a r3759849 38 38 39 39 #define PACKAGE "BitlBee" 40 #define BITLBEE_VERSION "1.2. 8"40 #define BITLBEE_VERSION "1.2.7" 41 41 #define VERSION BITLBEE_VERSION 42 42 #define BITLBEE_VER(a,b,c) (((a) << 16) + ((b) << 8) + (c)) 43 #define BITLBEE_VERSION_CODE BITLBEE_VER(1, 2, 8)43 #define BITLBEE_VERSION_CODE BITLBEE_VER(1, 2, 7) 44 44 45 45 #define MAX_STRING 511 -
doc/CHANGES
reb6df6a r3759849 3 3 4 4 http://bugs.bitlbee.org/bitlbee/timeline?daysback=90&changeset=on 5 6 Version 1.2.8:7 - Now always using the AIM-style authentication method for OSCAR connections,8 even when connecting to ICQ. This solves login issues some people were9 having. (If you have problems, try changing the old_icq_auth setting.)10 - Twitter:11 * Allow changing the Twitter API base URL so the module can also be used12 for identi.ca or any other compatible network.13 * Fetch the full list of Twitter contacts instead of slowly adding all14 contacts as they post a message.15 * Fixed message length counting.16 * Allow following/unfollowing people using the usual add/remove commands.17 * Better error reporting.18 - Added a user_agent setting to the Jabber module to get around artificial19 client restrictions.20 - Allow nick changes (although only before register/identify).21 - Some more minor bugfixes/etc.22 23 Finished 4 Jul 201024 5 25 6 Version 1.2.7: -
doc/user-guide/commands.xml
reb6df6a r3759849 633 633 </bitlbee-setting> 634 634 635 <bitlbee-setting name="base_url" type="string" scope="account">636 <default>http://twitter.com</default>637 638 <description>639 <para>640 There are more services that understand the Twitter API than just Twitter.com. BitlBee can connect to all Twitter API implementations.641 </para>642 643 <para>644 For example, set this setting to <emphasis>http://identi.ca/api</emphasis> to use Identi.ca.645 </para>646 647 <para>648 Keep two things in mind: When not using Twitter, you <emphasis>must</emphasis> also disable the <emphasis>oauth</emphasis> setting as it currently only works with Twitter. If you're still having issues, make sure there is <emphasis>no</emphasis> slash at the end of the URL you enter here.649 </para>650 </description>651 </bitlbee-setting>652 653 635 <bitlbee-setting name="buddy_sendbuffer" type="boolean" scope="global"> 654 636 <default>false</default> … … 1249 1231 </bitlbee-setting> 1250 1232 1251 <bitlbee-setting name="user_agent" type="string" scope="account">1252 <default>BitlBee</default>1253 1254 <description>1255 <para>1256 Some Jabber servers are configured to only allow a few (or even just one) kinds of XMPP clients to connect to them.1257 </para>1258 1259 <para>1260 You can change this setting to make BitlBee present itself as a different client, so that you can still connect to these servers.1261 </para>1262 </description>1263 </bitlbee-setting>1264 1265 1233 <bitlbee-setting name="voice_buddies" type="string" scope="global"> 1266 1234 <default>notaway</default> … … 1276 1244 </para> 1277 1245 </description> 1246 1278 1247 </bitlbee-setting> 1279 1248 -
protocols/jabber/iq.c
reb6df6a r3759849 65 65 if( strcmp( s, XMLNS_VERSION ) == 0 ) 66 66 { 67 xt_add_child( reply, xt_new_node( "name", set_getstr( &ic->acc->set, "user_agent" ), NULL ) );67 xt_add_child( reply, xt_new_node( "name", "BitlBee", NULL ) ); 68 68 xt_add_child( reply, xt_new_node( "version", BITLBEE_VERSION, NULL ) ); 69 69 xt_add_child( reply, xt_new_node( "os", ARCH, NULL ) ); … … 105 105 xt_add_attr( c, "category", "client" ); 106 106 xt_add_attr( c, "type", "pc" ); 107 xt_add_attr( c, "name", set_getstr( &ic->acc->set, "user_agent" ));107 xt_add_attr( c, "name", "BitlBee" ); 108 108 xt_add_child( reply, c ); 109 109 -
protocols/jabber/jabber.c
reb6df6a r3759849 79 79 s = set_add( &acc->set, "tls", "try", set_eval_tls, acc ); 80 80 s->flags |= ACC_SET_OFFLINE_ONLY; 81 82 s = set_add( &acc->set, "user_agent", "BitlBee", NULL, acc );83 81 84 82 s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc ); … … 288 286 g_hash_table_destroy( jd->node_cache ); 289 287 290 jabber_buddy_remove_all( ic );291 292 288 xt_free( jd->xt ); 293 289 … … 474 470 { 475 471 /* Just any whitespace character is enough as a keepalive for XMPP sessions. */ 476 if( !jabber_write( ic, "\n", 1 ) ) 477 return; 472 jabber_write( ic, "\n", 1 ); 478 473 479 474 /* This runs the garbage collection every minute, which means every packet -
protocols/jabber/jabber.h
reb6df6a r3759849 230 230 int jabber_buddy_remove( struct im_connection *ic, char *full_jid ); 231 231 int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid ); 232 void jabber_buddy_remove_all( struct im_connection *ic );233 232 time_t jabber_get_timestamp( struct xt_node *xt ); 234 233 struct jabber_error *jabber_error_parse( struct xt_node *node, char *xmlns ); -
protocols/jabber/jabber_util.c
reb6df6a r3759849 665 665 } 666 666 667 static gboolean jabber_buddy_remove_all_cb( gpointer key, gpointer value, gpointer data )668 {669 struct jabber_buddy *bud, *next;670 671 bud = value;672 while( bud )673 {674 next = bud->next;675 g_free( bud->ext_jid );676 g_free( bud->full_jid );677 g_free( bud->away_message );678 g_free( bud );679 bud = next;680 }681 682 return TRUE;683 }684 685 void jabber_buddy_remove_all( struct im_connection *ic )686 {687 struct jabber_data *jd = ic->proto_data;688 689 g_hash_table_foreach_remove( jd->buddies, jabber_buddy_remove_all_cb, NULL );690 g_hash_table_destroy( jd->buddies );691 }692 693 667 time_t jabber_get_timestamp( struct xt_node *xt ) 694 668 { -
protocols/jabber/message.c
reb6df6a r3759849 55 55 struct xt_node *inv, *reason; 56 56 57 if( ns &&strcmp( ns, XMLNS_MUC_USER ) == 0 &&57 if( strcmp( ns, XMLNS_MUC_USER ) == 0 && 58 58 ( inv = xt_find_node( c->children, "invite" ) ) ) 59 59 { -
protocols/twitter/twitter.c
reb6df6a r3759849 40 40 return 0; 41 41 42 // If the user uses multiple private message windows we need to get the 43 // users buddies. 44 if (g_strcasecmp(set_getstr(&ic->acc->set, "mode"), "many") == 0) 45 twitter_get_statuses_friends(ic, -1); 46 42 47 // Do stuff.. 43 48 twitter_get_home_timeline(ic, -1); … … 51 56 struct twitter_data *td = ic->proto_data; 52 57 53 imcb_log( ic, " Getting initial statuses" );58 imcb_log( ic, "Connecting to Twitter" ); 54 59 55 60 // Run this once. After this queue the main loop function. … … 61 66 } 62 67 63 static void twitter_oauth_start( struct im_connection *ic );64 65 void twitter_login_finish( struct im_connection *ic )66 {67 struct twitter_data *td = ic->proto_data;68 69 if( set_getbool( &ic->acc->set, "oauth" ) && !td->oauth_info )70 twitter_oauth_start( ic );71 else if( g_strcasecmp( set_getstr( &ic->acc->set, "mode" ), "one" ) != 0 &&72 !( td->flags & TWITTER_HAVE_FRIENDS ) )73 {74 imcb_log( ic, "Getting contact list" );75 twitter_get_statuses_friends( ic, -1 );76 }77 else78 twitter_main_loop_start( ic );79 }80 68 81 69 static const struct oauth_service twitter_oauth = … … 140 128 ic->acc->pass = oauth_to_string( info ); 141 129 142 twitter_ login_finish( ic );130 twitter_main_loop_start( ic ); 143 131 } 144 132 … … 223 211 imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL ); 224 212 225 imcb_log( ic, "Connecting" ); 226 227 twitter_login_finish( ic ); 213 if( td->oauth_info || !set_getbool( &acc->set, "oauth" ) ) 214 twitter_main_loop_start( ic ); 215 else 216 twitter_oauth_start( ic ); 228 217 } 229 218 … … 247 236 { 248 237 oauth_info_free( td->oauth_info ); 249 g_free( td->url_host );250 g_free( td->url_path );251 238 g_free( td->pass ); 252 239 g_free( td ); … … 269 256 td->oauth_info && td->oauth_info->token == NULL ) 270 257 { 271 char pin[strlen(message)+1], *s; 272 273 strcpy( pin, message ); 274 for( s = pin + sizeof( pin ) - 2; s > pin && isspace( *s ); s -- ) 275 *s = '\0'; 276 for( s = pin; *s && isspace( *s ); s ++ ) {} 277 278 if( !oauth_access_token( s, td->oauth_info ) ) 258 if( !oauth_access_token( message, td->oauth_info ) ) 279 259 { 280 260 imcb_error( ic, "OAuth error: %s", "Failed to send access token request" ); -
protocols/twitter/twitter.h
reb6df6a r3759849 33 33 #endif 34 34 35 typedef enum36 {37 TWITTER_HAVE_FRIENDS = 1,38 } twitter_flags_t;39 40 35 struct twitter_data 41 36 { … … 47 42 struct groupchat *home_timeline_gc; 48 43 gint http_fails; 49 twitter_flags_t flags;50 44 51 45 gboolean url_ssl; … … 62 56 GSList *twitter_connections; 63 57 64 void twitter_login_finish( struct im_connection *ic );65 66 58 #endif //_TWITTER_H -
protocols/twitter/twitter_lib.c
reb6df6a r3759849 42 42 struct twitter_xml_list { 43 43 int type; 44 gint64next_cursor;44 int next_cursor; 45 45 GSList *list; 46 46 gpointer data; … … 58 58 guint64 id; 59 59 }; 60 61 static void twitter_groupchat_init(struct im_connection *ic);62 60 63 61 /** … … 155 153 * Get the friends ids. 156 154 */ 157 void twitter_get_friends_ids(struct im_connection *ic, gint64next_cursor)155 void twitter_get_friends_ids(struct im_connection *ic, int next_cursor) 158 156 { 159 157 // Primitive, but hey! It works... 160 158 char* args[2]; 161 159 args[0] = "cursor"; 162 args[1] = g_strdup_printf ("% lld", (long long)next_cursor);160 args[1] = g_strdup_printf ("%d", next_cursor); 163 161 twitter_http(ic, TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, args, 2); 164 162 … … 171 169 static xt_status twitter_xt_next_cursor( struct xt_node *node, struct twitter_xml_list *txl ) 172 170 { 173 char *end = NULL; 174 175 if( node->text ) 176 txl->next_cursor = g_ascii_strtoll( node->text, &end, 10 ); 177 if( end == NULL ) 178 txl->next_cursor = -1; 171 // Do something with the cursor. 172 txl->next_cursor = node->text != NULL ? atoi(node->text) : -1; 179 173 180 174 return XT_HANDLED; … … 419 413 * Get the timeline. 420 414 */ 421 void twitter_get_home_timeline(struct im_connection *ic, gint64next_cursor)415 void twitter_get_home_timeline(struct im_connection *ic, int next_cursor) 422 416 { 423 417 struct twitter_data *td = ic->proto_data; … … 425 419 char* args[4]; 426 420 args[0] = "cursor"; 427 args[1] = g_strdup_printf ("% lld", (long long)next_cursor);421 args[1] = g_strdup_printf ("%d", next_cursor); 428 422 if (td->home_timeline_id) { 429 423 args[2] = "since_id"; … … 437 431 g_free(args[3]); 438 432 } 439 }440 441 static void twitter_groupchat_init(struct im_connection *ic)442 {443 char *name_hint;444 struct groupchat *gc;445 struct twitter_data *td = ic->proto_data;446 447 td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" );448 449 name_hint = g_strdup_printf( "Twitter_%s", ic->acc->user );450 imcb_chat_name_hint( gc, name_hint );451 g_free( name_hint );452 433 } 453 434 … … 464 445 // Create a new groupchat if it does not exsist. 465 446 if (!td->home_timeline_gc) 466 twitter_groupchat_init(ic); 467 468 gc = td->home_timeline_gc; 469 if (!gc->joined) 447 { 448 char *name_hint = g_strdup_printf( "Twitter_%s", ic->acc->user ); 449 td->home_timeline_gc = gc = imcb_chat_new( ic, "home/timeline" ); 450 imcb_chat_name_hint( gc, name_hint ); 451 g_free( name_hint ); 452 // Add the current user to the chat... 470 453 imcb_chat_add_buddy( gc, ic->acc->user ); 454 } 455 else 456 { 457 gc = td->home_timeline_gc; 458 } 471 459 472 460 for ( l = list; l ; l = g_slist_next(l) ) … … 616 604 617 605 // Check if the HTTP request went well. 618 if (req->status_code == 401) 619 { 620 imcb_error( ic, "Authentication failure" ); 621 imc_logout( ic, FALSE ); 622 return; 623 } else if (req->status_code != 200) { 606 if (req->status_code != 200) { 624 607 // It didn't go well, output the error and return. 625 imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL ": %s", twitter_parse_error(req)); 626 imc_logout( ic, TRUE ); 608 if (++td->http_fails >= 5) 609 imcb_error(ic, "Could not retrieve " TWITTER_SHOW_FRIENDS_URL ": %s", twitter_parse_error(req)); 610 627 611 return; 628 612 } else { 629 613 td->http_fails = 0; 630 614 } 631 632 if( !td->home_timeline_gc &&633 g_strcasecmp( set_getstr( &ic->acc->set, "mode" ), "chat" ) == 0 )634 twitter_groupchat_init( ic );635 615 636 616 txl = g_new0(struct twitter_xml_list, 1); … … 654 634 // if the next_cursor is set to something bigger then 0 there are more friends to gather. 655 635 if (txl->next_cursor > 0) 656 {657 636 twitter_get_statuses_friends(ic, txl->next_cursor); 658 } 659 else 660 { 661 td->flags |= TWITTER_HAVE_FRIENDS; 662 twitter_login_finish(ic); 663 } 664 637 665 638 // Free the structure. 666 639 txl_free(txl); … … 671 644 * Get the friends. 672 645 */ 673 void twitter_get_statuses_friends(struct im_connection *ic, gint64next_cursor)646 void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor) 674 647 { 675 648 char* args[2]; 676 649 args[0] = "cursor"; 677 args[1] = g_strdup_printf ("% lld", (long long)next_cursor);650 args[1] = g_strdup_printf ("%d", next_cursor); 678 651 679 652 twitter_http(ic, TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, args, 2); -
protocols/twitter/twitter_lib.h
reb6df6a r3759849 76 76 #define TWITTER_BLOCKS_DESTROY_URL "/blocks/destroy/" 77 77 78 void twitter_get_friends_ids(struct im_connection *ic, gint64next_cursor);79 void twitter_get_home_timeline(struct im_connection *ic, gint64next_cursor);80 void twitter_get_statuses_friends(struct im_connection *ic, gint64next_cursor);78 void twitter_get_friends_ids(struct im_connection *ic, int next_cursor); 79 void twitter_get_home_timeline(struct im_connection *ic, int next_cursor); 80 void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor); 81 81 82 82 void twitter_post_status(struct im_connection *ic, char *msg); -
storage_xml.c
reb6df6a r3759849 60 60 char *given_pass; 61 61 xml_pass_st pass_st; 62 int unknown_tag;63 62 }; 64 63 … … 88 87 irc_t *irc = xd->irc; 89 88 90 if( xd->unknown_tag > 0 ) 91 { 92 xd->unknown_tag ++; 93 } 94 else if( g_strcasecmp( element_name, "user" ) == 0 ) 89 if( g_strcasecmp( element_name, "user" ) == 0 ) 95 90 { 96 91 char *nick = xml_attr( attr_names, attr_values, "nick" ); … … 230 225 else 231 226 { 232 xd->unknown_tag ++;233 irc_usermsg( irc, "Warning: Unknown XML tag found in configuration file (%s). "234 "This may happen when downgrading BitlBee versions. "235 "This tag will be skipped and the information will be lost "236 "once you save your settings.", element_name );237 /*238 227 g_set_error( error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, 239 228 "Unkown element: %s", element_name ); 240 */241 229 } 242 230 } … … 246 234 struct xml_parsedata *xd = data; 247 235 248 if( xd->unknown_tag > 0 ) 249 { 250 xd->unknown_tag --; 251 } 252 else if( g_strcasecmp( element_name, "setting" ) == 0 && xd->current_setting ) 236 if( g_strcasecmp( element_name, "setting" ) == 0 && xd->current_setting ) 253 237 { 254 238 g_free( xd->current_setting ); … … 420 404 return STORAGE_ALREADY_EXISTS; 421 405 422 strcat( path, " .XXXXXX" );423 if( ( fd = mkstemp( path) ) < 0 )406 strcat( path, "~" ); 407 if( ( fd = open( path, O_WRONLY | O_CREAT | O_TRUNC, 0600 ) ) < 0 ) 424 408 { 425 409 irc_usermsg( irc, "Error while opening configuration file." ); … … 515 499 close( fd ); 516 500 517 path2 = g_strndup( path, strlen( path ) - 7);501 path2 = g_strndup( path, strlen( path ) - 1 ); 518 502 if( rename( path, path2 ) != 0 ) 519 503 {
Note: See TracChangeset
for help on using the changeset viewer.