From 6189401158ef881efc4e6c1743ef44c13dea1241 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 24 Aug 2011 13:24:48 +0200 Subject: [PATCH] More comments --- src/tests/userregistry.cpp | 4 ++-- src/usermanager.cpp | 21 +++++++++++++++------ src/userregistry.cpp | 2 ++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/tests/userregistry.cpp b/src/tests/userregistry.cpp index c932c1bf..3bf485ef 100644 --- a/src/tests/userregistry.cpp +++ b/src/tests/userregistry.cpp @@ -16,11 +16,11 @@ class UserRegistryTest : public CPPUNIT_NS :: TestFixture { std::istringstream ifs; cfg = new Config(); cfg->load(ifs); - userRegistry = new UserRegistry(cfg); +// userRegistry = new UserRegistry(cfg); } void tearDown (void) { - delete userRegistry; +// delete userRegistry; delete cfg; } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index fd8a7088..543286db 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -206,11 +206,15 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { void UserManager::handleRemoveTimeout(const std::string jid, User *u, bool reconnect) { m_removeTimer->onTick.disconnect(boost::bind(&UserManager::handleRemoveTimeout, this, jid, u, reconnect)); + + // Maybe this User instance has been deleted in mean time and we would remove new one, + // so better check for it and ignore deletion if "u" does not exist anymore. User *user = getUser(jid); if (user != u) { return; } + // Remove user if (user) { removeUser(user); } @@ -308,6 +312,9 @@ void UserManager::connectUser(const Swift::JID &user) { User *u = m_users[user.toBare().toString()]; if (u->isConnected()) { + // User is already logged in, so his password is OK, but this new user has different password => bad password. + // We can't call m_userRegistry->onPasswordInvalid() here, because this fuction is called from Swift::Parser + // and onPasswordInvalid destroys whole session together with parser itself, which leads to crash. if (m_userRegistry->getUserPassword(user.toBare().toString()) != u->getUserInfo().password) { m_userRegistry->removeLater(user); return; @@ -316,11 +323,15 @@ void UserManager::connectUser(const Swift::JID &user) { m_userRegistry->onPasswordValid(user); } else { + // Send message to currently logged in session boost::shared_ptr msg(new Swift::Message()); msg->setBody("You have signed on from another location."); msg->setTo(user); msg->setFrom(m_component->getJID()); m_component->getStanzaChannel()->sendMessage(msg); + + // Switch the session = accept new one, disconnect old one. + // Unavailable presence from old session has to be ignored, otherwise it would disconnect the user from legacy network. m_userRegistry->onPasswordValid(user); m_component->onUserPresenceReceived.disconnect(bind(&UserManager::handlePresence, this, _1)); dynamic_cast(m_component->getStanzaChannel())->finishSession(user, boost::shared_ptr(new Swift::StreamError()), true); @@ -328,16 +339,14 @@ void UserManager::connectUser(const Swift::JID &user) { } } else { + // User is created, but not connected => he's loggin in or he just logged out, but hasn't been deleted yet. + // Stop deletion process if there's any m_removeTimer->onTick.disconnect(boost::bind(&UserManager::handleRemoveTimeout, this, user.toBare().toString(), m_users[user.toBare().toString()], false)); + + // Delete old User instance but create new one immediatelly m_removeTimer->onTick.connect(boost::bind(&UserManager::handleRemoveTimeout, this, user.toBare().toString(), m_users[user.toBare().toString()], true)); m_removeTimer->start(); } -// } -// else { -// // Reconnect the user if more resources per one legacy network account are not allowed -// m_removeTimer->onTick.connect(boost::bind(&UserManager::handleRemoveTimeout, this, user.toBare().toString(), true)); -// m_removeTimer->start(); -// } } else { // simulate initial available presence to start connecting this user. diff --git a/src/userregistry.cpp b/src/userregistry.cpp index a748cd2e..4f1a83df 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -85,6 +85,8 @@ void UserRegistry::stopLogin(const Swift::JID& user, Swift::ServerFromClientSess LOG4CXX_WARN(logger, key << ": Stopping login process (user probably disconnected while logging in) for invalid user"); } + // ::removeLater can be called only by libtransport, not by Swift and libtransport + // takes care about user disconnecting itself, so don't call our signal. if (!m_inRemoveLater) onDisconnectUser(user); }