comparison libpurple/protocols/irc/irc.c @ 17033:4c8a2054fd81

Don't allow IRC username to contain spaces. Fixes #443.
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 11 May 2007 03:57:32 +0000
parents a338acd14365
children 3e437e86bd6e 62a71bb085ef e556eb2f38d2
comparison
equal deleted inserted replaced
17032:d6e855aedc30 17033:4c8a2054fd81
144 char *tosend= g_strdup(buf); 144 char *tosend= g_strdup(buf);
145 145
146 purple_signal_emit(_irc_plugin, "irc-sending-text", purple_account_get_connection(irc->account), &tosend); 146 purple_signal_emit(_irc_plugin, "irc-sending-text", purple_account_get_connection(irc->account), &tosend);
147 if (tosend == NULL) 147 if (tosend == NULL)
148 return 0; 148 return 0;
149 149
150 buflen = strlen(tosend); 150 buflen = strlen(tosend);
151 151
152 152
153 /* If we're not buffering writes, try to send immediately */ 153 /* If we're not buffering writes, try to send immediately */
154 if (!irc->writeh) 154 if (!irc->writeh)
155 ret = do_send(irc, tosend, buflen); 155 ret = do_send(irc, tosend, buflen);
156 else { 156 else {
157 ret = -1; 157 ret = -1;
340 } 340 }
341 } 341 }
342 } 342 }
343 343
344 static gboolean do_login(PurpleConnection *gc) { 344 static gboolean do_login(PurpleConnection *gc) {
345 char *buf; 345 char *buf, *tmp = NULL;
346 char hostname[256]; 346 char hostname[256];
347 const char *username, *realname; 347 const char *username, *realname;
348 struct irc_conn *irc = gc->proto_data; 348 struct irc_conn *irc = gc->proto_data;
349 const char *pass = purple_connection_get_password(gc); 349 const char *pass = purple_connection_get_password(gc);
350 350
356 return FALSE; 356 return FALSE;
357 } 357 }
358 g_free(buf); 358 g_free(buf);
359 } 359 }
360 360
361
361 gethostname(hostname, sizeof(hostname)); 362 gethostname(hostname, sizeof(hostname));
362 hostname[sizeof(hostname) - 1] = '\0'; 363 hostname[sizeof(hostname) - 1] = '\0';
364 realname = purple_account_get_string(irc->account, "realname", "");
363 username = purple_account_get_string(irc->account, "username", ""); 365 username = purple_account_get_string(irc->account, "username", "");
364 realname = purple_account_get_string(irc->account, "realname", ""); 366
365 buf = irc_format(irc, "vvvv:", "USER", strlen(username) ? username : g_get_user_name(), hostname, irc->server, 367 if (username == NULL || *username == '\0') {
368 username = g_get_user_name();
369 }
370
371 if (username != NULL && strchr(username, ' ') != NULL) {
372 tmp = g_strdup(username);
373 while ((buf = strchr(tmp, ' ')) != NULL) {
374 *buf = '_';
375 }
376 }
377
378 buf = irc_format(irc, "vvvv:", "USER", tmp ? tmp : username, hostname, irc->server,
366 strlen(realname) ? realname : IRC_DEFAULT_ALIAS); 379 strlen(realname) ? realname : IRC_DEFAULT_ALIAS);
380 g_free(tmp);
367 if (irc_send(irc, buf) < 0) { 381 if (irc_send(irc, buf) < 0) {
368 /* purple_connection_error(gc, "Error registering with server");*/ 382 /* purple_connection_error(gc, "Error registering with server");*/
369 g_free(buf); 383 g_free(buf);
370 return FALSE; 384 return FALSE;
371 } 385 }
546 560
547 irc->inbufused += len; 561 irc->inbufused += len;
548 irc->inbuf[irc->inbufused] = '\0'; 562 irc->inbuf[irc->inbufused] = '\0';
549 563
550 cur = irc->inbuf; 564 cur = irc->inbuf;
551 565
552 /* This is a hack to work around the fact that marv gets messages 566 /* This is a hack to work around the fact that marv gets messages
553 * with null bytes in them while using some weird irc server at work 567 * with null bytes in them while using some weird irc server at work
554 */ 568 */
555 while ((cur < (irc->inbuf + irc->inbufused)) && !*cur) 569 while ((cur < (irc->inbuf + irc->inbufused)) && !*cur)
556 cur++; 570 cur++;
557 571
558 while (cur < irc->inbuf + irc->inbufused && 572 while (cur < irc->inbuf + irc->inbufused &&
559 ((end = strstr(cur, "\r\n")) || (end = strstr(cur, "\n")))) { 573 ((end = strstr(cur, "\r\n")) || (end = strstr(cur, "\n")))) {
560 int step = (*end == '\r' ? 2 : 1); 574 int step = (*end == '\r' ? 2 : 1);
561 *end = '\0'; 575 *end = '\0';
562 irc_parse_msg(irc, cur); 576 irc_parse_msg(irc, cur);
641 655
642 static char *irc_get_chat_name(GHashTable *data) { 656 static char *irc_get_chat_name(GHashTable *data) {
643 return g_strdup(g_hash_table_lookup(data, "channel")); 657 return g_strdup(g_hash_table_lookup(data, "channel"));
644 } 658 }
645 659
646 static void irc_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name) 660 static void irc_chat_invite(PurpleConnection *gc, int id, const char *message, const char *name)
647 { 661 {
648 struct irc_conn *irc = gc->proto_data; 662 struct irc_conn *irc = gc->proto_data;
649 PurpleConversation *convo = purple_find_chat(gc, id); 663 PurpleConversation *convo = purple_find_chat(gc, id);
650 const char *args[2]; 664 const char *args[2];
651 665