15#include "../../sysdep.h"
30#include <libcitadel.h>
31#include "../../citadel.h"
32#include "../../server.h"
33#include "../../citserver.h"
34#include "../../support.h"
35#include "../../config.h"
36#include "../../internet_addressing.h"
37#include "../../ctdl_module.h"
48 cprintf(
"<item jid=\"%s\" name=\"%s\" subscription=\"both\">",
69 syslog(LOG_DEBUG,
"xmpp: roster push!");
70 cprintf(
"<query xmlns=\"jabber:iq:roster\">");
73 for (i=0; i<nContexts; i++) {
75 syslog(LOG_DEBUG,
"xmpp: rosterizing %s", cptr[i].
user.
fullname);
90 int supported_namespace = 0;
93 int reply_must_be_from_my_jid = 0;
100 (!strcasecmp(query_xmlns,
"jabber:iq:roster:query"))
101 || (!strcasecmp(query_xmlns,
"jabber:iq:auth:query"))
102 || (!strcasecmp(query_xmlns,
"http://jabber.org/protocol/disco#items:query"))
103 || (!strcasecmp(query_xmlns,
"http://jabber.org/protocol/disco#info:query"))
105 supported_namespace = 1;
108 syslog(LOG_DEBUG,
"xmpp: xmpp_query_namespace(id=%s, from=%s, to=%s, xmlns=%s)", iq_id, iq_from, iq_to, query_xmlns);
114 if (!strcasecmp(query_xmlns,
"jabber:iq:roster:query")) {
115 reply_must_be_from_my_jid = 1;
119 if (reply_must_be_from_my_jid) {
120 safestrncpy(dom,
XMPP->client_jid,
sizeof(dom));
121 char *slash = strchr(dom,
'/');
127 safestrncpy(dom,
XMPP->client_jid,
sizeof(dom));
128 if (IsEmptyStr(dom)) {
129 safestrncpy(dom,
XMPP->server_name,
sizeof(dom));
131 char *at = strrchr(dom,
'@');
135 char *slash = strchr(dom,
'/');
141 if (supported_namespace) {
142 cprintf(
"<iq type=\"result\" from=\"%s\" ",
xmlesc(xmlbuf, dom,
sizeof xmlbuf) );
145 cprintf(
"<iq type=\"error\" from=\"%s\" ",
xmlesc(xmlbuf, dom,
sizeof xmlbuf) );
147 if (!IsEmptyStr(iq_from)) {
148 cprintf(
"to=\"%s\" ",
xmlesc(xmlbuf, iq_from,
sizeof xmlbuf));
156 if (!strcasecmp(query_xmlns,
"jabber:iq:roster:query")) {
161 else if (!strcasecmp(query_xmlns,
"jabber:iq:auth:query")) {
162 cprintf(
"<query xmlns=\"jabber:iq:auth\">"
163 "<username/><password/><resource/>"
169 else if (!strcasecmp(query_xmlns,
"http://jabber.org/protocol/disco#items:query")) {
170 cprintf(
"<query xmlns=\"%s\"/>",
xmlesc(xmlbuf, query_xmlns,
sizeof xmlbuf));
174 else if (!strcasecmp(query_xmlns,
"http://jabber.org/protocol/disco#info:query")) {
175 cprintf(
"<query xmlns=\"%s\"/>",
xmlesc(xmlbuf, query_xmlns,
sizeof xmlbuf));
184 syslog(LOG_DEBUG,
"xmpp: unknown query namespace '%s' - returning <service-unavailable/>", query_xmlns);
185 cprintf(
"<error code=\"503\" type=\"cancel\">"
186 "<service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
char * CtdlGetConfigStr(char *key)
CitContext * CtdlGetContextArray(int *count)
char * xmlesc(char *buf, char *str, int bufsiz)
int xmpp_is_visible(struct CitContext *from, struct CitContext *to_whom)
void xmpp_delete_old_buddies_who_no_longer_exist_from_the_client_roster(void)
char cs_principal_id[256]
void cprintf(const char *format,...)
void xmpp_iq_roster_query(void)
void xmpp_roster_item(struct CitContext *cptr)
void xmpp_query_namespace(char *iq_id, char *iq_from, char *iq_to, char *query_xmlns)