Fixed removing users

This commit is contained in:
HanzZ 2011-07-17 03:56:19 +02:00
parent 16f2ef24d6
commit c6224941ce
7 changed files with 24 additions and 4 deletions

View file

@ -28,6 +28,7 @@
#include "Swiften/Server/ServerFromClientSession.h"
#include "Swiften/Server/ServerStanzaChannel.h"
#include "Swiften/Queries/IQRouter.h"
#include <iostream>
namespace Swift {
@ -108,6 +109,9 @@ void Server::handleNewClientConnection(boost::shared_ptr<Connection> 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));

View file

@ -24,6 +24,7 @@
#include <Swiften/StreamStack/TLSServerLayer.h>
#include <Swiften/Elements/StartTLSRequest.h>
#include <Swiften/Elements/TLSProceed.h>
#include <iostream>
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<AuthFailure>(new AuthFailure));
finishSession(AuthenticationFailedError);
onPasswordInvalid();
}
}

View file

@ -42,6 +42,7 @@ namespace Swift {
~ServerFromClientSession();
boost::signal<void ()> onSessionStarted;
boost::signal<void ()> onPasswordInvalid;
void setAllowSASLEXTERNAL();
const std::string &getUser() {
return user_;

View file

@ -55,10 +55,8 @@ void ServerStanzaChannel::sendPresence(boost::shared_ptr<Presence> presence) {
void ServerStanzaChannel::finishSession(const JID& to, boost::shared_ptr<Element> element) {
std::vector<boost::shared_ptr<ServerFromClientSession> > candidateSessions;
for (std::list<boost::shared_ptr<ServerFromClientSession> >::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<boost::shared_ptr<ServerFromClientSession> >::const_iterator i = candidateSessions.begin(); i != candidateSessions.end(); ++i) {

View file

@ -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;

View file

@ -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<Swift::ServerStanzaChannel *>(m_component->getStanzaChannel())->finishSession(m_jid, boost::shared_ptr<Swift::Element>(new Swift::StreamError()));
m_userManager->removeUser(this);
}
else {
m_userManager->removeUser(this);

View file

@ -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<Swift::MUCPayload>() != 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);