Connect just from one resource (can be changed in config)

This commit is contained in:
Jan Kaluza 2011-08-08 15:04:08 +02:00
parent c64e5768a8
commit d94de26489
6 changed files with 21 additions and 11 deletions

View file

@ -42,8 +42,6 @@ ServerFromClientSession::ServerFromClientSession(
allowSASLEXTERNAL(false),
tlsLayer(0),
tlsConnected(false) {
userRegistry->onPasswordValid.connect(boost::bind(&ServerFromClientSession::handlePasswordValid, this, _1));
userRegistry->onPasswordInvalid.connect(boost::bind(&ServerFromClientSession::handlePasswordInvalid, this, _1));
}
ServerFromClientSession::~ServerFromClientSession() {
@ -93,6 +91,9 @@ void ServerFromClientSession::handleElement(boost::shared_ptr<Element> element)
else {
PLAINMessage plainMessage(authRequest->getMessage() ? *authRequest->getMessage() : createSafeByteArray(""));
user_ = plainMessage.getAuthenticationID();
userRegistry_->onPasswordInvalid(JID(plainMessage.getAuthenticationID(), getLocalJID().getDomain()).toBare().toString());
userRegistry_->onPasswordValid.connect(boost::bind(&ServerFromClientSession::handlePasswordValid, this, _1));
userRegistry_->onPasswordInvalid.connect(boost::bind(&ServerFromClientSession::handlePasswordInvalid, this, _1));
if (userRegistry_->isValidUserPassword(JID(plainMessage.getAuthenticationID(), getLocalJID().getDomain()), plainMessage.getPassword())) {
// we're waiting for usermanager signal now
// authenticated_ = true;

View file

@ -89,7 +89,7 @@ class UserManager {
void handleGeneralPresenceReceived(Swift::Presence::ref presence);
void handleProbePresence(Swift::Presence::ref presence);
void handleSubscription(Swift::Presence::ref presence);
void handleRemoveTimeout(const std::string jid);
void handleRemoveTimeout(const std::string jid, bool reconnect);
// void handleDiscoInfoResponse(boost::shared_ptr<Swift::DiscoInfo> info, Swift::ErrorPayload::ref error, const Swift::JID& jid);
void addUser(User *user);

View file

@ -26,6 +26,6 @@ default_avatar=catmelonhead.jpg
#backend_config=backend_logging.cfg # log4cxx/log4j logging configuration file for backends
[database]
type = mysql # or "none" without database backend
#type = mysql # or "none" without database backend
database = test.sql
prefix=icq

View file

@ -48,6 +48,7 @@ bool Config::load(const std::string &configfile, boost::program_options::options
("service.admin_password", value<std::string>()->default_value(""), "Administrator password.")
("service.reuse_old_backends", value<bool>()->default_value(true), "True if Spectrum should use old backends which were full in the past.")
("service.idle_reconnect_time", value<int>()->default_value(4*3600), "Time in seconds after which idle users are reconnected to let their backend die.")
("service.more_resources", value<bool>()->default_value(false), "Allow more resources to be connected in server mode at the same time.")
("identity.name", value<std::string>()->default_value("Spectrum 2 Transport"), "Name showed in service discovery.")
("identity.category", value<std::string>()->default_value("gateway"), "Disco#info identity category. 'gateway' by default.")
("identity.type", value<std::string>()->default_value(""), "Type of transport ('icq','msn','gg','irc', ...)")

View file

@ -631,7 +631,7 @@ void NetworkPluginServer::pingTimeout() {
if ((*it)->users.size() == 0) {
LOG4CXX_INFO(logger, "Disconnecting backend " << (*it) << ". There are no users.");
(*it)->connection->disconnect();
// (*it)->connection->disconnect();
(*it)->connection.reset();
}
}

View file

@ -188,7 +188,7 @@ void UserManager::handlePresence(Swift::Presence::ref presence) {
Swift::Presence::ref highest = m_component->getPresenceOracle()->getHighestPriorityPresence(presence->getFrom().toBare());
// There's no presence for this user, so disconnect
if (!highest || (highest && highest->getType() == Swift::Presence::Unavailable)) {
m_removeTimer->onTick.connect(boost::bind(&UserManager::handleRemoveTimeout, this, user->getJID().toBare().toString()));
m_removeTimer->onTick.connect(boost::bind(&UserManager::handleRemoveTimeout, this, user->getJID().toBare().toString(), false));
m_removeTimer->start();
}
}
@ -199,12 +199,16 @@ void UserManager::handlePresence(Swift::Presence::ref presence) {
}
}
void UserManager::handleRemoveTimeout(const std::string jid) {
m_removeTimer->onTick.disconnect(boost::bind(&UserManager::handleRemoveTimeout, this, jid));
void UserManager::handleRemoveTimeout(const std::string jid, bool reconnect) {
m_removeTimer->onTick.disconnect(boost::bind(&UserManager::handleRemoveTimeout, this, jid, reconnect));
User *user = getUser(jid);
if (user) {
removeUser(user);
}
if (reconnect) {
connectUser(jid);
}
}
void UserManager::handleMessageReceived(Swift::Message::ref message) {
@ -286,11 +290,15 @@ 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);
if (CONFIG_BOOL(m_component->getConfig(), "service.more_resources")) {
m_userRegistry->onPasswordValid(user);
}
else {
m_removeTimer->onTick.connect(boost::bind(&UserManager::handleRemoveTimeout, this, user.toBare().toString(), true));
m_removeTimer->start();
}
}
else {
std::cout << "NOT FOUND - PRESENCe\n";
Swift::Presence::ref response = Swift::Presence::create();
response->setTo(m_component->getJID());
response->setFrom(user);