From 53e476d1c202119ddc87102208103675e47f9e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Thu, 9 Dec 2010 22:45:53 +0100 Subject: Handle stream errors in client session. diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 878ed9b..018948b 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -423,6 +423,7 @@ void MainController::handleDisconnected(const boost::optional& erro 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::StreamError: message = "Stream error"; break; case ClientError::TLSError: message = "Encryption error"; break; case ClientError::ClientCertificateLoadError: message = "Error loading certificate (Invalid password?)"; break; case ClientError::ClientCertificateError: message = "Certificate not authorized"; break; diff --git a/Swiften/Client/ClientError.h b/Swiften/Client/ClientError.h index 7ba0322..baf1b0a 100644 --- a/Swiften/Client/ClientError.h +++ b/Swiften/Client/ClientError.h @@ -23,6 +23,7 @@ namespace Swift { UnexpectedElementError, ResourceBindError, SessionStartError, + StreamError, TLSError, ClientCertificateLoadError, ClientCertificateError, diff --git a/Swiften/Client/ClientSession.cpp b/Swiften/Client/ClientSession.cpp index 13816d3..a7f39b6 100644 --- a/Swiften/Client/ClientSession.cpp +++ b/Swiften/Client/ClientSession.cpp @@ -13,6 +13,7 @@ #include "Swiften/Elements/ProtocolHeader.h" #include "Swiften/Elements/StreamFeatures.h" +#include "Swiften/Elements/StreamError.h" #include "Swiften/Elements/StartTLSRequest.h" #include "Swiften/Elements/StartTLSFailure.h" #include "Swiften/Elements/TLSProceed.h" @@ -151,6 +152,9 @@ void ClientSession::handleElement(boost::shared_ptr element) { std::cerr << "Warning: Ignoring ack" << std::endl; } } + else if (StreamError::ref streamError = boost::dynamic_pointer_cast(element)) { + finishSession(Error::StreamError); + } else if (getState() == Initialized) { boost::shared_ptr stanza = boost::dynamic_pointer_cast(element); if (stanza) { diff --git a/Swiften/Client/ClientSession.h b/Swiften/Client/ClientSession.h index 20573a0..170491f 100644 --- a/Swiften/Client/ClientSession.h +++ b/Swiften/Client/ClientSession.h @@ -51,6 +51,7 @@ namespace Swift { SessionStartError, TLSClientCertificateError, TLSError, + StreamError, } type; Error(Type type) : type(type) {} }; diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp index c4e5225..ed9302d 100644 --- a/Swiften/Client/CoreClient.cpp +++ b/Swiften/Client/CoreClient.cpp @@ -152,6 +152,9 @@ void CoreClient::handleSessionFinished(boost::shared_ptr error) { case ClientSession::Error::TLSClientCertificateError: clientError = ClientError(ClientError::ClientCertificateError); break; + case ClientSession::Error::StreamError: + clientError = ClientError(ClientError::StreamError); + break; } } else if (boost::shared_ptr actualError = boost::dynamic_pointer_cast(error)) { diff --git a/Swiften/Client/UnitTest/ClientSessionTest.cpp b/Swiften/Client/UnitTest/ClientSessionTest.cpp index 74f3376..dbed9aa 100644 --- a/Swiften/Client/UnitTest/ClientSessionTest.cpp +++ b/Swiften/Client/UnitTest/ClientSessionTest.cpp @@ -9,11 +9,13 @@ #include #include #include +#include #include "Swiften/Session/SessionStream.h" #include "Swiften/Client/ClientSession.h" #include "Swiften/Elements/StartTLSRequest.h" #include "Swiften/Elements/StreamFeatures.h" +#include "Swiften/Elements/StreamError.h" #include "Swiften/Elements/TLSProceed.h" #include "Swiften/Elements/StartTLSFailure.h" #include "Swiften/Elements/AuthRequest.h" @@ -32,6 +34,7 @@ using namespace Swift; class ClientSessionTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ClientSessionTest); CPPUNIT_TEST(testStart_Error); + CPPUNIT_TEST(testStart_StreamError); CPPUNIT_TEST(testStartTLS); CPPUNIT_TEST(testStartTLS_ServerError); CPPUNIT_TEST(testStartTLS_ConnectError); @@ -77,6 +80,17 @@ class ClientSessionTest : public CppUnit::TestFixture { CPPUNIT_ASSERT(sessionFinishedError); } + void testStart_StreamError() { + boost::shared_ptr session(createSession()); + session->start(); + server->sendStreamStart(); + server->sendStreamError(); + + CPPUNIT_ASSERT_EQUAL(ClientSession::Finished, session->getState()); + CPPUNIT_ASSERT(sessionFinishedReceived); + CPPUNIT_ASSERT(sessionFinishedError); + } + void testStartTLS() { boost::shared_ptr session(createSession()); session->setCertificateTrustChecker(blindCertificateTrustChecker); @@ -351,6 +365,10 @@ class ClientSessionTest : public CppUnit::TestFixture { onElementReceived(streamFeatures); } + void sendStreamError() { + onElementReceived(boost::make_shared()); + } + void sendTLSProceed() { onElementReceived(boost::shared_ptr(new TLSProceed())); } -- cgit v0.10.2-6-g49f6