From 94337d703e241dc6d7b0abc8a5c455de5a713206 Mon Sep 17 00:00:00 2001 From: Alexander Skovpen Date: Mon, 9 Apr 2012 00:28:42 +0400 Subject: [PATCH 1/2] partially #258 --- src/admininterface.cpp | 10 ++++++---- src/usermanager.cpp | 25 +++++++++++++++++++++++++ src/userregistry.cpp | 21 ++++++++++++--------- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 769d002f..5b5a50a3 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -59,11 +59,13 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { if (!message->getTo().getNode().empty()) return; - if (message->getFrom().toBare().toString() != CONFIG_STRING(m_component->getConfig(), "service.admin_jid")) { - LOG4CXX_WARN(logger, "Message not from admin user, but from " << message->getFrom().toBare().toString()); - return; + std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + if (std::find(x.begin(), x.end(), message->getFrom().toBare().toString()) == x.end()) { + LOG4CXX_WARN(logger, "Message not from admin user, but from " << message->getFrom().toBare().toString()); + return; + } - + // Ignore empty messages if (message->getBody().empty()) { return; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 671509f4..618be97e 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -150,6 +150,7 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { // Create user class if it's not there if (!user) { // Admin user is not legacy network user, so do not create User class instance for him +/* if (m_component->inServerMode() && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { // Send admin contact to the user. Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); @@ -168,6 +169,30 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { m_component->getStanzaChannel()->sendPresence(response); return; } +*/ + if (m_component->inServerMode()) { + // && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { + std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + if (std::find(x.begin(), x.end(), presence->getFrom().toBare().toString()) != x.end()) { + + // Send admin contact to the user. + Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); + Swift::RosterItemPayload item; + item.setJID(m_component->getJID()); + item.setName("Admin"); + item.setSubscription(Swift::RosterItemPayload::Both); + payload->addItem(item); + + Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); + request->send(); + + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo(presence->getFrom()); + response->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendPresence(response); + return; + } + } // No user and unavailable presence -> answer with unavailable if (presence->getType() == Swift::Presence::Unavailable) { diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 81f6806c..1b79c014 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -38,16 +38,19 @@ UserRegistry::UserRegistry(Config *cfg, Swift::NetworkFactories *factories) { UserRegistry::~UserRegistry() { m_removeTimer->stop(); } void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFromClientSession *session, const Swift::SafeByteArray& password) { - if (!CONFIG_STRING(config, "service.admin_jid").empty() && user.toBare().toString() == CONFIG_STRING(config, "service.admin_jid")) { - if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { - session->handlePasswordValid(); - } - else { - session->handlePasswordInvalid(); - } - return; - } + if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { + std::list const &x = CONFIG_LIST(config,"service.admin_jid"); + if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { + if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { + session->handlePasswordValid(); + } + else { + session->handlePasswordInvalid(); + } + return; + } + } std::string key = user.toBare().toString(); // Users try to connect twice From 75f0f7507762c22ed1a32e6dbc8f9500a64fae92 Mon Sep 17 00:00:00 2001 From: Alexander Skovpen Date: Mon, 9 Apr 2012 01:40:30 +0400 Subject: [PATCH 2/2] #258 --- src/admininterface.cpp | 2 +- src/config.cpp | 2 +- src/usermanager.cpp | 23 +---------------------- src/userregistry.cpp | 6 +++--- 4 files changed, 6 insertions(+), 27 deletions(-) diff --git a/src/admininterface.cpp b/src/admininterface.cpp index 5b5a50a3..db3c53a6 100644 --- a/src/admininterface.cpp +++ b/src/admininterface.cpp @@ -59,7 +59,7 @@ void AdminInterface::handleMessageReceived(Swift::Message::ref message) { if (!message->getTo().getNode().empty()) return; - std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + std::vector const &x = CONFIG_VECTOR(m_component->getConfig(),"service.admin_jid"); if (std::find(x.begin(), x.end(), message->getFrom().toBare().toString()) == x.end()) { LOG4CXX_WARN(logger, "Message not from admin user, but from " << message->getFrom().toBare().toString()); return; diff --git a/src/config.cpp b/src/config.cpp index 6eb10e4e..b3b263ff 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -77,7 +77,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("service.backend_port", value()->default_value("0"), "Port to bind backend server to") ("service.cert", value()->default_value(""), "PKCS#12 Certificate.") ("service.cert_password", value()->default_value(""), "PKCS#12 Certificate password.") - ("service.admin_jid", value()->default_value(""), "Administrator jid.") + ("service.admin_jid", value >()->multitoken(), "Administrator jid.") ("service.admin_password", value()->default_value(""), "Administrator password.") ("service.reuse_old_backends", value()->default_value(true), "True if Spectrum should use old backends which were full in the past.") ("service.idle_reconnect_time", value()->default_value(0), "Time in seconds after which idle users are reconnected to let their backend die.") diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 618be97e..ee46277b 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -150,29 +150,8 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { // Create user class if it's not there if (!user) { // Admin user is not legacy network user, so do not create User class instance for him -/* - if (m_component->inServerMode() && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { - // Send admin contact to the user. - Swift::RosterPayload::ref payload = Swift::RosterPayload::ref(new Swift::RosterPayload()); - Swift::RosterItemPayload item; - item.setJID(m_component->getJID()); - item.setName("Admin"); - item.setSubscription(Swift::RosterItemPayload::Both); - payload->addItem(item); - - Swift::SetRosterRequest::ref request = Swift::SetRosterRequest::create(payload, presence->getFrom(), m_component->getIQRouter()); - request->send(); - - Swift::Presence::ref response = Swift::Presence::create(); - response->setTo(presence->getFrom()); - response->setFrom(m_component->getJID()); - m_component->getStanzaChannel()->sendPresence(response); - return; - } -*/ if (m_component->inServerMode()) { - // && CONFIG_STRING(m_component->getConfig(), "service.admin_jid") == presence->getFrom().toBare().toString()) { - std::list const &x = CONFIG_LIST(m_component->getConfig(),"service.admin_jid"); + std::vector const &x = CONFIG_VECTOR(m_component->getConfig(),"service.admin_jid"); if (std::find(x.begin(), x.end(), presence->getFrom().toBare().toString()) != x.end()) { // Send admin contact to the user. diff --git a/src/userregistry.cpp b/src/userregistry.cpp index 1b79c014..265ee692 100644 --- a/src/userregistry.cpp +++ b/src/userregistry.cpp @@ -39,8 +39,8 @@ UserRegistry::~UserRegistry() { m_removeTimer->stop(); } void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFromClientSession *session, const Swift::SafeByteArray& password) { - if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { - std::list const &x = CONFIG_LIST(config,"service.admin_jid"); +// if (!CONFIG_STRING(config, "service.admin_jid").empty() ) { + std::vector const &x = CONFIG_VECTOR(config,"service.admin_jid"); if (std::find(x.begin(), x.end(), user.toBare().toString()) != x.end()) { if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) { session->handlePasswordValid(); @@ -50,7 +50,7 @@ void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFrom } return; } - } +// } std::string key = user.toBare().toString(); // Users try to connect twice