From c6224941ceabd63eec07ba3056498d74ab5d68cf Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 17 Jul 2011 03:56:19 +0200 Subject: [PATCH] Fixed removing users --- include/Swiften/Server/Server.cpp | 4 ++++ include/Swiften/Server/ServerFromClientSession.cpp | 3 +++ include/Swiften/Server/ServerFromClientSession.h | 1 + include/Swiften/Server/ServerStanzaChannel.cpp | 6 ++---- src/networkpluginserver.cpp | 2 ++ src/user.cpp | 2 ++ src/usermanager.cpp | 10 ++++++++++ 7 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/Swiften/Server/Server.cpp b/include/Swiften/Server/Server.cpp index f12addf0..89f478e4 100644 --- a/include/Swiften/Server/Server.cpp +++ b/include/Swiften/Server/Server.cpp @@ -28,6 +28,7 @@ #include "Swiften/Server/ServerFromClientSession.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Queries/IQRouter.h" +#include namespace Swift { @@ -108,6 +109,9 @@ void Server::handleNewClientConnection(boost::shared_ptr connection) serverFromClientSession->onSessionFinished.connect( boost::bind(&Server::handleSessionFinished, this, serverFromClientSession)); + serverFromClientSession->onPasswordInvalid.connect( + boost::bind(&Server::handleSessionFinished, this, + serverFromClientSession)); serverFromClientSession->onDataRead.connect(boost::bind(&Server::handleDataRead, this, _1)); serverFromClientSession->onDataWritten.connect(boost::bind(&Server::handleDataWritten, this, _1)); diff --git a/include/Swiften/Server/ServerFromClientSession.cpp b/include/Swiften/Server/ServerFromClientSession.cpp index c0a229a1..a5817807 100644 --- a/include/Swiften/Server/ServerFromClientSession.cpp +++ b/include/Swiften/Server/ServerFromClientSession.cpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace Swift { @@ -65,8 +66,10 @@ void ServerFromClientSession::handlePasswordInvalid(const std::string &user) { if (user != JID(user_, getLocalJID().getDomain()).toString() || authenticated_) return; if (!isInitialized()) { + user_ = "/././"; getXMPPLayer()->writeElement(boost::shared_ptr(new AuthFailure)); finishSession(AuthenticationFailedError); + onPasswordInvalid(); } } diff --git a/include/Swiften/Server/ServerFromClientSession.h b/include/Swiften/Server/ServerFromClientSession.h index 6483e3a0..7de233d3 100644 --- a/include/Swiften/Server/ServerFromClientSession.h +++ b/include/Swiften/Server/ServerFromClientSession.h @@ -42,6 +42,7 @@ namespace Swift { ~ServerFromClientSession(); boost::signal onSessionStarted; + boost::signal onPasswordInvalid; void setAllowSASLEXTERNAL(); const std::string &getUser() { return user_; diff --git a/include/Swiften/Server/ServerStanzaChannel.cpp b/include/Swiften/Server/ServerStanzaChannel.cpp index 5d0c85d0..10a3eceb 100644 --- a/include/Swiften/Server/ServerStanzaChannel.cpp +++ b/include/Swiften/Server/ServerStanzaChannel.cpp @@ -55,10 +55,8 @@ void ServerStanzaChannel::sendPresence(boost::shared_ptr presence) { void ServerStanzaChannel::finishSession(const JID& to, boost::shared_ptr element) { std::vector > candidateSessions; for (std::list >::const_iterator i = sessions[to.toBare().toString()].begin(); i != sessions[to.toBare().toString()].end(); ++i) { - if ((*i)->getRemoteJID().equals(to, JID::WithoutResource)) { - (*i)->sendElement(element); - candidateSessions.push_back(*i); - } + (*i)->sendElement(element); + candidateSessions.push_back(*i); } for (std::vector >::const_iterator i = candidateSessions.begin(); i != candidateSessions.end(); ++i) { diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 210faf48..647a7d6d 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -522,6 +522,7 @@ void NetworkPluginServer::pingTimeout() { void NetworkPluginServer::handleUserCreated(User *user) { Backend *c = getFreeClient(); + if (!c) { LOG4CXX_ERROR(logger, "There is no backend to handle user " << user->getJID().toString()); user->handleDisconnected("Internal Server Error (no free backend to handle your session), please reconnect."); @@ -624,6 +625,7 @@ void NetworkPluginServer::handleRoomLeft(User *user, const std::string &r) { } void NetworkPluginServer::handleUserDestroyed(User *user) { + std::cout << "HANDLE_DESTROYED\n"; UserInfo userInfo = user->getUserInfo(); pbnetwork::Logout logout; diff --git a/src/user.cpp b/src/user.cpp index c7d25428..bedf30e6 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -42,6 +42,7 @@ static LoggerPtr logger = Logger::getLogger("User"); User::User(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) { m_jid = jid; + m_data = NULL; m_component = component; m_presenceOracle = component->m_presenceOracle; @@ -190,6 +191,7 @@ void User::handleDisconnected(const std::string &error) { // Once in finishSession and once in m_userManager->removeUser. if (m_component->inServerMode()) { dynamic_cast(m_component->getStanzaChannel())->finishSession(m_jid, boost::shared_ptr(new Swift::StreamError())); + m_userManager->removeUser(this); } else { m_userManager->removeUser(this); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 8e16c029..5076a205 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -167,6 +167,14 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { // // // addUser(user); } + + // User can be handleDisconnected in addUser callbacks... + user = getUser(userkey); + if (!user) { + m_userRegistry->onPasswordInvalid(presence->getFrom()); + return; + } + user->handlePresence(presence); bool isMUC = presence->getPayload() != NULL || *presence->getTo().getNode().c_str() == '#'; @@ -256,9 +264,11 @@ void UserManager::handleSubscription(Swift::Presence::ref presence) { void UserManager::connectUser(const Swift::JID &user) { if (m_users.find(user.toBare().toString()) != m_users.end()) { + std::cout << "FOUND\n"; m_userRegistry->onPasswordValid(user); } else { + std::cout << "NOT FOUND - PRESENCe\n"; Swift::Presence::ref response = Swift::Presence::create(); response->setTo(m_component->getJID()); response->setFrom(user);