diff --git a/src/config/configfile.cpp b/src/config/configfile.cpp index d9fc1a5f..f6285dbe 100644 --- a/src/config/configfile.cpp +++ b/src/config/configfile.cpp @@ -64,7 +64,7 @@ ConfigFile::ConfigFile(char *argv0, bool readonly) : noWriteAccess(readonly) myConfigState = OK; // !!!! Revisionsnummer der Configdefaults !!!!! - configRev = 101; + configRev = 102; //standard defaults logOnOffDefault = "1"; @@ -223,6 +223,8 @@ ConfigFile::ConfigFile(char *argv0, bool readonly) : noWriteAccess(readonly) configList.push_back(ConfigInfo("ServerUseWebSocket", CONFIG_TYPE_INT, "0")); configList.push_back(ConfigInfo("ServerPort", CONFIG_TYPE_INT, "7234")); configList.push_back(ConfigInfo("ServerWebSocketPort", CONFIG_TYPE_INT, "7233")); + configList.push_back(ConfigInfo("ServerWebSocketResource", CONFIG_TYPE_STRING, "")); + configList.push_back(ConfigInfo("ServerWebSocketOrigin", CONFIG_TYPE_STRING, "")); configList.push_back(ConfigInfo("ServerUsePutAvatars", CONFIG_TYPE_INT, "0")); configList.push_back(ConfigInfo("ServerPutAvatarsAddress", CONFIG_TYPE_STRING, "")); configList.push_back(ConfigInfo("ServerPutAvatarsUser", CONFIG_TYPE_STRING, "")); diff --git a/src/net/common/serveracceptwebhelper.cpp b/src/net/common/serveracceptwebhelper.cpp index f5149ad2..8cfdd05a 100644 --- a/src/net/common/serveracceptwebhelper.cpp +++ b/src/net/common/serveracceptwebhelper.cpp @@ -36,8 +36,10 @@ using namespace std; -ServerAcceptWebHelper::ServerAcceptWebHelper(ServerCallback &serverCallback, boost::shared_ptr ioService) - : m_ioService(ioService), m_serverCallback(serverCallback) +ServerAcceptWebHelper::ServerAcceptWebHelper(ServerCallback &serverCallback, boost::shared_ptr ioService, + const string &webSocketResource, const string &webSocketOrigin) + : m_ioService(ioService), m_serverCallback(serverCallback), + m_webSocketResource(webSocketResource), m_webSocketOrigin(webSocketOrigin) { m_webSocketServer.reset(new server); } @@ -71,9 +73,15 @@ ServerAcceptWebHelper::Close() } bool -ServerAcceptWebHelper::validate(websocketpp::connection_hdl /*hdl*/) +ServerAcceptWebHelper::validate(websocketpp::connection_hdl hdl) { - return true; + bool retVal = false; + server::connection_ptr con = m_webSocketServer->get_con_from_hdl(hdl); + if ((m_webSocketResource.empty() || con->get_resource() == m_webSocketResource) + && (m_webSocketOrigin.empty() || (con->get_origin() != "null" && con->get_origin() == m_webSocketOrigin))) { + retVal = true; + } + return retVal; } void diff --git a/src/net/common/servermanager.cpp b/src/net/common/servermanager.cpp index b75e6961..2be86e38 100644 --- a/src/net/common/servermanager.cpp +++ b/src/net/common/servermanager.cpp @@ -78,7 +78,8 @@ ServerManager::~ServerManager() } void -ServerManager::Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const string &logDir) +ServerManager::Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const string &logDir, + const string &webSocketResource, const string &webSocketOrigin) { GetLobbyThread().Init(logDir); @@ -95,7 +96,8 @@ ServerManager::Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int }*/ if (proto & TRANSPORT_PROTOCOL_WEBSOCKET) { - boost::shared_ptr webAcceptHelper(new ServerAcceptWebHelper(GetGui(), m_ioService)); + boost::shared_ptr webAcceptHelper( + new ServerAcceptWebHelper(GetGui(), m_ioService, webSocketResource, webSocketOrigin)); webAcceptHelper->Listen(websocketPort, ipv6, logDir, m_lobbyThread); m_acceptHelperPool.push_back(webAcceptHelper); } diff --git a/src/net/common/servermanagerirc.cpp b/src/net/common/servermanagerirc.cpp index 3b7b028b..0f84eb7c 100644 --- a/src/net/common/servermanagerirc.cpp +++ b/src/net/common/servermanagerirc.cpp @@ -52,7 +52,8 @@ ServerManagerIrc::~ServerManagerIrc() } void -ServerManagerIrc::Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const string &logDir) +ServerManagerIrc::Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const string &logDir, + const std::string &webSocketResource, const std::string &webSocketOrigin) { boost::shared_ptr tmpIrcAdminThread; boost::shared_ptr tmpIrcLobbyThread; @@ -83,7 +84,7 @@ ServerManagerIrc::Init(unsigned serverPort, unsigned websocketPort, bool ipv6, i m_adminBot->Init(m_lobbyThread, tmpIrcAdminThread, myConfig.readConfigString("CacheDir")); m_lobbyBot->Init(m_lobbyThread, tmpIrcLobbyThread); - ServerManager::Init(serverPort, websocketPort, ipv6, proto, logDir); + ServerManager::Init(serverPort, websocketPort, ipv6, proto, logDir, webSocketResource, webSocketOrigin); } void diff --git a/src/net/serveracceptwebhelper.h b/src/net/serveracceptwebhelper.h index 3f7d91e7..e0e9faec 100644 --- a/src/net/serveracceptwebhelper.h +++ b/src/net/serveracceptwebhelper.h @@ -40,7 +40,8 @@ class ServerAcceptWebHelper : public ServerAcceptInterface { public: - ServerAcceptWebHelper(ServerCallback &serverCallback, boost::shared_ptr ioService); + ServerAcceptWebHelper(ServerCallback &serverCallback, boost::shared_ptr ioService, + const std::string &webSocketResource, const std::string &webSocketOrigin); virtual void Listen(unsigned serverPort, bool ipv6, const std::string &logDir, boost::shared_ptr lobbyThread); @@ -61,6 +62,8 @@ private: ServerCallback &m_serverCallback; boost::shared_ptr m_webSocketServer; SessionMap m_sessionMap; + std::string m_webSocketResource; + std::string m_webSocketOrigin; boost::shared_ptr m_lobbyThread; }; diff --git a/src/net/servermanager.h b/src/net/servermanager.h index 09b7468d..cce0e467 100644 --- a/src/net/servermanager.h +++ b/src/net/servermanager.h @@ -54,7 +54,8 @@ public: virtual ~ServerManager(); // Set the parameters. - virtual void Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const std::string &logDir); + virtual void Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const std::string &logDir, + const std::string &webSocketResource, const std::string &webSocketOrigin); // Main start function. virtual void RunAll(); diff --git a/src/net/servermanagerirc.h b/src/net/servermanagerirc.h index 3126a98a..feb7e684 100644 --- a/src/net/servermanagerirc.h +++ b/src/net/servermanagerirc.h @@ -45,7 +45,8 @@ public: virtual ~ServerManagerIrc(); // Set the parameters. - virtual void Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const std::string &logDir); + virtual void Init(unsigned serverPort, unsigned websocketPort, bool ipv6, int proto, const std::string &logDir, + const std::string &webSocketResource, const std::string &webSocketOrigin); // Main start function. virtual void RunAll(); diff --git a/src/session.cpp b/src/session.cpp index 5a067ba0..8db33601 100755 --- a/src/session.cpp +++ b/src/session.cpp @@ -342,7 +342,9 @@ void Session::startNetworkServer(bool dedicated) myConfig->readConfigInt("ServerWebSocketPort"), myConfig->readConfigInt("ServerUseIpv6") == 1, protocol, - myQtToolsInterface->stringFromUtf8(myConfig->readConfigString("LogDir")) + myQtToolsInterface->stringFromUtf8(myConfig->readConfigString("LogDir")), + myQtToolsInterface->stringFromUtf8(myConfig->readConfigString("ServerWebSocketResource")), + myQtToolsInterface->stringFromUtf8(myConfig->readConfigString("ServerWebSocketOrigin")) ); myNetServer->RunAll();