int StreamErrorTask::handleStanza(Stanza& stanza, StanzaHandlerResult& result) { // Stream error from server. Usually before stream closes // <stream:error> // <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/> // <text xml:lang='' xmlns='urn:ietf:params:xml:ns:xmpp-streams'>Replaced by new connection</text> // </stream:error> int ok = 1; if (stanza.getName() == "stream:error") { String sError; Apollo::XMLNode& text = stanza.getChildRef("text"); if (text) { sError = text.getCData(); } apLog_Info((LOG_CHANNEL, LOG_CONTEXT, "%s", _sz(sError))); result.stanzaHandled(1); result.stanzaConsumed(1); result.connectionFinished(1); } return ok; }
// ------------------------------------------------------------------- // <iq // from='*****@*****.**' // to='[email protected]/ApolloTest' // id='muc_ping_174059' // type='get' // > // <query xmlns='jabber:iq:version'/> // <x xmlns='halvar:ping' pingcount='3' stanzatime='2008-07-20T09:23:01.008488Z' idlesince='2008-07-20T09:14:10.509189Z'/> // </iq> int VersionTask::handleStanza(Stanza& stanza, StanzaHandlerResult& result) { int ok = 1; int AP_UNUSED_VARIABLE bUsed = 0; if (stanza.getName() == "iq") { Apollo::XMLNode& query = stanza.getChildRef("query"); if (query) { if (query.getAttribute("xmlns").getValue() == XMPP_NS_VERSION) { result.stanzaHandled(1); result.stanzaConsumed(1); ok = sendResponse(stanza); if (!ok) { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "sendResponse() failed")); } } } } return ok; }
int LoginTask::handleStanza(Stanza& stanza, StanzaHandlerResult& result) { int ok = 1; switch(nPhase_) { case StreamOpen: // <stream:stream xmlns:stream='http://etherx.jabber.org/streams' id='43956666' xmlns='jabber:client' from='user.virtual-presence.org'> if (stanza.getName() == "stream:stream") { result.stanzaHandled(1); result.stanzaConsumed(1); sStreamId_ = stanza.getAttribute("id").getValue(); if (sStreamId_.empty()) { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "<stream:stream> No stream ID")); nPhase_ = LoginFailed; result.connectionFinished(1); result.taskFinished(1); pClient_->onProtocolStartFailed(); } else { sendAuthMechQuery(); nPhase_ = AuthMechanisms; pClient_->onProtocolStart(); } } break; case AuthMechanisms: if (stanza.getName() == "iq") { // <iq id='1' type='result'><query xmlns='jabber:iq:auth'><username>lluna_484de02a54c5</username><digest/><password/><resource/></query></iq> if (sId_ == stanza.getAttribute("id").getValue()) { result.stanzaHandled(1); result.stanzaConsumed(1); String sType = stanza.getAttribute("type").getValue(); if (sType == "error") { String sError; int nError = 0; if (stanza.getError(nError, sError)) { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "jabber:iq:auth error result: %d %s", nError, _sz(sError))); } else { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "jabber:iq:auth unknown error result")); } nPhase_ = LoginFailed; result.connectionFinished(1); pClient_->onProtocolLoginFailed(); } else { Apollo::XMLNode& query = stanza.getChildRef("query"); Apollo::XMLNode& digest = query.getChildRef("digest"); Apollo::XMLNode& password = query.getChildRef("password"); AP_UNUSED_VARIABLE Apollo::XMLNode& resource = query.getChildRef("resource"); if (digest) { sendDigestAuth(); nPhase_ = DigestAuth; } else if (password) { sendPasswordAuth(); nPhase_ = PasswordAuth; } else { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "jabber:iq:auth result: neither digest nor password auth available")); nPhase_ = LoginFailed; result.connectionFinished(1); pClient_->onProtocolLoginFailed(); } } } } break; case DigestAuth: if (stanza.getName() == "iq") { // <iq id='2' type='result'/> if (sId_ == stanza.getAttribute("id").getValue()) { result.stanzaHandled(1); result.stanzaConsumed(1); result.taskFinished(1); String sType = stanza.getAttribute("type").getValue(); if (sType == "error") { String sError; int nError = 0; if (stanza.getError(nError, sError)) { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "DigestAuth error result: %d %s", nError, _sz(sError))); } else { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "DigestAuth unknown error result")); } nPhase_ = LoginFailed; result.connectionFinished(1); pClient_->onProtocolLoginFailed(); } else { apLog_Info((LOG_CHANNEL, LOG_CONTEXT, "Logged in")); nPhase_ = LoggedIn; pClient_->onProtocolLogin(); } } } break; case PasswordAuth: if (stanza.getName() == "iq") { // <iq id='2' type='result'/> if (sId_ == stanza.getAttribute("id").getValue()) { result.stanzaHandled(1); result.stanzaConsumed(1); result.taskFinished(1); String sType = stanza.getAttribute("type").getValue(); if (sType == "error") { String sError; int nError = 0; if (stanza.getError(nError, sError)) { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "PasswordAuth error result: %d %s", nError, _sz(sError))); } else { apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "PasswordAuth unknown error result")); } nPhase_ = LoginFailed; result.connectionFinished(1); pClient_->onProtocolLoginFailed(); } else { apLog_Info((LOG_CHANNEL, LOG_CONTEXT, "Logged in")); nPhase_ = LoggedIn; pClient_->onProtocolLogin(); } } } break; case LoginFailed: apLog_Warning((LOG_CHANNEL, LOG_CONTEXT, "Ignoring stanza after LoginFailed")); result.connectionFinished(1); break; default: apLog_Error((LOG_CHANNEL, LOG_CONTEXT, "Unknown phase")); result.connectionFinished(1); } return ok; }