/*
* Handle XMPP presence exchanges
*
- * Copyright (c) 2007-2010 by Art Cancro
+ * Copyright (c) 2007-2015 by Art Cancro and citadel.org
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
);
}
- // FIXME ... we should implement xmpp_indicate_nonpresence so we can use it elsewhere
+ // note: we should implement xmpp_indicate_nonpresence so we can use it elsewhere
/* Do an unsolicited roster update that deletes the contact. */
cprintf("<iq from=\"%s\" to=\"%s\" id=\"unbuddy_%x\" type=\"result\">",
}
DeleteHashPos(&HashPos);
- /* FIXME temp crap
- StrBufAppendPrintf(themsg, "foo@bar.com\n");
- StrBufAppendPrintf(themsg, "baz@quux.com\n");
- StrBufAppendPrintf(themsg, "haha%c\n", 1);
- StrBufAppendPrintf(themsg, "baaaz@quux.com\n");
- StrBufAppendPrintf(themsg, "baaaz@quuuuuux.com\n");
- */
-
/* Delete the old mortuary */
CtdlDeleteMessages(USERCONFIGROOM, NULL, 0, XMPPMORTUARY);
int nContexts, i;
syslog(LOG_DEBUG, "Roster push!");
- cprintf("<query xmlns=\"jabber:iq:roster\" rt=\"ass\">");
+ cprintf("<query xmlns=\"jabber:iq:roster\">");
cptr = CtdlGetContextArray(&nContexts);
if (cptr) {
for (i=0; i<nContexts; i++) {
int supported_namespace = 0;
int roster_query = 0;
char xmlbuf[256];
+ int reply_must_be_from_my_jid = 0;
/* We need to know before we begin the response whether this is a supported namespace, so
* unfortunately all supported namespaces need to be defined here *and* down below where
* Beginning of query result.
*/
- char dom[1024]; // Pidgin is very picky about where this
- safestrncpy(dom, XMPP->client_jid, sizeof(dom)); // result stanza is "from" - it wants the
- if (IsEmptyStr(dom)) { // same domain that the user's jid is in.
- safestrncpy(dom, XMPP->server_name, sizeof(dom));
+ if (!strcasecmp(query_xmlns, "jabber:iq:roster:query")) {
+ reply_must_be_from_my_jid = 1;
}
- char *at = strrchr(dom, '@');
- if (at) {
- strcpy(dom, ++at);
+
+ char dom[1024]; // client is expecting to see the reply
+ if (reply_must_be_from_my_jid) { // coming "from" the user's jid
+ safestrncpy(dom, XMPP->client_jid, sizeof(dom));
+ char *slash = strchr(dom, '/');
+ if (slash) {
+ *slash = 0;
+ }
}
- char *slash = strchr(dom, '/');
- if (slash) {
- *slash = 0;
+ else {
+ safestrncpy(dom, XMPP->client_jid, sizeof(dom)); // client is expecting to see the reply
+ if (IsEmptyStr(dom)) { // coming "from" the domain of the user's jid
+ safestrncpy(dom, XMPP->server_name, sizeof(dom));
+ }
+ char *at = strrchr(dom, '@');
+ if (at) {
+ strcpy(dom, ++at);
+ }
+ char *slash = strchr(dom, '/');
+ if (slash) {
+ *slash = 0;
+ }
}
if (supported_namespace) {