diff --git a/include/Swiften/Server/Server.cpp b/include/Swiften/Server/Server.cpp index afd239defdbd9588c8f6387d8b31c52af598bd5c..4313e1b309ebadcc55bc8f0c58efd4a888496742 100644 --- a/include/Swiften/Server/Server.cpp +++ b/include/Swiften/Server/Server.cpp @@ -48,7 +48,7 @@ Server::Server( selfJID(jid), stanzaChannel_(), address_(address){ - stanzaChannel_ = new ServerStanzaChannel(); + stanzaChannel_ = new ServerStanzaChannel(selfJID); iqRouter_ = new IQRouter(stanzaChannel_); tlsFactory = NULL; parserFactory_ = new PlatformXMLParserFactory(); diff --git a/include/Swiften/Server/ServerStanzaChannel.cpp b/include/Swiften/Server/ServerStanzaChannel.cpp index d13a0a9b5380832aac84f69ecef041fff5527852..8150d20de6dfac12b85cac30d4943ad8a36b6649 100644 --- a/include/Swiften/Server/ServerStanzaChannel.cpp +++ b/include/Swiften/Server/ServerStanzaChannel.cpp @@ -102,6 +102,10 @@ void ServerStanzaChannel::send(boost::shared_ptr stanza) { JID to = stanza->getTo(); assert(to.isValid()); + if (!stanza->getFrom().isValid()) { + stanza->setFrom(m_jid); + } + // For a full JID, first try to route to a session with the full JID if (!to.isBare()) { std::list >::const_iterator i = std::find_if(sessions[stanza->getTo().toBare().toString()].begin(), sessions[stanza->getTo().toBare().toString()].end(), HasJID(to)); diff --git a/include/Swiften/Server/ServerStanzaChannel.h b/include/Swiften/Server/ServerStanzaChannel.h index cc9c82279e362d1b050eb8304a9313c077e99bac..bf9cdb766fc08b60eb6d07834554a27d21130cc8 100644 --- a/include/Swiften/Server/ServerStanzaChannel.h +++ b/include/Swiften/Server/ServerStanzaChannel.h @@ -22,6 +22,9 @@ namespace Swift { class Error; class ServerStanzaChannel : public StanzaChannel { public: + ServerStanzaChannel(const JID &selfJID) : StanzaChannel() { + m_jid = selfJID; + } void addSession(boost::shared_ptr session); void removeSession(boost::shared_ptr session); @@ -54,6 +57,7 @@ namespace Swift { void handleSessionInitialized(); private: + JID m_jid; IDGenerator idGenerator; // [JID][resources][ServerFromClientSession] std::map > > sessions; diff --git a/spectrum/src/frontends/xmpp/XMPPUserManager.cpp b/spectrum/src/frontends/xmpp/XMPPUserManager.cpp index 19c4230863ac85d2eeadec94547c314ed103e05d..86acc50bb290c188aa3867ac3f423e958057dfe9 100644 --- a/spectrum/src/frontends/xmpp/XMPPUserManager.cpp +++ b/spectrum/src/frontends/xmpp/XMPPUserManager.cpp @@ -31,6 +31,7 @@ #include "gatewayresponder.h" #include "adhocmanager.h" #include "settingsadhoccommand.h" +#include "RosterResponder.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" @@ -75,6 +76,9 @@ XMPPUserManager::XMPPUserManager(Component *component, UserRegistry *userRegistr m_gatewayResponder = new GatewayResponder(frontend->getIQRouter(), this); m_gatewayResponder->start(); + m_rosterResponder = new RosterResponder(frontend->getIQRouter(), this); + m_rosterResponder->start(); + m_adHocManager = new AdHocManager(component, frontend->getDiscoItemsResponder(), this, storageBackend); m_adHocManager->start(); @@ -97,6 +101,7 @@ XMPPUserManager::~XMPPUserManager() { delete m_adHocManager; delete m_settings; delete m_vcardResponder; + delete m_rosterResponder; } void XMPPUserManager::sendVCard(unsigned int id, Swift::VCard::ref vcard) { diff --git a/spectrum/src/frontends/xmpp/XMPPUserManager.h b/spectrum/src/frontends/xmpp/XMPPUserManager.h index b63ce9051553b21ce97c6467dfbc80c8f0d745df..9ba994ac05cb6da2b3c65bb7e890c3814f5ace6e 100644 --- a/spectrum/src/frontends/xmpp/XMPPUserManager.h +++ b/spectrum/src/frontends/xmpp/XMPPUserManager.h @@ -39,6 +39,7 @@ class XMPPUserRegistration; class GatewayResponder; class AdHocManager; class SettingsAdHocCommandFactory; +class RosterResponder; class XMPPUserManager : public UserManager { public: @@ -61,6 +62,7 @@ class XMPPUserManager : public UserManager { GatewayResponder *m_gatewayResponder; AdHocManager *m_adHocManager; SettingsAdHocCommandFactory *m_settings; + RosterResponder *m_rosterResponder; }; } diff --git a/spectrum/src/tests/irc_test.py b/spectrum/src/tests/irc_test.py index 6ffc650f86ee301218d166b8f52ef8e011616c0c..8416dce81edb4292b43d4eaf801206a88f76d140 100644 --- a/spectrum/src/tests/irc_test.py +++ b/spectrum/src/tests/irc_test.py @@ -43,6 +43,8 @@ class Client(sleekxmpp.ClientXMPP): self.echo_received = True def start(self, event): + self.getRoster() + self.sendPresence() self.plugin['xep_0045'].joinMUC(self.room, self.nick, wait=True) self.send_message(mto=self.room, mbody="abc", mtype='groupchat') #time.sleep(10) diff --git a/src/tests/rostermanager.cpp b/src/tests/rostermanager.cpp index 9c94fe4749753b82274abdb9139b38f3f3c8541c..c1449a6b149dd228f48e9c3409f49734129c996c 100644 --- a/src/tests/rostermanager.cpp +++ b/src/tests/rostermanager.cpp @@ -95,6 +95,7 @@ class RosterManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { Swift::RosterItemPayload item = payload1->getItems()[0]; CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), Buddy::JIDToLegacyName(item.getJID())); CPPUNIT_ASSERT_EQUAL(std::string("Buddy 1"), item.getName()); + CPPUNIT_ASSERT_EQUAL(std::string("localhost"), getStanza(received[0])->getFrom().toString()); Swift::RosterPayload::ref payload2 = getStanza(received[2])->getPayload(); CPPUNIT_ASSERT(payload2);