void aim_transport(instance i, xmlnode x) { ati ti; xmlnode config; char *eightbitcode, *utf8code = "UTF-8", *latin1code = "CP1252"; ti = pmalloco(i->p, sizeof(_ati)); ti->i = i; ti->xc = xdb_cache(i); log_notice(i->id, "AIM-Transport starting up for instance %s...", i->id); config = xdb_get(ti->xc, jid_new(xmlnode_pool(x), "config@-internal"), "jabber:config:aimtrans"); ti->vcard = xmlnode_new_tag_pool(i->p,"vCard"); xmlnode_put_attrib(ti->vcard,"xmlns",NS_VCARD); xmlnode_insert_node(ti->vcard,xmlnode_get_firstchild(xmlnode_get_tag(config,"vCard"))); ti->start_time = time(NULL); ti->session__list=xhash_new(101); ti->iq__callbacks = xhash_new(23); ti->pending__buddies = xhash_new(101); /* The aim.exe binary should not be necessary any more. */ ti->aimbinarydir = pstrdup(i->p, xmlnode_get_tag_data(config, "aimbinarydir")); eightbitcode = pstrdup(i->p, xmlnode_get_tag_data(config, "charset")); if( eightbitcode == NULL ) { log_notice( i->id, "Charset is not specified, using CP1252" ); eightbitcode = latin1code; } xmlnode_free(config); fromutf8 = iconv_open(eightbitcode, utf8code); if(fromutf8 == (iconv_t)(-1)) { log_error(i->id, "Conversion from %s to %s is not supported", utf8code, eightbitcode); raise(SIGINT); } toutf8 = iconv_open(utf8code, eightbitcode); if(toutf8 == (iconv_t)(-1)) { log_error(i->id, "Conversion from %s to %s is not supported", eightbitcode, utf8code); raise(SIGINT); } ti->send_buf = NULL; ti->modname = NULL; pth_mutex_init(&ti->buddies_mutex); at_init_iqcbs(ti); register_phandler(i, o_DELIVER, at_phandler, ti); pool_cleanup(i->p, at_shutdown, (void*)i); }
/* returns the priority on a presence packet */ int jutil_priority(xmlnode x) { char *str; int p; if(x == NULL) return -1; if(xmlnode_get_attrib(x,"type") != NULL) return -1; x = xmlnode_get_tag(x,"priority"); if(x == NULL) return 0; str = xmlnode_get_data((x)); if(str == NULL) return 0; p = atoi(str); if(p >= 0) return p; else return 0; }
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 jabber_init(){ xmlnode node; stream_add_destroy_handler(jabber_stream_destroyed); node=xmlnode_get_tag(config,"service"); if (!node) error_exit("%s", L_("No <service/> found in config file")); my_name=xmlnode_get_attrib(node,"jid"); if (!my_name) error_exit("%s", L_("<service/> without \"jid\" in config file")); node=xmlnode_get_tag(config, "bare_domain"); if (node) bare_domain=1; server=config_load_string("connect/ip"); if (!server) error_exit("%s", L_("Jabberd server not found in config file")); port=config_load_int("connect/port",0); if (port<=0) error_exit("%s", L_("Connect port not found in config file")); node=xmlnode_get_tag(config,"connect/secret"); if (node) secret=xmlnode_get_data(node); if (!node || !secret) error_exit("%s", L_("Connect secret not found in config file")); register_instructions=config_load_formatted_string("register/instructions"); if (!register_instructions) error_exit("%s", L_("Registration instructions not not found in config file")); search_instructions=config_load_formatted_string("search/instructions"); if (!search_instructions) error_exit("%s", L_("Search instructions not found in config file")); gateway_desc=config_load_formatted_string("gateway/desc"); if (!gateway_desc) error_exit("%s", L_("Gateway instructions not found in config file")); gateway_prompt=config_load_formatted_string("gateway/prompt"); if (!gateway_prompt) error_exit("%s", L_("Gateway prompt not found in config file")); jabber_state=JS_NONE; return 0; }
/* return the cdata from any tag */ char *xmlnode_get_tag_data(xmlnode parent, const char *name) { xmlnode tag; tag = xmlnode_get_tag(parent, name); if(tag == NULL) return NULL; return xmlnode_get_data(tag); }
mreturn mod_roster_auto_in_s10n(mapi m, void *arg) { xmlnode reply, x; log_debug("AUTO ROSTER"); //in not s10n if (m->packet->type != JPACKET_S10N) return M_IGNORE; //if no to if (m->packet->to == NULL) return M_PASS; //if from me if (jid_cmpx(m->s->uid, m->packet->from, JID_USER | JID_SERVER) == 0) return M_PASS; log_debug("handling incoming s10n"); switch (jpacket_subtype(m->packet)) { case JPACKET__SUBSCRIBE: log_debug("SUBSCRIBE"); reply = jutil_presnew(JPACKET__SUBSCRIBED, jid_full(m->packet->from), NULL); js_session_from(m->s, jpacket_new(reply)); reply = jutil_presnew(JPACKET__SUBSCRIBE, jid_full(m->packet->from), NULL); js_session_from(m->s, jpacket_new(reply)); break; case JPACKET__SUBSCRIBED: break; case JPACKET__UNSUBSCRIBE: log_debug("UNSUBSCRIBE"); //reply = jutil_presnew(JPACKET__UNSUBSCRIBED, jid_full(m->packet->from),NULL); //js_session_from(m->s, jpacket_new(reply)); //remove account. reply = jutil_iqnew(JPACKET__SET, NS_ROSTER); x = xmlnode_get_tag(reply, "query"); x = xmlnode_insert_tag(x, "item"); xmlnode_put_attrib(x, "jid", jid_full(jid_user(m->packet->from))); xmlnode_put_attrib(x, "subscription", "remove"); js_session_from(m->s, jpacket_new(reply)); // reply = jutil_iqnewpresnew(JPACKET__UNSUBSCRIBE, jid_full(m->packet->from),NULL); // js_session_from(m->s, jpacket_new(reply)); break; case JPACKET__UNSUBSCRIBED: break; } xmlnode_free(m->packet->x); return M_HANDLED; }
/** * A replacement for xdb_set * returns 0 if the set succeeded, 1 if not */ int xdb_set(void *noop, jid fn, char *ns, xmlnode x) { extern jcr_instance jcr; char buf[512]; xmlnode n, s, xdb; int rc; n = xdb_get(noop, fn, NULL); if (n == NULL) { memset(buf, 0, 512); snprintf(buf, 511, "%s/%s.xml", jcr->spool_dir, fn->user); xdb = xmlnode_new_tag("xdb"); if (ns != NULL) xmlnode_put_attrib(x, "xdbns", ns); // log_debug(JDBG, "node not found, creating %s", xmlnode2str(x)); xmlnode_insert_node(xdb, x); // log_debug(JDBG, "\nwriting '%s'\n\n", xmlnode2str(xdb)); rc = xmlnode2file(buf, xdb); xmlnode_free(xdb); return rc; } else { s = NULL; // log_debug(JDBG, "node found '%s'", xmlnode2str(n)); if (ns == NULL) { s = xmlnode_get_tag(n, xmlnode_get_name(x)); } else { memset(buf, 0, 512); snprintf(buf, 511, "%s?xdbns=%s", xmlnode_get_name(x), ns); // log_debug(JDBG, "search for '%s'", buf); s = xmlnode_get_tag(n, buf); } // log_debug(JDBG, "removing '%s'", xmlnode2str(s)); xmlnode_hide(s); if (ns != NULL) xmlnode_put_attrib(x, "xdbns", ns); xmlnode_insert_tag_node(n, x); } snprintf(buf, 511, "%s/%s.xml", jcr->spool_dir, fn->user); rc = xmlnode2file(buf, n); xmlnode_free(n); log_debug(JDBG, "xdb_set: rc == %d", rc); return 0; }
/* * adds a field declaration to a jabber:x:data report * returns the field added */ xmlnode form_add_result_field(xmlnode form,const char *var,const char *label,const char *type){ xmlnode rep,field; rep=xmlnode_get_tag(form,"reported"); if (rep==NULL){ rep=xmlnode_insert_tag(form,"reported"); } field=xmlnode_insert_tag(rep,"field"); xmlnode_put_attrib(field,"var",var); xmlnode_put_attrib(field,"label",label); if (type!=NULL) xmlnode_put_attrib(field,"type",type); return field; }
jpacket jpacket_reset(jpacket p) { char *val; xmlnode x; x = p->x; memset(p,0,sizeof(_jpacket)); p->x = x; p->p = xmlnode_pool(x); if(strcmp(xmlnode_get_name(x),"message") == 0) { p->type = JPACKET_MESSAGE; }else if(strcmp(xmlnode_get_name(x),"presence") == 0) { p->type = JPACKET_PRESENCE; val = xmlnode_get_attrib(x, "type"); if(val == NULL) p->subtype = JPACKET__AVAILABLE; else if(strcmp(val,"unavailable") == 0) p->subtype = JPACKET__UNAVAILABLE; else if(strcmp(val,"probe") == 0) p->subtype = JPACKET__PROBE; else if(strcmp(val,"error") == 0) p->subtype = JPACKET__ERROR; else if(strcmp(val,"invisible") == 0) p->subtype = JPACKET__INVISIBLE; else if(*val == 's' || *val == 'u') p->type = JPACKET_S10N; else p->type = JPACKET_UNKNOWN; }else if(strcmp(xmlnode_get_name(x),"iq") == 0) { p->type = JPACKET_IQ; p->iq = xmlnode_get_tag(x,"?xmlns"); p->iqns = xmlnode_get_attrib(p->iq,"xmlns"); } /* set up the jids if any, flag packet as unknown if they are unparseable */ val = xmlnode_get_attrib(x,"to"); if(val != NULL) if((p->to = jid_new(p->p, val)) == NULL) p->type = JPACKET_UNKNOWN; val = xmlnode_get_attrib(x,"from"); if(val != NULL) if((p->from = jid_new(p->p, val)) == NULL) p->type = JPACKET_UNKNOWN; return p; }
void _at_shutdown(xht x, const char *key, void *data, void *arg) { ati ti = (ati)arg; at_session s = (at_session)data; xmlnode message; message = xmlnode_new_tag("message"); xmlnode_put_attrib(message, "from", jid_full(s->from)); xmlnode_put_attrib(message,"type", "error"); xmlnode_put_attrib(message, "to", jid_full(s->cur)); xmlnode_insert_cdata(xmlnode_insert_tag(message, "error"), "AIM Transport shutting down.", -1); xmlnode_put_attrib(xmlnode_get_tag(message, "error"), "code", "502"); at_deliver(ti,message); at_session_end(s); iconv_close( fromutf8 ); iconv_close( toutf8 ); return; }
/** * returns the priority on an available presence packet * * @param xmlnode the xmlnode containing the presence packet * @return the presence priority, -129 for unavailable presences and errors */ int jutil_priority(xmlnode x) { char *str; int p; if (x == NULL) return -129; if (xmlnode_get_attrib(x, "type") != NULL) return -129; x = xmlnode_get_tag(x, "priority"); if (x == NULL) return 0; str = xmlnode_get_data((x)); if (str == NULL) return 0; p = atoi(str); /* xmpp-im section 2.2.2.3 */ return p < -128 ? -128 : p > 127 ? 127 : p; }
/** * A replacement for xdb_set * returns 0 if the set succeeded, 1 if not */ xmlnode xdb_get(void *noop, jid fn, char *ns) { extern jcr_instance jcr; char buf[512]; xmlnode x, child; memset(buf, 0, 512); snprintf(buf, 511, "%s/%s.xml", jcr->spool_dir, fn->user); x = xmlnode_file(buf); if (x == NULL) return NULL; if (ns != NULL) { memset(buf, 0, 512); snprintf(buf, 511, "?xdbns=%s", ns); child = xmlnode_get_tag(x, buf); if (child == NULL) xmlnode_free(x); return child; } else { return x; } }
void jcr_queue_deliver(void *a) { extern jcr_instance jcr; GIOStatus rc = G_IO_STATUS_NORMAL; GString *buffer; gsize bytes; int left, len, pkts; dpacket d; GTimeVal timeout; int buf_size = j_atoi(xmlnode_get_data(xmlnode_get_tag(jcr->config,"send-buffer")), 8192); log_warn(JDBG, "packet delivery thread starting."); buffer = g_string_new(NULL); while(TRUE) { g_string_set_size(buffer, 0); pkts = 0; g_get_current_time(&timeout); g_time_val_add(&timeout, (5 * G_USEC_PER_SEC)); d = (dpacket)g_async_queue_timed_pop(jcr->dqueue, &timeout); if (d == NULL) { if (jcr->stream_state == _STREAM_CONNECTED) continue; else break; } g_string_append(buffer, xmlnode2str(d->x)); xmlnode_free(d->x); d = NULL; left = len = buffer->len; pkts++; while ((g_async_queue_length(jcr->dqueue) > 0) && (buffer->len < buf_size)) { d = (dpacket)g_async_queue_pop(jcr->dqueue); g_string_append(buffer, xmlnode2str(d->x)); xmlnode_free(d->x); d = NULL; left = len = buffer->len; pkts++; } // log_debug(JDBG, "%d '%s'", len, buf); while ((left > 0) && (rc == G_IO_STATUS_NORMAL)) { rc = g_io_channel_write_chars(jcr->gio, (buffer->str+(len - left)), left, &bytes, NULL); left = left - bytes; if (rc != G_IO_STATUS_NORMAL) { log_warn(JDBG, "Send packet failed, dropping packet"); } log_debug(JDBG, "wrote %d packets of %d bytes", pkts, bytes); // fprintf(stderr, "wrote %d packets of %d bytes\n", pkts, bytes); if (left==0){ //queue is empty, flushing the socket g_io_channel_flush(jcr->gio, NULL); } } } log_warn(JDBG, "packet delivery thread exiting."); log_warn(JDBG, " Last DvryQ Buffer='%.*s'", buffer->len, buffer->str); g_string_free(buffer, TRUE); }
int jabber_message(struct stream_s *stream,xmlnode tag){ char *type; char *from; char *to; char *subject; char *body; int chat; xmlnode subject_n; xmlnode body_n; Session *s; User *u; body_n=xmlnode_get_tag(tag,"body"); if (body_n!=NULL) body=xmlnode_get_data(body_n); else body=NULL; subject_n=xmlnode_get_tag(tag,"subject"); if (subject_n!=NULL) subject=xmlnode_get_data(subject_n); else subject=NULL; from=xmlnode_get_attrib(tag,"from"); to=xmlnode_get_attrib(tag,"to"); type=xmlnode_get_attrib(tag,"type"); if (!acl_is_allowed(from,tag)){ if (type && !strcmp(type,"error")){ debug("Ignoring forbidden message error"); return -1; } if (!from) return -1; message_send_error(stream,to,from,NULL,405,_("Not allowed")); return -1; } if (from) u=user_get_by_jid(from); else u=NULL; user_load_locale(u); if (!type || !strcmp(type,"normal")) chat=0; else if (!strcmp(type,"chat")) chat=1; else if (!strcmp(type,"error")){ g_warning(N_("Error message received: %s"),xmlnode2str(tag)); return 0; } else{ g_warning(N_("Unsupported message type")); message_send_error(stream,to,from,body,500,_("Internal Server Error")); return -1; } if (!to || !jid_is_my(to)){ g_warning(N_("Bad 'to' in: %s"),xmlnode2str(tag)); message_send_error(stream,to,from,body,400,_("Bad Request")); return -1; } if (!jid_has_uin(to)){ return message_to_me(stream,from,to,body,tag); } if (!from){ g_warning(N_("Anonymous message? %s"),xmlnode2str(tag)); message_send_error(stream,to,from,body,400,_("Bad Request")); return -1; } s=session_get_by_jid(from,NULL,0); if (!s || !s->connected){ g_warning(N_("%s not logged in. While processing %s"),from,xmlnode2str(tag)); message_send_error(stream,to,from,body,407,_("Not logged in")); return -1; } if (subject) body=g_strdup_printf("Subject: %s\n%s",subject,body); session_send_message(s,jid_get_uin(to),chat,string_to_gg(body)); if (subject) g_free(body); return 0; }
void mt_ns_not(mpacket mp, session s) { int i = 0; xmlnode msg, oob1, oob2; /* message body spool*/ pool p = pool_new(); spool sp = spool_new(p); /* parsing the message... */ xmlnode notification, msgtag, action, subscr, body, text; spool action_url = spool_new(p); spool subscr_url = spool_new(p); char *chunk, *fixedchunk, *notification_id, *msg_id, *bodytext; if (s->ti->inbox_headlines == 0) return; /* grab the <notification/> chunk */ for(i = 2; i < mp->count; i++) { spool_add(sp, mt_packet_data(mp,i)); } msg = xmlnode_new_tag("message"); xmlnode_put_attrib(msg,"to",jid_full(s->id)); xmlnode_put_attrib(msg,"from",s->host); xmlnode_put_attrib(msg,"type","headline"); xmlnode_insert_cdata(xmlnode_insert_tag(msg,"subject"),"MSN Alert",-1); /* Parse the alert -- there's probably better ways to do this */ chunk = spool_print(sp); log_debug(ZONE, "chunk from spool_print: \"%s\"", chunk); fixedchunk = mt_fix_amps(p, chunk); log_debug(ZONE, "fixedchunk: \"%s\"", fixedchunk); // Get the notification ID notification = xmlnode_str(fixedchunk, strlen(fixedchunk)); notification_id = xmlnode_get_attrib(notification, "id"); log_debug(ZONE, "notification - %X\nn_id - %s", notification, notification_id); // Get the message ID msgtag = xmlnode_get_tag(notification, "MSG"); msg_id = xmlnode_get_attrib(msgtag, "id"); // Get the action URL action = xmlnode_get_tag(msgtag, "ACTION"); spool_add(action_url, xmlnode_get_attrib(action, "url")); spool_add(action_url, "¬ification="); spool_add(action_url, notification_id); spool_add(action_url, "&message_id="); spool_add(action_url, msg_id); spool_add(action_url, "&agent=messenger"); // Get the subscription URL subscr = xmlnode_get_tag(msgtag, "SUBSCR"); spool_add(subscr_url, xmlnode_get_attrib(subscr, "url")); spool_add(subscr_url, "¬ification="); spool_add(subscr_url, notification_id); spool_add(subscr_url, "&message_id="); spool_add(subscr_url, msg_id); spool_add(subscr_url, "&agent=messenger"); // Get the body body = xmlnode_get_tag(msgtag, "BODY"); text = xmlnode_get_tag(body, "TEXT"); bodytext = xmlnode_get_data(text); /* Finished parsing the XML */ // Insert the body xmlnode_insert_cdata(xmlnode_insert_tag(msg,"body"),bodytext,-1); // Insert the action URL oob1 = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(oob1,"xmlns","jabber:x:oob"); xmlnode_insert_cdata(xmlnode_insert_tag(oob1,"url"),spool_print(action_url),-1); xmlnode_insert_cdata(xmlnode_insert_tag(oob1,"desc"),"More information on this alert",-1); // Insert the subscription URL oob2 = xmlnode_insert_tag(msg,"x"); xmlnode_put_attrib(oob2,"xmlns","jabber:x:oob"); xmlnode_insert_cdata(xmlnode_insert_tag(oob2,"url"),spool_print(subscr_url),-1); xmlnode_insert_cdata(xmlnode_insert_tag(oob2,"desc"),"Manage subscriptions to alerts",-1); mt_deliver(s->ti,msg); xmlnode_free(notification); pool_free(p); }
int sessions_init(){ char *proxy_ip,*proxy_username,*proxy_password,*proxy_http_only; char *p,*r; int port; int i; xmlnode parent,tag; GgServer *server; stream_add_destroy_handler(sessions_stream_destroyed); sessions_jid=g_hash_table_new(g_str_hash,g_str_equal); if (!sessions_jid) return -1; i=config_load_int("conn_timeout",0); if (i>0) conn_timeout=i; i=config_load_int("pong_timeout",0); if (i>0) pong_timeout=i; i=config_load_int("ping_interval",0); if (i>0) ping_interval=i; i=config_load_int("reconnect",0); if (i>0) reconnect=i; i=config_load_int("server_cutoff",0); if (i>0) cutoff=i; i=config_load_int("server_cutoff_timeout",0); if (i>0) cutoff_timeout=i; tag = xmlnode_get_tag(config, "ignore_system_messages"); if (!tag) { ignore_system_messages = ISM_IGNORE_NONE; } else { r=xmlnode_get_attrib(tag, "which"); if (r && !g_strcasecmp(r,"html")) { ignore_system_messages = ISM_IGNORE_HTML; } else { ignore_system_messages = ISM_IGNORE_ALL; } } parent=xmlnode_get_tag(config,"servers"); if (parent && xmlnode_has_children(parent)){ gg_servers=NULL; for(tag=xmlnode_get_firstchild(parent); tag!=NULL; tag=xmlnode_get_nextsibling(tag)){ if(xmlnode_get_type(tag) != NTYPE_TAG) continue; p=xmlnode_get_name(tag); if (strcmp(p, "hub")==0){ server=g_new(GgServer, 1); server->port=1; gg_servers=g_list_append(gg_servers, server); } else if (strcmp(p, "server")==0){ server=g_new(GgServer, 1); server->error_count=0; r=xmlnode_get_attrib(tag, "port"); if (r) server->port=atoi(r); else server->port=8074; r=xmlnode_get_data(tag); if(inet_aton(r, &server->addr)) gg_servers=g_list_append(gg_servers, server); } else continue; r=xmlnode_get_attrib(tag, "tls"); if (r && !g_strcasecmp(r,"no")) server->tls=0; else server->tls=1; } } else{ server=g_new(GgServer, 1); server->port=1; server->tls=0; gg_servers=g_list_append(gg_servers, server); server=g_new(GgServer, 1); server->error_count=0; inet_aton("217.17.45.145", &server->addr); server->port=8074; server->tls=0; gg_servers=g_list_append(gg_servers, server); } proxy_ip=config_load_string("proxy/ip"); if (!proxy_ip) return 0; port=config_load_int("proxy/port",0); if (port<=0) return 0; proxy_username=config_load_string("proxy/username"); proxy_password=config_load_string("proxy/password"); tag=xmlnode_get_tag(config,"proxy"); proxy_http_only=xmlnode_get_attrib(tag,"http_only"); g_message(L_("Using proxy: http://%s:%i"),proxy_ip,port); gg_proxy_enabled=1; gg_proxy_host=proxy_ip; gg_proxy_port=port; if (proxy_username && proxy_password){ gg_proxy_username=proxy_username; gg_proxy_password=proxy_password; } if (proxy_http_only && strcmp(proxy_http_only,"no")){ gg_proxy_http_only=1; } return 0; }
mreturn mod_stats_server(mapi m, void *arg) { xmlnode cur; int i; if (m->packet->type != JPACKET_IQ) return M_IGNORE; if (jpacket_subtype(m->packet) != JPACKET__GET) return M_PASS; if (!NSCHECK(m->packet->iq, NS_STATS)) return M_PASS; if (m->packet->to->resource) return M_PASS; /* get data from the config file */ i = 0; if (xmlnode_get_tag(js_config(m->si, "stats"), "allow_all") != NULL) i = 1; log_debug("handling stats get %s", jid_full(m->packet->from)); /* check if admin */ if ((i == 0) && (!js_admin_jid(m->si, jid_user(m->packet->from), ADMIN_READ))) { jutil_error(m->packet->x, TERROR_AUTH); jpacket_reset(m->packet); js_deliver(m->si, m->packet); return M_HANDLED; } /* check if any stat have given iq query */ cur = xmlnode_get_firstchild(m->packet->iq); for (; cur != NULL; cur = xmlnode_get_nextsibling(cur)) { if (xmlnode_get_type(cur) != NTYPE_TAG) continue; break; } if (cur != NULL) cur = xmlnode_get_firstchild(m->packet->iq); jutil_tofrom(m->packet->x); xmlnode_put_attrib(m->packet->x, "type", "result"); /* return available stats */ if (!cur) { for (i = 0; available_stats[i]; i++) { xmlnode_put_attrib(xmlnode_insert_tag (m->packet->iq, "stat"), "name", available_stats[i]); } jpacket_reset(m->packet); js_deliver(m->si, m->packet); return M_HANDLED; } /* return server stats */ /* cur is already first stat */ for (; cur != NULL; cur = xmlnode_get_nextsibling(cur)) { char *name; char buf[31]; int found; if (xmlnode_get_type(cur) != NTYPE_TAG) continue; if (j_strcmp(xmlnode_get_name(cur), "stat") != 0) continue; name = xmlnode_get_attrib(cur, "name"); if (!name) continue; log_debug("get stats for %s", name); found = 0; for (i = 0; available_stats[i]; i++) { if (j_strcmp(available_stats[i], name) != 0) continue; log_debug("stats for %s", name); /* give stats */ found = 1; /* time/uptime */ if (j_strcmp(name, "time/uptime") == 0) { snprintf(buf, 30, "%d", time(NULL) - m->si->stats->started); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "seconds"); } /* users/online */ if (j_strcmp(name, "users/online") == 0) { snprintf(buf, 30, "%d", m->si->stats->sessioncount); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "users"); } if (j_strcmp(name, "users/max_online_today") == 0) { snprintf(buf, 30, "%d", m->si->stats->session_max_today); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "users"); } if (j_strcmp(name, "users/max_online_yesterday") == 0) { snprintf(buf, 30, "%d", m->si->stats-> session_max_yesterday); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "users"); } if (j_strcmp(name, "users/registered_today") == 0) { snprintf(buf, 30, "%d", m->si->stats-> users_registered_today); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "users"); } if (j_strcmp(name, "users/registered_from_start") == 0) { snprintf(buf, 30, "%d", m->si->stats-> users_registered_from_start); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "users"); } if (j_strcmp(name, "bandwidth/packets-in") == 0) { snprintf(buf, 30, "%lu", m->si->stats->packets_in); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "packets"); } if (j_strcmp(name, "bandwidth/packets-out") == 0) { snprintf(buf, 30, "%lu", m->si->stats->packets_out); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "packets"); } #ifndef WIN32 if (j_strcmp(name, "memory/usage") == 0) { long mem = get_memory_usage(); if (mem > 0) { snprintf(buf, 30, "%lu", mem); xmlnode_put_attrib(cur, "value", buf); xmlnode_put_attrib(cur, "units", "bytes"); } else found = 0; } #endif break; } if (found <= 0) { xmlnode err; err = xmlnode_insert_tag(cur, "error"); xmlnode_put_attrib(err, "code", "404"); xmlnode_insert_cdata(err, "Not Found", -1); } } jpacket_reset(m->packet); js_deliver(m->si, m->packet); return M_HANDLED; }
/** Start up transport. Read configuration, register callbacks. */ void icqtrans(instance i, xmlnode x) { iti ti; pool p = i->p; xmlnode config; xmlnode cur; int check; log_debug(ZONE,"ICQ Transport, initializing for section '%s'",i->id); /* create new transport instance */ ti = pmalloco(p,sizeof(_iti)); ti->i = i; ti->xc = xdb_cache(i); config = xdb_get(ti->xc,jid_new(xmlnode_pool(x),"config@-internal"),"jabber:config:icqtrans"); if (config == NULL) { log_error(i->id,"Configuration not found!"); return; } ti->registration_instructions = pstrdup(p,xmlnode_get_tag_data(config,"instructions")); if (ti->registration_instructions == NULL) { log_debug(i->id,"Registration instructions not found"); } ti->search_instructions = pstrdup(p,xmlnode_get_tag_data(config,"search")); if (ti->search_instructions == NULL) { log_debug(i->id,"Search instructions not found"); } ti->charset = pstrdup(p,xmlnode_get_tag_data(config,"charset")); if (ti->charset == NULL) { log_debug(i->id,"Charset not specified, set default to %s ",DEFAULT_CHARSET); ti->charset = pstrdup(p,DEFAULT_CHARSET); } _ucs2utf = iconv_open("UTF-8","UCS-2BE"); _win2utf = iconv_open("UTF-8",ti->charset); if (_win2utf==(iconv_t)-1) { ti->charset = pstrdup(p,DEFAULT_CHARSET); _win2utf = iconv_open("UTF-8",ti->charset); if (_win2utf==(iconv_t)-1) { log_error(i->id,"Charset error!"); return; } } _utf2win = iconv_open(ti->charset,"UTF-8"); if (_utf2win ==(iconv_t)-1) { ti->charset = pstrdup(p,DEFAULT_CHARSET); _utf2win = iconv_open(ti->charset,"UTF-8"); if (_utf2win ==(iconv_t)-1) { log_error(i->id,"Charset error!"); return; } } log_notice("config","charset %s",ti->charset); ti->msg_chat = xmlnode_get_tag(config,"chat") ? 1 : 0; if (ti->msg_chat) { log_notice("config","chat messages enabled"); } ti->web_aware = xmlnode_get_tag(config,"web") ? 1 : 0; if (ti->web_aware) { log_notice("config","web presence enabled"); } ti->own_roster = xmlnode_get_tag(config,"own_roster") ? 1 : 0; if (ti->own_roster) { log_notice("config","JIT will use own roster"); } ti->no_jabber_roster = xmlnode_get_tag(config,"no_jabber_roster") ? 1 : 0; if (ti->no_jabber_roster) { log_notice("config","JIT willn't get users from jabber roster"); } ti->no_x_data = xmlnode_get_tag(config,"no_xdata") ? 1 : 0; if (ti->no_x_data) { log_notice("config","JIT will not use xdata"); } cur = xmlnode_get_tag(config,"sms"); if (cur) { ti->sms_id = pstrdup(p,xmlnode_get_tag_data(cur,"host")); if (ti->sms_id) { ti->sms_show = jit_show2status(xmlnode_get_tag_data(cur,"show")); if (ti->sms_show==ICQ_STATUS_NOT_IN_LIST) { ti->sms_show = ICQ_STATUS_ONLINE; } log_notice("config","sms host %s show: %d",ti->sms_id,ti->sms_show); ti->sms_status = pstrdup(p,xmlnode_get_tag_data(cur,"status")); if (ti->sms_status) { log_debug(ZONE,"sms st %s ",ti->sms_status); } ti->sms_name = pstrdup(p,xmlnode_get_tag_data(cur,"name")); if (ti->sms_name) { log_debug(ZONE,"sms name %s",ti->sms_name); } } } ti->count_file = pstrdup(p,xmlnode_get_tag_data(config,"user_count_file")); if (ti->count_file == NULL) { ti->count_file = "icqcount"; } log_notice("config","Using %s as count log file",ti->count_file); for (cur = xmlnode_get_firstchild(xmlnode_get_tag(config,"server")); cur != NULL; cur = xmlnode_get_nextsibling(cur)) { char * port; char * host; if (xmlnode_get_type(cur) != NTYPE_TAG) continue; if ((port = xmlnode_get_attrib(cur,"port")) == NULL) continue; if ((host = xmlnode_get_data(cur)) == NULL) continue; ti->auth_hosts[ti->auth_hosts_count] = pstrdup(p,host); ti->auth_ports[ti->auth_hosts_count] = j_atoi(port,5190); log_debug(ZONE,"Host %s port %d at pos %d", ti->auth_hosts[ti->auth_hosts_count], ti->auth_ports[ti->auth_hosts_count], ti->auth_hosts_count); ti->auth_hosts_count++; if (ti->auth_hosts_count >= MAX_AUTH_HOSTS) break; } if (ti->auth_hosts_count == 0) { log_alert("err","No hosts to auth icq client !. Using default"); ti->auth_hosts[ti->auth_hosts_count] = pstrdup(p,"205.188.179.233"); ti->auth_ports[ti->auth_hosts_count] = 5190; ti->auth_hosts_count++; } /* add queue for unknown packets */ ti->q = mtq_new(i->p); ti->sessions = wpxhash_new(j_atoi(xmlnode_get_tag_data(config,"prime"),509)); ti->sessions_alt = wpxhash_new(j_atoi(xmlnode_get_tag_data(config,"prime"),509)); SEM_INIT(ti->sessions_sem); ti->vcard = xmlnode_new_tag_pool(p,"vCard"); xmlnode_put_attrib(ti->vcard,"xmlns",NS_VCARD); xmlnode_insert_node(ti->vcard,xmlnode_get_firstchild(xmlnode_get_tag(config,"vCard"))); /* default 5 hours */ ti->session_timeout = j_atoi(xmlnode_get_tag_data(config,"session_timeout"),18000); log_notice("config","session_timeout in sec : %d",ti->session_timeout); ti->reconnect = j_atoi(xmlnode_get_tag_data(config,"reconnects"),0); log_notice("config","Number of reconnects for session %d",ti->reconnect); check = j_atoi(xmlnode_get_tag_data(config,"session_check"),10); log_notice("config","JIT will check session every %d sec",check); // ti->admin = xmlnode_dup(xmlnode_get_tag(config,"admin")); ti->start = time(NULL); /* Register callbacks */ register_phandler(i,o_DELIVER,it_receive,(void *) ti); register_shutdown(it_shutdown,(void *) ti); /* Start up heartbeat thread */ register_beat(check,it_sessions_check,(void *) ti); xmlnode_free(config); }
/* * xmlnode_get_tag -- find given tag in an xmlnode tree * * parameters * parent -- pointer to the parent tag * name -- "name" for the child tag of that name * "name/name" for a sub child (recurses) * "?attrib" to match the first tag with that attrib defined * "?attrib=value" to match the first tag with that attrib and value * "=cdata" to match the cdata contents of the child * or any combination: "name/name/?attrib", "name=cdata", etc * * results * a pointer to the tag matching search criteria * or NULL if search was unsuccessfull */ xmlnode xmlnode_get_tag(xmlnode parent, const char* name) { char *str, *slash, *qmark, *equals; xmlnode step, ret; if(parent == NULL || parent->firstchild == NULL || name == NULL || name == '\0') return NULL; if(strstr(name, "/") == NULL && strstr(name,"?") == NULL && strstr(name, "=") == NULL) return _xmlnode_search(parent->firstchild, name, NTYPE_TAG); str = strdup(name); slash = strstr(str, "/"); qmark = strstr(str, "?"); equals = strstr(str, "="); if(equals != NULL && (slash == NULL || equals < slash) && (qmark == NULL || equals < qmark)) { /* of type =cdata */ *equals = '\0'; equals++; for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step)) { if(xmlnode_get_type(step) != NTYPE_TAG) continue; if(*str != '\0') if(j_strcmp(xmlnode_get_name(step),str) != 0) continue; if(j_strcmp(xmlnode_get_data(step),equals) != 0) continue; break; } free(str); return step; } if(qmark != NULL && (slash == NULL || qmark < slash)) { /* of type ?attrib */ *qmark = '\0'; qmark++; if(equals != NULL) { *equals = '\0'; equals++; } for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step)) { if(xmlnode_get_type(step) != NTYPE_TAG) continue; if(*str != '\0') if(j_strcmp(xmlnode_get_name(step),str) != 0) continue; if(xmlnode_get_attrib(step,qmark) == NULL) continue; if(equals != NULL && j_strcmp(xmlnode_get_attrib(step,qmark),equals) != 0) continue; break; } free(str); return step; } *slash = '\0'; ++slash; for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step)) { if(xmlnode_get_type(step) != NTYPE_TAG) continue; if(j_strcmp(xmlnode_get_name(step),str) != 0) continue; ret = xmlnode_get_tag(step, slash); if(ret != NULL) { free(str); return ret; } } free(str); return NULL; }
int jabber_presence(struct stream_s *stream,xmlnode tag){ char *type; char *from; char *to; xmlnode prio_n; xmlnode show_n; xmlnode status_n; char *show,*status; int priority; char *tmp; User *u; type=xmlnode_get_attrib(tag,"type"); from=xmlnode_get_attrib(tag,"from"); to=xmlnode_get_attrib(tag,"to"); if (from) u=user_get_by_jid(from); else u=NULL; user_load_locale(u); if (!acl_is_allowed(from,tag)){ if (type && !strcmp(type,"error")){ debug("Ignoring forbidden presence error"); return -1; } if (!from) return -1; presence_send_error(stream,to,from,405,_("Not allowed")); return -1; } show_n=xmlnode_get_tag(tag,"show"); if (show_n) show=xmlnode_get_data(show_n); else show=NULL; status_n=xmlnode_get_tag(tag,"status"); if (status_n) status=xmlnode_get_data(status_n); else status=NULL; prio_n=xmlnode_get_tag(tag,"priority"); if (prio_n){ tmp=xmlnode_get_data(prio_n); if (tmp) priority=atoi(tmp); else priority=-1; } else priority=-1; if (!type) type="available"; if (!from || !to){ if (strcmp(type,"error")) presence_send_error(stream,to,from,406,_("Not Acceptable")); g_warning(N_("Bad <presence/>: %s"),xmlnode2str(tag)); return -1; } if (!jid_is_my(to)){ if (strcmp(type,"error")) presence_send_error(stream,to,from,406,_("Not Acceptable")); g_warning(N_("Wrong 'to' in %s"),xmlnode2str(tag)); return -1; } if (!strcmp(type,"available")){ if (jid_has_uin(to)) return presence_direct_available(stream,from,to); else return presence(stream,from,to,1,show,status,priority); } else if (!strcmp(type,"unavailable")){ if (jid_has_uin(to)) return presence_direct_unavailable(stream,from,to); else return presence(stream,from,to,0,show,status,priority); } if (!strcmp(type,"invisible")){ if (jid_has_uin(to)) return presence_direct_unavailable(stream,from,to); else return presence(stream,from,to,-1,show,status,priority); } else if (!strcmp(type,"subscribe")) return presence_subscribe(stream,from,to); else if (!strcmp(type,"unsubscribe")) return presence_unsubscribe(stream,from,to); else if (!strcmp(type,"subscribed")) return presence_subscribed(stream,from,to); else if (!strcmp(type,"unsubscribed")) return presence_unsubscribed(stream,from,to); else if (!strcmp(type,"probe")) return presence_probe(stream,from,to); else if (!strcmp(type,"error")){ g_warning(N_("Error presence received: %s"),xmlnode2str(tag)); return 0; } g_warning(N_("Unsupported type in %s"),xmlnode2str(tag)); presence_send_error(stream,to,from,501,_("Not Implemented")); return -1; }
char* get_avatar(char* uin) { CURL *curl_handle; char* xml_url=malloc(strlen(uin)+200*sizeof(char)); struct MemoryStruct chunk; xmlnode xml = NULL; xmlnode xmlnode_users; xmlnode xmlnode_user; xmlnode xmlnode_avatars; xmlnode xmlnode_avatar; xmlnode xmlnode_bigavatar; char* is_blank; chunk.memory=NULL; /* we expect realloc(NULL, size) to work */ chunk.size = 0; /* no data at this point */ curl_global_init(CURL_GLOBAL_ALL); /* init the curl session */ curl_handle = curl_easy_init(); /* specify URL to get */ sprintf(xml_url,"http://api.gadu-gadu.pl/avatars/%s/0.xml", uin); curl_easy_setopt(curl_handle, CURLOPT_URL, xml_url); /* send all data to this function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); /* we pass our 'chunk' struct to the callback function */ curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); /* some servers don't like requests that are made without a user-agent field, so we provide one */ curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.5)"); /* get it! */ curl_easy_perform(curl_handle); xml = xmlnode_str(chunk.memory, strlen(chunk.memory)); xmlnode_users = xmlnode_get_tag(xml, "users"); xmlnode_user = xmlnode_get_tag(xmlnode_users, "user"); xmlnode_avatars = xmlnode_get_tag(xmlnode_user, "avatars"); xmlnode_avatar = xmlnode_get_tag(xmlnode_avatars, "avatar"); xmlnode_bigavatar = xmlnode_get_tag(xmlnode_avatar, "originBigAvatar"); is_blank = xmlnode_get_attrib(xmlnode_avatar, "blank"); xml_url = xmlnode_get_data(xmlnode_bigavatar); chunk.memory = NULL; chunk.size=0; curl_easy_setopt(curl_handle, CURLOPT_URL, xml_url); curl_easy_perform(curl_handle); /* cleanup curl stuff */ curl_easy_cleanup(curl_handle); free(chunk.memory); /* we're done with libcurl, so clean it up */ curl_global_cleanup(); if(!strlen(is_blank)) return g_base64_encode(chunk.memory,chunk.size); else return "0"; }
User *user_load(const char *jid){ char *fn,*njid; xmlnode xml,tag,t; char *uin,*ujid,*name,*password,*email,*locale; char *status; int last_sys_msg=0,invisible=0,friends_only=0,ignore_unknown=0; unsigned int file_format_version=0; SubscriptionType subscribe; User *u; GList *contacts; char *p; char *data; uin=ujid=name=password=email=NULL; debug(L_("Loading user '%s'"),jid); fn=jid_normalized(jid,0); if (fn==NULL){ g_warning(L_("Bad JID: %s"),jid); return NULL; } errno=0; xml=xmlnode_file(fn); if (xml==NULL){ debug(L_("Couldn't read or parse '%s': %s"),fn,errno?g_strerror(errno):N_("XML parse error")); g_free(fn); return NULL; } g_free(fn); tag=xmlnode_get_tag(xml,"version"); if (tag!=NULL) { p=xmlnode_get_attrib(tag,"file_format"); if (p!=NULL) file_format_version=(unsigned int)strtol(p,NULL,16); } tag=xmlnode_get_tag(xml,"jid"); if (tag!=NULL) { ujid=xmlnode_get_data(tag); subscribe=get_subscribe(tag, file_format_version); } if (ujid==NULL){ g_warning(L_("Couldn't find JID in %s's file"),jid); return NULL; } tag=xmlnode_get_tag(xml,"uin"); if (tag!=NULL) uin=xmlnode_get_data(tag); if (uin==NULL){ g_warning(L_("Couldn't find UIN in %s's file"),jid); return NULL; } tag=xmlnode_get_tag(xml,"password"); if (tag!=NULL) password=xmlnode_get_data(tag); if (password==NULL){ g_warning(L_("Couldn't find password in %s's file"),jid); return NULL; } tag=xmlnode_get_tag(xml,"email"); if (tag!=NULL) email=xmlnode_get_data(tag); tag=xmlnode_get_tag(xml,"name"); if (tag!=NULL) name=xmlnode_get_data(tag); tag=xmlnode_get_tag(xml,"last_sys_msg"); if (tag!=NULL){ data=xmlnode_get_data(tag); if (data!=NULL) last_sys_msg=atoi(data); } tag=xmlnode_get_tag(xml,"friendsonly"); if (tag!=NULL) friends_only=1; tag=xmlnode_get_tag(xml,"invisible"); if (tag!=NULL) invisible=1; tag=xmlnode_get_tag(xml,"ignore_unknown"); if (tag!=NULL) ignore_unknown=1; tag=xmlnode_get_tag(xml,"locale"); if (tag!=NULL) locale=xmlnode_get_data(tag); else locale=NULL; tag=xmlnode_get_tag(xml,"status"); if (tag!=NULL) { status=xmlnode_get_data(tag); if (status==NULL) status=""; } else status=NULL; tag=xmlnode_get_tag(xml,"userlist"); contacts=NULL; if (tag!=NULL){ Contact *c; for(t=xmlnode_get_firstchild(tag);t;t=xmlnode_get_nextsibling(t)){ char *node_name; node_name=xmlnode_get_name(t); if (!node_name) continue; if (!strcmp(node_name,"uin")){ char *d; int uin; d=xmlnode_get_data(t); if (d==NULL) continue; uin=atoi(d); if (uin<=0) continue; c=g_new0(Contact,1); c->status=-1; c->uin=uin; contacts=g_list_append(contacts,c); continue; } if (!strcmp(node_name,"contact")){ char *d; int uin; d=xmlnode_get_attrib(t,"uin"); if (d==NULL) continue; uin=atoi(d); if (uin<=0) continue; c=g_new0(Contact,1); c->status=-1; c->uin=uin; d=xmlnode_get_attrib(t,"ignored"); if (d!=NULL && d[0]!='\000') c->ignored=1; else c->ignored=0; d=xmlnode_get_attrib(t,"blocked"); if (d!=NULL && d[0]!='\000') c->blocked=1; else c->blocked=0; c->subscribe=get_subscribe(t, file_format_version); contacts=g_list_append(contacts,c); } } } u=g_new0(User,1); u->uin=atoi(uin); u->jid=g_strdup(jid); p=strchr(u->jid,'/'); if (p) *p=0; u->password=g_strdup(password); u->last_sys_msg=last_sys_msg; u->friends_only=friends_only; u->invisible=invisible; u->ignore_unknown=ignore_unknown; u->locale=g_strdup(locale); u->status=g_strdup(from_utf8(status)); u->contacts=contacts; xmlnode_free(xml); g_assert(users_jid!=NULL); njid=jid_normalized(u->jid,0); g_assert(njid!=NULL); g_hash_table_insert(users_jid,(gpointer)njid,(gpointer)u); u->confirmed=1; u->subscribe=subscribe; return u; }
void con_room_send_invite(cnu sender, xmlnode node) { xmlnode result; xmlnode element; xmlnode invite; xmlnode pass; char *body, *user, *reason, *inviter; cnr room; pool p; if(sender == NULL || node == NULL) { log_warn(NAME, "[%s] Aborting - NULL attribute found", FZONE); return; } log_debug(NAME, "[%s] Sending room invite", FZONE); room = sender->room; invite = xmlnode_get_tag(node, "invite"); user = xmlnode_get_attrib(invite, "to"); reason = xmlnode_get_tag_data(invite, "reason"); p = xmlnode_pool(node); if(room->visible == 1) { inviter = jid_full(sender->realid); } else { inviter = jid_full(sender->localid); } xmlnode_put_attrib(invite, "from", inviter); xmlnode_hide_attrib(invite, "to"); if(reason == NULL) { reason = spools(p, "None given", p); } body = spools(p, "You have been invited to the ", jid_full(room->id), " room by ", inviter, "\nReason: ", reason, p); result = jutil_msgnew("normal", user , "Invitation", body); xmlnode_put_attrib(result, "from", jid_full(room->id)); xmlnode_insert_node(result, node); if(room->secret != NULL) { pass = xmlnode_get_tag(result, "x"); xmlnode_insert_cdata(xmlnode_insert_tag(pass, "password"), room->secret, -1); } element = xmlnode_insert_tag(result, "x"); xmlnode_put_attrib(element, "jid", jid_full(room->id)); xmlnode_put_attrib(element, "xmlns", NS_X_CONFERENCE); xmlnode_insert_cdata(element, reason, -1); log_debug(NAME, "[%s] >>>%s<<<", FZONE, xmlnode2str(result)); deliver(dpacket_new(result), NULL); return; }
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; }