From c538d9965b826f7e78abb0b39dd34af0eb15cee2 Mon Sep 17 00:00:00 2001 From: HanzZ Date: Wed, 12 Sep 2012 13:04:39 +0200 Subject: [PATCH] Handle backendConfig --- include/transport/config.h | 9 ++++- include/transport/networkpluginserver.h | 1 + src/config.cpp | 14 +++++++ src/networkpluginserver.cpp | 19 ++++++++-- src/tests/config.cpp | 49 +++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/tests/config.cpp diff --git a/include/transport/config.h b/include/transport/config.h index cecdf772..de7888ac 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -83,7 +83,8 @@ class Config { bool reload(); bool hasKey(const std::string &key) { - return m_variables.find(key) != m_variables.end() || m_unregistered.find(key) != m_unregistered.end(); + return (m_variables.find(key) != m_variables.end() || m_unregistered.find(key) != m_unregistered.end() + || m_backendConfig.find(key) != m_backendConfig.end()); } /// Returns value of variable defined by key. @@ -94,6 +95,9 @@ class Config { if (m_variables.find(key) != m_variables.end()) { return m_variables[key]; } + if (m_backendConfig.find(key) != m_backendConfig.end()) { + return m_backendConfig[key]; + } return m_unregistered[key]; } @@ -107,12 +111,15 @@ class Config { /// This signal is emitted when config is loaded/reloaded. boost::signal onConfigReloaded; + void updateBackendConfig(const std::string &backendConfig); + static Config *createFromArgs(int argc, char **argv, std::string &error, std::string &host, int &port); private: int m_argc; char **m_argv; Variables m_variables; + Variables m_backendConfig; std::map m_unregistered; std::string m_file; std::string m_jid; diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index eff5a987..62fc5b08 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -108,6 +108,7 @@ class NetworkPluginServer { void handleFTFinishPayload(const std::string &payload); void handleFTDataPayload(Backend *b, const std::string &payload); void handleQueryPayload(Backend *b, const std::string &payload); + void handleBackendConfigPayload(const std::string &payload); void handleUserCreated(User *user); void handleRoomJoined(User *user, const Swift::JID &who, const std::string &room, const std::string &nickname, const std::string &password); diff --git a/src/config.cpp b/src/config.cpp index f7147d29..2f57b168 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -284,6 +284,20 @@ std::string Config::getCommandLineArgs() const { return commandLineArgs.str(); } +void Config::updateBackendConfig(const std::string &backendConfig) { + options_description opts("Backend options"); + opts.add_options() + ("registration.needPassword", value()->default_value(true), "") + ("registration.extraField", value >()->multitoken(), "") + ; + + std::stringstream ifs(backendConfig); + parsed_options parsed = parse_config_file(ifs, opts, true); + + store(parsed, m_backendConfig); + notify(m_backendConfig); +} + Config *Config::createFromArgs(int argc, char **argv, std::string &error, std::string &host, int &port) { std::string jid; std::ostringstream os; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index ecfe26db..0c133a2c 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -825,17 +825,27 @@ void NetworkPluginServer::handleQueryPayload(Backend *b, const std::string &data msg->setBody(payload.config()); m_adminInterface->handleQuery(msg); - pbnetwork::BackendConfig vcard; - vcard.set_config(msg->getBody()); + pbnetwork::BackendConfig response; + response.set_config(msg->getBody()); std::string message; - vcard.SerializeToString(&message); + response.SerializeToString(&message); WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_QUERY); send(b->connection, message); } +void NetworkPluginServer::handleBackendConfigPayload(const std::string &data) { + pbnetwork::BackendConfig payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + m_config->updateBackendConfig(payload.config()); +} + void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr data) { // Append data to buffer c->data.insert(c->data.end(), data->begin(), data->end()); @@ -930,6 +940,9 @@ void NetworkPluginServer::handleDataRead(Backend *c, boost::shared_ptr +#include +#include +#include +#include +#include +#include +#include "Swiften/Server/ServerStanzaChannel.h" +#include "Swiften/Server/ServerFromClientSession.h" +#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h" +#include "basictest.h" + +#include "transport/util.h" + +using namespace Transport; + +class ConfigTest : public CPPUNIT_NS :: TestFixture{ + CPPUNIT_TEST_SUITE(ConfigTest); + CPPUNIT_TEST(updateBackendConfig); + CPPUNIT_TEST_SUITE_END(); + + public: + void setUp (void) { + } + + void tearDown (void) { + + } + + void updateBackendConfig() { + Config cfg; + CPPUNIT_ASSERT(!cfg.hasKey("registration.needPassword")); + + cfg.updateBackendConfig("[registration]\nneedPassword=0\n"); + CPPUNIT_ASSERT(cfg.hasKey("registration.needPassword")); + CPPUNIT_ASSERT_EQUAL(false, CONFIG_BOOL(&cfg, "registration.needPassword")); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION (ConfigTest);