diff --git a/src/user.cpp b/src/user.cpp index 2ca77538709de7a2a049216f806fef4babb25d10..5452ddc420f35b6832814fe798453038c9b99457 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -115,11 +115,12 @@ void User::handlePresence(Swift::Presence::ref presence) { Swift::Presence::ref highest = m_presenceOracle->getHighestPriorityPresence(m_jid.toBare()); if (highest) { - highest->setTo(presence->getFrom().toBare()); - highest->setFrom(m_component->getJID()); - m_component->getStanzaChannel()->sendPresence(highest); - LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << highest->getType()); - onPresenceChanged(highest); + Swift::Presence::ref response = Swift::Presence::create(highest); + response->setTo(presence->getFrom().toBare()); + response->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendPresence(response); + LOG4CXX_INFO(logger, m_jid.toString() << ": Changing legacy network presence to " << response->getType()); + onPresenceChanged(response); } else { Swift::Presence::ref response = Swift::Presence::create(); @@ -158,11 +159,15 @@ void User::handleDisconnected(const std::string &error) { msg->setFrom(m_component->getJID()); m_component->getStanzaChannel()->sendMessage(msg); + // In server mode, server finishes the session and pass unavailable session to userManager, + // so we can't removeUser() in server mode, because it would be removed twice. + // 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); + } } }