Changes in / [eb6df6a:3759849]


Ignore:
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • bitlbee.h

    reb6df6a r3759849  
    3838
    3939#define PACKAGE "BitlBee"
    40 #define BITLBEE_VERSION "1.2.8"
     40#define BITLBEE_VERSION "1.2.7"
    4141#define VERSION BITLBEE_VERSION
    4242#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)
    4444
    4545#define MAX_STRING 511
  • doc/CHANGES

    reb6df6a r3759849  
    33
    44http://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 were
    9   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 used
    12     for identi.ca or any other compatible network.
    13   * Fetch the full list of Twitter contacts instead of slowly adding all
    14     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 artificial
    19   client restrictions.
    20 - Allow nick changes (although only before register/identify).
    21 - Some more minor bugfixes/etc.
    22 
    23 Finished 4 Jul 2010
    245
    256Version 1.2.7:
  • doc/user-guide/commands.xml

    reb6df6a r3759849  
    633633        </bitlbee-setting>
    634634
    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 
    653635        <bitlbee-setting name="buddy_sendbuffer" type="boolean" scope="global">
    654636                <default>false</default>
     
    12491231        </bitlbee-setting>
    12501232
    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 
    12651233        <bitlbee-setting name="voice_buddies" type="string" scope="global">
    12661234                <default>notaway</default>
     
    12761244                        </para>
    12771245                </description>
     1246
    12781247        </bitlbee-setting>
    12791248
  • protocols/jabber/iq.c

    reb6df6a r3759849  
    6565                if( strcmp( s, XMLNS_VERSION ) == 0 )
    6666                {
    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 ) );
    6868                        xt_add_child( reply, xt_new_node( "version", BITLBEE_VERSION, NULL ) );
    6969                        xt_add_child( reply, xt_new_node( "os", ARCH, NULL ) );
     
    105105                        xt_add_attr( c, "category", "client" );
    106106                        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" );
    108108                        xt_add_child( reply, c );
    109109                       
  • protocols/jabber/jabber.c

    reb6df6a r3759849  
    7979        s = set_add( &acc->set, "tls", "try", set_eval_tls, acc );
    8080        s->flags |= ACC_SET_OFFLINE_ONLY;
    81        
    82         s = set_add( &acc->set, "user_agent", "BitlBee", NULL, acc );
    8381       
    8482        s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc );
     
    288286                g_hash_table_destroy( jd->node_cache );
    289287       
    290         jabber_buddy_remove_all( ic );
    291        
    292288        xt_free( jd->xt );
    293289       
     
    474470{
    475471        /* 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 );
    478473       
    479474        /* This runs the garbage collection every minute, which means every packet
  • protocols/jabber/jabber.h

    reb6df6a r3759849  
    230230int jabber_buddy_remove( struct im_connection *ic, char *full_jid );
    231231int jabber_buddy_remove_bare( struct im_connection *ic, char *bare_jid );
    232 void jabber_buddy_remove_all( struct im_connection *ic );
    233232time_t jabber_get_timestamp( struct xt_node *xt );
    234233struct jabber_error *jabber_error_parse( struct xt_node *node, char *xmlns );
  • protocols/jabber/jabber_util.c

    reb6df6a r3759849  
    665665}
    666666
    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 
    693667time_t jabber_get_timestamp( struct xt_node *xt )
    694668{
  • protocols/jabber/message.c

    reb6df6a r3759849  
    5555                        struct xt_node *inv, *reason;
    5656                       
    57                         if( ns && strcmp( ns, XMLNS_MUC_USER ) == 0 &&
     57                        if( strcmp( ns, XMLNS_MUC_USER ) == 0 &&
    5858                            ( inv = xt_find_node( c->children, "invite" ) ) )
    5959                        {
  • protocols/twitter/twitter.c

    reb6df6a r3759849  
    4040                return 0;
    4141
     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
    4247        // Do stuff..
    4348        twitter_get_home_timeline(ic, -1);
     
    5156        struct twitter_data *td = ic->proto_data;
    5257       
    53         imcb_log( ic, "Getting initial statuses" );
     58        imcb_log( ic, "Connecting to Twitter" );
    5459
    5560        // Run this once. After this queue the main loop function.
     
    6166}
    6267
    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         else
    78                 twitter_main_loop_start( ic );
    79 }
    8068
    8169static const struct oauth_service twitter_oauth =
     
    140128                ic->acc->pass = oauth_to_string( info );
    141129               
    142                 twitter_login_finish( ic );
     130                twitter_main_loop_start( ic );
    143131        }
    144132       
     
    223211        imcb_buddy_status( ic, name, OPT_LOGGED_IN, NULL, NULL );
    224212       
    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 );
    228217}
    229218
     
    247236        {
    248237                oauth_info_free( td->oauth_info );
    249                 g_free( td->url_host );
    250                 g_free( td->url_path );
    251238                g_free( td->pass );
    252239                g_free( td );
     
    269256                    td->oauth_info && td->oauth_info->token == NULL )
    270257                {
    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 ) )
    279259                        {
    280260                                imcb_error( ic, "OAuth error: %s", "Failed to send access token request" );
  • protocols/twitter/twitter.h

    reb6df6a r3759849  
    3333#endif
    3434
    35 typedef enum
    36 {
    37         TWITTER_HAVE_FRIENDS = 1,
    38 } twitter_flags_t;
    39 
    4035struct twitter_data
    4136{
     
    4742        struct groupchat *home_timeline_gc;
    4843        gint http_fails;
    49         twitter_flags_t flags;
    5044       
    5145        gboolean url_ssl;
     
    6256GSList *twitter_connections;
    6357
    64 void twitter_login_finish( struct im_connection *ic );
    65 
    6658#endif //_TWITTER_H
  • protocols/twitter/twitter_lib.c

    reb6df6a r3759849  
    4242struct twitter_xml_list {
    4343        int type;
    44         gint64 next_cursor;
     44        int next_cursor;
    4545        GSList *list;
    4646        gpointer data;
     
    5858        guint64 id;
    5959};
    60 
    61 static void twitter_groupchat_init(struct im_connection *ic);
    6260
    6361/**
     
    155153 * Get the friends ids.
    156154 */
    157 void twitter_get_friends_ids(struct im_connection *ic, gint64 next_cursor)
     155void twitter_get_friends_ids(struct im_connection *ic, int next_cursor)
    158156{
    159157        // Primitive, but hey! It works...     
    160158        char* args[2];
    161159        args[0] = "cursor";
    162         args[1] = g_strdup_printf ("%lld", (long long) next_cursor);
     160        args[1] = g_strdup_printf ("%d", next_cursor);
    163161        twitter_http(ic, TWITTER_FRIENDS_IDS_URL, twitter_http_get_friends_ids, ic, 0, args, 2);
    164162
     
    171169static xt_status twitter_xt_next_cursor( struct xt_node *node, struct twitter_xml_list *txl )
    172170{
    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;
    179173
    180174        return XT_HANDLED;
     
    419413 * Get the timeline.
    420414 */
    421 void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor)
     415void twitter_get_home_timeline(struct im_connection *ic, int next_cursor)
    422416{
    423417        struct twitter_data *td = ic->proto_data;
     
    425419        char* args[4];
    426420        args[0] = "cursor";
    427         args[1] = g_strdup_printf ("%lld", (long long) next_cursor);
     421        args[1] = g_strdup_printf ("%d", next_cursor);
    428422        if (td->home_timeline_id) {
    429423                args[2] = "since_id";
     
    437431                g_free(args[3]);
    438432        }
    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 );
    452433}
    453434
     
    464445        // Create a new groupchat if it does not exsist.
    465446        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...
    470453                imcb_chat_add_buddy( gc, ic->acc->user );
     454        }
     455        else
     456        {   
     457                gc = td->home_timeline_gc;
     458        }
    471459
    472460        for ( l = list; l ; l = g_slist_next(l) )
     
    616604       
    617605        // 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) {
    624607                // 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               
    627611                return;
    628612        } else {
    629613                td->http_fails = 0;
    630614        }
    631        
    632         if( !td->home_timeline_gc &&
    633             g_strcasecmp( set_getstr( &ic->acc->set, "mode" ), "chat" ) == 0 )
    634                 twitter_groupchat_init( ic );
    635615
    636616        txl = g_new0(struct twitter_xml_list, 1);
     
    654634        // if the next_cursor is set to something bigger then 0 there are more friends to gather.
    655635        if (txl->next_cursor > 0)
    656         {
    657636                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
    665638        // Free the structure.
    666639        txl_free(txl);
     
    671644 * Get the friends.
    672645 */
    673 void twitter_get_statuses_friends(struct im_connection *ic, gint64 next_cursor)
     646void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor)
    674647{
    675648        char* args[2];
    676649        args[0] = "cursor";
    677         args[1] = g_strdup_printf ("%lld", (long long) next_cursor);
     650        args[1] = g_strdup_printf ("%d", next_cursor);
    678651
    679652        twitter_http(ic, TWITTER_SHOW_FRIENDS_URL, twitter_http_get_statuses_friends, ic, 0, args, 2);
  • protocols/twitter/twitter_lib.h

    reb6df6a r3759849  
    7676#define TWITTER_BLOCKS_DESTROY_URL "/blocks/destroy/"
    7777
    78 void twitter_get_friends_ids(struct im_connection *ic, gint64 next_cursor);
    79 void twitter_get_home_timeline(struct im_connection *ic, gint64 next_cursor);
    80 void twitter_get_statuses_friends(struct im_connection *ic, gint64 next_cursor);
     78void twitter_get_friends_ids(struct im_connection *ic, int next_cursor);
     79void twitter_get_home_timeline(struct im_connection *ic, int next_cursor);
     80void twitter_get_statuses_friends(struct im_connection *ic, int next_cursor);
    8181
    8282void twitter_post_status(struct im_connection *ic, char *msg);
  • storage_xml.c

    reb6df6a r3759849  
    6060        char *given_pass;
    6161        xml_pass_st pass_st;
    62         int unknown_tag;
    6362};
    6463
     
    8887        irc_t *irc = xd->irc;
    8988       
    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 )
    9590        {
    9691                char *nick = xml_attr( attr_names, attr_values, "nick" );
     
    230225        else
    231226        {
    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                 /*
    238227                g_set_error( error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
    239228                             "Unkown element: %s", element_name );
    240                 */
    241229        }
    242230}
     
    246234        struct xml_parsedata *xd = data;
    247235       
    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 )
    253237        {
    254238                g_free( xd->current_setting );
     
    420404                return STORAGE_ALREADY_EXISTS;
    421405       
    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 )
    424408        {
    425409                irc_usermsg( irc, "Error while opening configuration file." );
     
    515499        close( fd );
    516500       
    517         path2 = g_strndup( path, strlen( path ) - 7 );
     501        path2 = g_strndup( path, strlen( path ) - 1 );
    518502        if( rename( path, path2 ) != 0 )
    519503        {
Note: See TracChangeset for help on using the changeset viewer.