From 66323700f5c7971a59161df46a5c34311f1906b1 2016-02-06 09:37:25 From: Jan Kaluza Date: 2016-02-06 09:37:25 Subject: [PATCH] Libtransport: Fix IQs forwarding in Raw XML mode + test it --- diff --git a/libtransport/NetworkPluginServer.cpp b/libtransport/NetworkPluginServer.cpp index 9bb280baf9f0227a84c3c746ab6a79021004e5b6..ab18b261ea4eeec80afa65579074c763126f1d2f 100644 --- a/libtransport/NetworkPluginServer.cpp +++ b/libtransport/NetworkPluginServer.cpp @@ -1080,24 +1080,24 @@ void NetworkPluginServer::handleElement(boost::shared_ptr elemen return; } - // TODO: FIX TO MAKE RAW XML BACKENDS WORKING AGAIN. -// boost::shared_ptr iq = boost::dynamic_pointer_cast(stanza); -// if (iq) { -// if (m_id2resource.find(stanza->getTo().toBare().toString() + stanza->getID()) != m_id2resource.end()) { -// iq->setTo(Swift::JID(iq->getTo().getNode(), iq->getTo().getDomain(), m_id2resource[stanza->getTo().toBare().toString() + stanza->getID()])); -// m_id2resource.erase(stanza->getTo().toBare().toString() + stanza->getID()); -// } -// else { -// Swift::Presence::ref highest = m_component->getPresenceOracle()->getHighestPriorityPresence(user->getJID()); -// if (highest) { -// iq->setTo(highest->getFrom()); -// } else { -// iq->setTo(user->getJID()); -// } -// } -// m_component->getFrontend()->sendIQ(iq); -// return; -// } + // TODO: Move m_id2resource in User and clean it up + boost::shared_ptr iq = boost::dynamic_pointer_cast(stanza); + if (iq) { + if (m_id2resource.find(stanza->getTo().toBare().toString() + stanza->getID()) != m_id2resource.end()) { + iq->setTo(Swift::JID(iq->getTo().getNode(), iq->getTo().getDomain(), m_id2resource[stanza->getTo().toBare().toString() + stanza->getID()])); + m_id2resource.erase(stanza->getTo().toBare().toString() + stanza->getID()); + } + else { + Swift::Presence::ref highest = m_component->getPresenceOracle()->getHighestPriorityPresence(user->getJID()); + if (highest) { + iq->setTo(highest->getFrom()); + } else { + iq->setTo(user->getJID()); + } + } + m_component->getFrontend()->sendIQ(iq); + return; + } } void NetworkPluginServer::handleRawXML(const std::string &xml) { diff --git a/spectrum/src/frontends/xmpp/XMPPFrontend.cpp b/spectrum/src/frontends/xmpp/XMPPFrontend.cpp index 0ee8faf71a99984f80d9a186795960ff5443d819..8bdefa1479461afc6ca35b7fbc47975298dd46bb 100644 --- a/spectrum/src/frontends/xmpp/XMPPFrontend.cpp +++ b/spectrum/src/frontends/xmpp/XMPPFrontend.cpp @@ -299,6 +299,7 @@ bool XMPPFrontend::handleIQ(boost::shared_ptr iq) { void XMPPFrontend::handleBackendConfigChanged() { if (!m_rawXML && CONFIG_BOOL_DEFAULTED(m_config, "features.rawxml", false)) { + LOG4CXX_INFO(logger, "Enabled Raw XML mode"); m_rawXML = true; m_iqRouter->addHandler(this); } diff --git a/tests/libtransport/networkpluginserver.cpp b/tests/libtransport/networkpluginserver.cpp index d9cd4f0f5c4ea896be114a78db56c49949646eb3..47d71dd2dc3d9847d87df5b7ee219a802a2722e5 100644 --- a/tests/libtransport/networkpluginserver.cpp +++ b/tests/libtransport/networkpluginserver.cpp @@ -44,6 +44,7 @@ class NetworkPluginServerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_TEST(handleConvMessageAckPayload); CPPUNIT_TEST(handleRawXML); CPPUNIT_TEST(handleRawXMLSplit); + CPPUNIT_TEST(handleRawXMLIQ); CPPUNIT_TEST(benchmarkHandleBuddyChangedPayload); CPPUNIT_TEST(benchmarkSendUnavailablePresence); @@ -51,12 +52,20 @@ class NetworkPluginServerTest : public CPPUNIT_NS :: TestFixture, public BasicTe public: NetworkPluginServer *serv; + NetworkPluginServer::Backend backend; + Swift::SafeByteArray protobufData; void setUp (void) { setMeUp(); serv = new NetworkPluginServer(component, cfg, userManager, NULL); connectUser(); + User *user = userManager->getUser("user@localhost"); + user->setData(&backend); + boost::shared_ptr client1 = factories->getConnectionFactory()->createConnection(); + dynamic_cast(client1.get())->onDataSent.connect(boost::bind(&NetworkPluginServerTest::handleDataSent, this, _1)); + backend.connection = client1; + received.clear(); } @@ -67,6 +76,10 @@ class NetworkPluginServerTest : public CPPUNIT_NS :: TestFixture, public BasicTe tearMeDown(); } + void handleDataSent(const Swift::SafeByteArray &data) { + protobufData = data; + } + void handleConvMessageAckPayload() { handleMessageHeadline(); received.clear(); @@ -311,6 +324,30 @@ class NetworkPluginServerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); CPPUNIT_ASSERT_EQUAL(std::string("buddy1\\40domain.tld@localhost/res"), dynamic_cast(getStanza(received[0]))->getFrom().toString()); } + + void handleRawXMLIQ() { + cfg->updateBackendConfig("[features]\nrawxml=1\n"); + User *user = userManager->getUser("user@localhost"); + std::vector grp; + grp.push_back("group1"); + LocalBuddy *buddy = new LocalBuddy(user->getRosterManager(), -1, "buddy1@domain.tld", "Buddy 1", grp, BUDDY_JID_ESCAPING); + user->getRosterManager()->setBuddy(buddy); + received.clear(); + + std::string xml = ""; + serv->handleRawXML(xml); + + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Get, dynamic_cast(getStanza(received[0]))->getType()); + + injectIQ(Swift::IQ::createResult(getStanza(received[0])->getFrom(), getStanza(received[0])->getTo(), getStanza(received[0])->getID())); + loop->processEvents(); + + pbnetwork::WrapperMessage wrapper; + wrapper.ParseFromArray(&protobufData[4], protobufData.size()); + CPPUNIT_ASSERT_EQUAL(pbnetwork::WrapperMessage_Type_TYPE_RAW_XML, wrapper.type()); + } }; CPPUNIT_TEST_SUITE_REGISTRATION (NetworkPluginServerTest);