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.
*/
+
+ if (!strcasecmp(query_xmlns, "jabber:iq:roster:query")) {
+ reply_must_be_from_my_jid = 1;
+ }
+
+ 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;
+ }
+ }
+ 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) {
- cprintf("<iq type=\"result\" from=\"%s\" ", xmlesc(xmlbuf, XMPP->server_name, sizeof xmlbuf) );
+ cprintf("<iq type=\"result\" from=\"%s\" ", xmlesc(xmlbuf, dom, sizeof xmlbuf) );
}
else {
- cprintf("<iq type=\"error\" from=\"%s\" ", xmlesc(xmlbuf, XMPP->server_name, sizeof xmlbuf) );
+ cprintf("<iq type=\"error\" from=\"%s\" ", xmlesc(xmlbuf, dom, sizeof xmlbuf) );
}
if (!IsEmptyStr(iq_from)) {
cprintf("to=\"%s\" ", xmlesc(xmlbuf, iq_from, sizeof xmlbuf));