void MessageCarbons::stanzaRequestResult(const Jid &AStreamJid, const Stanza &AStanza) { if (AStanza.type() == "result") { if (FEnableRequests.contains(AStanza.id())) { LogDetaile(QString("[MessageCarbons] Message Carbons enabled for '%1'").arg(AStreamJid.full())); FEnabled[AStreamJid] = true; emit enableChanged(AStreamJid,true); } else if(FDisableRequests.contains(AStanza.id())) { LogDetaile(QString("[MessageCarbons] Message Carbons disabled for '%1'").arg(AStreamJid.full())); FEnabled[AStreamJid] = false; emit enableChanged(AStreamJid,false); } } else { ErrorHandler err(AStanza.element()); LogError(QString("[MessageCarbons] Failed to change Message Carbons state for '%1': %2").arg(AStreamJid.full(),err.message())); emit errorReceived(AStreamJid,err.condition(),err.message()); } FEnableRequests.removeAll(AStanza.id()); FDisableRequests.removeAll(AStanza.id()); }
bool SASLBind::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder) { if (AXmppStream==FXmppStream && AOrder==XSHO_XMPP_FEATURE && AStanza.id()=="bind") { FXmppStream->removeXmppStanzaHandler(this, XSHO_XMPP_FEATURE); if (AStanza.type() == "result") { Jid streamJid = AStanza.firstElement().firstChild().toElement().text(); if (streamJid.isValid()) { LogDetaile(QString("[SASLBind][%1] XMPP session binded with resource='%2'").arg(FXmppStream->streamJid().bare()).arg(streamJid.resource())); deleteLater(); FXmppStream->setStreamJid(streamJid); emit finished(false); } else { LogError(QString("[SASLBind][%1] Invalid XMPP stream JID in response").arg(FXmppStream->streamJid().bare())); emit error(tr("Invalid XMPP stream JID in SASL bind response")); } } else { ErrorHandler err(AStanza.element()); LogError(QString("[SASLBind] Failed to bind XMPP session: %1").arg(err.message())); emit error(err.message()); } return true; } return false; }
void ClientStream::write(const Stanza &s) { if(d->state == Active) { d->client.sendStanza(s.element()); processNext(); } }
void LinkLocal::Stream::ready() { while(!waiting.isEmpty()) { inUse = true; Stanza s = waiting.first(); proto->sendStanza(s.element()); processNext(); waiting.removeFirst(); } }
void LinkLocal::Stream::write(const Stanza &s) { inUse = true; if(state == Active && !waiting.isEmpty()) { proto->sendStanza(s.element()); processNext(); } else { waiting.append(s); } }
bool Roster::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder) { if (!FVerSupported && !isOpen() && FXmppStream==AXmppStream && AOrder==XSHO_XMPP_FEATURE) { if (AStanza.element().nodeName()=="stream:features" && !AStanza.firstElement("ver",NS_FEATURE_ROSTER_VER).isNull()) { FVerSupported = true; LOG_STRM_INFO(streamJid(),"Roster versioning is supported by server"); } } return false; }
void Client::streamReadyRead() { // HACK HACK HACK QGuardedPtr<ClientStream> pstream = d->stream; while(pstream && d->stream->stanzaAvailable()) { Stanza s = d->stream->read(); QString out = s.toString(); debug(QString("Client: incoming: [\n%1]\n").arg(out)); xmlIncoming(out); QDomElement x = oldStyleNS(s.element()); distribute(x); } }
bool XmppStream::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder) { if (AXmppStream == this && AOrder == XSHO_XMPP_STREAM) { if (FStreamState==SS_INITIALIZE && AStanza.element().nodeName()=="stream:stream") { LogDetail(QString("[XmppStream][%1] XMPP stream initialized").arg(FStreamJid.bare())); FStreamId = AStanza.id(); FStreamState = SS_FEATURES; if (VersionParser(AStanza.element().attribute("version","0.0")) < VersionParser(1,0)) { Stanza stanza("stream:features"); stanza.addElement("register",NS_FEATURE_REGISTER); stanza.addElement("auth",NS_FEATURE_IQAUTH); xmppStanzaIn(AXmppStream, stanza, AOrder); } return true; } else if (FStreamState==SS_FEATURES && AStanza.element().nodeName()=="stream:features") { LogDetail(QString("[XmppStream][%1] Processing XMPP stream features").arg(FStreamJid.bare())); FServerFeatures = AStanza.element().cloneNode(true).toElement(); FAvailFeatures = FXmppStreams->xmppFeaturesOrdered(); processFeatures(); return true; } else if (AStanza.element().nodeName() == "stream:error") { ErrorHandler err(AStanza.element(),NS_XMPP_STREAMS); LogError(QString("[XmppStream][%1] XMPP stream error received: %2").arg(FStreamJid.bare(),err.message())); abort(err.message()); return true; } } return false; }
Message2::Message2(const Stanza& AStanza) : FStanza(new Stanza(AStanza.element().cloneNode().toElement())) { }
bool Presence::stanzaReadWrite(int AHandlerId, const Jid &AStreamJid, Stanza &AStanza, bool &AAccept) { if (AHandlerId == FSHIPresence) { int show; int priority; QString status; QString errCond; if (AStanza.type().isEmpty()) { QString showText = AStanza.firstElement("show").text(); if (showText.isEmpty()) show = Online; else if (showText == "chat") show = Chat; else if (showText == "away") show = Away; else if (showText == "dnd") show = DoNotDisturb; else if (showText == "xa") show = ExtendedAway; else show = Online; //Костыль под кривые клиенты и транспорты status = AStanza.firstElement("status").text(); priority = AStanza.firstElement("priority").text().toInt(); } else if (AStanza.type() == "unavailable") { show = Offline; status = AStanza.firstElement("status").text(); priority = 0; } else if (AStanza.type() == "error") { ErrorHandler err(AStanza.element()); show = Error; status = err.message(); errCond = err.condition(); priority = 0; } else return false; if (AStreamJid != AStanza.from()) { Jid fromJid = AStanza.from(); IPresenceItem &pitem = FItems[fromJid]; IPresenceItem before = pitem; pitem.isValid = true; pitem.itemJid = fromJid; pitem.show = show; pitem.priority = priority; pitem.status = status; pitem.errCondition = errCond; if (pitem != before) emit itemReceived(pitem, before); if (show == Offline) FItems.remove(fromJid); } else if (show!=IPresence::Offline && (FShow != show || FStatus != status || FPriority != priority)) { LogDetaile(QString("[Presence][%1] Self presence changed by server, show=%2, status='%3'").arg(streamJid().bare()).arg(show).arg(status)); FShow = show; FStatus = status; FPriority = priority; FErrCondition = errCond; emit changed(show,status,priority); } AAccept = true; } return false; }
bool ConsoleWidget::xmppStanzaOut(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder) { if (AOrder == XSHO_CONSOLE) showElement(AXmppStream,AStanza.element(),true); return false; }
bool SASLAuthFeature::xmppStanzaIn(IXmppStream *AXmppStream, Stanza &AStanza, int AOrder) { if (AXmppStream==FXmppStream && AOrder==XSHO_XMPP_FEATURE) { if (AStanza.kind() == "challenge") { QByteArray challengeData = QByteArray::fromBase64(AStanza.element().text().toLatin1()); LOG_STRM_DEBUG(FXmppStream->streamJid(),QString("SASL auth challenge received: %1").arg(QString::fromUtf8(challengeData))); QMap<QByteArray, QByteArray> responseMap; QMap<QByteArray, QByteArray> challengeMap = parseChallenge(challengeData); if (challengeMap.value("qop") == "auth") { QByteArray randBytes(32,' '); for (int i=0; i<randBytes.size(); i++) randBytes[i] = (char) (256.0 * qrand() / (RAND_MAX + 1.0)); responseMap["cnonce"] = randBytes.toHex(); if (challengeMap.contains("realm")) responseMap["realm"] = challengeMap.value("realm"); else responseMap["realm"] = FXmppStream->streamJid().pDomain().toUtf8(); responseMap["username"] = FXmppStream->streamJid().pNode().toUtf8(); responseMap["nonce"] = challengeMap.value("nonce"); responseMap["nc"] = "00000001"; responseMap["qop"] = "auth"; responseMap["digest-uri"] = QString("xmpp/%1").arg(FXmppStream->streamJid().pDomain()).toUtf8(); responseMap["charset"] = "utf-8"; responseMap["response"] = getResponseValue(responseMap,FXmppStream->password()); } QByteArray responseData = serializeResponse(responseMap); Stanza response("response",NS_FEATURE_SASL); response.element().appendChild(response.createTextNode(responseData.toBase64())); FXmppStream->sendStanza(response); LOG_STRM_DEBUG(FXmppStream->streamJid(),QString("SASL auth response sent: %1").arg(QString::fromUtf8(responseData))); } else { FXmppStream->removeXmppStanzaHandler(XSHO_XMPP_FEATURE,this); if (AStanza.kind() == "success") { LOG_STRM_INFO(FXmppStream->streamJid(),"Authorization successes"); deleteLater(); emit finished(true); } else if (AStanza.kind() == "failure") { XmppSaslError err(AStanza.element()); LOG_STRM_WARNING(FXmppStream->streamJid(),QString("Authorization failed: %1").arg(err.condition())); emit error(err); } else { XmppError err(IERR_SASL_AUTH_INVALID_RESPONSE); LOG_STRM_WARNING(FXmppStream->streamJid(),QString("Authorization error: Invalid stanza kind=%1").arg(AStanza.kind())); emit error(err); } } return true; } return false; }