From e0f560a64814be67debae69991598e5b6b8276e6 2012-11-13 12:37:42 From: Jan Kaluza Date: 2012-11-13 12:37:42 Subject: [PATCH] Added database.vip_statement, database.vip_only and database.vip_message variables --- diff --git a/src/config.cpp b/src/config.cpp index 5e134db03b1a58c48c1a5f9439a30bf47ced486c..6bf3a4b2919e4ce8b6730e6a403effc4d79956cd 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -99,6 +99,8 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("service.enable_xhtml", value()->default_value(true), "") ("service.max_room_list_size", value()->default_value(100), "") ("service.jid_escaping", value()->default_value(true), "") + ("service.vip_only", value()->default_value(false), "") + ("service.vip_message", value()->default_value(""), "") ("vhosts.vhost", value >()->multitoken(), "") ("identity.name", value()->default_value("Spectrum 2 Transport"), "Name showed in service discovery.") ("identity.category", value()->default_value("gateway"), "Disco#info identity category. 'gateway' by default.") @@ -125,6 +127,7 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ("database.port", value()->default_value(0), "Database port.") ("database.prefix", value()->default_value(""), "Prefix of tables in database") ("database.encryption_key", value()->default_value(""), "Encryption key.") + ("database.vip_statement", value()->default_value(""), "Encryption key.") ("logging.config", value()->default_value(""), "Path to log4cxx config file which is used for Spectrum 2 instance") ("logging.backend_config", value()->default_value(""), "Path to log4cxx config file which is used for backends") ("backend.default_avatar", value()->default_value(""), "Full path to default avatar") diff --git a/src/mysqlbackend.cpp b/src/mysqlbackend.cpp index f0769368e1cb887385074e38c91a1a3dc92d4d43..642127acc228fcd854775968aecc7d80944a2727 100644 --- a/src/mysqlbackend.cpp +++ b/src/mysqlbackend.cpp @@ -443,6 +443,23 @@ bool MySQLBackend::getUser(const std::string &barejid, UserInfo &user) { } } + if (!CONFIG_STRING(m_config, "database.vip_statement").empty()) { + std::string query = CONFIG_STRING(m_config, "database.vip_statement"); + boost::replace_all(query, "$jid", barejid); + LOG4CXX_INFO(logger, "Executing '" << query << "' to find out if user " << barejid << " is VIP"); + if (exec(query)) { + MYSQL_RES *result = mysql_store_result(&m_conn); + if (result) { + LOG4CXX_INFO(logger, "User " << barejid << " is VIP"); + user.vip = 1; + } + else { + LOG4CXX_INFO(logger, "User " << barejid << " is not VIP"); + user.vip = 0; + } + } + } + return ret; } diff --git a/src/tests/basictest.h b/src/tests/basictest.h index 1d270b20aff45e438b039b4aadb66b58134331be..a1d9a0f14b4998aebdc483962bfaff6b3a1ab582 100644 --- a/src/tests/basictest.h +++ b/src/tests/basictest.h @@ -225,6 +225,7 @@ class BasicTest : public Swift::XMPPParserClient { user.jid = "user@localhost"; user.uin = "legacyname"; user.password = "password"; + user.vip = 0; storage->setUser(user); } diff --git a/src/tests/usermanager.cpp b/src/tests/usermanager.cpp index 26ba476a6c1da8042a6dcb583ab1f9cf7178f053..a95c063fffbd142875facd9c32c1d07a684bee3a 100644 --- a/src/tests/usermanager.cpp +++ b/src/tests/usermanager.cpp @@ -27,6 +27,7 @@ class UserManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_TEST(connectUserTransportDisabled); CPPUNIT_TEST(connectUserRegistrationNeeded); CPPUNIT_TEST(connectUserRegistrationNeededRegistered); + CPPUNIT_TEST(connectUserVipOnlyNonVip); CPPUNIT_TEST(handleProbePresence); CPPUNIT_TEST(disconnectUser); CPPUNIT_TEST_SUITE_END(); @@ -71,6 +72,26 @@ class UserManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_ASSERT(!streamEnded); } + void connectUserVipOnlyNonVip() { + addUser(); + std::istringstream ifs("service.server_mode = 1\nservice.jid_escaping=0\nservice.jid=localhost\nservice.vip_only=1\nservice.vip_message=Ahoj\n"); + cfg->load(ifs); + CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount()); + userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password")); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(3, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[1]))); + CPPUNIT_ASSERT_EQUAL(std::string("Ahoj"), dynamic_cast(getStanza(received[1]))->getBody()); + CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast(getStanza(received[1]))->getTo().toString()); + CPPUNIT_ASSERT_EQUAL(std::string("localhost"), dynamic_cast(getStanza(received[1]))->getFrom().toString()); + + CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount()); + CPPUNIT_ASSERT(streamEnded); + std::istringstream ifs2("service.server_mode = 1\nservice.jid_escaping=1\nservice.jid=localhost\nservice.more_resources=1\n"); + cfg->load(ifs2); + } + void handleProbePresence() { UserInfo info; info.id = 1; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 38f31bd039646eb7fc0a74aba9a35242bbcc27e2..e870f8a463dcadc7e18875fc89e7a1d1eff87ed2 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -277,6 +277,22 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { return; } + if (CONFIG_BOOL(m_component->getConfig(), "service.vip_only") && res.vip == false) { + if (!CONFIG_STRING(m_component->getConfig(), "service.vip_message").empty()) { + boost::shared_ptr msg(new Swift::Message()); + msg->setBody(CONFIG_STRING(m_component->getConfig(), "service.vip_message")); + msg->setTo(presence->getFrom()); + msg->setFrom(m_component->getJID()); + m_component->getStanzaChannel()->sendMessage(msg); + } + + LOG4CXX_WARN(logger, "Non VIP user " << userkey << " tried to login"); + if (m_component->inServerMode()) { + m_userRegistry->onPasswordInvalid(presence->getFrom()); + } + return; + } + bool transport_enabled = true; if (m_storageBackend) { std::string value = "1";