diff options
| author | Remko Tronçon <git@el-tramo.be> | 2009-11-22 16:46:37 (GMT) |
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2009-11-22 16:54:51 (GMT) |
| commit | 497dd9b099e5810057ebcd8a3f6755819cfecdef (patch) | |
| tree | a65ecc29c3f86d2ed6b6050d4650708abceafa3d | |
| parent | d9ca66fa828e99ec5b4067d954c97d882b9ab8fe (diff) | |
| download | swift-497dd9b099e5810057ebcd8a3f6755819cfecdef.zip swift-497dd9b099e5810057ebcd8a3f6755819cfecdef.tar.bz2 | |
Added auth success value support.
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 1 | ||||
| -rw-r--r-- | Swiften/Client/Client.cpp | 3 | ||||
| -rw-r--r-- | Swiften/Client/ClientError.h | 1 | ||||
| -rw-r--r-- | Swiften/Client/ClientSession.cpp | 18 | ||||
| -rw-r--r-- | Swiften/Client/ClientSession.h | 1 | ||||
| -rw-r--r-- | Swiften/Elements/AuthSuccess.h | 12 | ||||
| -rw-r--r-- | Swiften/Parser/AuthSuccessParser.cpp | 24 | ||||
| -rw-r--r-- | Swiften/Parser/AuthSuccessParser.h | 16 | ||||
| -rw-r--r-- | Swiften/Parser/SConscript | 1 | ||||
| -rw-r--r-- | Swiften/SConscript | 1 | ||||
| -rw-r--r-- | Swiften/Serializer/AuthSuccessSerializer.cpp | 17 | ||||
| -rw-r--r-- | Swiften/Serializer/AuthSuccessSerializer.h | 13 |
12 files changed, 86 insertions, 22 deletions
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 2ae110b..f05d42d 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -276,12 +276,13 @@ void MainController::handleError(const ClientError& error) { case ClientError::DomainNameResolveError: message = "Unable to find server"; break; case ClientError::ConnectionError: message = "Error connecting to server"; break; case ClientError::ConnectionReadError: message = "Error while receiving server data"; break; case ClientError::ConnectionWriteError: message = "Error while sending data to the server"; break; case ClientError::XMLError: message = "Error parsing server data"; break; case ClientError::AuthenticationFailedError: message = "Login/password invalid"; break; + case ClientError::ServerVerificationFailedError: message = "Server verification failed"; break; case ClientError::NoSupportedAuthMechanismsError: message = "Authentication mechanisms not supported"; break; case ClientError::UnexpectedElementError: message = "Unexpected response"; break; case ClientError::ResourceBindError: message = "Error binding resource"; break; case ClientError::SessionStartError: message = "Error starting session"; break; case ClientError::TLSError: message = "Encryption error"; break; case ClientError::ClientCertificateLoadError: message = "Error loading certificate (Invalid password?)"; break; diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp index 2bd039a..874e23b 100644 --- a/Swiften/Client/Client.cpp +++ b/Swiften/Client/Client.cpp @@ -138,12 +138,15 @@ void Client::handleSessionFinished(boost::shared_ptr<Error> error) { ClientError clientError; if (boost::shared_ptr<ClientSession::Error> actualError = boost::dynamic_pointer_cast<ClientSession::Error>(error)) { switch(actualError->type) { case ClientSession::Error::AuthenticationFailedError: clientError = ClientError(ClientError::AuthenticationFailedError); break; + case ClientSession::Error::ServerVerificationFailedError: + clientError = ClientError(ClientError::ServerVerificationFailedError); + break; case ClientSession::Error::NoSupportedAuthMechanismsError: clientError = ClientError(ClientError::NoSupportedAuthMechanismsError); break; case ClientSession::Error::UnexpectedElementError: clientError = ClientError(ClientError::UnexpectedElementError); break; diff --git a/Swiften/Client/ClientError.h b/Swiften/Client/ClientError.h index d4f280c..55c57fc 100644 --- a/Swiften/Client/ClientError.h +++ b/Swiften/Client/ClientError.h @@ -8,12 +8,13 @@ namespace Swift { DomainNameResolveError, ConnectionError, ConnectionReadError, ConnectionWriteError, XMLError, AuthenticationFailedError, + ServerVerificationFailedError, NoSupportedAuthMechanismsError, UnexpectedElementError, ResourceBindError, SessionStartError, TLSError, ClientCertificateLoadError, diff --git a/Swiften/Client/ClientSession.cpp b/Swiften/Client/ClientSession.cpp index fb80754..960af70 100644 --- a/Swiften/Client/ClientSession.cpp +++ b/Swiften/Client/ClientSession.cpp @@ -127,20 +127,24 @@ void ClientSession::handleElement(boost::shared_ptr<Element> element) { stream->writeElement(boost::shared_ptr<AuthResponse>(new AuthResponse(authenticator->getResponse()))); } else { finishSession(Error::AuthenticationFailedError); } } - else if (dynamic_cast<AuthSuccess*>(element.get())) { - // TODO: Check success data with authenticator + else if (AuthSuccess* authSuccess = dynamic_cast<AuthSuccess*>(element.get())) { checkState(Authenticating); - state = WaitingForStreamStart; - delete authenticator; - authenticator = NULL; - stream->resetXMPPParser(); - sendStreamHeader(); + if (!authenticator->setChallenge(authSuccess->getValue())) { + finishSession(Error::ServerVerificationFailedError); + } + else { + state = WaitingForStreamStart; + delete authenticator; + authenticator = NULL; + stream->resetXMPPParser(); + sendStreamHeader(); + } } else if (dynamic_cast<AuthFailure*>(element.get())) { delete authenticator; authenticator = NULL; finishSession(Error::AuthenticationFailedError); } diff --git a/Swiften/Client/ClientSession.h b/Swiften/Client/ClientSession.h index f3bc119..5e5acbc 100644 --- a/Swiften/Client/ClientSession.h +++ b/Swiften/Client/ClientSession.h @@ -31,12 +31,13 @@ namespace Swift { Finished }; struct Error : public Swift::Error { enum Type { AuthenticationFailedError, + ServerVerificationFailedError, NoSupportedAuthMechanismsError, UnexpectedElementError, ResourceBindError, SessionStartError, TLSClientCertificateError, TLSError, diff --git a/Swiften/Elements/AuthSuccess.h b/Swiften/Elements/AuthSuccess.h index da4d798..1db1729 100644 --- a/Swiften/Elements/AuthSuccess.h +++ b/Swiften/Elements/AuthSuccess.h @@ -1,10 +1,22 @@ #pragma once #include "Swiften/Elements/Element.h" +#include "Swiften/Base/ByteArray.h" namespace Swift { class AuthSuccess : public Element { public: AuthSuccess() {} + + const ByteArray& getValue() const { + return value; + } + + void setValue(const ByteArray& value) { + this->value = value; + } + + private: + ByteArray value; }; } diff --git a/Swiften/Parser/AuthSuccessParser.cpp b/Swiften/Parser/AuthSuccessParser.cpp new file mode 100644 index 0000000..2dc2aa2 --- /dev/null +++ b/Swiften/Parser/AuthSuccessParser.cpp @@ -0,0 +1,24 @@ +#include "Swiften/Parser/AuthSuccessParser.h" +#include "Swiften/StringCodecs/Base64.h" + +namespace Swift { + +AuthSuccessParser::AuthSuccessParser() : GenericElementParser<AuthSuccess>(), depth(0) { +} + +void AuthSuccessParser::handleStartElement(const String&, const String&, const AttributeMap&) { + ++depth; +} + +void AuthSuccessParser::handleEndElement(const String&, const String&) { + --depth; + if (depth == 0) { + getElementGeneric()->setValue(Base64::decode(text)); + } +} + +void AuthSuccessParser::handleCharacterData(const String& text) { + this->text += text; +} + +} diff --git a/Swiften/Parser/AuthSuccessParser.h b/Swiften/Parser/AuthSuccessParser.h index bb6515d..5d987c5 100644 --- a/Swiften/Parser/AuthSuccessParser.h +++ b/Swiften/Parser/AuthSuccessParser.h @@ -1,14 +1,20 @@ -#ifndef SWIFTEN_AUTHSUCCESSPARSER_H -#define SWIFTEN_AUTHSUCCESSPARSER_H +#pragma once #include "Swiften/Parser/GenericElementParser.h" #include "Swiften/Elements/AuthSuccess.h" +#include "Swiften/Base/String.h" namespace Swift { class AuthSuccessParser : public GenericElementParser<AuthSuccess> { public: - AuthSuccessParser() : GenericElementParser<AuthSuccess>() {} + AuthSuccessParser(); + + 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; }; } - -#endif diff --git a/Swiften/Parser/SConscript b/Swiften/Parser/SConscript index d04712c..1e1dcd8 100644 --- a/Swiften/Parser/SConscript +++ b/Swiften/Parser/SConscript @@ -5,12 +5,13 @@ 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", + "AuthSuccessParser.cpp", "AuthResponseParser.cpp", "CompressParser.cpp", "ElementParser.cpp", "IQParser.cpp", "MessageParser.cpp", "PayloadParser.cpp", diff --git a/Swiften/SConscript b/Swiften/SConscript index 6189b2e..9742768 100644 --- a/Swiften/SConscript +++ b/Swiften/SConscript @@ -40,12 +40,13 @@ sources = [ "Queries/Responders/DiscoInfoResponder.cpp", "Queries/Responders/SoftwareVersionResponder.cpp", "Roster/ContactRosterItem.cpp", "Roster/Roster.cpp", "Roster/XMPPRoster.cpp", "Serializer/AuthRequestSerializer.cpp", + "Serializer/AuthSuccessSerializer.cpp", "Serializer/AuthChallengeSerializer.cpp", "Serializer/AuthResponseSerializer.cpp", "Serializer/CompressRequestSerializer.cpp", "Serializer/ElementSerializer.cpp", "Serializer/MessageSerializer.cpp", "Serializer/PayloadSerializer.cpp", diff --git a/Swiften/Serializer/AuthSuccessSerializer.cpp b/Swiften/Serializer/AuthSuccessSerializer.cpp new file mode 100644 index 0000000..6d7f195 --- /dev/null +++ b/Swiften/Serializer/AuthSuccessSerializer.cpp @@ -0,0 +1,17 @@ +#include "Swiften/Serializer/AuthSuccessSerializer.h" + +#include "Swiften/Elements/AuthSuccess.h" +#include "Swiften/StringCodecs/Base64.h" + +namespace Swift { + +AuthSuccessSerializer::AuthSuccessSerializer() { +} + +String AuthSuccessSerializer::serialize(boost::shared_ptr<Element> element) const { + boost::shared_ptr<AuthSuccess> authRequest(boost::dynamic_pointer_cast<AuthSuccess>(element)); + String value = (authRequest->getValue().isEmpty() ? "=" : Base64::encode(authRequest->getValue())); + return "<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" + value + "</challenge>"; +} + +} diff --git a/Swiften/Serializer/AuthSuccessSerializer.h b/Swiften/Serializer/AuthSuccessSerializer.h index 1fdc3ab..6ced772 100644 --- a/Swiften/Serializer/AuthSuccessSerializer.h +++ b/Swiften/Serializer/AuthSuccessSerializer.h @@ -1,22 +1,15 @@ -#ifndef SWIFTEN_AuthSuccessSerializer_H -#define SWIFTEN_AuthSuccessSerializer_H +#pragma once #include <boost/shared_ptr.hpp> #include "Swiften/Elements/AuthSuccess.h" #include "Swiften/Serializer/GenericElementSerializer.h" -#include "Swiften/Serializer/XML/XMLElement.h" namespace Swift { class AuthSuccessSerializer : public GenericElementSerializer<AuthSuccess> { public: - AuthSuccessSerializer() : GenericElementSerializer<AuthSuccess>() { - } + AuthSuccessSerializer(); - virtual String serialize(boost::shared_ptr<Element>) const { - return XMLElement("success", "urn:ietf:params:xml:ns:xmpp-sasl").serialize(); - } + virtual String serialize(boost::shared_ptr<Element> element) const; }; } - -#endif |
Swift