Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/jabber_util.c

    r89d736a r9143aeb  
    2323
    2424#include "jabber.h"
    25 #include "md5.h"
    26 #include "base64.h"
    2725
    2826static unsigned int next_id = 1;
     
    136134        struct jabber_data *jd = ic->proto_data;
    137135        struct jabber_cache_entry *entry = g_new0( struct jabber_cache_entry, 1 );
    138         md5_state_t id_hash;
    139         md5_byte_t id_sum[16];
    140         char *id, *asc_hash;
    141        
    142         next_id ++;
    143        
    144         id_hash = jd->cached_id_prefix;
    145         md5_append( &id_hash, (md5_byte_t*) &next_id, sizeof( next_id ) );
    146         md5_finish( &id_hash, id_sum );
    147         asc_hash = base64_encode( id_sum, 12 );
    148        
    149         id = g_strdup_printf( "%s%s", JABBER_CACHED_ID, asc_hash );
     136        char *id;
     137       
     138        id = g_strdup_printf( "%s%05x", jd->cached_id_prefix, ( next_id++ ) & 0xfffff );
    150139        xt_add_attr( node, "id", id );
    151140        g_free( id );
    152         g_free( asc_hash );
    153141       
    154142        entry->node = node;
     
    196184       
    197185        if( ( s = xt_find_attr( node, "id" ) ) == NULL ||
    198             strncmp( s, JABBER_CACHED_ID, strlen( JABBER_CACHED_ID ) ) != 0 )
     186            strncmp( s, jd->cached_id_prefix, strlen( jd->cached_id_prefix ) ) != 0 )
    199187        {
    200188                /* Silently ignore it, without an ID (or a non-cache
     
    208196        if( entry == NULL )
    209197        {
    210                 /*
    211                 There's no longer an easy way to see if we generated this
    212                 one or someone else, and there's a ten-minute timeout anyway,
    213                 so meh.
    214                
    215198                imcb_log( ic, "Warning: Received %s-%s packet with unknown/expired ID %s!",
    216199                              node->name, xt_find_attr( node, "type" ) ? : "(no type)", s );
    217                 */
    218200        }
    219201        else if( entry->func )
     
    308290        len = strlen( orig );
    309291        new = g_new( char, len + 1 );
    310        
    311         /* So it turns out the /resource part is case sensitive. Yeah, and
    312            it's Unicode but feck Unicode. :-P So stop once we see a slash. */
    313         for( i = 0; i < len && orig[i] != '/' ; i ++ )
     292        for( i = 0; i < len; i ++ )
    314293                new[i] = tolower( orig[i] );
    315         for( ; orig[i]; i ++ )
    316                 new[i] = orig[i];
    317294       
    318295        new[i] = 0;
     
    357334                {
    358335                        /* Check for dupes. */
    359                         if( strcmp( bi->resource, s + 1 ) == 0 )
     336                        if( g_strcasecmp( bi->resource, s + 1 ) == 0 )
    360337                        {
    361338                                *s = '/';
     
    410387        if( ( s = strchr( jid, '/' ) ) )
    411388        {
    412                 int bare_exists = 0;
     389                int none_found = 0;
    413390               
    414391                *s = 0;
     
    433410                        /* See if there's an exact match. */
    434411                        for( ; bud; bud = bud->next )
    435                                 if( strcmp( bud->resource, s + 1 ) == 0 )
     412                                if( g_strcasecmp( bud->resource, s + 1 ) == 0 )
    436413                                        break;
    437414                }
    438415                else
    439416                {
    440                         /* This variable tells the if down here that the bare
    441                            JID already exists and we should feel free to add
    442                            more resources, if the caller asked for that. */
    443                         bare_exists = 1;
    444                 }
    445                
    446                 if( bud == NULL && ( flags & GET_BUDDY_CREAT ) &&
    447                     ( !bare_exists || imcb_find_buddy( ic, jid ) ) )
     417                        /* This hack is there to make sure that O_CREAT will
     418                           work if there's already another resouce present
     419                           for this JID, even if it's an unknown buddy. This
     420                           is done to handle conferences properly. */
     421                        none_found = 1;
     422                        /* TODO(wilmer): Find out what I was thinking when I
     423                           wrote this??? And then fix it. This makes me sad... */
     424                }
     425               
     426                if( bud == NULL && ( flags & GET_BUDDY_CREAT ) && ( imcb_find_buddy( ic, jid ) || !none_found ) )
    448427                {
    449428                        *s = '/';
     
    470449                        /* We want an exact match, so in thise case there shouldn't be a /resource. */
    471450                        return NULL;
    472                 else if( bud->resource == NULL || bud->next == NULL )
     451                else if( ( bud->resource == NULL || bud->next == NULL ) )
    473452                        /* No need for selection if there's only one option. */
    474453                        return bud;
     
    546525                   matches), removing it is simple. (And the hash reference
    547526                   should be removed too!) */
    548                 if( bud->next == NULL &&
    549                     ( ( s == NULL && bud->resource == NULL ) ||
    550                       ( bud->resource && s && strcmp( bud->resource, s + 1 ) == 0 ) ) )
     527                if( bud->next == NULL && ( ( s == NULL || bud->resource == NULL ) || g_strcasecmp( bud->resource, s + 1 ) == 0 ) )
    551528                {
    552529                        g_hash_table_remove( jd->buddies, bud->bare_jid );
     
    571548                {
    572549                        for( bi = bud, prev = NULL; bi; bi = (prev=bi)->next )
    573                                 if( strcmp( bi->resource, s + 1 ) == 0 )
     550                                if( g_strcasecmp( bi->resource, s + 1 ) == 0 )
    574551                                        break;
    575552                       
Note: See TracChangeset for help on using the changeset viewer.