|
|
#include "notice.h"
#include "exec.h"
#include "mux.h"
#include "main.h"
Go to the source code of this file.
Functions | |
void | process_presence (jabconn conn, jabpacket packet) |
void | process_iq_get (jabconn conn, jabpacket packet) |
void | process_iq_set (jabconn conn, jabpacket packet) |
void | process_iq_result (jabconn conn, jabpacket packet) |
void | process_iq_error (jabconn conn, jabpacket packet) |
void | jab_on_packet_handler (jabconn conn, jabpacket packet) |
void | jab_on_state_handler (jabconn conn, int state) |
|
Definition at line 13 of file jabber_handler.c. References decode_notice(), dExecution, dprintf(), exec_process_packet(), jabconn, jabpacket, JABPACKET__ERROR, JABPACKET__GET, JABPACKET__RESULT, JABPACKET__SET, JABPACKET_IQ, JABPACKET_MESSAGE, JABPACKET_PRESENCE, jabpacket_reset(), xode_struct::name, ns, NS_ENCRYPTED, NULL, process_iq_error(), process_iq_get(), process_iq_result(), process_iq_set(), process_presence(), program, jabpacket_struct::subtype, trim_message(), jabpacket_struct::type, unicode_to_str(), jabpacket_struct::x, xode, xode_get_attrib(), xode_get_data(), xode_get_tag(), and xode_to_str(). Referenced by jabber_init(). 00016 { 00017 dprintf(dExecution, "Jabber packet handler called...\n"); 00018 if (conn->dumpfd != -1) { 00019 char *id = xode_get_attrib(packet->x, "id"); 00020 if (conn->dumpid == NULL || 00021 (id != NULL && !strcmp(conn->dumpid, id))) { 00022 char *tmpstr; 00023 00024 dprintf(dExecution, "Dumping to client...\n"); 00025 tmpstr = xode_to_str(packet->x); 00026 if (tmpstr) { 00027 write(conn->dumpfd, tmpstr, strlen(tmpstr) + 1); 00028 } 00029 return; 00030 } 00031 } 00032 00033 jabpacket_reset(packet); 00034 dprintf(dExecution, "Packet: %s\n", 00035 packet->x->name ? packet->x->name : "n/a"); 00036 switch (packet->type) { 00037 case JABPACKET_MESSAGE: { 00038 xode x; 00039 char *cbody, *body, *ns, *convbody; 00040 int body_sz; 00041 00042 body = NULL; 00043 00044 dprintf(dExecution, "Received MESSAGE\n"); 00045 00046 #ifdef USE_GPGME 00047 x = xode_get_tag(packet->x, "x"); 00048 if (x) { 00049 ns = xode_get_attrib(x, "xmlns"); 00050 if (ns && !strcmp(ns, NS_ENCRYPTED)) { 00051 cbody = xode_get_data(x); 00052 if (cbody) { 00053 body = JDecrypt(cbody); 00054 if (body) { 00055 trim_message(body); 00056 } 00057 } 00058 } 00059 } 00060 #endif /* USE_GPGME */ 00061 if (!body) { 00062 x = xode_get_tag(packet->x, "body"); 00063 if (x) { 00064 cbody = xode_get_data(x); 00065 if (cbody) { 00066 body = strdup(cbody); 00067 trim_message(body); 00068 } 00069 } 00070 } 00071 00072 if (!unicode_to_str(body, &convbody)) { 00073 convbody = strdup(""); 00074 } 00075 body_sz = strlen(convbody); 00076 00077 decode_notice(packet); 00078 dprintf(dExecution, "Rendering message...\n"); 00079 exec_process_packet(program, packet, convbody, body_sz); 00080 free(body); 00081 } break; 00082 00083 case JABPACKET_PRESENCE: { 00084 dprintf(dExecution, "Received PRESENCE\n"); 00085 dprintf(dExecution, "Contact status change\n"); 00086 process_presence(conn, packet); 00087 } break; 00088 00089 case JABPACKET_IQ: { 00090 dprintf(dExecution, "IQ received: %d\n", 00091 packet->subtype); 00092 switch (packet->subtype) { 00093 case JABPACKET__GET: { 00094 dprintf(dExecution, 00095 "Process IQ Get...\n"); 00096 process_iq_get(conn, packet); 00097 } break; 00098 00099 case JABPACKET__SET: { 00100 dprintf(dExecution, 00101 "Process IQ Set...\n"); 00102 process_iq_set(conn, packet); 00103 } break; 00104 00105 case JABPACKET__RESULT: { 00106 dprintf(dExecution, 00107 "Process IQ Result...\n"); 00108 process_iq_result(conn, packet); 00109 } break; 00110 00111 case JABPACKET__ERROR: { 00112 dprintf(dExecution, 00113 "Process IQ Error...\n"); 00114 process_iq_error(conn, packet); 00115 } break; 00116 00117 default: { 00118 dprintf(dExecution, 00119 "Unknown subtype.\n"); 00120 } break; 00121 } 00122 } break; 00123 00124 default: { 00125 dprintf(dExecution, 00126 "unrecognized packet: %i recieved\n", packet->type); 00127 } break; 00128 } 00129 }
|
|
Definition at line 132 of file jabber_handler.c. References dExecution, dprintf(), jab_c, jab_getfd(), jab_reauth, jab_send(), jabconn, JABCONN_STATE_AUTH, JABCONN_STATE_CONNECTED, JABCONN_STATE_OFF, JABCONN_STATE_ON, JABPACKET__AVAILABLE, JABPACKET__GET, jabutil_iqnew(), jabutil_presnew(), jVarPresence, jVarPriority, jVars_get(), mux_delete_input_source(), NS_AGENT, NS_AGENTS, NS_ROSTER, NULL, xode, xode_free(), xode_insert_cdata(), and xode_insert_tag(). Referenced by jabber_init(). 00135 { 00136 static int previous_state = JABCONN_STATE_OFF; 00137 00138 dprintf(dExecution, 00139 "Entering: new state: %i previous_state: %i\n", state, previous_state); 00140 switch (state) { 00141 case JABCONN_STATE_OFF: { 00142 if (previous_state != JABCONN_STATE_OFF) { 00143 dprintf(dExecution, 00144 "The Jabber server has disconnected you: %i\n", 00145 previous_state); 00146 mux_delete_input_source(jab_getfd(jab_c)); 00147 jab_reauth = 1; 00148 } 00149 } break; 00150 00151 case JABCONN_STATE_CONNECTED: { 00152 dprintf(dExecution, "JABCONN_STATE_CONNECTED\n"); 00153 } break; 00154 00155 case JABCONN_STATE_AUTH: { 00156 dprintf(dExecution, "JABCONN_STATE_AUTH\n"); 00157 } break; 00158 00159 case JABCONN_STATE_ON: { 00160 xode x, out; 00161 00162 dprintf(dExecution, "JABCONN_STATE_ON\n"); 00163 00164 dprintf(dExecution, "requesting agent list\n"); 00165 x = jabutil_iqnew(JABPACKET__GET, NS_AGENTS); 00166 jab_send(conn, x); 00167 xode_free(x); 00168 00169 dprintf(dExecution, "requesting roster\n"); 00170 x = jabutil_iqnew(JABPACKET__GET, NS_ROSTER); 00171 jab_send(conn, x); 00172 xode_free(x); 00173 00174 dprintf(dExecution, "requesting agent info\n"); 00175 x = jabutil_iqnew(JABPACKET__GET, NS_AGENT); 00176 jab_send(conn, x); 00177 xode_free(x); 00178 00179 if (strcmp((char *)jVars_get(jVarPresence), 00180 "available")) { 00181 xode y; 00182 00183 out = jabutil_presnew(JABPACKET__AVAILABLE, 00184 NULL, 00185 (char *)jVars_get(jVarPresence), 00186 *(int *)jVars_get(jVarPriority)); 00187 x = xode_insert_tag(out, "show"); 00188 y = xode_insert_cdata(x, 00189 (char *)jVars_get(jVarPresence), 00190 strlen((char *)jVars_get(jVarPresence))); 00191 } 00192 else { 00193 out = jabutil_presnew(JABPACKET__AVAILABLE, 00194 NULL, 00195 NULL, 00196 *(int *)jVars_get(jVarPriority)); 00197 } 00198 jab_send(conn, out); 00199 xode_free(out); 00200 } break; 00201 00202 default: { 00203 dprintf(dExecution, "UNKNOWN state: %i\n", state); 00204 } break; 00205 } 00206 previous_state = state; 00207 }
|
|
Definition at line 555 of file jabber_handler.c. References dExecution, dprintf(), jabconn, jabpacket, jabpacket_struct::x, xode, xode_get_attrib(), xode_get_tag(), and xode_get_tagdata(). Referenced by jab_on_packet_handler(). 00558 { 00559 xode x; 00560 char *code, *desc; 00561 00562 x = xode_get_tag(packet->x, "error"); 00563 code = xode_get_attrib(x, "code"); 00564 desc = xode_get_tagdata(packet->x, "error"); 00565 dprintf(dExecution, "Received error: %s\n", 00566 desc ? desc : "n/a"); 00567 fprintf(stderr, "Error %s: %s\n", 00568 code ? code : "n/a", 00569 desc ? desc : "n/a"); 00570 switch (atoi(code)) { 00571 case 302: /* Redirect */ 00572 break; 00573 case 400: /* Bad request */ 00574 /* mux_end_loop_p = 1; */ 00575 break; 00576 case 401: /* Unauthorized */ 00577 /* mux_end_loop_p = 1; */ 00578 break; 00579 case 402: /* Payment Required */ 00580 /* mux_end_loop_p = 1; */ 00581 break; 00582 case 403: /* Forbidden */ 00583 /* mux_end_loop_p = 1; */ 00584 break; 00585 case 404: /* Not Found */ 00586 /* mux_end_loop_p = 1; */ 00587 break; 00588 case 405: /* Not Allowed */ 00589 /* mux_end_loop_p = 1; */ 00590 break; 00591 case 406: /* Not Acceptable */ 00592 /* mux_end_loop_p = 1; */ 00593 break; 00594 case 407: /* Registration Required */ 00595 /* mux_end_loop_p = 1; */ 00596 break; 00597 case 408: /* Request Timeout */ 00598 /* mux_end_loop_p = 1; */ 00599 break; 00600 case 409: /* Conflict */ 00601 /* mux_end_loop_p = 1; */ 00602 break; 00603 case 500: /* Internal Server Error */ 00604 break; 00605 case 501: /* Not Implemented */ 00606 break; 00607 case 502: /* Remote Server Error */ 00608 break; 00609 case 503: /* Service Unavailable */ 00610 break; 00611 case 504: /* Remote Server Timeout */ 00612 break; 00613 default: 00614 break; 00615 } 00616 }
|
|
Definition at line 548 of file jabber_handler.c. References jabconn, and jabpacket. Referenced by jab_on_packet_handler(). 00551 { 00552 }
|
|
Definition at line 340 of file jabber_handler.c. References dExecution, dprintf(), insert_into_agent_list(), jabconn, jabpacket, jid, ns, NS_AGENT, NS_AGENTS, NS_AUTH, NS_ROSTER, NS_VERSION, NULL, update_contact_status(), update_group(), update_nickname(), jabpacket_struct::x, xode, xode_get_attrib(), xode_get_data(), xode_get_nextsibling(), xode_get_tag(), and xode_get_tagdata(). Referenced by jab_on_packet_handler(). 00343 { 00344 char *id, *ns; 00345 xode x, out; 00346 00347 id = xode_get_attrib(packet->x, "id"); 00348 if (!id) { 00349 dprintf(dExecution, "No ID!\n"); 00350 } 00351 00352 x = xode_get_tag(packet->x, "query"); 00353 if (!x) { 00354 dprintf(dExecution, "No query\n"); 00355 return; 00356 } 00357 00358 ns = xode_get_attrib(x, "xmlns"); 00359 if (!ns) { 00360 dprintf(dExecution, "No NS!\n"); 00361 return; 00362 } 00363 00364 dprintf(dExecution, "ns: %s\n", ns); 00365 if (strcmp(ns, NS_ROSTER) == 0) { 00366 xode y; 00367 00368 y = xode_get_tag(x, "item"); 00369 while (y) { 00370 char *jid, *sub, *name, *group; 00371 char *resource = NULL; 00372 char *pos; 00373 xode z; 00374 00375 jid = xode_get_attrib(y, "jid"); 00376 if (!jid) 00377 break; 00378 sub = xode_get_attrib(y, "subscription"); 00379 name = xode_get_attrib(y, "name"); 00380 z = xode_get_tag(y, "group"); 00381 group = xode_get_data(z); 00382 00383 pos = (char *) strchr(jid, '/'); 00384 if (pos) { 00385 *pos = '\0'; 00386 resource = pos + 1; 00387 } 00388 00389 dprintf(dExecution, "Buddy: %s/%s(%s) %s %s\n", 00390 jid ? jid : "n/a", 00391 resource ? resource : "n/a", 00392 group ? group : "n/a", 00393 sub ? sub : "n/a", 00394 name ? name : "n/a"); 00395 update_contact_status(jid, NULL, resource); 00396 if (name) { 00397 update_nickname(jid, name); 00398 } 00399 if (group) { 00400 update_group(jid, group); 00401 } 00402 y = xode_get_nextsibling(y); 00403 } 00404 } 00405 else if (strcmp(ns, NS_AGENTS) == 0) { 00406 xode y; 00407 00408 y = xode_get_tag(x, "agent"); 00409 while (y) { 00410 char *jid, *name, *service; 00411 int flags = AGENT_NONE; 00412 00413 jid = xode_get_attrib(y, "jid"); 00414 if (!jid) 00415 break; 00416 name = xode_get_tagdata(y, "name"); 00417 service = xode_get_tagdata(y, "service"); 00418 if (xode_get_tag(y, "transport")) { 00419 flags |= AGENT_TRANSPORT; 00420 } 00421 if (xode_get_tag(y, "register")) { 00422 flags |= AGENT_REGISTER; 00423 } 00424 if (xode_get_tag(y, "groupchat")) { 00425 flags |= AGENT_GROUPCHAT; 00426 } 00427 if (xode_get_tag(y, "search")) { 00428 flags |= AGENT_SEARCH; 00429 } 00430 insert_into_agent_list(jid, name, service, flags); 00431 dprintf(dExecution, "Agent[%s]: %s [%s]\n", 00432 name ? name : "n/a", 00433 jid ? jid : "n/a", 00434 service ? service : "n/a"); 00435 y = xode_get_nextsibling(y); 00436 } 00437 } 00438 else if (strcmp(ns, NS_AGENT) == 0) { 00439 char *name, *url, *reg; 00440 00441 name = xode_get_tagdata(x, "name"); 00442 url = xode_get_tagdata(x, "url"); 00443 reg = xode_get_tagdata(x, "register"); 00444 dprintf(dExecution, "agent: %s - %s\n", 00445 name ? name : "n/a", 00446 url ? url : "n/a"); 00447 } 00448 else if (strcmp(ns, NS_VERSION) == 0) { 00449 char *name, *ver, *os; 00450 00451 name = xode_get_tagdata(x, "name"); 00452 ver = xode_get_tagdata(x, "version"); 00453 os = xode_get_tagdata(x, "os"); 00454 dprintf(dExecution, "version: %s - %s - %s\n", 00455 name ? name : "n/a", 00456 ver ? ver : "n/a", 00457 os ? os : "n/a"); 00458 } 00459 else if (strcmp(ns, NS_AUTH) == 0) { 00460 char *seq, *tok; 00461 xode password, digest; 00462 00463 password = xode_get_tag(x, "password"); 00464 if (password) 00465 conn->auth_password = 1; 00466 else 00467 conn->auth_password = 0; 00468 00469 digest = xode_get_tag(x, "digest"); 00470 if (digest) 00471 conn->auth_digest = 1; 00472 else 00473 conn->auth_digest = 0; 00474 00475 seq = xode_get_tagdata(x, "sequence"); 00476 if (seq) 00477 conn->sequence = atoi(seq); 00478 else 00479 conn->sequence = 0; 00480 00481 tok = xode_get_tagdata(x, "token"); 00482 if (tok) 00483 conn->token = tok; 00484 else 00485 conn->token = NULL; 00486 00487 if (seq && tok) 00488 conn->auth_0k = 1; 00489 else 00490 conn->auth_0k = 0; 00491 00492 /* broken currently */ 00493 /* conn->auth_digest = 0; */ 00494 00495 dprintf(dExecution, 00496 "auth support:\npassword=%s\ndigest=%s\n0k=%s %s %s\n", 00497 password ? "supported" : "not supported", 00498 digest ? "supported" : "not supported", 00499 (seq && tok) ? "supported" : "not supported", 00500 (seq && tok) ? seq : "", 00501 (seq && tok) ? tok : ""); 00502 } 00503 00504 return; 00505 }
|
|
Definition at line 508 of file jabber_handler.c. References dExecution, dprintf(), jabconn, jabpacket, jid, ns, NS_ROSTER, remove_from_contact_list(), jabpacket_struct::x, xode, xode_get_attrib(), and xode_get_tag(). Referenced by jab_on_packet_handler(). 00511 { 00512 xode x; 00513 char *ns; 00514 00515 x = xode_get_tag(packet->x, "query"); 00516 ns = xode_get_attrib(x, "xmlns"); 00517 if (strcmp(ns, NS_ROSTER) == 0) { 00518 xode y; 00519 char *jid, *sub, *name, *ask; 00520 00521 y = xode_get_tag(x, "item"); 00522 jid = xode_get_attrib(y, "jid"); 00523 sub = xode_get_attrib(y, "subscription"); 00524 name = xode_get_attrib(y, "name"); 00525 ask = xode_get_attrib(y, "ask"); 00526 dprintf(dExecution, "iq set request: %s %s %s %s\n", 00527 jid ? jid : "n/a", 00528 sub ? sub : "n/a", 00529 name ? name : "n/a", 00530 ask ? ask : "n/a"); 00531 00532 if (sub) { 00533 if (!strcmp(sub, "remove") || !strcmp(sub, "none")) { 00534 if (!jid) { 00535 dprintf(dExecution, 00536 "No jid specified!\n"); 00537 return; 00538 } 00539 remove_from_contact_list(jid); 00540 dprintf(dExecution, "Contact %s removed\n", jid); 00541 return; 00542 } 00543 } 00544 } 00545 }
|
|
Definition at line 210 of file jabber_handler.c. References contact_status_change(), decode_notice(), dExecution, dprintf(), exec_process_packet(), jabpacket_struct::from, jid_struct::full, jab_connect_time, jab_send(), jabconn, jabpacket, JABPACKET__AVAILABLE, JABPACKET__ERROR, JABPACKET__INVISIBLE, JABPACKET__SUBSCRIBE, JABPACKET__SUBSCRIBED, JABPACKET__UNAVAILABLE, JABPACKET__UNSUBSCRIBE, JABPACKET__UNSUBSCRIBED, jabutil_presnew(), jid, ns, NS_SIGNED, NULL, program, jabpacket_struct::subtype, jabpacket_struct::x, xode, xode_free(), xode_get_attrib(), xode_get_data(), xode_get_tag(), and xode_get_tagdata(). Referenced by jab_on_packet_handler(). 00213 { 00214 char *from = packet->from->full; 00215 if (!from) { 00216 dprintf(dExecution, "Presence processing with no from.\n"); 00217 return; 00218 } 00219 00220 switch (packet->subtype) { 00221 case JABPACKET__SUBSCRIBE: { 00222 xode x; 00223 00224 x = jabutil_presnew(JABPACKET__SUBSCRIBED, 00225 from, NULL, -1); 00226 jab_send(conn, x); 00227 decode_notice(packet); 00228 dprintf(dExecution, 00229 "Rendering subscribe message...\n"); 00230 exec_process_packet(program, packet, "", 0); 00231 xode_free(x); 00232 } break; 00233 00234 case JABPACKET__UNSUBSCRIBE: { 00235 xode x; 00236 00237 x = jabutil_presnew(JABPACKET__UNSUBSCRIBED, 00238 from, NULL, -1); 00239 jab_send(conn, x); 00240 decode_notice(packet); 00241 dprintf(dExecution, 00242 "Rendering unsubscribe message...\n"); 00243 exec_process_packet(program, packet, "", 0); 00244 xode_free(x); 00245 } break; 00246 00247 case JABPACKET__SUBSCRIBED: { 00248 dprintf(dExecution, 00249 "Rendering subscribed message...\n"); 00250 exec_process_packet(program, packet, "", 0); 00251 } break; 00252 00253 case JABPACKET__UNSUBSCRIBED: { 00254 dprintf(dExecution, 00255 "Rendering unsubscribed message...\n"); 00256 exec_process_packet(program, packet, "", 0); 00257 } break; 00258 00259 case JABPACKET__INVISIBLE: 00260 case JABPACKET__UNAVAILABLE: 00261 case JABPACKET__AVAILABLE: { 00262 xode x; 00263 char *jid, *pos, *ns; 00264 int ret; 00265 00266 ret = contact_status_change(packet); 00267 if (ret) { 00268 if (time(0) > (jab_connect_time + 30)) { 00269 dprintf(dExecution, "Decoding notice...\n"); 00270 decode_notice(packet); 00271 dprintf(dExecution, "Rendering presence message\n"); 00272 exec_process_packet( 00273 program, 00274 packet, 00275 "", 00276 0); 00277 } 00278 } 00279 00280 jid = xode_get_attrib(packet->x, "from"); 00281 if (!jid) { 00282 break; 00283 } 00284 00285 pos = (char *) strchr(jid, '/'); 00286 if (pos) { 00287 *pos = '\0'; 00288 } 00289 00290 x = xode_get_tag(packet->x, "x"); 00291 if (!x) { 00292 break; 00293 } 00294 00295 ns = xode_get_attrib(x, "xmlns"); 00296 if (!ns) { 00297 break; 00298 } 00299 00300 00301 dprintf(dExecution, "presence ns: %s\n", ns); 00302 #ifdef USE_GPGME 00303 if (!strcmp(ns, NS_SIGNED)) { 00304 char *signature, *status; 00305 00306 dprintf(dExecution, 00307 "Processing gpg signature...\n"); 00308 00309 signature = xode_get_data(x); 00310 status = xode_get_tagdata(packet->x, "status"); 00311 if (signature && status) { 00312 dprintf(dExecution, 00313 "Signature[%d] is:\n%s\n", 00314 jid, signature); 00315 JUpdateKeyList(jid, status, signature); 00316 } 00317 } 00318 #endif /* USE_GPGME */ 00319 } break; 00320 00321 case JABPACKET__ERROR: { 00322 char *errormsg; 00323 00324 errormsg = xode_get_tagdata(packet->x, "error"); 00325 dprintf(dExecution, 00326 "Error from %s: %s\n", 00327 from ? from : "n/a", 00328 errormsg ? errormsg : "n/a"); 00329 } break; 00330 00331 default: { 00332 dprintf(dExecution, 00333 "Unknown or ignored subtype from %s.\n", 00334 from ? from : "n/a"); 00335 } break; 00336 } 00337 }
|
Last updated at Tue Dec 18 21:07:42 PST 2007. | This site and project hosted by... |