int at_iq_vcard(ati ti, jpacket jp) { xmlnode data; at_session s; s = at_session_find_by_jid(ti, jp->from); if(jpacket_subtype(jp) != JPACKET__GET || (s && ((!s->icq && jp->to->user) || (s->icq && s->icq_vcard_response)))) { at_bounce(ti, jp, TERROR_BAD); return 1; } if(!jp->to->user) { xmlnode_insert_node(jutil_iqresult(jp->x),ti->vcard); at_deliver(ti,jp->x); return 1; } if(!s) return 0; jutil_iqresult(jp->x); jp->iq = data = xmlnode_insert_tag(jp->x,"vCard"); xmlnode_put_attrib(data,"xmlns",NS_VCARD); xmlnode_put_attrib(data,"version","3.0"); xmlnode_put_attrib(data,"prodid","-//HandGen//NONSGML vGen v1.0//EN"); s->icq_vcard_response = jp; aim_icq_getsimpleinfo(s->ass, jp->to->user); return 1; }
int at_iq_gateway(ati ti, jpacket jp) { if(jp->to->user != NULL) { at_bounce(ti, jp, TERROR_NOTALLOWED); return 1; } switch(jpacket_subtype(jp)) { case JPACKET__GET: { xmlnode q; jutil_iqresult(jp->x); q = xmlnode_insert_tag(jp->x,"query"); xmlnode_put_attrib(q,"xmlns",NS_GATEWAY); xmlnode_insert_cdata(xmlnode_insert_tag(q,"desc"),"Enter the user's screenname",-1); xmlnode_insert_tag(q,"prompt"); break; } case JPACKET__SET: { char *user, *id; user = xmlnode_get_tag_data(jp->iq,"prompt"); id = user ? spools(jp->p,at_normalize(user),"@",jp->to->server,jp->p) : NULL; if (id) { xmlnode q; jutil_iqresult(jp->x); q = xmlnode_insert_tag(jp->x,"query"); xmlnode_put_attrib(q,"xmlns",NS_GATEWAY); xmlnode_insert_cdata(xmlnode_insert_tag(q,"prompt"),id,-1); } else jutil_error(jp->x,TERROR_BAD); break; } default: jutil_error(jp->x,TERROR_BAD); break; } at_deliver(ti,jp->x); return 1; }
int at_iq_last(ati ti, jpacket jp) { xmlnode last; xmlnode q; char str[10]; /* XXX I can do last if I track logouts in the XDB... not too hard */ if(jpacket_subtype(jp) != JPACKET__GET) { at_bounce(ti, jp, TERROR_BAD); return 1; } if(jp->to->user != NULL) { at_session s; at_buddy buddy; char *res; s = at_session_find_by_jid(ti, jp->from); if(s == NULL) { at_bounce(ti, jp, TERROR_REGISTER); return 1; } buddy = xhash_get(s->buddies, jp->to->user); if(buddy == NULL) { at_bounce(ti, jp, TERROR_BAD); return 1; } jutil_iqresult(jp->x); last = xmlnode_insert_tag(jp->x, "query"); xmlnode_put_attrib(last,"xmlns",NS_LAST); sprintf(str, "%d", buddy->idle_time); xmlnode_put_attrib(last, "seconds", str); at_deliver(ti,jp->x); return 1; } jutil_iqresult(jp->x); last = xmlnode_insert_tag(jp->x, "query"); xmlnode_put_attrib(last,"xmlns",NS_LAST); sprintf(str, "%d", time(NULL) - ti->start_time); xmlnode_put_attrib(last,"seconds", str); at_deliver(ti,jp->x); return 1; }
mreturn mod_browse_reply(mapi m, void *arg) { xmlnode browse, ns, cur; session s; if (m->packet->type != JPACKET_IQ) return M_IGNORE; if (!NSCHECK(m->packet->iq, NS_BROWSE)) return M_PASS; /* first, is this a valid request? */ switch (jpacket_subtype(m->packet)) { case JPACKET__RESULT: case JPACKET__ERROR: return M_PASS; case JPACKET__SET: js_bounce(m->si, m->packet->x, TERROR_NOTALLOWED); return M_HANDLED; } log_debug("handling query for user %s", m->user->user); /* get this dudes browse info */ browse = mod_browse_get(m, m->packet->to); /* insert the namespaces */ ns = xdb_get(m->si->xc, m->packet->to, NS_XDBNSLIST); for (cur = xmlnode_get_firstchild(ns); cur != NULL; cur = xmlnode_get_nextsibling(cur)) if (xmlnode_get_attrib(cur, "type") == NULL) xmlnode_insert_tag_node(browse, cur); /* only include the generic <ns>foo</ns> */ xmlnode_free(ns); /* include any connected resources if there's a s10n from them */ if (js_trust(m->user, m->packet->from)) { SEM_LOCK(m->user->sem); for (s = m->user->sessions; s != NULL; s = s->next) { /* if(s->priority < 0) continue; *** include all resources I guess */ if (xmlnode_get_tag (browse, spools(m->packet->p, "?jid=", jid_full(s->id), m->packet->p)) != NULL) continue; /* already in the browse result */ cur = xmlnode_insert_tag(browse, "user"); xmlnode_put_attrib(cur, "type", "client"); xmlnode_put_attrib(cur, "jid", jid_full(s->id)); } SEM_UNLOCK(m->user->sem); } /* XXX include iq:filter forwards */ jutil_iqresult(m->packet->x); jpacket_reset(m->packet); xmlnode_insert_tag_node(m->packet->x, browse); js_deliver(m->si, m->packet); xmlnode_free(browse); return M_HANDLED; }
int at_iq_disco_items(ati ti, jpacket jp) { xmlnode q; if(jpacket_subtype(jp) != JPACKET__GET) { at_bounce(ti, jp, TERROR_BAD); return 1; } if(xmlnode_get_attrib(xmlnode_get_tag(jp->x, "query"),"node") != NULL) { at_bounce(ti, jp, TERROR_NOTALLOWED); return 1; } jutil_iqresult(jp->x); q = xmlnode_insert_tag(jp->x, "query"); xmlnode_put_attrib(q, "xmlns", NS_DISCO_ITEMS); at_deliver(ti,jp->x); return 1; }
int at_iq_version(ati ti, jpacket jp) { xmlnode os, x, q; struct utsname un; if(jpacket_subtype(jp) != JPACKET__GET) { at_bounce(ti, jp, TERROR_BAD); return 1; } x = jutil_iqresult(jp->x); q = xmlnode_insert_tag(x,"query"); xmlnode_put_attrib(q,"xmlns",NS_VERSION); xmlnode_insert_cdata(xmlnode_insert_tag(q,"name"),"AIM Transport",-1); xmlnode_insert_cdata(xmlnode_insert_tag(q,"version"), VERSION,-1); uname(&un); os = xmlnode_insert_tag(q,"os"); xmlnode_insert_cdata(os,un.sysname,-1); xmlnode_insert_cdata(os," ",1); xmlnode_insert_cdata(os,un.release,-1); at_deliver(ti,x); // AGAIN!?! return 1; }
int at_iq_time(ati ti, jpacket jp) { xmlnode x, q; time_t t; char *tstr; if(jpacket_subtype(jp) != JPACKET__GET) { at_bounce(ti, jp, TERROR_BAD); return 1; } x = jutil_iqresult(jp->x); q = xmlnode_insert_tag(x,"query"); xmlnode_put_attrib(q,"xmlns",NS_TIME); xmlnode_insert_cdata(xmlnode_insert_tag(q,"utc"),jutil_timestamp(),-1); xmlnode_insert_cdata(xmlnode_insert_tag(q,"tz"),tzname[0],-1); /* create nice display time */ t = time(NULL); tstr = ctime(&t); tstr[strlen(tstr) - 1] = '\0'; /* cut off newline */ xmlnode_insert_cdata(xmlnode_insert_tag(q,"display"),tstr,-1); at_deliver(ti,x); return 1; }
int at_iq_browse(ati ti, jpacket jp) { xmlnode q; if(jpacket_subtype(jp) != JPACKET__GET) { at_bounce(ti, jp, TERROR_BAD); return 1; } if(jp->to->user != NULL) { q = xmlnode_insert_tag(jutil_iqresult(jp->x),"item"); xmlnode_put_attrib(q,"xmlns",NS_BROWSE); xmlnode_put_attrib(q,"category","user"); xmlnode_put_attrib(q,"type","client"); xmlnode_put_attrib(q,"jid",jid_full(jp->to)); xmlnode_put_attrib(q,"name", jp->to->user); at_deliver(ti,jp->x); return 1; } q = xmlnode_insert_tag(jutil_iqresult(jp->x),"item"); xmlnode_put_attrib(q,"xmlns",NS_BROWSE); xmlnode_put_attrib(q,"category","service"); xmlnode_put_attrib(q,"type","aim"); xmlnode_put_attrib(q,"jid",jp->to->server); xmlnode_put_attrib(q,"name",xmlnode_get_tag_data(ti->vcard,"FN")); xmlnode_insert_cdata(xmlnode_insert_tag(q,"ns"),NS_DISCO_INFO,-1); xmlnode_insert_cdata(xmlnode_insert_tag(q,"ns"),NS_DISCO_ITEMS,-1); xmlnode_insert_cdata(xmlnode_insert_tag(q,"ns"),NS_REGISTER,-1); xmlnode_insert_cdata(xmlnode_insert_tag(q,"ns"),NS_GATEWAY,-1); at_deliver(ti,jp->x); // WHY! DAMNIT! WHY? return 1; }
mreturn mod_agents_agent(mapi m) { xmlnode ret, retq, info, agents, reg; /* get data from the config file */ info = js_config(m->si, "vCard"); agents = js_config(m->si, "agents"); reg = js_config(m->si, "register"); /* if we don't have anything to say, bounce */ if (info == NULL && agents == NULL && reg == NULL) return M_PASS; log_debug("handling agent query"); /* build the result IQ */ ret = jutil_iqresult(m->packet->x); retq = xmlnode_insert_tag(ret, "query"); xmlnode_put_attrib(retq, "xmlns", NS_AGENT); /* copy in the vCard info */ xmlnode_insert_cdata(xmlnode_insert_tag(retq, "name"), xmlnode_get_tag_data(info, "FN"), -1); xmlnode_insert_cdata(xmlnode_insert_tag(retq, "url"), xmlnode_get_tag_data(info, "URL"), -1); xmlnode_insert_cdata(xmlnode_insert_tag(retq, "service"), "jabber", 6); /* set the flags */ if (agents != NULL) xmlnode_insert_tag(retq, "agents"); if (reg != NULL) xmlnode_insert_tag(retq, "register"); jpacket_reset(m->packet); if (m->s != NULL) { /* XXX null session hack! */ xmlnode_put_attrib(m->packet->x, "from", m->packet->from->server); js_session_to(m->s, m->packet); } else { js_deliver(m->si, m->packet); } return M_HANDLED; }
mreturn mod_browse_server(mapi m, void *arg) { xmlnode browse, query, x; if (m->packet->type != JPACKET_IQ) return M_IGNORE; if (jpacket_subtype(m->packet) != JPACKET__GET || !NSCHECK(m->packet->iq, NS_BROWSE) || m->packet->to->resource != NULL) return M_PASS; /* get data from the config file */ if ((browse = js_config(m->si, "browse")) == NULL) return M_PASS; log_debug("handling browse query"); /* build the result IQ */ query = xmlnode_insert_tag(jutil_iqresult(m->packet->x), "service"); xmlnode_put_attrib(query, "xmlns", NS_BROWSE); xmlnode_put_attrib(query, "type", "jabber"); xmlnode_put_attrib(query, "jid", m->packet->to->server); xmlnode_put_attrib(query, "name", xmlnode_get_data(js_config(m->si, "vCard/FN"))); /* pull name from the server vCard */ /* copy in the configured services */ xmlnode_insert_node(query, xmlnode_get_firstchild(browse)); /* list the admin stuff */ if (js_admin_jid(m->si, jid_user(m->packet->from), ADMIN_READ)) { x = xmlnode_insert_tag(query, "item"); xmlnode_put_attrib(x, "jid", spools(xmlnode_pool(x), m->packet->to->server, "/admin", xmlnode_pool(x))); xmlnode_put_attrib(x, "name", "Online Users"); xmlnode_insert_cdata(xmlnode_insert_tag(query, "ns"), NS_ADMIN, -1); } jpacket_reset(m->packet); js_deliver(m->si, m->packet); return M_HANDLED; }
void _con_room_discoinfo(cnr room, jpacket jp) { xmlnode result; xmlnode xdata, field; char *topic; char buf[32]; if(room == NULL) { log_warn(NAME, "[%s] Aborting - NULL room attribute found", FZONE); return; } jutil_iqresult(jp->x); xmlnode_put_attrib(xmlnode_insert_tag(jp->x,"query"), "xmlns", NS_DISCO_INFO); jpacket_reset(jp); result = xmlnode_insert_tag(jp->iq,"identity"); xmlnode_put_attrib(result, "category", "conference"); xmlnode_put_attrib(result, "type", "text"); xmlnode_put_attrib(result, "name", room->name); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq, "feature"), "var", NS_MUC); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", NS_DISCO); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", NS_BROWSE); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", NS_VERSION); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", NS_LAST); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", NS_TIME); xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", NS_VCARD); if(room->secret != NULL && *room->secret != '\0') xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", "muc_passwordprotected"); else xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", "muc_unsecure"); if(room->public == 1) xmlnode_put_attrib(xmlnode_insert_tag(jp->iq,"feature"), "var", "muc_public"); else
mreturn mod_agents_agents(mapi m) { xmlnode ret, retq, agents, cur, a, cur2; /* get data from the config file */ agents = js_config(m->si, "browse"); /* if we don't have anything to say, bounce */ if (agents == NULL) return M_PASS; log_debug("handling agents query"); /* build the result IQ */ ret = jutil_iqresult(m->packet->x); retq = xmlnode_insert_tag(ret, "query"); xmlnode_put_attrib(retq, "xmlns", NS_AGENTS); /* parse the new browse data into old agents format */ for (cur = xmlnode_get_firstchild(agents); cur != NULL; cur = xmlnode_get_nextsibling(cur)) { if (xmlnode_get_type(cur) != NTYPE_TAG) continue; /* generic <agent> part */ a = xmlnode_insert_tag(retq, "agent"); xmlnode_put_attrib(a, "jid", xmlnode_get_attrib(cur, "jid")); xmlnode_insert_cdata(xmlnode_insert_tag(a, "name"), xmlnode_get_attrib(cur, "name"), -1); xmlnode_insert_cdata(xmlnode_insert_tag(a, "service"), xmlnode_get_attrib(cur, "type"), -1); if (j_strcmp(xmlnode_get_name(cur), "conference") == 0) xmlnode_insert_tag(a, "groupchat"); /* map the included <ns>'s in browse to the old agent flags */ for (cur2 = xmlnode_get_firstchild(cur); cur2 != NULL; cur2 = xmlnode_get_nextsibling(cur2)) { if (j_strcmp(xmlnode_get_name(cur2), "ns") != 0) continue; if (j_strcmp (xmlnode_get_data(cur2), "jabber:iq:register") == 0) xmlnode_insert_tag(a, "register"); if (j_strcmp (xmlnode_get_data(cur2), "jabber:iq:search") == 0) xmlnode_insert_tag(a, "search"); if (j_strcmp (xmlnode_get_data(cur2), "jabber:iq:gateway") == 0) xmlnode_insert_cdata(xmlnode_insert_tag (a, "transport"), "Enter ID", -1); } } jpacket_reset(m->packet); if (m->s != NULL) { /* XXX null session hack! */ xmlnode_put_attrib(m->packet->x, "from", m->packet->from->server); js_session_to(m->s, m->packet); } else { js_deliver(m->si, m->packet); } return M_HANDLED; }
mreturn mod_browse_set(mapi m, void *arg) { xmlnode browse, cur; jid id, to; if (m->packet->type != JPACKET_IQ) return M_IGNORE; if (!NSCHECK(m->packet->iq, NS_BROWSE) || jpacket_subtype(m->packet) != JPACKET__SET) return M_PASS; if (m->packet->to != NULL) return M_PASS; /* if its to someone other than ourselves */ log_debug("handling set request %s", xmlnode2str(m->packet->iq)); /* no to implies to ourselves */ if (m->packet->to != NULL) to = m->packet->to; else to = m->user->id; /* if we set to a resource, we need to make sure that resource's browse is in the users browse */ if (to->resource != NULL) { browse = mod_browse_get(m, to); /* get our browse info */ xmlnode_hide_attrib(browse, "xmlns"); /* don't need a ns as a child */ for (cur = xmlnode_get_firstchild(browse); cur != NULL; cur = xmlnode_get_nextsibling(cur)) xmlnode_hide(cur); /* erase all children */ xdb_act(m->si->xc, m->user->id, NS_BROWSE, "insert", spools(m->packet->p, "?jid=", jid_full(to), m->packet->p), browse); /* insert and match replace */ xmlnode_free(browse); } /* get the id of the new browse item */ if ((cur = xmlnode_get_firstchild(m->packet->iq)) == NULL || (id = jid_new(m->packet->p, xmlnode_get_attrib(cur, "jid"))) == NULL) { js_bounce(m->si, m->packet->x, TERROR_NOTACCEPTABLE); return M_HANDLED; } /* insert the new item into the resource it was sent to */ xmlnode_hide_attrib(cur, "xmlns"); /* just in case, to make sure it inserts */ if (xdb_act (m->si->xc, to, NS_BROWSE, "insert", spools(m->packet->p, "?jid=", jid_full(id), m->packet->p), cur)) { js_bounce(m->si, m->packet->x, TERROR_UNAVAIL); return M_HANDLED; } /* if the new data we're inserting is to one of our resources, update that resource's browse */ if (jid_cmpx(m->user->id, id, JID_USER | JID_SERVER) == 0 && id->resource != NULL) { /* get the old */ browse = mod_browse_get(m, id); /* transform the new one into the old one */ xmlnode_put_attrib(cur, "xmlns", NS_BROWSE); xmlnode_insert_node(cur, xmlnode_get_firstchild(browse)); xdb_set(m->si->xc, id, NS_BROWSE, cur); /* replace the resource's browse w/ this one */ xmlnode_free(browse); } /* send response to the user */ jutil_iqresult(m->packet->x); jpacket_reset(m->packet); js_session_to(m->s, m->packet); return M_HANDLED; }
int at_iq_disco_info(ati ti, jpacket jp) { xmlnode q, info; if(jpacket_subtype(jp) != JPACKET__GET) { at_bounce(ti, jp, TERROR_BAD); return 1; } if(xmlnode_get_attrib(xmlnode_get_tag(jp->x, "query"),"node") != NULL) { at_bounce(ti, jp, TERROR_NOTALLOWED); return 1; } if(jp->to->user != NULL) { q = xmlnode_insert_tag(jutil_iqresult(jp->x),"query"); xmlnode_put_attrib(q,"xmlns",NS_DISCO_INFO); info = xmlnode_insert_tag(q, "identity"); xmlnode_put_attrib(info, "category", "client"); xmlnode_put_attrib(info, "type", "pc"); xmlnode_put_attrib(info, "name", jp->to->user); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_VCARD); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_LAST); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_TIME); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_VERSION); at_deliver(ti,jp->x); return 1; } q = xmlnode_insert_tag(jutil_iqresult(jp->x),"query"); xmlnode_put_attrib(q,"xmlns",NS_DISCO_INFO); info = xmlnode_insert_tag(q, "identity"); xmlnode_put_attrib(info, "category", "gateway"); xmlnode_put_attrib(info, "type", "aim"); xmlnode_put_attrib(info,"name",xmlnode_get_tag_data(ti->vcard,"FN")); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_VCARD); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_LAST); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_TIME); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_VERSION); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_GATEWAY); info = xmlnode_insert_tag(q, "feature"); xmlnode_put_attrib(info, "var", NS_REGISTER); at_deliver(ti,jp->x); return 1; }