diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index 9c0be47d..6bc496c1 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -74,6 +74,10 @@ bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& Swift::RosterItemPayload item = payload->getItems()[0]; + if (item.getJID().getNode().empty()) { + return true; + } + Buddy *buddy = user->getRosterManager()->getBuddy(Buddy::JIDToLegacyName(item.getJID())); if (buddy) { if (item.getSubscription() == Swift::RosterItemPayload::Remove) { diff --git a/src/tests/rosterresponder.cpp b/src/tests/rosterresponder.cpp new file mode 100644 index 00000000..2c6cf86a --- /dev/null +++ b/src/tests/rosterresponder.cpp @@ -0,0 +1,86 @@ +#include "transport/userregistry.h" +#include "transport/config.h" +#include "transport/storagebackend.h" +#include "transport/user.h" +#include "transport/transport.h" +#include "transport/conversation.h" +#include "transport/rosterresponder.h" +#include "transport/usermanager.h" +#include "transport/localbuddy.h" +#include +#include +#include +#include +#include +#include +#include +#include "Swiften/Server/ServerStanzaChannel.h" +#include "Swiften/Server/ServerFromClientSession.h" +#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h" +#include "basictest.h" + +using namespace Transport; + +class RosterResponderTest : public CPPUNIT_NS :: TestFixture, public BasicTest { + CPPUNIT_TEST_SUITE(RosterResponderTest); + CPPUNIT_TEST(addEmptyBuddy); + CPPUNIT_TEST_SUITE_END(); + + public: + RosterResponder *m_rosterResponder; + std::string m_buddy; + + void setUp (void) { + m_buddy = "none"; + setMeUp(); + connectUser(); + + m_rosterResponder = new RosterResponder(component->getIQRouter(), userManager); + m_rosterResponder->onBuddyAdded.connect(boost::bind(&RosterResponderTest::handleBuddyAdded, this, _1, _2)); + m_rosterResponder->onBuddyRemoved.connect(boost::bind(&RosterResponderTest::handleBuddyRemoved, this, _1)); + m_rosterResponder->onBuddyUpdated.connect(boost::bind(&RosterResponderTest::handleBuddyUpdated, this, _1, _2)); + m_rosterResponder->start(); + + received.clear(); + } + + void tearDown (void) { + received.clear(); + disconnectUser(); + tearMeDown(); + } + + void handleBuddyAdded(Buddy *buddy, const Swift::RosterItemPayload &item) { + m_buddy = buddy->getName(); + } + + void handleBuddyRemoved(Buddy *buddy) { + m_buddy = buddy->getName(); + } + + void handleBuddyUpdated(Buddy *buddy, const Swift::RosterItemPayload &item) { + m_buddy = buddy->getName(); + } + + void addEmptyBuddy() { + Swift::RosterPayload::ref p = Swift::RosterPayload::ref(new Swift::RosterPayload()); + Swift::RosterItemPayload item; + item.setJID("icq.localhost"); + item.setSubscription(Swift::RosterItemPayload::Both); + + p->addItem(item); + Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(p, "user@localhost", component->getIQRouter()); + + boost::shared_ptr iq(new Swift::IQ(Swift::IQ::Set)); + iq->setTo("icq.localhost"); + iq->setFrom("user@localhost"); + iq->addPayload(p); + iq->setID("123"); + injectIQ(iq); + + CPPUNIT_ASSERT_EQUAL(std::string("none"), m_buddy); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION (RosterResponderTest);