diff options
Diffstat (limited to 'Swiften/Parser')
| -rw-r--r-- | Swiften/Parser/AuthChallengeParser.cpp | 24 | ||||
| -rw-r--r-- | Swiften/Parser/AuthChallengeParser.h | 20 | ||||
| -rw-r--r-- | Swiften/Parser/AuthResponseParser.cpp | 24 | ||||
| -rw-r--r-- | Swiften/Parser/AuthResponseParser.h | 20 | ||||
| -rw-r--r-- | Swiften/Parser/SConscript | 2 | ||||
| -rw-r--r-- | Swiften/Parser/XMPPParser.cpp | 8 |
6 files changed, 98 insertions, 0 deletions
diff --git a/Swiften/Parser/AuthChallengeParser.cpp b/Swiften/Parser/AuthChallengeParser.cpp new file mode 100644 index 0000000..c83cf7d --- /dev/null +++ b/Swiften/Parser/AuthChallengeParser.cpp @@ -0,0 +1,24 @@ +#include "Swiften/Parser/AuthChallengeParser.h" +#include "Swiften/StringCodecs/Base64.h" + +namespace Swift { + +AuthChallengeParser::AuthChallengeParser() : GenericElementParser<AuthChallenge>(), depth(0) { +} + +void AuthChallengeParser::handleStartElement(const String&, const String&, const AttributeMap&) { + ++depth; +} + +void AuthChallengeParser::handleEndElement(const String&, const String&) { + --depth; + if (depth == 0) { + getElementGeneric()->setValue(Base64::decode(text)); + } +} + +void AuthChallengeParser::handleCharacterData(const String& text) { + this->text += text; +} + +} diff --git a/Swiften/Parser/AuthChallengeParser.h b/Swiften/Parser/AuthChallengeParser.h new file mode 100644 index 0000000..be44b96 --- /dev/null +++ b/Swiften/Parser/AuthChallengeParser.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Swiften/Parser/GenericElementParser.h" +#include "Swiften/Elements/AuthChallenge.h" +#include "Swiften/Base/String.h" + +namespace Swift { + class AuthChallengeParser : public GenericElementParser<AuthChallenge> { + public: + AuthChallengeParser(); + + virtual void handleStartElement(const String&, const String& ns, const AttributeMap&); + virtual void handleEndElement(const String&, const String& ns); + virtual void handleCharacterData(const String&); + + private: + int depth; + String text; + }; +} diff --git a/Swiften/Parser/AuthResponseParser.cpp b/Swiften/Parser/AuthResponseParser.cpp new file mode 100644 index 0000000..b5976a5 --- /dev/null +++ b/Swiften/Parser/AuthResponseParser.cpp @@ -0,0 +1,24 @@ +#include "Swiften/Parser/AuthResponseParser.h" +#include "Swiften/StringCodecs/Base64.h" + +namespace Swift { + +AuthResponseParser::AuthResponseParser() : GenericElementParser<AuthResponse>(), depth(0) { +} + +void AuthResponseParser::handleStartElement(const String&, const String&, const AttributeMap&) { + ++depth; +} + +void AuthResponseParser::handleEndElement(const String&, const String&) { + --depth; + if (depth == 0) { + getElementGeneric()->setValue(Base64::decode(text)); + } +} + +void AuthResponseParser::handleCharacterData(const String& text) { + this->text += text; +} + +} diff --git a/Swiften/Parser/AuthResponseParser.h b/Swiften/Parser/AuthResponseParser.h new file mode 100644 index 0000000..f2b3a9e --- /dev/null +++ b/Swiften/Parser/AuthResponseParser.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Swiften/Parser/GenericElementParser.h" +#include "Swiften/Elements/AuthResponse.h" +#include "Swiften/Base/String.h" + +namespace Swift { + class AuthResponseParser : public GenericElementParser<AuthResponse> { + public: + AuthResponseParser(); + + virtual void handleStartElement(const String&, const String& ns, const AttributeMap&); + virtual void handleEndElement(const String&, const String& ns); + virtual void handleCharacterData(const String&); + + private: + int depth; + String text; + }; +} diff --git a/Swiften/Parser/SConscript b/Swiften/Parser/SConscript index 3330775..d04712c 100644 --- a/Swiften/Parser/SConscript +++ b/Swiften/Parser/SConscript @@ -1,54 +1,56 @@ Import("swiften_env") myenv = swiften_env.Clone() myenv.MergeFlags(swiften_env["BOOST_FLAGS"]) myenv.MergeFlags(swiften_env.get("LIBXML_FLAGS", "")) myenv.MergeFlags(swiften_env.get("EXPAT_FLAGS", "")) sources = [ "AuthRequestParser.cpp", + "AuthChallengeParser.cpp", + "AuthResponseParser.cpp", "CompressParser.cpp", "ElementParser.cpp", "IQParser.cpp", "MessageParser.cpp", "PayloadParser.cpp", "PayloadParserFactory.cpp", "PayloadParserFactoryCollection.cpp", "PayloadParsers/BodyParser.cpp", "PayloadParsers/DiscoInfoParser.cpp", "PayloadParsers/ErrorParser.cpp", "PayloadParsers/FullPayloadParserFactoryCollection.cpp", "PayloadParsers/PriorityParser.cpp", "PayloadParsers/PrivateStorageParser.cpp", "PayloadParsers/RawXMLPayloadParser.cpp", "PayloadParsers/ResourceBindParser.cpp", "PayloadParsers/RosterParser.cpp", "PayloadParsers/SecurityLabelParser.cpp", "PayloadParsers/SecurityLabelsCatalogParser.cpp", "PayloadParsers/SoftwareVersionParser.cpp", "PayloadParsers/StorageParser.cpp", "PayloadParsers/StatusParser.cpp", "PayloadParsers/StatusShowParser.cpp", "PayloadParsers/VCardParser.cpp", "PayloadParsers/VCardUpdateParser.cpp", "PlatformXMLParserFactory.cpp", "PresenceParser.cpp", "SerializingParser.cpp", "StanzaParser.cpp", "StreamFeaturesParser.cpp", "XMLParser.cpp", "XMLParserClient.cpp", "XMLParserFactory.cpp", "XMPPParser.cpp", "XMPPParserClient.cpp", ] if myenv.get("HAVE_EXPAT", 0) : myenv.Append(CPPDEFINES = "HAVE_EXPAT") sources += ["ExpatParser.cpp"] if myenv.get("HAVE_LIBXML", 0) : myenv.Append(CPPDEFINES = "HAVE_LIBXML") sources += ["LibXMLParser.cpp"] objects = myenv.StaticObject(sources) swiften_env.Append(SWIFTEN_OBJECTS = [objects]) diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp index f97bed8..83de263 100644 --- a/Swiften/Parser/XMPPParser.cpp +++ b/Swiften/Parser/XMPPParser.cpp @@ -1,67 +1,69 @@ #include "Swiften/Parser/XMPPParser.h" #include <iostream> #include <cassert> #include "Swiften/Elements/ProtocolHeader.h" #include "Swiften/Base/String.h" #include "Swiften/Parser/XMLParser.h" #include "Swiften/Parser/PlatformXMLParserFactory.h" #include "Swiften/Parser/XMPPParserClient.h" #include "Swiften/Parser/XMPPParser.h" #include "Swiften/Parser/ElementParser.h" #include "Swiften/Parser/PresenceParser.h" #include "Swiften/Parser/IQParser.h" #include "Swiften/Parser/MessageParser.h" #include "Swiften/Parser/StreamFeaturesParser.h" #include "Swiften/Parser/AuthRequestParser.h" #include "Swiften/Parser/AuthSuccessParser.h" #include "Swiften/Parser/AuthFailureParser.h" +#include "Swiften/Parser/AuthChallengeParser.h" +#include "Swiften/Parser/AuthResponseParser.h" #include "Swiften/Parser/StartTLSParser.h" #include "Swiften/Parser/StartTLSFailureParser.h" #include "Swiften/Parser/CompressParser.h" #include "Swiften/Parser/CompressFailureParser.h" #include "Swiften/Parser/CompressedParser.h" #include "Swiften/Parser/UnknownElementParser.h" #include "Swiften/Parser/TLSProceedParser.h" // TODO: Whenever an error occurs in the handlers, stop the parser by returing // a bool value, and stopping the XML parser namespace Swift { XMPPParser::XMPPParser( XMPPParserClient* client, PayloadParserFactoryCollection* payloadParserFactories) : xmlParser_(0), client_(client), payloadParserFactories_(payloadParserFactories), currentDepth_(0), currentElementParser_(0), parseErrorOccurred_(false) { xmlParser_ = PlatformXMLParserFactory().createXMLParser(this); } XMPPParser::~XMPPParser() { delete currentElementParser_; delete xmlParser_; } bool XMPPParser::parse(const String& data) { bool xmlParseResult = xmlParser_->parse(data); return xmlParseResult && !parseErrorOccurred_; } void XMPPParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) { if (!inStream()) { if (element == "stream" && ns == "http://etherx.jabber.org/streams") { ProtocolHeader header; header.setFrom(attributes.getAttribute("from")); header.setTo(attributes.getAttribute("to")); header.setID(attributes.getAttribute("id")); header.setVersion(attributes.getAttribute("version")); client_->handleStreamStart(header); } else { parseErrorOccurred_ = true; } @@ -82,70 +84,76 @@ void XMPPParser::handleEndElement(const String& element, const String& ns) { if (inElement()) { assert(currentElementParser_); currentElementParser_->handleEndElement(element, ns); --currentDepth_; if (!inElement()) { client_->handleElement(currentElementParser_->getElement()); delete currentElementParser_; currentElementParser_ = 0; } } else { assert(element == "stream"); --currentDepth_; client_->handleStreamEnd(); } } void XMPPParser::handleCharacterData(const String& data) { if (currentElementParser_) { currentElementParser_->handleCharacterData(data); } //else { // std::cerr << "XMPPParser: Ignoring stray character data: " << data << std::endl; //} } ElementParser* XMPPParser::createElementParser(const String& element, const String& ns) { if (element == "presence") { return new PresenceParser(payloadParserFactories_); } else if (element == "iq") { return new IQParser(payloadParserFactories_); } else if (element == "message") { return new MessageParser(payloadParserFactories_); } else if (element == "features" && ns == "http://etherx.jabber.org/streams") { return new StreamFeaturesParser(); } else if (element == "auth") { return new AuthRequestParser(); } else if (element == "success") { return new AuthSuccessParser(); } else if (element == "failure" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") { return new AuthFailureParser(); } + else if (element == "challenge" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") { + return new AuthChallengeParser(); + } + else if (element == "response" && ns == "urn:ietf:params:xml:ns:xmpp-sasl") { + return new AuthResponseParser(); + } else if (element == "starttls") { return new StartTLSParser(); } else if (element == "failure" && ns == "urn:ietf:params:xml:ns:xmpp-tls") { return new StartTLSFailureParser(); } else if (element == "compress") { return new CompressParser(); } else if (element == "compressed") { return new CompressedParser(); } else if (element == "failure" && ns == "http://jabber.org/protocol/compress") { return new CompressFailureParser(); } else if (element == "proceed") { return new TLSProceedParser(); } return new UnknownElementParser(); } } |
Swift