- Timestamp:
- 2015-11-21T00:01:50Z (9 years ago)
- Parents:
- e4f08bf (diff), 8fdeaa5 (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:
-
- 63 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/bee.h
re4f08bf r29ff5c2 62 62 BEE_USER_LOCAL = 256, /* Locally-added contacts (not in real contact list) */ 63 63 BEE_USER_SPECIAL = 512, /* Denotes a user as being special */ 64 BEE_USER_NOOTR = 4096, /* Per-user version of OPT_NOOTR */ 64 65 } bee_user_flags_t; 65 66 … … 104 105 gboolean (*user_status)(bee_t *bee, struct bee_user *bu, struct bee_user *old); 105 106 /* On every incoming message. sent_at = 0 means unknown. */ 106 gboolean (*user_msg)(bee_t *bee, bee_user_t *bu, const char *msg, time_t sent_at);107 gboolean (*user_msg)(bee_t *bee, bee_user_t *bu, const char *msg, guint32 flags, time_t sent_at); 107 108 /* Flags currently defined (OPT_TYPING/THINKING) in nogaim.h. */ 108 109 gboolean (*user_typing)(bee_t *bee, bee_user_t *bu, guint32 flags); … … 119 120 /* System messages of any kind. */ 120 121 gboolean (*chat_log)(bee_t *bee, struct groupchat *c, const char *text); 121 gboolean (*chat_msg)(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, time_t sent_at);122 gboolean (*chat_msg)(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, guint32 flags, time_t sent_at); 122 123 gboolean (*chat_add_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu); 123 gboolean (*chat_remove_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu );124 gboolean (*chat_remove_user)(bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *reason); 124 125 gboolean (*chat_topic)(bee_t *bee, struct groupchat *c, const char *new_topic, bee_user_t *bu); 125 126 gboolean (*chat_name_hint)(bee_t *bee, struct groupchat *c, const char *name); -
protocols/bee_chat.c
re4f08bf r29ff5c2 104 104 } 105 105 106 void imcb_chat_msg(struct groupchat *c, const char *who, char *msg, uint32_tflags, time_t sent_at)106 void imcb_chat_msg(struct groupchat *c, const char *who, char *msg, guint32 flags, time_t sent_at) 107 107 { 108 108 struct im_connection *ic = c->ic; 109 109 bee_t *bee = ic->bee; 110 110 bee_user_t *bu; 111 gboolean temp ;111 gboolean temp = FALSE; 112 112 char *s; 113 113 114 /* Gaim sends own messages through this too. IRC doesn't want this, so kill them */ 115 if (handle_is_self(ic, who)) { 114 if (handle_is_self(ic, who) && !(flags & OPT_SELFMESSAGE)) { 116 115 return; 117 116 } … … 131 130 132 131 if (bee->ui->chat_msg) { 133 bee->ui->chat_msg(bee, c, bu, msg, sent_at);132 bee->ui->chat_msg(bee, c, bu, msg, flags, sent_at); 134 133 } 135 134 … … 239 238 240 239 if (bee->ui->chat_remove_user && bu) { 241 bee->ui->chat_remove_user(bee, c, bu );240 bee->ui->chat_remove_user(bee, c, bu, reason); 242 241 } 243 242 } -
protocols/bee_user.c
re4f08bf r29ff5c2 247 247 } 248 248 249 void imcb_buddy_msg(struct im_connection *ic, const char *handle, const char *msg, uint32_tflags, time_t sent_at)249 void imcb_buddy_msg(struct im_connection *ic, const char *handle, const char *msg, guint32 flags, time_t sent_at) 250 250 { 251 251 bee_t *bee = ic->bee; … … 265 265 266 266 if (bee->ui->user_msg && bu) { 267 bee->ui->user_msg(bee, bu, msg, sent_at);267 bee->ui->user_msg(bee, bu, msg, flags, sent_at); 268 268 } else { 269 269 imcb_log(ic, "Message from unknown handle %s:\n%s", handle, msg); … … 297 297 } 298 298 299 void imcb_buddy_typing(struct im_connection *ic, const char *handle, uint32_tflags)299 void imcb_buddy_typing(struct im_connection *ic, const char *handle, guint32 flags) 300 300 { 301 301 bee_user_t *bu; -
protocols/ft.h
re4f08bf r29ff5c2 58 58 * | accept 59 59 * V 60 * /------ /-------------\ /------------------------ \61 * out_of_data | | TRANSFER ING | -----------------> | TRANSFERING | CANCELED |62 * \-----> \-------------/ [canceled,]free \------------------------ /60 * /------ /-------------\ /--------------------------\ 61 * out_of_data | | TRANSFERRING | -----------------> | TRANSFERRING | CANCELED | 62 * \-----> \-------------/ [canceled,]free \--------------------------/ 63 63 * | 64 64 * | finished,free 65 65 * V 66 * /------------------------ \67 * | TRANSFER ING | FINISHED |68 * \------------------------ /66 * /-------------------------\ 67 * | TRANSFERRING | FINISHED | 68 * \-------------------------/ 69 69 */ 70 70 typedef struct file_transfer { … … 115 115 116 116 /* 117 * If set, called after succes ful connection setup.117 * If set, called after successful connection setup. 118 118 */ 119 119 void (*accept)(struct file_transfer *file); -
protocols/jabber/conference.c
re4f08bf r29ff5c2 26 26 27 27 static xt_status jabber_chat_join_failed(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 28 static xt_status jabber_chat_self_message(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 28 29 29 30 struct groupchat *jabber_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password) … … 127 128 } 128 129 130 static xt_status jabber_chat_self_message(struct im_connection *ic, struct xt_node *node, struct xt_node *orig) 131 { 132 /* This is a self message sent by this bitlbee - just drop it */ 133 return XT_ABORT; 134 } 135 129 136 struct groupchat *jabber_chat_by_jid(struct im_connection *ic, const char *name) 130 137 { … … 171 178 node = jabber_make_packet("message", "groupchat", jc->name, node); 172 179 173 if (!jabber_write_packet(ic, node)) { 174 xt_free_node(node); 175 return 0; 176 } 177 xt_free_node(node); 178 179 return 1; 180 jabber_cache_add(ic, node, jabber_chat_self_message); 181 182 return !jabber_write_packet(ic, node); 180 183 } 181 184 … … 299 302 } 300 303 } 301 302 /* Some program-specific restrictions. */303 imcb_clean_handle(ic, bud->ext_jid);304 304 } 305 305 bud->flags |= JBFLAG_IS_ANONYMOUS; … … 331 331 } else if (type) { /* type can only be NULL or "unavailable" in this function */ 332 332 if ((bud->flags & JBFLAG_IS_CHATROOM) && bud->ext_jid) { 333 char *reason = NULL; 334 char *status = NULL; 335 char *status_text = NULL; 336 337 if ((c = xt_find_node_by_attr(node->children, "x", "xmlns", XMLNS_MUC_USER))) { 338 struct xt_node *c2 = c->children; 339 340 while ((c2 = xt_find_node(c2, "status"))) { 341 char *code = xt_find_attr(c2, "code"); 342 if (g_strcmp0(code, "301") == 0) { 343 status = "Banned"; 344 break; 345 } else if (g_strcmp0(code, "303") == 0) { 346 /* This could be handled in a cleverer way, 347 * but let's just show a literal part/join for now */ 348 status = "Changing nicks"; 349 break; 350 } else if (g_strcmp0(code, "307") == 0) { 351 status = "Kicked"; 352 break; 353 } 354 c2 = c2->next; 355 } 356 357 /* Sometimes the status message is in presence/x/item/reason */ 358 if ((c2 = xt_find_path(c, "item/reason")) && c2->text && c2->text_len) { 359 status_text = c2->text; 360 } 361 } 362 363 /* Sometimes the status message is right inside <presence> */ 364 if ((c = xt_find_node(node->children, "status")) && c->text && c->text_len) { 365 status_text = c->text; 366 } 367 368 if (status_text && status) { 369 reason = g_strdup_printf("%s: %s", status, status_text); 370 } else { 371 reason = g_strdup(status_text ? : status); 372 } 373 333 374 s = strchr(bud->ext_jid, '/'); 334 375 if (s) { 335 376 *s = 0; 336 377 } 337 imcb_chat_remove_buddy(chat, bud->ext_jid, NULL);378 imcb_chat_remove_buddy(chat, bud->ext_jid, reason); 338 379 if (bud != jc->me && bud->flags & JBFLAG_IS_ANONYMOUS) { 339 imcb_remove_buddy(ic, bud->ext_jid, NULL);380 imcb_remove_buddy(ic, bud->ext_jid, reason); 340 381 } 341 382 if (s) { 342 383 *s = '/'; 343 384 } 385 386 g_free(reason); 344 387 } 345 388 … … 360 403 char *final_from = NULL; 361 404 char *bare_jid = NULL; 405 guint32 flags = 0; 362 406 363 407 from = (bud) ? bud->full_jid : xt_find_attr(node, "from"); … … 396 440 397 441 if (subject && chat) { 398 char *subject_text = subject->text_len > 0 ? subject->text : NULL;442 char *subject_text = subject->text_len > 0 ? subject->text : ""; 399 443 if (g_strcmp0(chat->topic, subject_text) != 0) { 400 444 bare_jid = (bud) ? jabber_get_bare_jid(bud->ext_jid) : NULL; … … 402 446 jabber_get_timestamp(node)); 403 447 g_free(bare_jid); 448 bare_jid = NULL; 404 449 } 405 450 } … … 422 467 imcb_chat_log(chat, "From conference server: %s", body->text); 423 468 return; 424 } else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me ) {425 /* exclude self-messages since they would get filtered out426 * but not the ones in the backlog*/469 } else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me && 470 (jabber_cache_handle_packet(ic, node) == XT_ABORT)) { 471 /* Self message marked by this bitlbee, don't show it */ 427 472 return; 428 473 } 429 474 430 if (bud && jc && bud != jc->me) {475 if (bud) { 431 476 bare_jid = jabber_get_bare_jid(bud->ext_jid ? bud->ext_jid : bud->full_jid); 432 477 final_from = bare_jid; 478 flags = (bud == jc->me) ? OPT_SELFMESSAGE : 0; 433 479 } else { 434 480 final_from = nick; 435 481 } 436 482 437 imcb_chat_msg(chat, final_from, body->text, 0, jabber_get_timestamp(node));483 imcb_chat_msg(chat, final_from, body->text, flags, jabber_get_timestamp(node)); 438 484 439 485 g_free(bare_jid); -
protocols/jabber/io.c
re4f08bf r29ff5c2 147 147 } 148 148 149 static gboolean jabber_read_callback(gpointer data, gint fd, b_input_condition cond) 150 { 151 struct im_connection *ic = data; 152 struct jabber_data *jd = ic->proto_data; 153 char buf[512]; 154 int st; 155 156 if (jd->fd == -1) { 157 return FALSE; 158 } 159 160 if (jd->ssl) { 161 st = ssl_read(jd->ssl, buf, sizeof(buf)); 162 } else { 163 st = read(jd->fd, buf, sizeof(buf)); 164 } 165 166 if (st > 0) { 167 /* Parse. */ 168 if (xt_feed(jd->xt, buf, st) < 0) { 149 static gboolean jabber_feed_input(struct im_connection *ic, char *buf, int size) 150 { 151 struct jabber_data *jd = ic->proto_data; 152 153 /* Allow not passing a size for debugging purposes. 154 * This never happens when reading from the socket */ 155 if (size == -1) { 156 size = strlen(buf); 157 } 158 159 /* Parse. */ 160 if (xt_feed(jd->xt, buf, size) < 0) { 161 imcb_error(ic, "XML stream error"); 162 imc_logout(ic, TRUE); 163 return FALSE; 164 } 165 166 /* Execute all handlers. */ 167 if (!xt_handle(jd->xt, NULL, 1)) { 168 /* Don't do anything, the handlers should have 169 aborted the connection already. */ 170 return FALSE; 171 } 172 173 if (jd->flags & JFLAG_STREAM_RESTART) { 174 jd->flags &= ~JFLAG_STREAM_RESTART; 175 jabber_start_stream(ic); 176 } 177 178 /* Garbage collection. */ 179 xt_cleanup(jd->xt, NULL, 1); 180 181 /* This is a bit hackish, unfortunately. Although xmltree 182 has nifty event handler stuff, it only calls handlers 183 when nodes are complete. Since the server should only 184 send an opening <stream:stream> tag, we have to check 185 this by hand. :-( */ 186 if (!(jd->flags & JFLAG_STREAM_STARTED) && jd->xt && jd->xt->root) { 187 if (g_strcasecmp(jd->xt->root->name, "stream:stream") == 0) { 188 jd->flags |= JFLAG_STREAM_STARTED; 189 190 /* If there's no version attribute, assume 191 this is an old server that can't do SASL 192 authentication. */ 193 if (!set_getbool(&ic->acc->set, "sasl") || !sasl_supported(ic)) { 194 /* If there's no version= tag, we suppose 195 this server does NOT implement: XMPP 1.0, 196 SASL and TLS. */ 197 if (set_getbool(&ic->acc->set, "tls")) { 198 imcb_error(ic, "TLS is turned on for this " 199 "account, but is not supported by this server"); 200 imc_logout(ic, FALSE); 201 return FALSE; 202 } else { 203 if (!jabber_init_iq_auth(ic)) { 204 return FALSE; 205 } 206 } 207 } 208 } else { 169 209 imcb_error(ic, "XML stream error"); 170 210 imc_logout(ic, TRUE); 171 211 return FALSE; 172 212 } 173 174 /* Execute all handlers. */ 175 if (!xt_handle(jd->xt, NULL, 1)) { 176 /* Don't do anything, the handlers should have 177 aborted the connection already. */ 213 } 214 215 return TRUE; 216 } 217 218 219 static gboolean jabber_read_callback(gpointer data, gint fd, b_input_condition cond) 220 { 221 struct im_connection *ic = data; 222 struct jabber_data *jd = ic->proto_data; 223 char buf[512]; 224 int st; 225 226 if (jd->fd == -1) { 227 return FALSE; 228 } 229 230 if (jd->ssl) { 231 st = ssl_read(jd->ssl, buf, sizeof(buf)); 232 } else { 233 st = read(jd->fd, buf, sizeof(buf)); 234 } 235 236 if (st > 0) { 237 if (!jabber_feed_input(ic, buf, st)) { 178 238 return FALSE; 179 }180 181 if (jd->flags & JFLAG_STREAM_RESTART) {182 jd->flags &= ~JFLAG_STREAM_RESTART;183 jabber_start_stream(ic);184 }185 186 /* Garbage collection. */187 xt_cleanup(jd->xt, NULL, 1);188 189 /* This is a bit hackish, unfortunately. Although xmltree190 has nifty event handler stuff, it only calls handlers191 when nodes are complete. Since the server should only192 send an opening <stream:stream> tag, we have to check193 this by hand. :-( */194 if (!(jd->flags & JFLAG_STREAM_STARTED) && jd->xt && jd->xt->root) {195 if (g_strcasecmp(jd->xt->root->name, "stream:stream") == 0) {196 jd->flags |= JFLAG_STREAM_STARTED;197 198 /* If there's no version attribute, assume199 this is an old server that can't do SASL200 authentication. */201 if (!set_getbool(&ic->acc->set, "sasl") || !sasl_supported(ic)) {202 /* If there's no version= tag, we suppose203 this server does NOT implement: XMPP 1.0,204 SASL and TLS. */205 if (set_getbool(&ic->acc->set, "tls")) {206 imcb_error(ic, "TLS is turned on for this "207 "account, but is not supported by this server");208 imc_logout(ic, FALSE);209 return FALSE;210 } else {211 return jabber_init_iq_auth(ic);212 }213 }214 } else {215 imcb_error(ic, "XML stream error");216 imc_logout(ic, TRUE);217 return FALSE;218 }219 239 } 220 240 } else if (st == 0 || (st < 0 && !ssl_sockerr_again(jd->ssl))) { -
protocols/jabber/iq.c
re4f08bf r29ff5c2 385 385 struct xt_node *response; 386 386 struct jabber_data *jd = ic->proto_data; 387 388 response = jabber_make_packet("iq", "result", g_strdup_printf("%s@%s", jd->username, jd->server), NULL);387 388 response = jabber_make_packet("iq", "result", jd->me, NULL); 389 389 390 390 jabber_cache_add(ic, response, NULL); -
protocols/jabber/jabber.c
re4f08bf r29ff5c2 85 85 set_setstr(&acc->set, "server", "chat.hipchat.com"); 86 86 } else { 87 s = set_add(&acc->set, "oauth", "false", set_eval_oauth, acc); 87 set_add(&acc->set, "oauth", "false", set_eval_oauth, acc); 88 89 /* this reuses set_eval_oauth, which clears the password */ 90 set_add(&acc->set, "anonymous", "false", set_eval_oauth, acc); 88 91 } 89 92 … … 194 197 } else { 195 198 jabber_connect(ic); 199 } 200 } 201 202 static void jabber_xmlconsole_enable(struct im_connection *ic) 203 { 204 struct jabber_data *jd = ic->proto_data; 205 const char *handle = JABBER_XMLCONSOLE_HANDLE; 206 bee_user_t *bu; 207 208 jd->flags |= JFLAG_XMLCONSOLE; 209 210 if (!(bu = bee_user_by_handle(ic->bee, ic, handle))) { 211 bu = bee_user_new(ic->bee, ic, handle, 0); 212 bu->flags |= BEE_USER_NOOTR; 196 213 } 197 214 } … … 263 280 264 281 if (set_getbool(&acc->set, "xmlconsole")) { 265 jd->flags |= JFLAG_XMLCONSOLE; 266 /* Shouldn't really do this at this stage already, maybe. But 267 I think this shouldn't break anything. */ 268 imcb_add_buddy(ic, JABBER_XMLCONSOLE_HANDLE, NULL); 282 jabber_xmlconsole_enable(ic); 269 283 } 270 284 … … 331 345 } 332 346 if (jd->fd >= 0) { 333 closesocket(jd->fd);347 proxy_disconnect(jd->fd); 334 348 } 335 349 … … 342 356 } 343 357 344 jabber_buddy_remove_all(ic); 358 if (jd->buddies) { 359 jabber_buddy_remove_all(ic); 360 } 345 361 346 362 xt_free(jd->xt); … … 469 485 static void jabber_add_buddy(struct im_connection *ic, char *who, char *group) 470 486 { 471 struct jabber_data *jd = ic->proto_data;472 473 487 if (g_strcasecmp(who, JABBER_XMLCONSOLE_HANDLE) == 0) { 474 jd->flags |= JFLAG_XMLCONSOLE; 475 imcb_add_buddy(ic, JABBER_XMLCONSOLE_HANDLE, NULL); 488 jabber_xmlconsole_enable(ic); 476 489 return; 477 490 } … … 587 600 { 588 601 struct jabber_data *jd = ic->proto_data; 589 struct jabber_buddy *bud ;602 struct jabber_buddy *bud, *bare; 590 603 591 604 /* Enable typing notification related code from now. */ 592 605 jd->flags |= JFLAG_WANT_TYPING; 593 606 594 if ((bud = jabber_buddy_by_jid(ic, who, 0)) == NULL) { 607 if ((bud = jabber_buddy_by_jid(ic, who, 0)) == NULL || 608 (bare = jabber_buddy_by_jid(ic, who, GET_BUDDY_BARE)) == NULL) { 595 609 /* Sending typing notifications to unknown buddies is 596 610 unsupported for now. Shouldn't be a problem, I think. */ … … 598 612 } 599 613 600 if (bud->flags & JBFLAG_DOES_XEP85) { 614 615 if (bud->flags & JBFLAG_DOES_XEP85 || bare->flags & JBFLAG_DOES_XEP85) { 601 616 /* We're only allowed to send this stuff if we know the other 602 side supports it. */ 617 side supports it. If the bare JID has the flag, all other 618 resources get it, too (That is the case in gtalk) */ 603 619 604 620 struct xt_node *node; -
protocols/jabber/jabber_util.c
re4f08bf r29ff5c2 514 514 } else if (bud->resource && (flags & GET_BUDDY_EXACT)) { 515 515 /* We want an exact match, so in thise case there shouldn't be a /resource. */ 516 return NULL; 516 if (head != bud && head->resource == NULL) { 517 return head; 518 } else { 519 return NULL; 520 } 517 521 } else if (bud->resource == NULL || bud->next == NULL) { 518 522 /* No need for selection if there's only one option. */ -
protocols/jabber/message.c
re4f08bf r29ff5c2 37 37 if (!from) { 38 38 return XT_HANDLED; /* Consider this packet corrupted. */ 39 } 39 40 40 } 41 if (request && id) { 41 if (request && id && g_strcmp0(type, "groupchat") != 0) { 42 42 /* Send a message receipt (XEP-0184), looking like this: 43 * <message 44 * from='kingrichard@royalty.england.lit/throne' 45 * id='bi29sg183b4v' 46 * to='northumberland@shakespeare.lit/westminster'> 43 * <message from='...' id='...' to='...'> 47 44 * <received xmlns='urn:xmpp:receipts' id='richard2-4.1.247'/> 48 * </message> */ 45 * </message> 46 * 47 * MUC messages are excluded, since receipts aren't supposed to be sent over MUCs 48 * (XEP-0184 section 5.3) and replying to those may result in 'forbidden' errors. 49 */ 49 50 struct xt_node *received, *receipt; 50 51 … … 142 143 imcb_buddy_typing(ic, from, OPT_TYPING); 143 144 } 144 /* No need to send a "stopped typing" signal when there's a message. */ 145 else if (xt_find_node(node->children, "active") && (body == NULL)) { 145 else if (xt_find_node(node->children, "active")) { 146 146 bud->flags |= JBFLAG_DOES_XEP85; 147 imcb_buddy_typing(ic, from, 0); 147 148 /* No need to send a "stopped typing" signal when there's a message. */ 149 if (body == NULL) { 150 imcb_buddy_typing(ic, from, 0); 151 } 148 152 } else if (xt_find_node(node->children, "paused")) { 149 153 bud->flags |= JBFLAG_DOES_XEP85; -
protocols/jabber/s5bytestream.c
re4f08bf r29ff5c2 85 85 return jabber_bs_abort(bt, msg ": %s", strerror(errno)); } 86 86 87 gboolean jabber_bs_abort(struct bs_transfer *bt, char *format, ...) ;87 gboolean jabber_bs_abort(struct bs_transfer *bt, char *format, ...) G_GNUC_PRINTF(2, 3); 88 88 void jabber_bs_canceled(file_transfer_t *ft, char *reason); 89 89 void jabber_bs_free_transfer(file_transfer_t *ft); … … 536 536 * that sends atyp=0 addrlen=0 and only 6 bytes (one less than one would expect). 537 537 * Therefore I removed the wait for more bytes. Since we don't care about what else the proxy 538 * is sending, it should nt matter */538 * is sending, it should not matter */ 539 539 540 540 if (bt->tf->ft->sending) { … … 559 559 * An intelligent sender would probably specify himself as the first streamhost and 560 560 * a proxy as the second (Kopete and PSI are examples here). That way, a (potentially) 561 * slow proxy is only used if nec cessary. This of course also means, that the timeout561 * slow proxy is only used if necessary. This of course also means, that the timeout 562 562 * per streamhost should be kept short. If one or two firewalled adresses are specified, 563 563 * they have to timeout first before a proxy is tried. -
protocols/jabber/sasl.c
re4f08bf r29ff5c2 54 54 struct xt_node *c, *reply; 55 55 char *s; 56 int sup_plain = 0, sup_digest = 0, sup_gtalk = 0, sup_fb = 0 ;57 int want_oauth = FALSE, want_hipchat = FALSE ;56 int sup_plain = 0, sup_digest = 0, sup_gtalk = 0, sup_fb = 0, sup_anonymous = 0; 57 int want_oauth = FALSE, want_hipchat = FALSE, want_anonymous = FALSE; 58 58 GString *mechs; 59 59 … … 74 74 } 75 75 76 want_anonymous = set_getbool(&ic->acc->set, "anonymous"); 76 77 want_oauth = set_getbool(&ic->acc->set, "oauth"); 77 78 want_hipchat = (jd->flags & JFLAG_HIPCHAT); … … 84 85 } else if (c->text && g_strcasecmp(c->text, "DIGEST-MD5") == 0) { 85 86 sup_digest = 1; 87 } else if (c->text && g_strcasecmp(c->text, "ANONYMOUS") == 0) { 88 sup_anonymous = 1; 86 89 } else if (c->text && g_strcasecmp(c->text, "X-OAUTH2") == 0) { 87 90 sup_gtalk = 1; … … 142 145 xt_free_node(reply); 143 146 return XT_ABORT; 144 } else if (sup_digest) { 147 } else if (want_anonymous && sup_anonymous) { 148 xt_add_attr(reply, "mechanism", "ANONYMOUS"); 149 150 /* Well, that was easy. */ 151 } else if (want_anonymous) { 152 imcb_error(ic, "Anonymous login requested, but not supported by server"); 153 imc_logout(ic, FALSE); 154 xt_free_node(reply); 155 return XT_ABORT; 156 } else if (sup_digest && !(jd->ssl && sup_plain)) { 157 /* Only try DIGEST-MD5 if there's no SSL/TLS or if PLAIN isn't supported. 158 * Which in practice means "don't bother with DIGEST-MD5 most of the time". 159 * It's weak, pointless over TLS, and often breaks with some servers (hi openfire) */ 160 145 161 xt_add_attr(reply, "mechanism", "DIGEST-MD5"); 146 162 -
protocols/jabber/si.c
re4f08bf r29ff5c2 186 186 jd->filetransfers = g_slist_prepend(jd->filetransfers, tf); 187 187 188 /* query buddy's features and server's streaming proxies if nec cessary */188 /* query buddy's features and server's streaming proxies if necessary */ 189 189 190 190 if (!tf->bud->features) { … … 283 283 284 284 if (requestok) { 285 /* Figure out who the transfer should come from e... */285 /* Figure out who the transfer should come from... */ 286 286 287 287 ext_jid = ini_jid; … … 403 403 * <iq from=... to=... id=...> 404 404 * <si xmlns=si> 405 * [ <file xmlns=ft/> ] <-- not nec cessary405 * [ <file xmlns=ft/> ] <-- not necessary 406 406 * <feature xmlns=feature> 407 407 * <x xmlns=xdata type=submit> -
protocols/msn/ns.c
re4f08bf r29ff5c2 39 39 static void msn_ns_send_adl(struct im_connection *ic); 40 40 static void msn_ns_structured_message(struct msn_data *md, char *msg, int msglen, char **cmd); 41 static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action );41 static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action, gboolean selfmessage); 42 42 static void msn_ns_nfy(struct msn_data *md, char *who, char **parts, char *action, gboolean is_put); 43 43 … … 475 475 } 476 476 477 /* returns newly allocated string */ 478 static char *msn_ns_parse_header_address(struct msn_data *md, char *headers, char *header_name) 479 { 480 char *semicolon = NULL; 481 char *header = NULL; 482 char *address = NULL; 483 484 if (!(header = get_rfc822_header(headers, header_name, 0))) { 485 return NULL; 486 } 487 488 /* either the semicolon or the end of the string */ 489 semicolon = strchr(header, ';') ? : (header + strlen(header)); 490 491 address = g_strndup(header + 2, semicolon - header - 2); 492 493 g_free(header); 494 return address; 495 } 496 477 497 static void msn_ns_structured_message(struct msn_data *md, char *msg, int msglen, char **cmd) 478 498 { 479 499 char **parts = NULL; 480 char *semicolon = NULL;481 500 char *action = NULL; 482 char *from = NULL;483 501 char *who = NULL; 502 gboolean selfmessage = FALSE; 484 503 485 504 parts = g_strsplit(msg, "\r\n\r\n", 4); 486 505 487 if (!( from = get_rfc822_header(parts[0], "From", 0))) {506 if (!(who = msn_ns_parse_header_address(md, parts[0], "From"))) { 488 507 goto cleanup; 489 508 } 490 509 491 /* either the semicolon or the end of the string */ 492 semicolon = strchr(from, ';') ? : (from + strlen(from)); 493 494 who = g_strndup(from + 2, semicolon - from - 2); 510 if (strcmp(who, md->ic->acc->user) == 0) { 511 selfmessage = TRUE; 512 g_free(who); 513 if (!(who = msn_ns_parse_header_address(md, parts[0], "To"))) { 514 goto cleanup; 515 } 516 } 495 517 496 518 if ((strcmp(cmd[0], "SDG") == 0) && (action = get_rfc822_header(parts[2], "Message-Type", 0))) { 497 msn_ns_sdg(md, who, parts, action );519 msn_ns_sdg(md, who, parts, action, selfmessage); 498 520 499 521 } else if ((strcmp(cmd[0], "NFY") == 0) && (action = get_rfc822_header(parts[2], "Uri", 0))) { … … 505 527 g_strfreev(parts); 506 528 g_free(action); 507 g_free(from);508 529 g_free(who); 509 530 } 510 531 511 static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action )532 static void msn_ns_sdg(struct msn_data *md, char *who, char **parts, char *action, gboolean selfmessage) 512 533 { 513 534 struct im_connection *ic = md->ic; 514 535 515 if (strcmp(action, "Control/Typing") == 0 ) {536 if (strcmp(action, "Control/Typing") == 0 && !selfmessage) { 516 537 imcb_buddy_typing(ic, who, OPT_TYPING); 517 538 } else if (strcmp(action, "Text") == 0) { 518 imcb_buddy_msg(ic, who, parts[3], 0, 0);539 imcb_buddy_msg(ic, who, parts[3], selfmessage ? OPT_SELFMESSAGE : 0, 0); 519 540 } 520 541 } … … 595 616 } else { 596 617 imcb_error(ic, "Error during Passport authentication: %s", error); 597 imc_logout(ic, TRUE); 618 619 /* don't reconnect with auth errors */ 620 if (error && g_str_has_prefix(error, "wsse:FailedAuthentication")) { 621 imc_logout(ic, FALSE); 622 } else { 623 imc_logout(ic, TRUE); 624 } 598 625 } 599 626 } -
protocols/msn/soap.c
re4f08bf r29ff5c2 327 327 struct xt_node *code = xt_find_node(node->children, "faultcode"); 328 328 struct xt_node *string = xt_find_node(node->children, "faultstring"); 329 struct xt_node *reqstatus = xt_find_path(node, "psf:pp/psf:reqstatus"); 329 330 struct xt_node *url; 330 331 … … 335 336 url->text_len > 0) { 336 337 sd->redirect = g_strdup(url->text); 338 } else if (reqstatus && strcmp(reqstatus->text, "0x800488fe") == 0) { 339 char *msg = "Location blocked. Log in to live.com, go to recent activity and click 'this was me'"; 340 sd->error = g_strdup_printf("%s (%s)", code->text, msg); 337 341 } else { 338 342 sd->error = g_strdup_printf("%s (%s)", code->text, string && string->text_len ? … … 346 350 { "wsse:BinarySecurityToken", "wst:RequestedSecurityToken", msn_soap_passport_sso_token }, 347 351 { "S:Fault", "S:Envelope", msn_soap_passport_failure }, 352 { "S:Fault", "wst:RequestSecurityTokenResponse", msn_soap_passport_failure }, 348 353 { NULL, NULL, NULL } 349 354 }; -
protocols/nogaim.c
re4f08bf r29ff5c2 735 735 } 736 736 737 /* Deprecated: using this function resulted in merging several handles accidentally 738 * Also the irc layer handles this decently nowadays */ 737 739 void imcb_clean_handle(struct im_connection *ic, char *handle) 738 740 { 739 /* Accepts a handle and does whatever is necessary to make it 740 BitlBee-friendly. Currently this means removing everything 741 outside 33-127 (ASCII printable excl spaces), @ (only one 742 is allowed) and ! and : */ 743 char out[strlen(handle) + 1]; 744 int s, d; 745 746 s = d = 0; 747 while (handle[s]) { 748 if (handle[s] > ' ' && handle[s] != '!' && handle[s] != ':' && 749 (handle[s] & 0x80) == 0) { 750 if (handle[s] == '@') { 751 /* See if we got an @ already? */ 752 out[d] = 0; 753 if (strchr(out, '@')) { 754 continue; 755 } 756 } 757 758 out[d++] = handle[s]; 759 } 760 s++; 761 } 762 out[d] = handle[s]; 763 764 strcpy(handle, out); 765 } 741 } -
protocols/nogaim.h
re4f08bf r29ff5c2 70 70 #define OPT_PONGS 0x00010000 /* Service sends us keep-alives */ 71 71 #define OPT_PONGED 0x00020000 /* Received a keep-alive during last interval */ 72 #define OPT_SELFMESSAGE 0x00080000 /* A message sent by self from another location */ 72 73 73 74 /* ok. now the fun begins. first we create a connection structure */ … … 325 326 G_MODULE_EXPORT void imcb_buddy_action_response(bee_user_t *bu, const char *action, char * const args[], void *data); 326 327 327 G_MODULE_EXPORT void imcb_buddy_typing(struct im_connection *ic, const char *handle, uint32_tflags);328 G_MODULE_EXPORT void imcb_buddy_typing(struct im_connection *ic, const char *handle, guint32 flags); 328 329 G_MODULE_EXPORT struct bee_user *imcb_buddy_by_handle(struct im_connection *ic, const char *handle); 329 G_MODULE_EXPORT void imcb_clean_handle(struct im_connection *ic, char *handle); 330 331 G_GNUC_DEPRECATED G_MODULE_EXPORT void imcb_clean_handle(struct im_connection *ic, char *handle); 330 332 331 333 /* Actions, or whatever. */ -
protocols/oscar/aim.h
re4f08bf r29ff5c2 871 871 * SNAC Family: Internal Messages 872 872 * 873 * This isn't tru ely a SNAC family either, but using873 * This isn't truly a SNAC family either, but using 874 874 * these, we can integrated non-SNAC services into 875 875 * the SNAC-centered libfaim callback structure. -
protocols/oscar/auth.c
re4f08bf r29ff5c2 41 41 * meaning you generally never call this. 42 42 * 43 * But there are times when something might want it sep erate. Specifically,43 * But there are times when something might want it separate. Specifically, 44 44 * libfaim sends this internally when doing SNAC login. 45 45 * -
protocols/oscar/conn.c
re4f08bf r29ff5c2 15 15 * In OSCAR, every connection has a set of SNAC groups associated 16 16 * with it. These are the groups that you can send over this connection 17 * without being guar enteed a "Not supported" SNAC error.17 * without being guaranteed a "Not supported" SNAC error. 18 18 * 19 19 * The grand theory of things says that these associations transcend … … 36 36 * 37 37 * Here comes the good bit. Without even letting anyone know, particularly 38 * the module that decided to send this SNAC, and definit ly not that twit38 * the module that decided to send this SNAC, and definitely not that twit 39 39 * in Greenland, you send out a service request. In this request, you have 40 40 * marked the need for a connection supporting group 0x000e. A few seconds … … 317 317 318 318 if (deadconn->fd >= 3) { 319 closesocket(deadconn->fd);319 proxy_disconnect(deadconn->fd); 320 320 } 321 321 deadconn->fd = -1; -
protocols/oscar/im.c
re4f08bf r29ff5c2 50 50 * encoding for your message. In UNICODE mode, _all_ characters must 51 51 * occupy 16bits, including ones that are not special. (Remember that 52 * the first 128 UNICODE symbols are equiv elent to ASCII7, however they52 * the first 128 UNICODE symbols are equivalent to ASCII7, however they 53 53 * must be prefixed with a zero high order byte.) 54 54 * … … 64 64 * in all of libfaim, it is written with performance in mind. As such, 65 65 * it is not as clear as it could be in respect to how this message is 66 * supposed to be la yed out. Most obviously, tlvlists should be used66 * supposed to be laid out. Most obviously, tlvlists should be used 67 67 * instead of writing out the bytes manually. 68 68 * … … 476 476 * examples of how to do this. 477 477 * 478 * I would definit ly recommend avoiding this feature unless you really478 * I would definitely recommend avoiding this feature unless you really 479 479 * know what you are doing, and/or you have something neat to do with it. 480 480 * … … 638 638 } 639 639 #if 0 640 /* XXX this isn't really neces ary... */640 /* XXX this isn't really necessary... */ 641 641 if (((args.flag1 != 0x0000) && 642 642 (args.flag1 != 0x0002) && … … 1161 1161 * 1162 1162 * Channel 0x0001 is the message channel. There are 1163 * other channels for things called "rende vous"1163 * other channels for things called "rendezvous" 1164 1164 * which represent chat and some of the other new 1165 1165 * features of AIM2/3/3.5. 1166 1166 * 1167 * Channel 0x0002 is the Rende vous channel, which1167 * Channel 0x0002 is the Rendezvous channel, which 1168 1168 * is where Chat Invitiations and various client-client 1169 1169 * connection negotiations come from. … … 1181 1181 * with the TLVs read below, they are two different pieces. The 1182 1182 * userinfo block contains the number of TLVs that contain user 1183 * information, the rest are not even though there is no sep eration.1183 * information, the rest are not even though there is no separation. 1184 1184 * aim_extractuserinfo() returns the number of bytes used by the 1185 1185 * userinfo tlvs, so you can start reading the rest of them right … … 1253 1253 /* 1254 1254 * 1255 * I definit ly recommend sending this. If you don't, you'll be stuck1255 * I definitely recommend sending this. If you don't, you'll be stuck 1256 1256 * with the rather unreasonable defaults. You don't want those. Send this. 1257 1257 * -
protocols/oscar/misc.c
re4f08bf r29ff5c2 3 3 * aim_misc.c 4 4 * 5 * TODO: Sep erate a lot of this into an aim_bos.c.5 * TODO: Separate a lot of this into an aim_bos.c. 6 6 * 7 7 * Other things... -
protocols/oscar/msgcookie.c
re4f08bf r29ff5c2 142 142 * @cookiep: the address of a pointer to the cookie struct to remove 143 143 * 144 * this function removes the cookie *cookie from t ehlist of cookies144 * this function removes the cookie *cookie from the list of cookies 145 145 * in sess, and then frees all memory associated with it. including 146 146 * its data! if you want to use the private data after calling this, -
protocols/oscar/oscar.c
re4f08bf r29ff5c2 456 456 b_event_remove(n->inpa); 457 457 } 458 n->inpa = 0; 458 459 g_free(n->name); 459 460 g_free(n->show); … … 481 482 if (ic->inpa > 0) { 482 483 b_event_remove(ic->inpa); 484 ic->inpa = 0; 483 485 } 484 486 if (odata->cnpa > 0) { 485 487 b_event_remove(odata->cnpa); 488 odata->cnpa = 0; 486 489 } 487 490 if (odata->paspa > 0) { 488 491 b_event_remove(odata->paspa); 492 odata->paspa = 0; 489 493 } 490 494 aim_session_kill(odata->sess); … … 637 641 aim_sendcookie(sess, bosconn, info->cookie); 638 642 b_event_remove(ic->inpa); 643 ic->inpa = 0; 639 644 640 645 return 1; … … 1261 1266 } break; 1262 1267 1263 case 2: { /* rende vous */1268 case 2: { /* rendezvous */ 1264 1269 struct aim_incomingim_ch2_args *args; 1265 1270 args = va_arg(ap, struct aim_incomingim_ch2_args *); … … 2586 2591 if (cc->inpa > 0) { 2587 2592 b_event_remove(cc->inpa); 2593 cc->inpa = 0; 2588 2594 } 2589 2595 aim_conn_kill(od->sess, &cc->conn); -
protocols/oscar/rxhandlers.c
re4f08bf r29ff5c2 381 381 /* 382 382 * This doesn't have to be called here. It could easily be done 383 * by a sep erate thread or something. It's an administrative operation,383 * by a separate thread or something. It's an administrative operation, 384 384 * and can take a while. Though the less you call it the less memory 385 385 * you'll have :) -
protocols/oscar/rxqueue.c
re4f08bf r29ff5c2 361 361 /* 362 362 * Grab a single command sequence off the socket, and enqueue 363 * it in the incoming event queue in a sep erate struct.363 * it in the incoming event queue in a separate struct. 364 364 */ 365 365 int aim_get_command(aim_session_t *sess, aim_conn_t *conn) … … 479 479 480 480 /* 481 * Purge rec ieve queue of all handled commands (->handled==1). Also481 * Purge receive queue of all handled commands (->handled==1). Also 482 482 * allows for selective freeing using ->nofree so that the client can 483 483 * keep the data for various purposes. -
protocols/oscar/service.c
re4f08bf r29ff5c2 157 157 158 158 /* 159 * OSCAR defines several 'rate classes'. Each class has sep erate159 * OSCAR defines several 'rate classes'. Each class has separate 160 160 * rate limiting properties (limit level, alert level, disconnect 161 161 * level, etc), and a set of SNAC family/type pairs associated with … … 709 709 * of memory. (I won't put it past them to start requesting data in 710 710 * less static regions -- regions that are initialized at run time, but still 711 * before the client rec ieves this request.)712 * 713 * When the client rec ieves the request, it adds it to the current ds711 * before the client receives this request.) 712 * 713 * When the client receives the request, it adds it to the current ds 714 714 * (0x00400000) and dereferences it, copying the data into a buffer which 715 715 * it then runs directly through the MD5 hasher. The 16 byte output of … … 723 723 * download a FREE, fully featured, and authorized client, here 724 724 * http://www.aol.com/aim/download2.html" 725 * The connection is then closed, rec ieving disconnect code 1, URL725 * The connection is then closed, receiving disconnect code 1, URL 726 726 * http://www.aim.aol.com/errors/USER_LOGGED_OFF_NEW_LOGIN.html. 727 727 * 728 728 * Note, however, that numerous inconsistencies can cause the above error, 729 * not just sending back a bad hash. Do not immediat ly suspect this code729 * not just sending back a bad hash. Do not immediately suspect this code 730 730 * if you get disconnected. AOL and the open/free software community have 731 731 * played this game for a couple years now, generating the above message 732 * on numerous oc assions.732 * on numerous occasions. 733 733 * 734 734 * Anyway, neener. We win again. -
protocols/oscar/tlv.c
re4f08bf r29ff5c2 25 25 * bstream references, so that at least the ->value portion of each 26 26 * element doesn't need to be malloc/memcpy'd. This could prove to be 27 * just as eff ecient as the in-place TLV parsing used in a couple places27 * just as efficient as the in-place TLV parsing used in a couple places 28 28 * in libfaim. 29 29 * … … 135 135 /** 136 136 * aim_addtlvtochain_str - Add a string to a TLV chain 137 * @list: Desi nation chain (%NULL pointer if empty)137 * @list: Designation chain (%NULL pointer if empty) 138 138 * @type: TLV type 139 139 * @str: String to add -
protocols/oscar/txqueue.c
re4f08bf r29ff5c2 67 67 * The overall purpose here is to enqueue the passed in command struct 68 68 * into the outgoing (tx) queue. Basically... 69 * 1) Make a scope-irrelev ent copy of the struct69 * 1) Make a scope-irrelevant copy of the struct 70 70 * 3) Mark as not-sent-yet 71 71 * 4) Enqueue the struct into the list -
protocols/purple/purple.c
re4f08bf r29ff5c2 113 113 servers anyway! */ 114 114 if (!dir_fixed) { 115 PurpleCertificatePool *pool; 115 116 irc_t *irc = acc->bee->ui_data; 116 117 char *dir; … … 122 123 purple_blist_load(); 123 124 purple_prefs_load(); 125 126 if (proxytype == PROXY_SOCKS4A) { 127 /* do this here after loading prefs. yes, i know, it sucks */ 128 purple_prefs_set_bool("/purple/proxy/socks4_remotedns", TRUE); 129 } 130 131 /* re-create the certificate cache directory */ 132 pool = purple_certificate_find_pool("x509", "tls_peers"); 133 dir = purple_certificate_pool_mkpath(pool, NULL); 134 purple_build_dir(dir, 0700); 135 124 136 dir_fixed = TRUE; 125 137 } … … 1404 1416 PurpleProxyInfo *pi = purple_global_proxy_get_info(); 1405 1417 switch (proxytype) { 1418 case PROXY_SOCKS4A: 1406 1419 case PROXY_SOCKS4: 1407 1420 purple_proxy_info_set_type(pi, PURPLE_PROXY_SOCKS4); -
protocols/skype/README
re4f08bf r29ff5c2 203 203 204 204 * `account skype set skypeconsole_receive true` will make the 205 `skypeconsole` account dump all the rec ieved raw traffic for you205 `skypeconsole` account dump all the received raw traffic for you 206 206 207 207 - If you want to automatically join bookmarked groupchats right after -
protocols/skype/skype.c
re4f08bf r29ff5c2 21 21 22 22 #define _XOPEN_SOURCE 23 #define _BSD_SOURCE24 23 #include <poll.h> 25 24 #include <stdio.h> … … 188 187 189 188 va_start(args, fmt); 190 vsnprintf(str, IRC_LINE_SIZE, fmt, args);189 g_vsnprintf(str, IRC_LINE_SIZE, fmt, args); 191 190 va_end(args); 192 191 … … 322 321 } 323 322 return NULL; 323 } 324 325 static struct groupchat *skype_chat_get_or_create(struct im_connection *ic, char *id) 326 { 327 struct skype_data *sd = ic->proto_data; 328 struct groupchat *gc = bee_chat_by_title(ic->bee, ic, id); 329 330 if (!gc) { 331 gc = imcb_chat_new(ic, id); 332 imcb_chat_name_hint(gc, id); 333 imcb_chat_add_buddy(gc, sd->username); 334 335 skype_printf(ic, "GET CHAT %s ADDER\n", id); 336 skype_printf(ic, "GET CHAT %s TOPIC\n", id); 337 skype_printf(ic, "GET CHAT %s ACTIVEMEMBERS\n", id); 338 } 339 340 return gc; 324 341 } 325 342 … … 688 705 info += 9; 689 706 if (sd->handle && sd->body && sd->type) { 690 struct groupchat *gc = bee_chat_by_title(ic->bee,ic, info);707 struct groupchat *gc = skype_chat_get_or_create(ic, info); 691 708 int i; 692 709 for (i = 0; i < g_list_length(sd->body); i++) { … … 1026 1043 } 1027 1044 if (!strcmp(info, "STATUS MULTI_SUBSCRIBED")) { 1028 gc = bee_chat_by_title(ic->bee, ic, id); 1029 if (!gc) { 1030 gc = imcb_chat_new(ic, id); 1031 imcb_chat_name_hint(gc, id); 1032 } 1033 skype_printf(ic, "GET CHAT %s ADDER\n", id); 1034 skype_printf(ic, "GET CHAT %s TOPIC\n", id); 1045 skype_chat_get_or_create(ic, id); 1035 1046 } else if (!strcmp(info, "STATUS DIALOG") && sd->groupchat_with) { 1036 gc = imcb_chat_new(ic, id); 1037 imcb_chat_name_hint(gc, id); 1047 gc = skype_chat_get_or_create(ic, id); 1038 1048 /* According to the docs this 1039 1049 * is necessary. However it … … 1046 1056 sd->groupchat_with); 1047 1057 imcb_chat_add_buddy(gc, buf); 1048 imcb_chat_add_buddy(gc, sd->username);1049 1058 g_free(sd->groupchat_with); 1050 1059 sd->groupchat_with = NULL; 1051 skype_printf(ic, "GET CHAT %s ADDER\n", id);1052 skype_printf(ic, "GET CHAT %s TOPIC\n", id);1053 1060 } else if (!strcmp(info, "STATUS UNSUBSCRIBED")) { 1054 1061 gc = bee_chat_by_title(ic->bee, ic, id); … … 1257 1264 } 1258 1265 g_strfreev(lines); 1259 } else if (st == 0 || (st < 0 && !s ockerr_again())) {1266 } else if (st == 0 || (st < 0 && !ssl_sockerr_again(sd->ssl))) { 1260 1267 ssl_disconnect(sd->ssl); 1261 1268 sd->fd = -1; -
protocols/skype/t/add-yes-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/added-no-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/added-yes-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/away-set-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/call-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :alice -
protocols/skype/t/call-failed-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :alice -
protocols/skype/t/called-no-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/called-yes-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/ctcp-help-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/filetransfer-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/group-add-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/group-read-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/groupchat-invite-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice … … 7 7 >> :bob!bob@skype.com JOIN :&bitlbee 8 8 << PRIVMSG &bitlbee :chat with bob 9 >> 353 alice = ##alice/$bob;a7ab206ec78 0 :@alice bob@root10 << INVITE cecil ##alice/$bob;a7ab206ec78 011 >> cecil@skype.com JOIN :##alice/$bob;a7ab206ec78 09 >> 353 alice = ##alice/$bob;a7ab206ec78 :@alice @root 10 << INVITE cecil ##alice/$bob;a7ab206ec78 11 >> cecil@skype.com JOIN :##alice/$bob;a7ab206ec78 -
protocols/skype/t/groupchat-invite-skyped.mock
re4f08bf r29ff5c2 26 26 >> GET CHAT #alice/$bob;a7ab206ec78060f1 TOPIC 27 27 << CHAT #alice/$bob;a7ab206ec78060f1 TOPIC 28 >> GET CHAT #alice/$bob;a7ab206ec78060f1 ACTIVEMEMBERS 29 << CHAT #alice/$bob;a7ab206ec78060f1 ACTIVEMEMBERS 28 30 << CHATMESSAGE 206 STATUS SENDING 29 31 << CHAT #alice/$bob;a7ab206ec78060f1 STATUS DIALOG -
protocols/skype/t/groupchat-invited-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice … … 5 5 << PRIVMSG &bitlbee :account add skype alice foo 6 6 << PRIVMSG &bitlbee :account skype on 7 >> JOIN :##cecil/$bob;4d8cc996579 18 >> 353 alice = ##cecil/$bob;4d8cc996579 1 :@alice bob cecil@root7 >> JOIN :##cecil/$bob;4d8cc996579 8 >> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root -
protocols/skype/t/groupchat-leave-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice … … 6 6 << PRIVMSG &bitlbee :account skype set skypeconsole_receive true 7 7 << PRIVMSG &bitlbee :account skype on 8 >> JOIN :##cecil/$bob;4d8cc996579 19 >> 353 alice = ##cecil/$bob;4d8cc996579 1 :@alice bob cecil@root10 << PART ##cecil/$bob;4d8cc996579 18 >> JOIN :##cecil/$bob;4d8cc996579 9 >> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root 10 << PART ##cecil/$bob;4d8cc996579 11 11 >> PRIVMSG &bitlbee :alice: CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS UNSUBSCRIBED -
protocols/skype/t/groupchat-leave-skyped.mock
re4f08bf r29ff5c2 36 36 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 37 37 << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 38 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER 39 << CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob 40 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 41 << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 42 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER 43 << CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob 44 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 45 << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 38 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS 39 << CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS 46 40 >> GET CHATMESSAGE 188 FROM_HANDLE 47 41 << CHATMESSAGE 188 FROM_HANDLE bob -
protocols/skype/t/groupchat-msg-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice … … 6 6 << PRIVMSG &bitlbee :account skype set skypeconsole_receive true 7 7 << PRIVMSG &bitlbee :account skype on 8 >> JOIN :##cecil/$bob;4d8cc996579 19 >> 353 alice = ##cecil/$bob;4d8cc996579 1 :@alice bob cecil@root10 << PRIVMSG ##cecil/$bob;4d8cc996579 1:hello8 >> JOIN :##cecil/$bob;4d8cc996579 9 >> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root 10 << PRIVMSG ##cecil/$bob;4d8cc996579 :hello 11 11 >> PRIVMSG &bitlbee :alice: CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVITY_TIMESTAMP -
protocols/skype/t/groupchat-msg-skyped.mock
re4f08bf r29ff5c2 36 36 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 37 37 << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 38 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER 39 << CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob 40 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 41 << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 42 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER 43 << CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob 44 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 45 << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC 38 >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS 39 << CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob cecil alice 46 40 >> GET CHATMESSAGE 188 FROM_HANDLE 47 41 << CHATMESSAGE 188 FROM_HANDLE bob -
protocols/skype/t/groupchat-topic-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice … … 5 5 << PRIVMSG &bitlbee :account add skype alice foo 6 6 << PRIVMSG &bitlbee :account skype on 7 >> JOIN :##cecil/$bob;4d8cc996579 18 >> 353 alice = ##cecil/$bob;4d8cc996579 1 :@alice bob cecil@root9 << TOPIC ##cecil/$bob;4d8cc996579 1:topic10 >> TOPIC ##cecil/$bob;4d8cc996579 1:topic7 >> JOIN :##cecil/$bob;4d8cc996579 8 >> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root 9 << TOPIC ##cecil/$bob;4d8cc996579 :topic 10 >> TOPIC ##cecil/$bob;4d8cc996579 :topic -
protocols/skype/t/info-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/login-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/msg-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/skype/t/set-mood-text-bitlbee.mock
re4f08bf r29ff5c2 1 >> NOTICE AUTH1 >> NOTICE * 2 2 << NICK alice 3 3 << USER alice alice localhost :Alice -
protocols/twitter/twitter.c
re4f08bf r29ff5c2 678 678 ic->flags &= ~OPT_LOGGED_IN; 679 679 680 // Remove the main_loop function from the function queue.681 b_event_remove(td->main_loop_id);682 683 if (td->timeline_gc) {684 imcb_chat_free(td->timeline_gc);685 }686 687 680 if (td) { 681 // Remove the main_loop function from the function queue. 682 b_event_remove(td->main_loop_id); 683 684 if (td->timeline_gc) { 685 imcb_chat_free(td->timeline_gc); 686 } 687 688 688 if (td->filter_update_id > 0) { 689 689 b_event_remove(td->filter_update_id); … … 1012 1012 twitter_log(ic, "Tweet `%s' does not exist", cmd[1]); 1013 1013 } else { 1014 /* More common link is twitter.com/$UID/status/$ID (and that's 1015 * what this will 302 to) but can't generate that since for RTs, 1016 * bu here points at the retweeter while id contains the id of 1017 * the original message. */ 1018 twitter_log(ic, "https://twitter.com/statuses/%lld", id); 1014 twitter_status_show_url(ic, id); 1019 1015 } 1020 1016 goto eof; -
protocols/twitter/twitter_http.c
re4f08bf r29ff5c2 24 24 /***************************************************************************\ 25 25 * * 26 * Some fun tions within this file have been copied from other files within *26 * Some functions within this file have been copied from other files within * 27 27 * BitlBee. * 28 28 * * … … 53 53 char *tmp; 54 54 GString *request = g_string_new(""); 55 void *ret ;55 void *ret = NULL; 56 56 char *url_arguments; 57 57 url_t *base_url = NULL; … … 72 72 base_url = g_new0(url_t, 1); 73 73 if (!url_set(base_url, url_string)) { 74 g_free(base_url); 75 return NULL; 74 goto error; 76 75 } 77 76 } … … 132 131 } 133 132 133 error: 134 134 g_free(url_arguments); 135 135 g_string_free(request, TRUE); -
protocols/twitter/twitter_lib.c
re4f08bf r29ff5c2 312 312 td = ic->proto_data; 313 313 314 // Parse the data. 315 if (!(parsed = twitter_parse_response(ic, req))) { 316 return; 317 } 318 314 319 txl = g_new0(struct twitter_xml_list, 1); 315 320 txl->list = td->follow_ids; 316 317 // Parse the data.318 if (!(parsed = twitter_parse_response(ic, req))) {319 return;320 }321 321 322 322 twitter_xt_get_friends_id_list(parsed, txl); … … 388 388 } 389 389 390 // Get the user list from the parsed xml feed. 391 if (!(parsed = twitter_parse_response(ic, req))) { 392 return; 393 } 394 390 395 txl = g_new0(struct twitter_xml_list, 1); 391 396 txl->list = NULL; 392 397 393 // Get the user list from the parsed xml feed.394 if (!(parsed = twitter_parse_response(ic, req))) {395 return;396 }397 398 twitter_xt_get_users(parsed, txl); 398 399 json_value_free(parsed); … … 1385 1386 td = ic->proto_data; 1386 1387 1387 txl = g_new0(struct twitter_xml_list, 1);1388 txl->list = NULL;1389 1390 1388 // The root <statuses> node should hold the list of statuses <status> 1391 1389 if (!(parsed = twitter_parse_response(ic, req))) { 1392 1390 goto end; 1393 1391 } 1392 1393 txl = g_new0(struct twitter_xml_list, 1); 1394 txl->list = NULL; 1395 1394 1396 twitter_xt_get_status_list(ic, parsed, txl); 1395 1397 json_value_free(parsed); … … 1424 1426 td = ic->proto_data; 1425 1427 1426 txl = g_new0(struct twitter_xml_list, 1);1427 txl->list = NULL;1428 1429 1428 // The root <statuses> node should hold the list of statuses <status> 1430 1429 if (!(parsed = twitter_parse_response(ic, req))) { 1431 1430 goto end; 1432 1431 } 1432 1433 txl = g_new0(struct twitter_xml_list, 1); 1434 txl->list = NULL; 1435 1433 1436 twitter_xt_get_status_list(ic, parsed, txl); 1434 1437 json_value_free(parsed); … … 1573 1576 g_free(args[1]); 1574 1577 } 1578 1579 static void twitter_http_status_show_url(struct http_request *req) 1580 { 1581 struct im_connection *ic = req->data; 1582 json_value *parsed, *id; 1583 const char *name; 1584 1585 // Check if the connection is still active. 1586 if (!g_slist_find(twitter_connections, ic)) { 1587 return; 1588 } 1589 1590 if (!(parsed = twitter_parse_response(ic, req))) { 1591 return; 1592 } 1593 1594 /* for the parson branch: 1595 name = json_object_dotget_string(json_object(parsed), "user.screen_name"); 1596 id = json_object_get_integer(json_object(parsed), "id"); 1597 */ 1598 1599 name = json_o_str(json_o_get(parsed, "user"), "screen_name"); 1600 id = json_o_get(parsed, "id"); 1601 1602 if (name && id && id->type == json_integer) { 1603 twitter_log(ic, "https://twitter.com/%s/status/%" G_GUINT64_FORMAT, name, id->u.integer); 1604 } else { 1605 twitter_log(ic, "Error: could not fetch tweet url."); 1606 } 1607 1608 json_value_free(parsed); 1609 } 1610 1611 void twitter_status_show_url(struct im_connection *ic, guint64 id) 1612 { 1613 char *url = g_strdup_printf("%s%" G_GUINT64_FORMAT "%s", TWITTER_STATUS_SHOW_URL, id, ".json"); 1614 twitter_http(ic, url, twitter_http_status_show_url, ic, 0, NULL, 0); 1615 g_free(url); 1616 } -
protocols/twitter/twitter_lib.h
re4f08bf r29ff5c2 96 96 void twitter_report_spam(struct im_connection *ic, char *screen_name); 97 97 void twitter_favourite_tweet(struct im_connection *ic, guint64 id); 98 void twitter_status_show_url(struct im_connection *ic, guint64 id); 98 99 99 100 #endif //_TWITTER_LIB_H -
protocols/yahoo/libyahoo2.c
re4f08bf r29ff5c2 12 12 * GNU GPL. 13 13 * 14 * This code is deriv itive of Gaim <http://gaim.sourceforge.net>14 * This code is derivative of Gaim <http://gaim.sourceforge.net> 15 15 * copyright (C) 1998-1999, Mark Spencer <markster@marko.net> 16 16 * 1998-1999, Adam Fritzler <afritz@marko.net> … … 1402 1402 1403 1403 /* 1404 * Status updates may be spread ac cross multiple packets and not1404 * Status updates may be spread across multiple packets and not 1405 1405 * even on buddy boundaries, so keeping some state is important. 1406 1406 * So, continue where we left off, and only add a user entry to -
protocols/yahoo/yahoo.c
re4f08bf r29ff5c2 440 440 { 441 441 struct byahoo_connect_callback_data *d = data; 442 443 if (!byahoo_get_ic_by_id(d->id)) { 442 struct im_connection *ic; 443 444 if (!(ic = byahoo_get_ic_by_id(d->id))) { 445 g_free(d); 446 return; 447 } 448 449 if (source == -1) { 450 d->callback(NULL, 0, d->data); 451 imcb_error(ic, "Could not connect to server"); 452 imc_logout(ic, TRUE); 444 453 g_free(d); 445 454 return; -
protocols/yahoo/yahoo2_callbacks.h
re4f08bf r29ff5c2 685 685 * Name: ext_yahoo_connect_async 686 686 * Connect to a host:port asynchronously. This function should return 687 * immediately retur ing a tag used to identify the connection handler,687 * immediately returning a tag used to identify the connection handler, 688 688 * or a pre-connect error (eg: host name lookup failure). 689 689 * Once the connect completes (successfully or unsuccessfully), callback
Note: See TracChangeset
for help on using the changeset viewer.