#include "support.h"
#include "config.h"
#include "user_ops.h"
-#include "policy.h"
#include "database.h"
#include "msgbase.h"
#include "internet_addressing.h"
}
}
- if (!strcasecmp(el, "username")) { /* NON SASL ONLY */
+ else if (!strcasecmp(el, "username")) { /* NON SASL ONLY */
if (XMPP->chardata_len > 0) {
safestrncpy(XMPP->iq_client_username, XMPP->chardata,
sizeof XMPP->iq_client_username);
}
}
- if (!strcasecmp(el, "password")) { /* NON SASL ONLY */
+ else if (!strcasecmp(el, "password")) { /* NON SASL ONLY */
if (XMPP->chardata_len > 0) {
safestrncpy(XMPP->iq_client_password, XMPP->chardata,
sizeof XMPP->iq_client_password);
}
/*
- * Unknown queries ... return the XML equivalent of a blank stare
+ * Unknown query ... return the XML equivalent of a blank stare
*/
else {
- CtdlLogPrintf(CTDL_DEBUG, "Unknown query; <service-unavailable/>\n");
+ CtdlLogPrintf(CTDL_DEBUG,
+ "Unknown query <%s> - returning <service-unavailable/>\n",
+ el
+ );
cprintf("<iq type=\"error\" id=\"%s\">", XMPP->iq_id);
cprintf("<error code=\"503\" type=\"cancel\">"
"<service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
else {
cprintf("<iq type=\"error\" id=\"%s\">", XMPP->iq_id);
- cprintf("<error></error>");
+ cprintf("<error>Don't know howto do '%s'!</error>", XMPP->iq_type);
cprintf("</iq>");
}
else if (!strcasecmp(el, "starttls")) {
#ifdef HAVE_OPENSSL
- cprintf("<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
- CtdlModuleStartCryptoMsgs(NULL, NULL, NULL);
- if (!CC->redirect_ssl) CC->kill_me = 1;
+ cprintf("<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
+ CtdlModuleStartCryptoMsgs(NULL, NULL, NULL);
+ if (!CC->redirect_ssl) CC->kill_me = 1;
#else
- cprintf("<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
- CC->kill_me = 1;
+ cprintf("<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
+ CC->kill_me = 1;
#endif
}
XMPP->ping_requested = 1;
}
+ else if (!strcasecmp(el, "stream")) {
+ CtdlLogPrintf(CTDL_DEBUG, "XMPP client shut down their stream\n");
+ xmpp_massacre_roster();
+ cprintf("</stream>\n");
+ CC->kill_me = 1;
+ }
+
+ else {
+ CtdlLogPrintf(CTDL_DEBUG, "Ignoring unknown tag <%s>\n", el);
+ }
+
XMPP->chardata_len = 0;
if (XMPP->chardata_alloc > 0) {
XMPP->chardata[0] = 0;
/*
* Main command loop for XMPP sessions.
+ * Right now we're reading one byte at a time and sending it to the XML parser.
+ * There's got to be a better way to do this.
*/
void xmpp_command_loop(void) {
- char cmdbuf[16];
+ char cmdbuf[2];
int retval;
time(&CC->lastcmd);
- memset(cmdbuf, 0, sizeof cmdbuf); /* Clear it, just in case */
+ memset(cmdbuf, 0, sizeof cmdbuf);
retval = client_read(cmdbuf, 1);
if (retval != 1) {
- CtdlLogPrintf(CTDL_ERR, "Client disconnected: ending session.\r\n");
+ CtdlLogPrintf(CTDL_ERR, "Client disconnected: ending session.\n");
CC->kill_me = 1;
return;
}
- /* FIXME ... this is woefully inefficient. */
-
XML_Parse(XMPP->xp, cmdbuf, 1, 0);
}
*/
void xmpp_login_hook(void) {
xmpp_queue_event(XMPP_EVT_LOGIN, CC->cs_inet_email);
+ xmpp_delete_old_buddies_who_no_longer_exist_from_the_client_roster();
}
xmpp_greeting,
xmpp_command_loop,
xmpp_async_loop,
- CitadelServiceXMPP);
+ CitadelServiceXMPP
+ );
CtdlRegisterSessionHook(xmpp_cleanup_function, EVT_STOP);
CtdlRegisterSessionHook(xmpp_login_hook, EVT_LOGIN);
CtdlRegisterSessionHook(xmpp_logout_hook, EVT_LOGOUT);