comparison mcabber/src/jab_iq.c @ 1261:704adf4df2d0

Send service-unavailable when Last Activity is disabled According to XEP-0012, the client should return a <service-unavailable/> error when it doesn't wish to divulge the information. This patch also adds a new option: iq_last_disable_when_notavail.
author Mikael Berthe <mikael@lilotux.net>
date Sun, 01 Jul 2007 12:22:54 +0200
parents ceada40bbe20
children dbc907b2d92f
comparison
equal deleted inserted replaced
1260:b4ccc5b2a6de 1261:704adf4df2d0
929 929
930 jab_send(conn, x); 930 jab_send(conn, x);
931 xmlnode_free(x); 931 xmlnode_free(x);
932 } 932 }
933 933
934 // FIXME highly duplicated code
935 static void send_iq_not_available(jconn conn, char *from, xmlnode xmldata)
936 {
937 xmlnode x, y, z;
938 // Not available.
939 x = xmlnode_dup(xmldata);
940 xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
941 xmlnode_hide_attrib(x, "from");
942
943 xmlnode_put_attrib(x, "type", TMSG_ERROR);
944 y = xmlnode_insert_tag(x, TMSG_ERROR);
945 xmlnode_put_attrib(y, "code", "503");
946 xmlnode_put_attrib(y, "type", "cancel");
947 z = xmlnode_insert_tag(y, "service-unavailable");
948 xmlnode_put_attrib(z, "xmlns", NS_XMPP_STANZAS);
949
950 jab_send(conn, x);
951 xmlnode_free(x);
952 }
953
934 /* 954 /*
935 static void send_iq_commands_bad_action(jconn conn, char *from, xmlnode xmldata) 955 static void send_iq_commands_bad_action(jconn conn, char *from, xmlnode xmldata)
936 { 956 {
937 xmlnode x, y, z; 957 xmlnode x, y, z;
938 958
1521 handle_iq_disco_info(conn, from, id, xmldata); 1541 handle_iq_disco_info(conn, from, id, xmldata);
1522 } else if (ns && !strcmp(ns, NS_DISCO_ITEMS)) { 1542 } else if (ns && !strcmp(ns, NS_DISCO_ITEMS)) {
1523 handle_iq_disco_items(conn, from, id, xmldata); 1543 handle_iq_disco_items(conn, from, id, xmldata);
1524 } else if (ns && !strcmp(ns, NS_VERSION)) { 1544 } else if (ns && !strcmp(ns, NS_VERSION)) {
1525 handle_iq_version(conn, from, id, xmldata); 1545 handle_iq_version(conn, from, id, xmldata);
1526 } else if (ns && !strcmp(ns, NS_LAST) && 1546 } else if (ns && !strcmp(ns, NS_LAST)) {
1527 !settings_opt_get_int("iq_last_disable")) { 1547 if (!settings_opt_get_int("iq_last_disable") &&
1528 handle_iq_last(conn, from, id, xmldata); 1548 (!settings_opt_get_int("iq_last_disable_when_notavail") ||
1549 jb_getstatus() != notavail))
1550 handle_iq_last(conn, from, id, xmldata);
1551 else
1552 send_iq_not_available(conn, from, xmldata);
1529 } else if (ns && !strcmp(ns, NS_TIME)) { 1553 } else if (ns && !strcmp(ns, NS_TIME)) {
1530 handle_iq_time(conn, from, id, xmldata); 1554 handle_iq_time(conn, from, id, xmldata);
1531 } else { 1555 } else {
1532 iq_not_implemented = TRUE; 1556 iq_not_implemented = TRUE;
1533 } 1557 }