00001 #include "notice.h"
00002 #include "exec.h"
00003 #include "mux.h"
00004 #include "main.h"
00005
00006 void
00007 jwg_on_event_handler(jwgconn conn, jwgpacket packet)
00008 {
00009 dprintf(dExecution, "JWGC event handler called...\n");
00010
00011 jwgpacket_reset(packet);
00012 dprintf(dExecution, "Received event: %d.\n", packet->type);
00013 switch (packet->type) {
00014 case JWGPACKET_PING: {
00015 char *match, *target, *message, *dontmatch, *type;
00016 char retstr[80];
00017 xode out;
00018
00019 target = xode_get_attrib(packet->x, "to");
00020 dontmatch = xode_get_attrib(packet->x, "dontmatch");
00021 type = xode_get_attrib(packet->x, "type");
00022 if (!type) {
00023 type = strdup("chat");
00024 }
00025
00026 dprintf(dExecution, "Received ping\n");
00027
00028 if (!target) {
00029 dprintf(dExecution, "No target specified.\n");
00030 jwg_serverror(conn, "No target specified.");
00031 break;
00032 }
00033
00034 dprintf(dExecution, "Target %s\n", target);
00035 if (dontmatch && !strcmp(dontmatch, "yes")) {
00036 match = strdup(target);
00037 }
00038 else if (strncmp(target,
00039 (char *)jVars_get(jVarJID),
00040 strlen(target))) {
00041 match = find_match(target);
00042 if (!match) {
00043 dprintf(dExecution, "No match\n");
00044 jwg_serverror(conn, "Unable to find a matching user.");
00045
00046 break;
00047 }
00048 }
00049 else {
00050 match = strdup(target);
00051 }
00052
00053 dprintf(dExecution, "To: %s\n", match);
00054 out = jabutil_pingnew(type, match);
00055 jab_send(jab_c, out);
00056
00057 sprintf(retstr, "Successfully pinged %.67s.", match);
00058 jwg_servsuccess(conn, retstr);
00059 } break;
00060
00061 case JWGPACKET_MESSAGE: {
00062 char *match, *target, *message, *dontmatch, *encrypt,
00063 *encmessage, *type;
00064 char retstr[80];
00065 xode out;
00066
00067 encrypt = NULL;
00068 encmessage = NULL;
00069 target = xode_get_attrib(packet->x, "to");
00070 dontmatch = xode_get_attrib(packet->x, "dontmatch");
00071 encrypt = xode_get_attrib(packet->x, "encrypt");
00072 type = xode_get_attrib(packet->x, "type");
00073 if (!type) {
00074 type = strdup("chat");
00075 }
00076
00077 dprintf(dExecution, "Received message\n");
00078
00079 if (!target) {
00080 dprintf(dExecution, "No target specified.\n");
00081 jwg_serverror(conn, "No target specified.");
00082 break;
00083 }
00084
00085 dprintf(dExecution, "Target %s\n", target);
00086 if (dontmatch && !strcmp(dontmatch, "yes")) {
00087 match = strdup(target);
00088 }
00089 else if (strncmp(target,
00090 (char *)jVars_get(jVarJID),
00091 strlen(target))) {
00092 match = find_match(target);
00093 if (!match) {
00094 dprintf(dExecution, "No match\n");
00095 jwg_serverror(conn, "Unable to find a matching user.");
00096
00097 break;
00098 }
00099 }
00100 else {
00101 match = strdup(target);
00102 }
00103
00104 message = xode_get_data(packet->x);
00105 if (!message) {
00106 message = "";
00107 }
00108 else {
00109 trim_message(message);
00110 }
00111
00112 #ifdef USE_GPGME
00113 if (encrypt) {
00114 char *keyid = JGetKeyID(match);
00115
00116 if (!keyid) {
00117 dprintf(dExecution, "Unable to find keyid.\n");
00118 jwg_serverror(conn, "Unable to find a matching gpg key.");
00119 break;
00120 }
00121
00122 encmessage = JEncrypt(message, keyid);
00123 if (!encmessage) {
00124 dprintf(dExecution, "Unable to encrypt message.\n");
00125 jwg_serverror(conn, "Unable to encrypt message.");
00126 break;
00127 }
00128
00129 encmessage = JTrimPGPMessage(encmessage);
00130 if (!encmessage) {
00131 dprintf(dExecution, "Unable to trim encrypted message.\n");
00132 jwg_serverror(conn, "Unable to trim encrypted message.");
00133 break;
00134 }
00135
00136 message = "[This message is encrypted.]";
00137 }
00138 #endif
00139
00140 dprintf(dExecution, "To: %s\nMsg: %s%s\n", match, message, encmessage ? " [encrypted]" : "");
00141 out = jabutil_msgnew(type, match, NULL, message, encmessage);
00142 jab_send(jab_c, out);
00143
00144 sprintf(retstr, "Successfully sent to %.67s.", match);
00145 jwg_servsuccess(conn, retstr);
00146 } break;
00147
00148 case JWGPACKET_LOCATE: {
00149 char *organization, *match, *showall, *target;
00150 int skipnotavail, strictmatch;
00151
00152 dprintf(dExecution, "Received locate\n");
00153
00154 target = xode_get_attrib(packet->x, "target");
00155 if (!target) {
00156 target = NULL;
00157 }
00158
00159 strictmatch = 0;
00160 match = xode_get_attrib(packet->x, "match");
00161 if (match) {
00162 if (!strcmp(match, "strict")) {
00163 strictmatch = 1;
00164 }
00165 }
00166
00167 skipnotavail = 1;
00168 showall = xode_get_attrib(packet->x, "showall");
00169 if (showall && !strcmp(showall, "yes")) {
00170 skipnotavail = 0;
00171 }
00172
00173 organization = xode_get_attrib(packet->x, "organization");
00174 if (organization) {
00175 if (!strcmp(organization, "group")) {
00176 list_contacts_bygroup(jwg_c, target, strictmatch, skipnotavail);
00177 }
00178 else {
00179 list_contacts(jwg_c, target, strictmatch, skipnotavail);
00180 }
00181 }
00182 else {
00183 list_contacts(jwg_c, target, strictmatch, skipnotavail);
00184 }
00185 } break;
00186
00187 case JWGPACKET_STATUS: {
00188 show_status();
00189 } break;
00190
00191 case JWGPACKET_SHUTDOWN: {
00192 dprintf(dExecution, "Received shutdown\n");
00193 jwg_servsuccess(conn, "Shutdown initiated.");
00194 mux_end_loop_p = 1;
00195 } break;
00196
00197 case JWGPACKET_CHECK: {
00198 dprintf(dExecution, "Received check\n");
00199 jwg_servsuccess(conn, "check");
00200 } break;
00201
00202 case JWGPACKET_REREAD: {
00203 dprintf(dExecution, "Received reread\n");
00204 if (read_in_description_file()) {
00205 jwg_servsuccess(conn,
00206 "Description file loaded.");
00207 }
00208 else {
00209 jwg_serverror(conn,
00210 "Description file had an error. Load failed.");
00211 }
00212 } break;
00213
00214 case JWGPACKET_SHOWVAR: {
00215 xode out, x;
00216 char *var, *setting;
00217
00218 dprintf(dExecution, "Received showvar\n");
00219
00220 var = xode_get_attrib(packet->x, "var");
00221 if (!var) {
00222 jwg_serverror(conn, "Variable not specified.");
00223 break;
00224 }
00225
00226 setting = jVars_show(jVars_stoi(var));
00227 if (!setting) {
00228 jwg_serverror(conn, jVars_get_error());
00229 break;
00230 }
00231
00232 out = xode_new("results");
00233 x = xode_insert_cdata(out, setting, strlen(setting));
00234 jwg_servsend(conn, out);
00235 xode_free(out);
00236 } break;
00237
00238 case JWGPACKET_SUBSCRIBE: {
00239 xode out, x, y;
00240 char *jid;
00241
00242 dprintf(dExecution, "Received subscribe\n");
00243
00244 jid = xode_get_attrib(packet->x, "jid");
00245 if (!jid) {
00246 jwg_serverror(conn, "JID not specified.");
00247 break;
00248 }
00249 dprintf(dExecution, "Subscribe: %s\n", jid);
00250
00251 out = jabutil_presnew(JABPACKET__SUBSCRIBE, jid, "Jwgc Subscription Request", -1);
00252 jab_send(jab_c, out);
00253 xode_free(out);
00254
00255 out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00256 x = xode_get_tag(out, "query");
00257 y = xode_insert_tag(x, "item");
00258 xode_put_attrib(y, "jid", jid);
00259 jab_send(jab_c, out);
00260 xode_free(out);
00261
00262 out = xode_new("presence");
00263 xode_put_attrib(out, "to", jid);
00264 jab_send(jab_c, out);
00265 xode_free(out);
00266
00267 jwg_servsuccess(conn, "Subscription successful.");
00268 } break;
00269
00270 case JWGPACKET_UNSUBSCRIBE: {
00271 xode out, x, y;
00272 char *jid;
00273
00274 dprintf(dExecution, "Received unsubscribe\n");
00275
00276 jid = xode_get_attrib(packet->x, "jid");
00277 if (!jid) {
00278 jwg_serverror(conn, "JID not specified.");
00279 break;
00280 }
00281 dprintf(dExecution, "Unsubscribe: %s\n", jid);
00282
00283 out = jabutil_presnew(JABPACKET__UNSUBSCRIBE, jid, "Jwgc Unsubscription Request", -1);
00284 jab_send(jab_c, out);
00285 xode_free(out);
00286
00287 out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00288 x = xode_get_tag(out, "query");
00289 y = xode_insert_tag(x, "item");
00290 xode_put_attrib(y, "jid", jid);
00291 xode_put_attrib(y, "subscription", "remove");
00292 jab_send(jab_c, out);
00293 xode_free(out);
00294
00295 jwg_servsuccess(conn, "Unsubscription successful.");
00296 } break;
00297
00298 case JWGPACKET_NICKNAME: {
00299 xode out, x, y;
00300 char *jid, *nick;
00301
00302 dprintf(dExecution, "Received nickname\n");
00303
00304 jid = xode_get_attrib(packet->x, "jid");
00305 nick = xode_get_attrib(packet->x, "nick");
00306 if (!jid) {
00307 jwg_serverror(conn, "JID not specified.");
00308 break;
00309 }
00310 if (!nick) {
00311 jwg_serverror(conn, "Nickname not specified.");
00312 break;
00313 }
00314 dprintf(dExecution, "Nickname: %s -> %s\n", jid, nick);
00315
00316 out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00317 x = xode_get_tag(out, "query");
00318 y = xode_insert_tag(x, "item");
00319 xode_put_attrib(y, "jid", jid);
00320 xode_put_attrib(y, "name", nick);
00321 jab_send(jab_c, out);
00322 xode_free(out);
00323
00324 update_nickname(jid, nick);
00325
00326 jwg_servsuccess(conn, "Nickname setting successful.");
00327 } break;
00328
00329 case JWGPACKET_GROUP: {
00330 xode out, x, y, z, zz;
00331 char *jid, *group;
00332
00333 dprintf(dExecution, "Received group\n");
00334
00335 jid = xode_get_attrib(packet->x, "jid");
00336 group = xode_get_attrib(packet->x, "group");
00337 if (!jid) {
00338 jwg_serverror(conn, "JID not specified.");
00339 break;
00340 }
00341 if (!group) {
00342 jwg_serverror(conn, "Group not specified.");
00343 break;
00344 }
00345 dprintf(dExecution, "Group: %s -> %s\n", jid, group);
00346
00347 out = jabutil_iqnew(JABPACKET__SET, NS_ROSTER);
00348 x = xode_get_tag(out, "query");
00349 y = xode_insert_tag(x, "item");
00350 xode_put_attrib(y, "jid", jid);
00351 z = xode_insert_tag(y, "group");
00352 zz = xode_insert_cdata(z, group, strlen(group));
00353
00354 jab_send(jab_c, out);
00355 xode_free(out);
00356
00357 update_group(jid, group);
00358
00359 jwg_servsuccess(conn, "Group setting successful.");
00360 } break;
00361
00362 case JWGPACKET_REGISTER: {
00363 xode out, query, queryout, x;
00364 char *jid, randnum[6];
00365
00366 dprintf(dExecution, "Received register\n");
00367
00368 jid = xode_get_attrib(packet->x, "jid");
00369 if (!jid) {
00370 jwg_serverror(conn, "JID not specified.");
00371 break;
00372 }
00373 dprintf(dExecution, "Register: %s\n", jid);
00374
00375 query = xode_get_tag(packet->x, "query");
00376 if (query) {
00377 out = jabutil_iqnew(JABPACKET__SET, NS_REGISTER);
00378 queryout = xode_get_tag(out, "query");
00379 }
00380 else {
00381 out = jabutil_iqnew(JABPACKET__GET, NS_REGISTER);
00382 }
00383 sprintf(randnum, "%d", random() % 50000);
00384 xode_put_attrib(out, "id", randnum);
00385 xode_put_attrib(out, "to", jid);
00386 if (query) {
00387 x = xode_get_firstchild(query);
00388 while (x) {
00389 xode_insert_node(queryout, x);
00390 x = xode_get_nextsibling(x);
00391 }
00392 }
00393 jab_send(jab_c, out);
00394 xode_free(out);
00395
00396 jab_c->dumpfd = conn->sckfd;
00397 jab_c->dumpid = randnum;
00398 jab_recv(jab_c);
00399 jab_c->dumpfd = -1;
00400 jab_c->dumpid = NULL;
00401 } break;
00402
00403 case JWGPACKET_SEARCH: {
00404 xode out, query, queryout, x;
00405 char *jid, randnum[6];
00406
00407 dprintf(dExecution, "Received search\n");
00408
00409 jid = xode_get_attrib(packet->x, "jid");
00410 if (!jid) {
00411 jwg_serverror(conn, "JID not specified.");
00412 break;
00413 }
00414 dprintf(dExecution, "Search: %s\n", jid);
00415
00416 query = xode_get_tag(packet->x, "query");
00417 if (query) {
00418 out = jabutil_iqnew(JABPACKET__SET, NS_SEARCH);
00419 queryout = xode_get_tag(out, "query");
00420 }
00421 else {
00422 out = jabutil_iqnew(JABPACKET__GET, NS_SEARCH);
00423 }
00424 sprintf(randnum, "%d", random() % 50000);
00425 xode_put_attrib(out, "id", randnum);
00426 xode_put_attrib(out, "to", jid);
00427 if (query) {
00428 x = xode_get_firstchild(query);
00429 while (x) {
00430 xode_insert_node(queryout, x);
00431 x = xode_get_nextsibling(x);
00432 }
00433 }
00434 jab_send(jab_c, out);
00435 xode_free(out);
00436
00437 jab_c->dumpfd = conn->sckfd;
00438 jab_c->dumpid = randnum;
00439 jab_recv(jab_c);
00440 jab_c->dumpfd = -1;
00441 jab_c->dumpid = NULL;
00442 } break;
00443
00444 case JWGPACKET_SETVAR: {
00445 xode out, x;
00446 char *var, *setting;
00447
00448 dprintf(dExecution, "Received setvar\n");
00449
00450 var = xode_get_attrib(packet->x, "var");
00451 if (!var) {
00452 jwg_serverror(conn, "Variable not specified.");
00453 break;
00454 }
00455
00456 setting = xode_get_data(packet->x);
00457 if (!setting) {
00458 jwg_serverror(conn, "Empty setting.");
00459 break;
00460 }
00461
00462 if (!jVars_set(jVars_stoi(var), setting)) {
00463 jwg_serverror(conn, jVars_get_error());
00464 break;
00465 }
00466
00467 jwg_servsuccess(conn, "Variable successfully set.");
00468 } break;
00469
00470 case JWGPACKET_JOIN: {
00471 xode out;
00472 char *chatroom;
00473
00474 dprintf(dExecution, "Received join\n");
00475 chatroom = xode_get_attrib(packet->x, "room");
00476 if (!chatroom) {
00477 jwg_serverror(conn, "Target room not specified.");
00478 break;
00479 }
00480
00481 out = jabutil_presnew(-1, chatroom, NULL, -1);
00482 jab_send(jab_c, out);
00483
00484 jwg_servsuccess(conn, "Successfully joined chat room.");
00485 } break;
00486
00487 case JWGPACKET_LEAVE: {
00488 xode out;
00489 char *chatroom;
00490
00491 dprintf(dExecution, "Received leave\n");
00492 chatroom = xode_get_attrib(packet->x, "room");
00493 if (!chatroom) {
00494 jwg_serverror(conn, "Target room not specified.");
00495 break;
00496 }
00497
00498 out = jabutil_presnew(JABPACKET__UNAVAILABLE, chatroom, NULL, -1);
00499 jab_send(jab_c, out);
00500
00501 remove_from_contact_list(chatroom);
00502
00503 jwg_servsuccess(conn, "Successfully left chat room.");
00504 } break;
00505
00506 case JWGPACKET_DEBUG: {
00507 char *debugflags;
00508
00509 dprintf(dExecution, "Received debug\n");
00510 debugflags = xode_get_tagdata(packet->x, "debugflags");
00511 if (!debugflags) {
00512 jwg_serverror(conn, "You must specify debugging flags.");
00513 break;
00514 }
00515
00516 dparseflags(debugflags);
00517
00518 jwg_servsuccess(conn, "Successfully adjusted debugging flags.");
00519 } break;
00520
00521 default: {
00522 dprintf(dExecution, "JwgcEvent: unknown packet.\n");
00523 } break;
00524 }
00525
00526 jwg_cleanup(conn);
00527 return;
00528 }