diff options
author | Remko Tronçon <git@el-tramo.be> | 2012-04-23 10:05:24 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2012-04-23 10:05:24 (GMT) |
commit | c5dc30ae9ad8b9f3b0209c8ba177f1ce170a6364 (patch) | |
tree | cc28fb37c1ea9e136a5d96764dfe7bc700b47621 | |
parent | d072dcd1ee143357c41e53ee94a4b6d13e48e2fc (diff) | |
download | swift-contrib-c5dc30ae9ad8b9f3b0209c8ba177f1ce170a6364.zip swift-contrib-c5dc30ae9ad8b9f3b0209c8ba177f1ce170a6364.tar.bz2 |
Work around incorrect roster responses from ejabberd.
Resolves: #1072
-rw-r--r-- | Swiften/Queries/Request.cpp | 6 | ||||
-rw-r--r-- | Swiften/Queries/UnitTest/RequestTest.cpp | 15 |
2 files changed, 21 insertions, 0 deletions
diff --git a/Swiften/Queries/Request.cpp b/Swiften/Queries/Request.cpp index f3f56c9..422f36c 100644 --- a/Swiften/Queries/Request.cpp +++ b/Swiften/Queries/Request.cpp @@ -1,18 +1,19 @@ /* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include <Swiften/Queries/Request.h> #include <Swiften/Queries/IQRouter.h> #include <Swiften/Elements/RawXMLPayload.h> +#include <Swiften/Base/Log.h> namespace Swift { Request::Request(IQ::Type type, const JID& receiver, boost::shared_ptr<Payload> payload, IQRouter* router) : router_(router), type_(type), receiver_(receiver), payload_(payload), sent_(false) { } Request::Request(IQ::Type type, const JID& receiver, IQRouter* router) : router_(router), type_(type), receiver_(receiver), sent_(false) { } @@ -69,18 +70,23 @@ bool Request::handleIQ(boost::shared_ptr<IQ> iq) { handled = true; } } } return handled; } bool Request::isCorrectSender(const JID& jid) { if (router_->isAccountJID(receiver_)) { + if (jid.isValid() && jid.equals(router_->getJID(), JID::WithResource)) { + // This unspecified behavior seems to happen in ejabberd versions (e.g. 2.0.5) + SWIFT_LOG(warning) << "Server responded to an account request with a full JID, which is not allowed. Handling it anyway."; + return true; + } return router_->isAccountJID(jid); } else { return jid.equals(receiver_, JID::WithResource); } } } diff --git a/Swiften/Queries/UnitTest/RequestTest.cpp b/Swiften/Queries/UnitTest/RequestTest.cpp index cf9b381..6c2a805 100644 --- a/Swiften/Queries/UnitTest/RequestTest.cpp +++ b/Swiften/Queries/UnitTest/RequestTest.cpp @@ -31,18 +31,19 @@ class RequestTest : public CppUnit::TestFixture { CPPUNIT_TEST(testHandleIQ_RawXMLPayload); CPPUNIT_TEST(testHandleIQ_GetWithSameID); CPPUNIT_TEST(testHandleIQ_SetWithSameID); CPPUNIT_TEST(testHandleIQ_IncorrectSender); CPPUNIT_TEST(testHandleIQ_IncorrectSenderForServerQuery); CPPUNIT_TEST(testHandleIQ_IncorrectOtherResourceSenderForServerQuery); CPPUNIT_TEST(testHandleIQ_ServerRespondsWithDomain); CPPUNIT_TEST(testHandleIQ_ServerRespondsWithBareJID); CPPUNIT_TEST(testHandleIQ_ServerRespondsWithoutFrom); + CPPUNIT_TEST(testHandleIQ_ServerRespondsWithFullJID); CPPUNIT_TEST_SUITE_END(); public: class MyPayload : public Payload { public: MyPayload(const std::string& s = "") : text_(s) {} std::string text_; }; @@ -277,18 +278,32 @@ class RequestTest : public CppUnit::TestFixture { testling.send(); channel_->onIQReceived(createResponse(JID("alice@wonderland.lit"),"test-id")); CPPUNIT_ASSERT_EQUAL(1, responsesReceived_); CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(receivedErrors.size())); CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(channel_->iqs_.size())); } + // This tests a bug in ejabberd servers (2.0.5) + void testHandleIQ_ServerRespondsWithFullJID() { + MyRequest testling(IQ::Get, JID(), payload_, router_); + router_->setJID("alice@wonderland.lit/TeaParty"); + testling.onResponse.connect(boost::bind(&RequestTest::handleResponse, this, _1, _2)); + testling.send(); + + channel_->onIQReceived(createResponse(JID("alice@wonderland.lit/TeaParty"),"test-id")); + + CPPUNIT_ASSERT_EQUAL(1, responsesReceived_); + CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(receivedErrors.size())); + CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(channel_->iqs_.size())); + } + void testHandleIQ_ServerRespondsWithoutFrom() { MyRequest testling(IQ::Get, JID(), payload_, router_); router_->setJID("alice@wonderland.lit/TeaParty"); testling.onResponse.connect(boost::bind(&RequestTest::handleResponse, this, _1, _2)); testling.send(); channel_->onIQReceived(createResponse(JID(),"test-id")); CPPUNIT_ASSERT_EQUAL(1, responsesReceived_); |