- Timestamp:
- 2008-08-04T14:45:24Z (16 years ago)
- Branches:
- master
- Children:
- 87f525e
- Parents:
- 4ac647d (diff), 718e05f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- protocols
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/jabber.c
r4ac647d r8661caa 33 33 #include "jabber.h" 34 34 #include "md5.h" 35 #include "base64.h"36 35 37 36 GSList *jabber_connections; 38 37 38 /* First enty is the default */ 39 static const int jabber_port_list[] = { 40 5222, 41 5223, 42 5220, 43 5221, 44 5224, 45 5225, 46 5226, 47 5227, 48 5228, 49 5229, 50 80, 51 443, 52 0 53 }; 54 39 55 static void jabber_init( account_t *acc ) 40 56 { 41 57 set_t *s; 42 43 s = set_add( &acc->set, "port", JABBER_PORT_DEFAULT, set_eval_int, acc ); 58 char str[16]; 59 60 g_snprintf( str, sizeof( str ), "%d", jabber_port_list[0] ); 61 s = set_add( &acc->set, "port", str, set_eval_int, acc ); 44 62 s->flags |= ACC_SET_OFFLINE_ONLY; 45 63 … … 74 92 struct ns_srv_reply *srv = NULL; 75 93 char *connect_to, *s; 94 int i; 76 95 77 96 /* For now this is needed in the _connected() handlers if using … … 179 198 imcb_log( ic, "Connecting" ); 180 199 181 if( set_getint( &acc->set, "port" ) < JABBER_PORT_MIN || 182 set_getint( &acc->set, "port" ) > JABBER_PORT_MAX ) 183 { 184 imcb_log( ic, "Incorrect port number, must be in the %d-%d range", 185 JABBER_PORT_MIN, JABBER_PORT_MAX ); 200 for( i = 0; jabber_port_list[i] > 0; i ++ ) 201 if( set_getint( &acc->set, "port" ) == jabber_port_list[i] ) 202 break; 203 204 if( jabber_port_list[i] == 0 ) 205 { 206 imcb_log( ic, "Illegal port number" ); 186 207 imc_logout( ic, FALSE ); 187 208 return; … … 221 242 } 222 243 244 /* This generates an unfinished md5_state_t variable. Every time we generate 245 an ID, we finish the state by adding a sequence number and take the hash. */ 223 246 static void jabber_generate_id_hash( struct jabber_data *jd ) 224 247 { 225 md5_state_t id_hash; 226 md5_byte_t binbuf[16]; 248 md5_byte_t binbuf[4]; 227 249 char *s; 228 250 229 md5_init( & id_hash);230 md5_append( & id_hash, (unsigned char *) jd->username, strlen( jd->username ) );231 md5_append( & id_hash, (unsigned char *) jd->server, strlen( jd->server ) );251 md5_init( &jd->cached_id_prefix ); 252 md5_append( &jd->cached_id_prefix, (unsigned char *) jd->username, strlen( jd->username ) ); 253 md5_append( &jd->cached_id_prefix, (unsigned char *) jd->server, strlen( jd->server ) ); 232 254 s = set_getstr( &jd->ic->acc->set, "resource" ); 233 md5_append( &id_hash, (unsigned char *) s, strlen( s ) ); 234 random_bytes( binbuf, 16 ); 235 md5_append( &id_hash, binbuf, 16 ); 236 md5_finish( &id_hash, binbuf ); 237 238 s = base64_encode( binbuf, 9 ); 239 jd->cached_id_prefix = g_strdup_printf( "%s%s", JABBER_CACHED_ID, s ); 240 g_free( s ); 255 md5_append( &jd->cached_id_prefix, (unsigned char *) s, strlen( s ) ); 256 random_bytes( binbuf, 4 ); 257 md5_append( &jd->cached_id_prefix, binbuf, 4 ); 241 258 } 242 259 … … 281 298 xt_free( jd->xt ); 282 299 283 g_free( jd->cached_id_prefix );284 300 g_free( jd->away_message ); 285 301 g_free( jd->username ); -
protocols/jabber/jabber.h
r4ac647d r8661caa 94 94 char *away_message; 95 95 96 char *cached_id_prefix;96 md5_state_t cached_id_prefix; 97 97 GHashTable *node_cache; 98 98 GHashTable *buddies; … … 177 177 178 178 #define JABBER_XMLCONSOLE_HANDLE "xmlconsole" 179 180 #define JABBER_PORT_DEFAULT "5222"181 #define JABBER_PORT_MIN 5220182 #define JABBER_PORT_MAX 5229183 179 184 180 /* Prefixes to use for packet IDs (mainly for IQ packets ATM). Usually the -
protocols/jabber/jabber_util.c
r4ac647d r8661caa 23 23 24 24 #include "jabber.h" 25 #include "md5.h" 26 #include "base64.h" 25 27 26 28 static unsigned int next_id = 1; … … 138 140 struct jabber_data *jd = ic->proto_data; 139 141 struct jabber_cache_entry *entry = g_new0( struct jabber_cache_entry, 1 ); 140 char *id; 141 142 id = g_strdup_printf( "%s%05x", jd->cached_id_prefix, ( next_id++ ) & 0xfffff ); 142 md5_state_t id_hash; 143 md5_byte_t id_sum[16]; 144 char *id, *asc_hash; 145 146 next_id ++; 147 148 id_hash = jd->cached_id_prefix; 149 md5_append( &id_hash, (md5_byte_t*) &next_id, sizeof( next_id ) ); 150 md5_finish( &id_hash, id_sum ); 151 asc_hash = base64_encode( id_sum, 12 ); 152 153 id = g_strdup_printf( "%s%s", JABBER_CACHED_ID, asc_hash ); 143 154 xt_add_attr( node, "id", id ); 144 155 g_free( id ); 156 g_free( asc_hash ); 145 157 146 158 entry->node = node; … … 188 200 189 201 if( ( s = xt_find_attr( node, "id" ) ) == NULL || 190 strncmp( s, jd->cached_id_prefix, strlen( jd->cached_id_prefix) ) != 0 )202 strncmp( s, JABBER_CACHED_ID, strlen( JABBER_CACHED_ID ) ) != 0 ) 191 203 { 192 204 /* Silently ignore it, without an ID (or a non-cache … … 200 212 if( entry == NULL ) 201 213 { 214 /* 215 There's no longer an easy way to see if we generated this 216 one or someone else, and there's a ten-minute timeout anyway, 217 so meh. 218 202 219 imcb_log( ic, "Warning: Received %s-%s packet with unknown/expired ID %s!", 203 220 node->name, xt_find_attr( node, "type" ) ? : "(no type)", s ); 221 */ 204 222 } 205 223 else if( entry->func ) … … 294 312 len = strlen( orig ); 295 313 new = g_new( char, len + 1 ); 296 for( i = 0; i < len; i ++ ) 297 { 298 /* don't normalize the resource */ 299 if( orig[i] == '/' ) 300 break; 314 315 /* So it turns out the /resource part is case sensitive. Yeah, and 316 it's Unicode but feck Unicode. :-P So stop once we see a slash. */ 317 for( i = 0; i < len && orig[i] != '/' ; i ++ ) 301 318 new[i] = tolower( orig[i] ); 302 } 303 for( ; i < len; i ++ ) 319 for( ; orig[i]; i ++ ) 304 320 new[i] = orig[i]; 305 321 … … 345 361 { 346 362 /* Check for dupes. */ 347 if( g_strcasecmp( bi->resource, s + 1 ) == 0 )363 if( strcmp( bi->resource, s + 1 ) == 0 ) 348 364 { 349 365 *s = '/'; … … 398 414 if( ( s = strchr( jid, '/' ) ) ) 399 415 { 400 int none_found= 0;416 int bare_exists = 0; 401 417 402 418 *s = 0; … … 421 437 /* See if there's an exact match. */ 422 438 for( ; bud; bud = bud->next ) 423 if( g_strcasecmp( bud->resource, s + 1 ) == 0 )439 if( strcmp( bud->resource, s + 1 ) == 0 ) 424 440 break; 425 441 } 426 442 else 427 443 { 428 /* This hack is there to make sure that O_CREAT will 429 work if there's already another resouce present 430 for this JID, even if it's an unknown buddy. This 431 is done to handle conferences properly. */ 432 none_found = 1; 433 /* TODO(wilmer): Find out what I was thinking when I 434 wrote this??? And then fix it. This makes me sad... */ 435 } 436 437 if( bud == NULL && ( flags & GET_BUDDY_CREAT ) && ( imcb_find_buddy( ic, jid ) || !none_found ) ) 444 /* This variable tells the if down here that the bare 445 JID already exists and we should feel free to add 446 more resources, if the caller asked for that. */ 447 bare_exists = 1; 448 } 449 450 if( bud == NULL && ( flags & GET_BUDDY_CREAT ) && 451 ( !bare_exists || imcb_find_buddy( ic, jid ) ) ) 438 452 { 439 453 *s = '/'; … … 460 474 /* We want an exact match, so in thise case there shouldn't be a /resource. */ 461 475 return NULL; 462 else if( ( bud->resource == NULL || bud->next == NULL ))476 else if( bud->resource == NULL || bud->next == NULL ) 463 477 /* No need for selection if there's only one option. */ 464 478 return bud; … … 536 550 matches), removing it is simple. (And the hash reference 537 551 should be removed too!) */ 538 if( bud->next == NULL && ( ( s == NULL || bud->resource == NULL ) || g_strcasecmp( bud->resource, s + 1 ) == 0 ) ) 552 if( bud->next == NULL && 553 ( ( s == NULL && bud->resource == NULL ) || 554 ( bud->resource && s && strcmp( bud->resource, s + 1 ) == 0 ) ) ) 539 555 { 540 556 g_hash_table_remove( jd->buddies, bud->bare_jid ); … … 559 575 { 560 576 for( bi = bud, prev = NULL; bi; bi = (prev=bi)->next ) 561 if( g_strcasecmp( bi->resource, s + 1 ) == 0 )577 if( strcmp( bi->resource, s + 1 ) == 0 ) 562 578 break; 563 579 -
protocols/jabber/message.c
r4ac647d r8661caa 49 49 { 50 50 GString *fullmsg = g_string_new( "" ); 51 52 for( c = node->children; ( c = xt_find_node( c, "x" ) ); c = c->next ) 53 { 54 char *ns = xt_find_attr( c, "xmlns" ), *room; 55 struct xt_node *inv, *reason; 56 57 if( strcmp( ns, XMLNS_MUC_USER ) == 0 && 58 ( inv = xt_find_node( c->children, "invite" ) ) ) 59 { 60 room = from; 61 from = xt_find_attr( inv, "from" ) ? : from; 62 63 g_string_append_printf( fullmsg, "<< \002BitlBee\002 - Invitation to chatroom %s >>\n", room ); 64 if( ( reason = xt_find_node( inv->children, "reason" ) ) && reason->text_len > 0 ) 65 g_string_append( fullmsg, reason->text ); 66 } 67 } 51 68 52 69 if( ( s = strchr( from, '/' ) ) ) -
protocols/msn/ns.c
r4ac647d r8661caa 278 278 if( num_parts == 5 ) 279 279 { 280 int i, groupcount; 281 282 groupcount = atoi( cmd[4] ); 283 if( groupcount > 0 ) 284 { 285 /* valgrind says this is leaking memory, I'm guessing 286 that this happens during server redirects. */ 287 if( md->grouplist ) 288 { 289 for( i = 0; i < md->groupcount; i ++ ) 290 g_free( md->grouplist[i] ); 291 g_free( md->grouplist ); 292 } 293 294 md->groupcount = groupcount; 295 md->grouplist = g_new0( char *, md->groupcount ); 296 } 297 280 298 md->buddycount = atoi( cmd[3] ); 281 md->groupcount = atoi( cmd[4] );282 if( md->groupcount > 0 )283 md->grouplist = g_new0( char *, md->groupcount );284 285 299 if( !*cmd[3] || md->buddycount == 0 ) 286 300 msn_logged_in( ic ); … … 665 679 imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders ); 666 680 } 681 682 g_free( inbox ); 683 g_free( folders ); 667 684 } 668 685 else if( g_strncasecmp( ct, "text/x-msmsgsemailnotification", 30 ) == 0 ) -
protocols/nogaim.h
r4ac647d r8661caa 45 45 #include "md5.h" 46 46 #include "ft.h" 47 48 #define BUF_LEN MSG_LEN49 #define BUF_LONG ( BUF_LEN * 2 )50 #define MSG_LEN 204851 #define BUF_LEN MSG_LEN52 47 53 48 #define BUDDY_ALIAS_MAXLEN 388 /* because MSN names can be 387 characters */ -
protocols/oscar/oscar.c
r4ac647d r8661caa 60 60 61 61 #define OSCAR_GROUP "Friends" 62 63 #define BUF_LEN 2048 64 #define BUF_LONG ( BUF_LEN * 2 ) 62 65 63 66 /* Don't know if support for UTF8 is really working. For now it's UTF16 here. … … 240 243 }; 241 244 static int msgerrreasonlen = 25; 245 246 /* Hurray, this function is NOT thread-safe \o/ */ 247 static char *normalize(const char *s) 248 { 249 static char buf[BUF_LEN]; 250 char *t, *u; 251 int x = 0; 252 253 g_return_val_if_fail((s != NULL), NULL); 254 255 u = t = g_strdup(s); 256 257 strcpy(t, s); 258 g_strdown(t); 259 260 while (*t && (x < BUF_LEN - 1)) { 261 if (*t != ' ' && *t != '!') { 262 buf[x] = *t; 263 x++; 264 } 265 t++; 266 } 267 buf[x] = '\0'; 268 g_free(u); 269 return buf; 270 } 242 271 243 272 static gboolean oscar_callback(gpointer data, gint source, … … 1002 1031 } 1003 1032 1004 tmp = g_strdup(normalize(ic->acc->user)); 1005 if (!strcmp(tmp, normalize(info->sn))) 1033 if (!aim_sncmp(ic->acc->user, info->sn)) 1006 1034 g_snprintf(ic->displayname, sizeof(ic->displayname), "%s", info->sn); 1007 g_free(tmp); 1008 1009 imcb_buddy_status(ic, info->sn, flags, state_string, NULL); 1010 /* imcb_buddy_times(ic, info->sn, signon, time_idle); */ 1035 1036 tmp = normalize(info->sn); 1037 imcb_buddy_status(ic, tmp, flags, state_string, NULL); 1038 /* imcb_buddy_times(ic, tmp, signon, time_idle); */ 1039 1011 1040 1012 1041 return 1; … … 1022 1051 va_end(ap); 1023 1052 1024 imcb_buddy_status(ic, info->sn, 0, NULL, NULL );1053 imcb_buddy_status(ic, normalize(info->sn), 0, NULL, NULL ); 1025 1054 1026 1055 return 1; … … 1078 1107 1079 1108 strip_linefeed(tmp); 1080 imcb_buddy_msg(ic, userinfo->sn, tmp, flags, 0);1109 imcb_buddy_msg(ic, normalize(userinfo->sn), tmp, flags, 0); 1081 1110 g_free(tmp); 1082 1111 … … 1177 1206 message = g_strdup(args->msg); 1178 1207 strip_linefeed(message); 1179 imcb_buddy_msg(ic, uin, message, 0, 0);1208 imcb_buddy_msg(ic, normalize(uin), message, 0, 0); 1180 1209 g_free(uin); 1181 1210 g_free(message); … … 1196 1225 1197 1226 strip_linefeed(message); 1198 imcb_buddy_msg(ic, uin, message, 0, 0);1227 imcb_buddy_msg(ic, normalize(uin), message, 0, 0); 1199 1228 g_free(uin); 1200 1229 g_free(m); … … 1471 1500 1472 1501 for (i = 0; i < count; i++) 1473 imcb_chat_add_buddy(c->cnv, info[i].sn);1502 imcb_chat_add_buddy(c->cnv, normalize(info[i].sn)); 1474 1503 1475 1504 return 1; … … 1494 1523 1495 1524 for (i = 0; i < count; i++) 1496 imcb_chat_remove_buddy(c->cnv, info[i].sn, NULL);1525 imcb_chat_remove_buddy(c->cnv, normalize(info[i].sn), NULL); 1497 1526 1498 1527 return 1; … … 1545 1574 tmp = g_malloc(BUF_LONG); 1546 1575 g_snprintf(tmp, BUF_LONG, "%s", msg); 1547 imcb_chat_msg(ccon->cnv, info->sn, tmp, 0, 0);1576 imcb_chat_msg(ccon->cnv, normalize(info->sn), tmp, 0, 0); 1548 1577 g_free(tmp); 1549 1578 … … 1758 1787 g_snprintf(sender, sizeof(sender), "%u", msg->sender); 1759 1788 strip_linefeed(dialog_msg); 1760 imcb_buddy_msg(ic, sender, dialog_msg, 0, t);1789 imcb_buddy_msg(ic, normalize(sender), dialog_msg, 0, t); 1761 1790 g_free(dialog_msg); 1762 1791 } break; … … 1779 1808 1780 1809 strip_linefeed(dialog_msg); 1781 imcb_buddy_msg(ic, sender, dialog_msg, 0, t);1810 imcb_buddy_msg(ic, normalize(sender), dialog_msg, 0, t); 1782 1811 g_free(dialog_msg); 1783 1812 g_free(m); … … 2017 2046 struct aim_ssi_item *curitem; 2018 2047 int tmp; 2048 char *nrm; 2019 2049 2020 2050 /* Add from server list to local list */ 2021 2051 tmp = 0; 2022 2052 for (curitem=sess->ssi.items; curitem; curitem=curitem->next) { 2053 nrm = curitem->name ? normalize(curitem->name) : NULL; 2054 2023 2055 switch (curitem->type) { 2024 2056 case 0x0000: /* Buddy */ 2025 if ((curitem->name) && (!imcb_find_buddy(ic, curitem->name))) {2057 if ((curitem->name) && (!imcb_find_buddy(ic, nrm))) { 2026 2058 char *realname = NULL; 2027 2059 … … 2029 2061 realname = aim_gettlv_str(curitem->data, 0x0131, 1); 2030 2062 2031 imcb_add_buddy(ic, curitem->name, NULL);2063 imcb_add_buddy(ic, nrm, NULL); 2032 2064 2033 2065 if (realname) { 2034 imcb_buddy_nick_hint(ic, curitem->name, realname);2035 imcb_rename_buddy(ic, curitem->name, realname);2066 imcb_buddy_nick_hint(ic, nrm, realname); 2067 imcb_rename_buddy(ic, nrm, realname); 2036 2068 g_free(realname); 2037 2069 } … … 2045 2077 if (!list) { 2046 2078 char *name; 2047 name = g_strdup(n ormalize(curitem->name));2079 name = g_strdup(nrm); 2048 2080 ic->permit = g_slist_append(ic->permit, name); 2049 2081 tmp++; … … 2058 2090 if (!list) { 2059 2091 char *name; 2060 name = g_strdup(n ormalize(curitem->name));2092 name = g_strdup(nrm); 2061 2093 ic->deny = g_slist_append(ic->deny, name); 2062 2094 tmp++; … … 2120 2152 if( st == 0x00 ) 2121 2153 { 2122 imcb_add_buddy( sess->aux_data, list, NULL );2154 imcb_add_buddy( sess->aux_data, normalize(list), NULL ); 2123 2155 } 2124 2156 else if( st == 0x0E ) … … 2450 2482 if(type2 == 0x0002) { 2451 2483 /* User is typing */ 2452 imcb_buddy_typing(ic, sn, OPT_TYPING);2484 imcb_buddy_typing(ic, normalize(sn), OPT_TYPING); 2453 2485 } 2454 2486 else if (type2 == 0x0001) { 2455 2487 /* User has typed something, but is not actively typing (stale) */ 2456 imcb_buddy_typing(ic, sn, OPT_THINKING);2488 imcb_buddy_typing(ic, normalize(sn), OPT_THINKING); 2457 2489 } 2458 2490 else { 2459 2491 /* User has stopped typing */ 2460 imcb_buddy_typing(ic, sn, 0);2492 imcb_buddy_typing(ic, normalize(sn), 0); 2461 2493 } 2462 2494 -
protocols/yahoo/libyahoo2.c
r4ac647d r8661caa 69 69 #ifdef __MINGW32__ 70 70 # include <winsock2.h> 71 # define write(a,b,c) send(a,b,c,0)72 # define read(a,b,c) recv(a,b,c,0)73 71 #endif 74 72 … … 381 379 382 380 /* call repeatedly to get the next one */ 383 /*384 381 static struct yahoo_input_data * find_input_by_id(int id) 385 382 { … … 392 389 return NULL; 393 390 } 394 */395 391 396 392 static struct yahoo_input_data * find_input_by_id_and_webcam_user(int id, const char * who) … … 797 793 { 798 794 struct yahoo_data *yd = find_conn_by_id(id); 795 799 796 if(!yd) 800 797 return; … … 3166 3163 3167 3164 LOG(("write callback: id=%d fd=%d data=%p", id, fd, data)); 3168 if(!yid || !yid->txqueues )3165 if(!yid || !yid->txqueues || !find_conn_by_id(id)) 3169 3166 return -2; 3170 3167 … … 3842 3839 } 3843 3840 3844 3845 /* do { 3841 do { 3846 3842 yahoo_input_close(yid); 3847 } while((yid = find_input_by_id(id)));*/ 3848 3843 } while((yid = find_input_by_id(id))); 3849 3844 } 3850 3845 -
protocols/yahoo/yahoo.c
r4ac647d r8661caa 163 163 g_slist_free( yd->buddygroups ); 164 164 165 if( yd->logged_in ) 166 yahoo_logoff( yd->y2_id ); 167 else 168 yahoo_close( yd->y2_id ); 165 yahoo_logoff( yd->y2_id ); 169 166 170 167 g_free( yd ); … … 454 451 struct byahoo_write_ready_data *d = data; 455 452 456 if( !byahoo_get_ic_by_id( d->id ) )457 /* WTF doesn't libyahoo clean this up? */458 return FALSE;459 460 453 yahoo_write_ready( d->id, d->fd, d->data ); 461 454 … … 672 665 673 666 imcb_error( ic, "%s", err ); 674 675 if( fatal )676 imc_logout( ic, TRUE );677 667 } 678 668 -
protocols/yahoo/yahoo_httplib.c
r4ac647d r8661caa 51 51 #ifdef __MINGW32__ 52 52 # include <winsock2.h> 53 # define write(a,b,c) send(a,b,c,0)54 # define read(a,b,c) recv(a,b,c,0)55 53 # define snprintf _snprintf 56 54 #endif
Note: See TracChangeset
for help on using the changeset viewer.