From 716513eebb62981c653234c693507a57e88a1ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnter=20Obiltschnig?= Date: Sun, 6 Mar 2022 12:00:52 +0100 Subject: [PATCH] use logged-in user's default domain if no domain is configured for rmagent; code cleanup; bump version and copyright date --- README.md | 17 ++-- html/footer.inc | 2 +- rmgateway.properties | 5 ++ src/AjaxCore.cpp | 2 +- src/AjaxCore.h | 2 +- src/CreateDevicePage.cpp | 24 +++--- src/CreateDevicePage.cpsp | 1 - src/CreateDevicePage.h | 2 +- src/CreateDevicePageController.cpp | 33 ++++---- src/DevicePage.cpp | 48 ++++++----- src/DevicePage.cpsp | 1 - src/DevicePage.h | 2 +- src/DevicePageController.cpp | 123 +++++++++++++++-------------- src/FavIcon.cpp | 2 +- src/FavIcon.h | 2 +- src/GatewayServer.cpp | 53 +++++++------ src/HeaderLogo.cpp | 2 +- src/HeaderLogo.h | 2 +- src/HeaderLogoX2.cpp | 2 +- src/HeaderLogoX2.h | 2 +- src/IndexPage.cpp | 52 ++++++------ src/IndexPage.cpsp | 3 +- src/IndexPage.h | 2 +- src/IndexPageController.cpp | 41 +++++----- src/LoginPage.cpp | 14 ++-- src/LoginPage.cpsp | 1 - src/LoginPage.h | 2 +- src/LoginPageController.cpp | 102 +++++++++++++++++------- src/LoginPageController.h | 1 + src/MinusIcon.cpp | 2 +- src/MinusIcon.h | 2 +- src/MinusIconX2.cpp | 2 +- src/MinusIconX2.h | 2 +- src/PageController.cpp | 5 +- src/PlusIcon.cpp | 2 +- src/PlusIcon.h | 2 +- src/PlusIconX2.cpp | 2 +- src/PlusIconX2.h | 2 +- src/StatusJSON.cpp | 2 +- src/StatusJSON.h | 2 +- src/StatusJSONController.cpp | 15 ++-- src/Stylesheet.cpp | 2 +- src/Stylesheet.h | 2 +- src/Version.h | 2 +- src/WebTunnelAgent.cpp | 2 +- 45 files changed, 323 insertions(+), 270 deletions(-) diff --git a/README.md b/README.md index 49ce7c4..e034114 100644 --- a/README.md +++ b/README.md @@ -100,11 +100,18 @@ size before deploying it to the device. ## Running the Gateway -Edit the configuration file [rmgateway.properties](rmgateway.properties) and change the default -macchina.io REMOTE domain. - -Change the value of the `webtunnel.domain` property to the domain UUID of your -macchina.io REMOTE server account. +Review the configuration file [rmgateway.properties](rmgateway.properties) and +make some changes to the configuration if desired. + +The most important setting is `webtunnel.domain`, which specifies the default +domain any devices created through the web user interface will be assigned to. +This can be left at the default (`00000000-0000-0000-0000-000000000000`). +In this case, the default domain of the logged-in user will be used. The default +domain UUID can be overridden when creating a device. + +The value of the `webtunnel.domain` property can also be set to a specific value. +In this case, when a user logs in, the Gateway will verify that the user has access +to that specific domain, and deny login if not. Optionally, you can also change other configuration properties, such as the port of the internal web server (defaults to 8080). diff --git a/html/footer.inc b/html/footer.inc index 4f23c56..60b49b5 100644 --- a/html/footer.inc +++ b/html/footer.inc @@ -3,7 +3,7 @@ diff --git a/rmgateway.properties b/rmgateway.properties index 4ea95d6..c726f3d 100644 --- a/rmgateway.properties +++ b/rmgateway.properties @@ -26,6 +26,11 @@ gateway.http.port = 8080 # # The domain UUID is used to associate the device with a user account. +# If set to a non-nil UUID (00000000-0000-0000-0000-000000000000), +# the Gateway will verify whether a user logging in to the Gateway +# web user interface has the permission to access that domain. +# If set to a nil UUID, the default domain of the logged-in +# user will be used (if the user has a default domain assigned). webtunnel.domain = 00000000-0000-0000-0000-000000000000 # The URL of the reflector server. diff --git a/src/AjaxCore.cpp b/src/AjaxCore.cpp index 1c6b01b..2ca0f93 100644 --- a/src/AjaxCore.cpp +++ b/src/AjaxCore.cpp @@ -1,7 +1,7 @@ // // AjaxCore.cpp // -// This file has been generated from AjaxCore.cpsp on 2021-11-27 19:58:16. +// This file has been generated from AjaxCore.cpsp on 2022-03-06 09:57:47. // diff --git a/src/AjaxCore.h b/src/AjaxCore.h index da371b5..3e0164b 100644 --- a/src/AjaxCore.h +++ b/src/AjaxCore.h @@ -1,7 +1,7 @@ // // AjaxCore.h // -// This file has been generated from AjaxCore.cpsp on 2021-11-27 19:58:16. +// This file has been generated from AjaxCore.cpsp on 2022-03-06 09:57:47. // diff --git a/src/CreateDevicePage.cpp b/src/CreateDevicePage.cpp index 3e8d0d1..487af00 100644 --- a/src/CreateDevicePage.cpp +++ b/src/CreateDevicePage.cpp @@ -1,7 +1,7 @@ // // CreateDevicePage.cpp // -// This file has been generated from CreateDevicePage.cpsp on 2021-11-27 20:06:35. +// This file has been generated from CreateDevicePage.cpsp on 2022-03-06 10:01:18. // @@ -47,7 +47,6 @@ if (response.sent()) return; if (ctrl.mustRedirect()) return; pageTemplate.set("title", "Gateway > Create Device"); -pageTemplate.set("domain", ctrl.defaultDomain()); std::ostream& _responseStream = response.send(); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; @@ -99,7 +98,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << "  \n"; responseStream << " "; -#line 38 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" +#line 37 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" responseStream << ( ctrl.username() ); responseStream << "\n"; responseStream << "  \n"; @@ -112,15 +111,15 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << "\n"; responseStream << "\n"; -#line 49 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" +#line 48 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" if (!ctrl.message().empty()) { responseStream << "\n"; responseStream << "
\n"; responseStream << " "; -#line 51 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" +#line 50 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" responseStream << ( U::htmlize(ctrl.message()) ); responseStream << "\n"; responseStream << "
\n"; -#line 53 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" +#line 52 "/Users/guenter/ws/git/my-devices/gateway/src/CreateDevicePage.cpsp" } responseStream << "\n"; responseStream << "
\n"; responseStream << "

New Device Properties

\n"; @@ -128,7 +127,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; @@ -139,7 +138,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " Applied Informatics GmbH | Gateway Domain: "; -#line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" - responseStream << ( U::htmlize(pageTemplate["domain"]) ); - responseStream << "\n"; + responseStream << " | © 2015-2022 by Applied Informatics GmbH\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; diff --git a/src/CreateDevicePage.cpsp b/src/CreateDevicePage.cpsp index 3061eef..d8caf03 100644 --- a/src/CreateDevicePage.cpsp +++ b/src/CreateDevicePage.cpsp @@ -16,7 +16,6 @@ if (response.sent()) return; if (ctrl.mustRedirect()) return; pageTemplate.set("title", "Gateway > Create Device"); -pageTemplate.set("domain", ctrl.defaultDomain()); %> <%@ include file="../html/header.inc" %> diff --git a/src/CreateDevicePage.h b/src/CreateDevicePage.h index d77d435..a36404e 100644 --- a/src/CreateDevicePage.h +++ b/src/CreateDevicePage.h @@ -1,7 +1,7 @@ // // CreateDevicePage.h // -// This file has been generated from CreateDevicePage.cpsp on 2021-11-27 20:06:35. +// This file has been generated from CreateDevicePage.cpsp on 2022-03-06 10:01:18. // diff --git a/src/CreateDevicePageController.cpp b/src/CreateDevicePageController.cpp index e8d607a..f32a6ea 100644 --- a/src/CreateDevicePageController.cpp +++ b/src/CreateDevicePageController.cpp @@ -19,6 +19,9 @@ #include "Poco/Path.h" +using namespace std::string_literals; + + namespace MyDevices { namespace Gateway { @@ -45,17 +48,17 @@ namespace CreateDevicePageController::CreateDevicePageController(DeviceManager::Ptr pDeviceManager, const Poco::Net::HTTPServerRequest& request, const Poco::Net::HTMLForm& form): PageController(pDeviceManager, request, form) { - WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway", request); - if (!pSession || !pSession->has("username")) + WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway"s, request); + if (!pSession || !pSession->has("username"s)) { - request.response().redirect("/"); + request.response().redirect("/"s); return; } - username(pSession->getValue("username")); + username(pSession->getValue("username"s)); csrfToken(pSession->csrfToken()); try { - if (form.has("action")) + if (form.has("action"s)) { processForm(); } @@ -64,7 +67,7 @@ CreateDevicePageController::CreateDevicePageController(DeviceManager::Ptr pDevic Poco::UUIDGenerator uuidGen; _deviceId = uuidGen.createRandom().toString(); _name = "Unnamed Device"; - _domain = defaultDomain(); + _domain = pSession->getValue("domain"s, defaultDomain()); } } catch (Poco::Exception& exc) @@ -81,36 +84,36 @@ CreateDevicePageController::~CreateDevicePageController() void CreateDevicePageController::processForm() { - std::string action = form().get("action", ""); - std::string token = form().get("csrfToken", ""); + const std::string action = form().get("action"s, ""s); + const std::string token = form().get("csrfToken"s, ""s); if (token == csrfToken()) { if (action == "create") { - _deviceId = form().get("deviceId"); - _name = form().get("deviceName"); - _domain = form().get("domain"); + _deviceId = form().get("deviceId"s); + _name = form().get("deviceName"s); + _domain = form().get("domain"s); if (!isValidId(_deviceId)) { - message("Invalid device ID: " + _deviceId); + message("Invalid device ID: "s + _deviceId); return; } if (!isValidId(_domain)) { - message("Invalid domain ID: " + _domain); + message("Invalid domain ID: "s + _domain); return; } Poco::AutoPtr pDeviceConfig = deviceManager()->createDevice(_deviceId, _domain, _name); - request().response().redirect("/device/" + _deviceId); + request().response().redirect("/device/"s + _deviceId); } else if (action == "cancel") { - request().response().redirect("/devices"); + request().response().redirect("/devices"s); } } } diff --git a/src/DevicePage.cpp b/src/DevicePage.cpp index 48d82fa..76510a8 100644 --- a/src/DevicePage.cpp +++ b/src/DevicePage.cpp @@ -1,7 +1,7 @@ // // DevicePage.cpp // -// This file has been generated from DevicePage.cpsp on 2021-11-27 20:17:05. +// This file has been generated from DevicePage.cpsp on 2022-03-06 10:00:36. // @@ -54,7 +54,6 @@ else { pageTemplate.set("title", "Gateway > Unknown Device"); } -pageTemplate.set("domain", ctrl.defaultDomain()); std::ostream& _responseStream = response.send(); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; @@ -106,7 +105,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << "  \n"; responseStream << " "; -#line 45 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 44 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" responseStream << ( ctrl.username() ); responseStream << "\n"; responseStream << "  \n"; @@ -119,17 +118,17 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << "\n"; responseStream << "\n"; -#line 56 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 55 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" if (!ctrl.message().empty()) { responseStream << "\n"; responseStream << "
\n"; responseStream << " "; -#line 58 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 57 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" responseStream << ( U::htmlize(ctrl.message()) ); responseStream << "\n"; responseStream << "
\n"; -#line 60 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 59 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" } responseStream << "\n"; -#line 62 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 61 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" if (ctrl.deviceConfig()) { responseStream << "\n"; responseStream << "
\n"; responseStream << "

Device Properties

\n"; @@ -137,11 +136,11 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << "
\n"; @@ -157,7 +156,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; @@ -178,7 +177,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; @@ -219,7 +218,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " \n"; @@ -258,7 +257,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; -#line 219 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 218 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" } responseStream << " "; responseStream << "\n"; // begin include html/footer.inc @@ -341,10 +340,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " "; #line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" responseStream << ( pageTemplate["softwareVersion"] ); - responseStream << " | © 2015-2021 by Applied Informatics GmbH | Gateway Domain: "; -#line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" - responseStream << ( U::htmlize(pageTemplate["domain"]) ); - responseStream << "\n"; + responseStream << " | © 2015-2022 by Applied Informatics GmbH\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; diff --git a/src/DevicePage.cpsp b/src/DevicePage.cpsp index e79caf6..38a1432 100644 --- a/src/DevicePage.cpsp +++ b/src/DevicePage.cpsp @@ -23,7 +23,6 @@ else { pageTemplate.set("title", "Gateway > Unknown Device"); } -pageTemplate.set("domain", ctrl.defaultDomain()); %> <%@ include file="../html/header.inc" %> diff --git a/src/DevicePage.h b/src/DevicePage.h index 1467a5c..f095364 100644 --- a/src/DevicePage.h +++ b/src/DevicePage.h @@ -1,7 +1,7 @@ // // DevicePage.h // -// This file has been generated from DevicePage.cpsp on 2021-11-27 20:17:05. +// This file has been generated from DevicePage.cpsp on 2022-03-06 10:00:36. // diff --git a/src/DevicePageController.cpp b/src/DevicePageController.cpp index 5e8ba8e..6cbed91 100644 --- a/src/DevicePageController.cpp +++ b/src/DevicePageController.cpp @@ -17,6 +17,9 @@ #include "Poco/Path.h" +using namespace std::string_literals; + + namespace MyDevices { namespace Gateway { @@ -25,7 +28,7 @@ namespace { Poco::UInt16 validatePort(const std::string& portStr) { - std::string portTrim = Poco::trim(portStr); + const std::string portTrim = Poco::trim(portStr); if (portTrim.empty()) return 0; try { @@ -36,7 +39,7 @@ namespace catch (Poco::Exception&) { } - throw Poco::InvalidArgumentException("Invalid port", portTrim); + throw Poco::InvalidArgumentException("Invalid port"s, portTrim); } void validateHost(const std::string& host) @@ -49,7 +52,7 @@ namespace catch (...) { } - throw Poco::InvalidArgumentException("Invalid host", host); + throw Poco::InvalidArgumentException("Invalid host"s, host); } } @@ -57,13 +60,13 @@ namespace DevicePageController::DevicePageController(DeviceManager::Ptr pDeviceManager, const Poco::Net::HTTPServerRequest& request, const Poco::Net::HTMLForm& form): PageController(pDeviceManager, request, form) { - WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway", request); - if (!pSession || !pSession->has("username")) + WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway"s, request); + if (!pSession || !pSession->has("username"s)) { - request.response().redirect("/"); + request.response().redirect("/"s); return; } - username(pSession->getValue("username")); + username(pSession->getValue("username"s)); csrfToken(pSession->csrfToken()); try { @@ -89,27 +92,27 @@ DevicePageController::~DevicePageController() void DevicePageController::loadDevice() { - _name = deviceConfig()->getString("webtunnel.deviceName", ""); - _domain = deviceConfig()->getString("webtunnel.domain", ""); - _password = deviceConfig()->getString("webtunnel.password", ""); - _host = deviceConfig()->getString("webtunnel.host", ""); - _httpPort = deviceConfig()->getString("webtunnel.httpPort", ""); - _httpsEnable = deviceConfig()->getBool("webtunnel.https.enable", false); - _sshPort = deviceConfig()->getString("webtunnel.sshPort", ""); - _vncPort = deviceConfig()->getString("webtunnel.vncPort", ""); - _rdpPort = deviceConfig()->getString("webtunnel.rdpPort", ""); + _name = deviceConfig()->getString("webtunnel.deviceName"s, ""s); + _domain = deviceConfig()->getString("webtunnel.domain"s, ""s); + _password = deviceConfig()->getString("webtunnel.password"s, ""s); + _host = deviceConfig()->getString("webtunnel.host"s, ""s); + _httpPort = deviceConfig()->getString("webtunnel.httpPort"s, ""s); + _httpsEnable = deviceConfig()->getBool("webtunnel.https.enable"s, false); + _sshPort = deviceConfig()->getString("webtunnel.sshPort"s, ""s); + _vncPort = deviceConfig()->getString("webtunnel.vncPort"s, ""s); + _rdpPort = deviceConfig()->getString("webtunnel.rdpPort"s, ""s); _extraPorts = loadExtraPorts(); } std::string DevicePageController::loadExtraPorts() const { - unsigned httpPort = deviceConfig()->getUInt("webtunnel.httpPort", 0); - unsigned sshPort = deviceConfig()->getUInt("webtunnel.sshPort", 0); - unsigned vncPort = deviceConfig()->getUInt("webtunnel.vncPort", 0); - unsigned rdpPort = deviceConfig()->getUInt("webtunnel.rdpPort", 0); - std::string portsStr = deviceConfig()->getString("webtunnel.ports", ""); - Poco::StringTokenizer portsTok(portsStr, ",;", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); + const unsigned httpPort = deviceConfig()->getUInt("webtunnel.httpPort"s, 0); + const unsigned sshPort = deviceConfig()->getUInt("webtunnel.sshPort"s, 0); + const unsigned vncPort = deviceConfig()->getUInt("webtunnel.vncPort"s, 0); + const unsigned rdpPort = deviceConfig()->getUInt("webtunnel.rdpPort"s, 0); + const std::string portsStr = deviceConfig()->getString("webtunnel.ports"s, ""s); + Poco::StringTokenizer portsTok(portsStr, ",;"s, Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); std::set ports; for (Poco::StringTokenizer::Iterator it = portsTok.begin(); it != portsTok.end(); ++it) { @@ -134,95 +137,95 @@ std::string DevicePageController::loadExtraPorts() const void DevicePageController::processForm() { - std::string action = form().get("action", ""); - std::string token = form().get("csrfToken", ""); + const std::string action = form().get("action"s, ""s); + const std::string token = form().get("csrfToken"s, ""s); if (token == csrfToken()) { - if (action == "update") + if (action == "update"s) { - _name = form().get("deviceName"); - _domain = form().get("domain"); - _password = form().get("password"); - _host = form().get("host"); - _httpPort = form().get("httpPort"); - _httpsEnable = form().get("httpsRequired", "") == "true"; - _sshPort = form().get("sshPort"); - _vncPort = form().get("vncPort"); - _rdpPort = form().get("rdpPort"); - _extraPorts = form().get("ports"); + _name = form().get("deviceName"s); + _domain = form().get("domain"s); + _password = form().get("password"s); + _host = form().get("host"s); + _httpPort = form().get("httpPort"s); + _httpsEnable = form().get("httpsRequired"s, ""s) == "true"; + _sshPort = form().get("sshPort"s); + _vncPort = form().get("vncPort"s); + _rdpPort = form().get("rdpPort"s); + _extraPorts = form().get("ports"s); bool ok = true; try { - deviceConfig()->setString("webtunnel.deviceName", _name); + deviceConfig()->setString("webtunnel.deviceName"s, _name); if (!_domain.empty()) - deviceConfig()->setString("webtunnel.domain", _domain); + deviceConfig()->setString("webtunnel.domain"s, _domain); else - deviceConfig()->remove("webtunnel.domain"); + deviceConfig()->remove("webtunnel.domain"s); validateHost(_host); - deviceConfig()->setString("webtunnel.host", _host); + deviceConfig()->setString("webtunnel.host"s, _host); std::set ports; Poco::UInt16 httpPort = validatePort(_httpPort); if (httpPort > 0) { - deviceConfig()->setUInt("webtunnel.httpPort", httpPort); + deviceConfig()->setUInt("webtunnel.httpPort"s, httpPort); ports.insert(httpPort); } else { - deviceConfig()->remove("webtunnel.httpPort"); + deviceConfig()->remove("webtunnel.httpPort"s); } if (_httpsEnable) { - deviceConfig()->setBool("webtunnel.https.enable", true); + deviceConfig()->setBool("webtunnel.https.enable"s, true); } else { - deviceConfig()->remove("webtunnel.https.enable"); + deviceConfig()->remove("webtunnel.https.enable"s); } Poco::UInt16 sshPort = validatePort(_sshPort); if (sshPort > 0) { - deviceConfig()->setUInt("webtunnel.sshPort", sshPort); + deviceConfig()->setUInt("webtunnel.sshPort"s, sshPort); ports.insert(sshPort); } else { - deviceConfig()->remove("webtunnel.sshPort"); + deviceConfig()->remove("webtunnel.sshPort"s); } Poco::UInt16 vncPort = validatePort(_vncPort); if (vncPort > 0) { - deviceConfig()->setUInt("webtunnel.vncPort", vncPort); + deviceConfig()->setUInt("webtunnel.vncPort"s, vncPort); ports.insert(vncPort); } else { - deviceConfig()->remove("webtunnel.vncPort"); + deviceConfig()->remove("webtunnel.vncPort"s); } Poco::UInt16 rdpPort = validatePort(_rdpPort); if (rdpPort > 0) { - deviceConfig()->setUInt("webtunnel.rdpPort", rdpPort); + deviceConfig()->setUInt("webtunnel.rdpPort"s, rdpPort); ports.insert(rdpPort); } else { - deviceConfig()->remove("webtunnel.rdpPort"); + deviceConfig()->remove("webtunnel.rdpPort"s); } - deviceConfig()->setString("webtunnel.password", _password); + deviceConfig()->setString("webtunnel.password"s, _password); - Poco::StringTokenizer portsTok(_extraPorts, ",;", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); + Poco::StringTokenizer portsTok(_extraPorts, ",;"s, Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); for (Poco::StringTokenizer::Iterator it = portsTok.begin(); it != portsTok.end(); ++it) { ports.insert(validatePort(*it)); @@ -233,14 +236,14 @@ void DevicePageController::processForm() std::string portsStr; for (std::set::const_iterator it = ports.begin(); it != ports.end(); ++it) { - if (it != ports.begin()) portsStr += ", "; + if (it != ports.begin()) portsStr += ", "s; portsStr += Poco::NumberFormatter::format(static_cast(*it)); } - deviceConfig()->setString("webtunnel.ports", portsStr); + deviceConfig()->setString("webtunnel.ports"s, portsStr); } else { - message("At least one port must be enabled."); + message("At least one port must be enabled."s); ok = false; } } @@ -254,7 +257,7 @@ void DevicePageController::processForm() { deviceManager()->updateDevice(deviceConfig()); deviceManager()->reconfigureAgents(2000); - request().response().redirect("/devices"); + request().response().redirect("/devices"s); } } else if (action == "cancel") @@ -263,7 +266,7 @@ void DevicePageController::processForm() { deviceManager()->removeDevice(_deviceId); } - request().response().redirect("/devices"); + request().response().redirect("/devices"s); } } } @@ -279,16 +282,16 @@ std::string DevicePageController::deviceStatus() const switch (status) { case WebTunnelAgent::STATUS_DISCONNECTED: - return "disconnected"; + return "disconnected"s; case WebTunnelAgent::STATUS_CONNECTED: - return "connected"; + return "connected"s; case WebTunnelAgent::STATUS_ERROR: - return "error"; + return "error"s; default: - return "unknown"; + return "unknown"s; } } diff --git a/src/FavIcon.cpp b/src/FavIcon.cpp index a6f6820..bf3ebff 100644 --- a/src/FavIcon.cpp +++ b/src/FavIcon.cpp @@ -1,7 +1,7 @@ // // FavIcon.cpp // -// This file has been generated from FavIcon.cpsp on 2021-11-27 20:14:11. +// This file has been generated from FavIcon.cpsp on 2022-03-06 09:57:50. // diff --git a/src/FavIcon.h b/src/FavIcon.h index ff6e584..d3ba585 100644 --- a/src/FavIcon.h +++ b/src/FavIcon.h @@ -1,7 +1,7 @@ // // FavIcon.h // -// This file has been generated from FavIcon.cpsp on 2021-11-27 20:14:11. +// This file has been generated from FavIcon.cpsp on 2022-03-06 09:57:50. // diff --git a/src/GatewayServer.cpp b/src/GatewayServer.cpp index 1bdde93..e9f7ff4 100644 --- a/src/GatewayServer.cpp +++ b/src/GatewayServer.cpp @@ -77,6 +77,9 @@ using Poco::DirectoryWatcher; using Poco::delegate; +using namespace std::string_literals; + + namespace MyDevices { namespace Gateway { @@ -105,7 +108,7 @@ class GatewayRequestHandlerFactory: public HTTPRequestHandlerFactory public: GatewayRequestHandlerFactory(DeviceManager::Ptr pDeviceManager): _pDeviceManager(pDeviceManager), - _logger(Poco::Logger::get("GatewayRequestHandlerFactory")) + _logger(Poco::Logger::get("GatewayRequestHandlerFactory"s)) { } @@ -113,7 +116,7 @@ class GatewayRequestHandlerFactory: public HTTPRequestHandlerFactory { const std::string& uri = request.getURI(); - _logger.debug("%s %s %s", request.getMethod(), uri, request.getVersion()); + _logger.debug("%s %s %s"s, request.getMethod(), uri, request.getVersion()); if (uri == "/") return new LoginPage(_pDeviceManager); @@ -195,23 +198,23 @@ class GatewayServer: public Poco::Util::ServerApplication ServerApplication::defineOptions(options); options.addOption( - Option("help", "h", "Display help information on command line arguments.") + Option("help"s, "h"s, "Display help information on command line arguments."s) .required(false) .repeatable(false) .callback(OptionCallback(this, &GatewayServer::handleHelp))); options.addOption( - Option("config-file", "c", "Load configuration data from a file.") + Option("config-file"s, "c"s, "Load configuration data from a file."s) .required(false) .repeatable(true) - .argument("file") + .argument("file"s) .callback(OptionCallback(this, &GatewayServer::handleConfig))); options.addOption( - Option("define", "D", "Define or override a configuration property.") + Option("define"s, "D"s, "Define or override a configuration property."s) .required(false) .repeatable(true) - .argument("name=value") + .argument("name=value"s) .callback(OptionCallback(this, &GatewayServer::handleDefine))); } @@ -236,18 +239,18 @@ class GatewayServer: public Poco::Util::ServerApplication { HelpFormatter helpFormatter(options()); helpFormatter.setCommand(commandName()); - helpFormatter.setUsage("OPTIONS"); + helpFormatter.setUsage("OPTIONS"s); helpFormatter.setHeader("\n" "macchina.io REMOTE Gateway Server.\n\n" - "Copyright (c) 2015-2021 by Applied Informatics Software Engineering GmbH.\n" + "Copyright (c) 2015-2022 by Applied Informatics Software Engineering GmbH.\n" "All rights reserved.\n\n" "This application is used to connect device web servers in the local\n" "network to the macchina.io REMOTE server in order to make them\n" "accessible remotely.\n\n" - "The following command-line options are supported:"); + "The following command-line options are supported:"s); helpFormatter.setFooter( "For more information, please visit the macchina.io REMOTE " - "website at ." + "website at ."s ); helpFormatter.setIndent(8); helpFormatter.format(std::cout); @@ -271,14 +274,14 @@ class GatewayServer: public Poco::Util::ServerApplication Poco::Net::Context::Ptr createContext(const std::string& prefix) { - std::string cipherList = config().getString(prefix + ".ciphers", "HIGH:!DSS:!aNULL@STRENGTH"); - bool extendedVerification = config().getBool(prefix + ".extendedCertificateVerification", false); - std::string caLocation = config().getString(prefix + ".caLocation", ""); - std::string privateKey = config().getString(prefix + ".privateKey", ""); - std::string certificate = config().getString(prefix + ".certificate", ""); + std::string cipherList = config().getString(prefix + ".ciphers", "HIGH:!DSS:!aNULL@STRENGTH"s); + bool extendedVerification = config().getBool(prefix + ".extendedCertificateVerification"s, false); + std::string caLocation = config().getString(prefix + ".caLocation", ""s); + std::string privateKey = config().getString(prefix + ".privateKey", ""s); + std::string certificate = config().getString(prefix + ".certificate", ""s); Poco::Net::Context::VerificationMode vMode = Poco::Net::Context::VERIFY_RELAXED; - std::string vModeStr = config().getString(prefix + ".verification", ""); + std::string vModeStr = config().getString(prefix + ".verification", ""s); if (vModeStr == "none") vMode = Poco::Net::Context::VERIFY_NONE; else if (vModeStr == "relaxed") @@ -327,14 +330,14 @@ class GatewayServer: public Poco::Util::ServerApplication "\n" " macchina.io REMOTE Gateway %s\n" "\n" - " Copyright (c) 2015-2021 by Applied Informatics Software Engineering GmbH.\n" - " All rights reserved.\n", + " Copyright (c) 2015-2022 by Applied Informatics Software Engineering GmbH.\n" + " All rights reserved.\n"s, U::versionString() ); #if defined(WEBTUNNEL_ENABLE_TLS) - Poco::Net::Context::Ptr pContext = createContext("tls"); - bool acceptUnknownCert = config().getBool("tls.acceptUnknownCertificate", true); + Poco::Net::Context::Ptr pContext = createContext("tls"s); + bool acceptUnknownCert = config().getBool("tls.acceptUnknownCertificate"s, true); Poco::SharedPtr pCertificateHandler; if (acceptUnknownCert) pCertificateHandler = new Poco::Net::AcceptCertificateHandler(false); @@ -344,12 +347,12 @@ class GatewayServer: public Poco::Util::ServerApplication #endif #if defined(WEBTUNNEL_ENABLE_TLS) - _pDeviceManager = new DeviceManager(config(), _pTimer, createContext("webtunnel.https")); + _pDeviceManager = new DeviceManager(config(), _pTimer, createContext("webtunnel.https"s)); #else _pDeviceManager = new DeviceManager(config(), _pTimer); #endif - bool watchRepository = config().getBool("gateway.watchRepository", false); + bool watchRepository = config().getBool("gateway.watchRepository"s, false); if (watchRepository) { _pDirectoryWatcher = new DirectoryWatcher(_pDeviceManager->deviceRepositoryPath()); @@ -358,13 +361,13 @@ class GatewayServer: public Poco::Util::ServerApplication _pDirectoryWatcher->itemModified += delegate(this, &GatewayServer::onItemChanged); } - Poco::UInt16 port = static_cast(config().getInt("gateway.http.port", 8080)); + Poco::UInt16 port = static_cast(config().getInt("gateway.http.port"s, 8080)); if (port != 0) { ServerSocket svs(port); _pHTTPServer = new HTTPServer(new GatewayRequestHandlerFactory(_pDeviceManager), svs, new HTTPServerParams); _pHTTPServer->start(); - logger().information("Web server started on port %hu.", port); + logger().information("Web server started on port %hu."s, port); } waitForTerminationRequest(); diff --git a/src/HeaderLogo.cpp b/src/HeaderLogo.cpp index 43af35f..28d8d0c 100644 --- a/src/HeaderLogo.cpp +++ b/src/HeaderLogo.cpp @@ -1,7 +1,7 @@ // // HeaderLogo.cpp // -// This file has been generated from HeaderLogo.cpsp on 2021-11-27 19:58:16. +// This file has been generated from HeaderLogo.cpsp on 2022-03-06 09:57:49. // diff --git a/src/HeaderLogo.h b/src/HeaderLogo.h index 60032a5..c44c1f6 100644 --- a/src/HeaderLogo.h +++ b/src/HeaderLogo.h @@ -1,7 +1,7 @@ // // HeaderLogo.h // -// This file has been generated from HeaderLogo.cpsp on 2021-11-27 19:58:16. +// This file has been generated from HeaderLogo.cpsp on 2022-03-06 09:57:49. // diff --git a/src/HeaderLogoX2.cpp b/src/HeaderLogoX2.cpp index f1cd47e..f3f69d1 100644 --- a/src/HeaderLogoX2.cpp +++ b/src/HeaderLogoX2.cpp @@ -1,7 +1,7 @@ // // HeaderLogoX2.cpp // -// This file has been generated from HeaderLogoX2.cpsp on 2021-11-27 19:58:16. +// This file has been generated from HeaderLogoX2.cpsp on 2022-03-06 09:57:49. // diff --git a/src/HeaderLogoX2.h b/src/HeaderLogoX2.h index b05f71c..2808ad8 100644 --- a/src/HeaderLogoX2.h +++ b/src/HeaderLogoX2.h @@ -1,7 +1,7 @@ // // HeaderLogoX2.h // -// This file has been generated from HeaderLogoX2.cpsp on 2021-11-27 19:58:16. +// This file has been generated from HeaderLogoX2.cpsp on 2022-03-06 09:57:49. // diff --git a/src/IndexPage.cpp b/src/IndexPage.cpp index cfe9e14..ed31944 100644 --- a/src/IndexPage.cpp +++ b/src/IndexPage.cpp @@ -1,7 +1,7 @@ // // IndexPage.cpp // -// This file has been generated from IndexPage.cpsp on 2021-11-27 20:06:35. +// This file has been generated from IndexPage.cpsp on 2022-03-06 10:57:18. // @@ -46,8 +46,7 @@ IndexPageController ctrl(context(), request, form); if (response.sent()) return; if (ctrl.mustRedirect()) return; -pageTemplate.set("title", "Gateway"); -pageTemplate.set("domain", ctrl.defaultDomain()); +pageTemplate.set("title"s, "Gateway"s); std::ostream& _responseStream = response.send(); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; @@ -109,7 +108,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << "  \n"; responseStream << " "; -#line 47 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 46 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( ctrl.username() ); responseStream << "\n"; responseStream << "  \n"; @@ -122,21 +121,21 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; responseStream << "\n"; responseStream << "\n"; -#line 58 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 57 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" if (!ctrl.message().empty()) { responseStream << "\n"; responseStream << "
\n"; responseStream << " "; -#line 60 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 59 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( U::htmlize(ctrl.message()) ); responseStream << "\n"; responseStream << "
\n"; -#line 62 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 61 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" } responseStream << "\n"; responseStream << "
\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << "\n"; @@ -157,66 +156,66 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " \n"; responseStream << "
\n"; responseStream << " "; -#line 85 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 84 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" bool even = false; responseStream << "\n"; responseStream << " "; -#line 88 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 87 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" for (std::vector::const_iterator it = ctrl.devices().begin(); it != ctrl.devices().end(); ++it) { responseStream << "\n"; responseStream << " "; -#line 89 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 88 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" Poco::AutoPtr pDeviceConfig = ctrl.deviceManager()->deviceConfiguration(*it); responseStream << "\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; responseStream << " "; -#line 119 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 118 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" even = !even; responseStream << "\n"; responseStream << " "; -#line 122 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 121 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" } responseStream << " "; responseStream << "\n"; responseStream << " \n"; responseStream << "
ID"; -#line 90 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 89 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" responseStream << ( U::htmlize(ctrl.deviceId()) ); responseStream << "
Status"; -#line 117 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" +#line 116 "/Users/guenter/ws/git/my-devices/gateway/src/DevicePage.cpsp" responseStream << ( ctrl.deviceStatus() ); responseStream << "
\n"; responseStream << " \n"; responseStream << " "; -#line 95 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 94 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( U::htmlize(pDeviceConfig->getString("webtunnel.deviceName", "")) ); responseStream << "\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " "; -#line 99 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 98 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( U::htmlize(pDeviceConfig->getString("webtunnel.deviceId", "")) ); responseStream << "\n"; responseStream << " \n"; responseStream << " "; -#line 102 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 101 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( U::htmlize(pDeviceConfig->getString("webtunnel.host", "")) ); responseStream << "\n"; responseStream << " \n"; responseStream << " "; -#line 105 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 104 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( ctrl.formatPorts(pDeviceConfig) ); responseStream << "\n"; responseStream << " \n"; responseStream << " "; -#line 108 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" +#line 107 "/Users/guenter/ws/git/my-devices/gateway/src/IndexPage.cpsp" responseStream << ( ctrl.deviceStatus(*it) ); responseStream << "\n"; responseStream << " \n"; responseStream << " getString("webtunnel.deviceName", "")) ); responseStream << "')\">\n"; responseStream << " \n"; responseStream << "
\n"; @@ -266,10 +265,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " "; #line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" responseStream << ( pageTemplate["softwareVersion"] ); - responseStream << " | © 2015-2021 by Applied Informatics GmbH | Gateway Domain: "; -#line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" - responseStream << ( U::htmlize(pageTemplate["domain"]) ); - responseStream << "\n"; + responseStream << " | © 2015-2022 by Applied Informatics GmbH\n"; responseStream << " \n"; responseStream << " \n"; responseStream << " \n"; diff --git a/src/IndexPage.cpsp b/src/IndexPage.cpsp index dbae90c..89efbdb 100644 --- a/src/IndexPage.cpsp +++ b/src/IndexPage.cpsp @@ -14,8 +14,7 @@ IndexPageController ctrl(context(), request, form); if (response.sent()) return; if (ctrl.mustRedirect()) return; -pageTemplate.set("title", "Gateway"); -pageTemplate.set("domain", ctrl.defaultDomain()); +pageTemplate.set("title"s, "Gateway"s); %> <%@ include file="../html/header.inc" %> diff --git a/src/IndexPage.h b/src/IndexPage.h index 04fd3a1..db9767d 100644 --- a/src/IndexPage.h +++ b/src/IndexPage.h @@ -1,7 +1,7 @@ // // IndexPage.h // -// This file has been generated from IndexPage.cpsp on 2021-11-27 20:06:35. +// This file has been generated from IndexPage.cpsp on 2022-03-06 10:57:18. // diff --git a/src/IndexPageController.cpp b/src/IndexPageController.cpp index f65171d..550c9f2 100644 --- a/src/IndexPageController.cpp +++ b/src/IndexPageController.cpp @@ -17,22 +17,23 @@ #include -namespace MyDevices { -namespace Gateway { +using namespace std::string_literals; +namespace MyDevices { +namespace Gateway { IndexPageController::IndexPageController(DeviceManager::Ptr pDeviceManager, const Poco::Net::HTTPServerRequest& request, const Poco::Net::HTMLForm& form): PageController(pDeviceManager, request, form) { - WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway", request); - if (!pSession || !pSession->has("username")) + WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway"s, request); + if (!pSession || !pSession->has("username"s)) { request.response().redirect("/"); return; } - username(pSession->getValue("username")); + username(pSession->getValue("username"s)); csrfToken(pSession->csrfToken()); processForm(); _devices = pDeviceManager->enumerateDevices(); @@ -46,16 +47,16 @@ IndexPageController::~IndexPageController() void IndexPageController::processForm() { - std::string action = form().get("action", ""); - std::string target = form().get("target", ""); - std::string token = form().get("csrfToken", ""); + const std::string action = form().get("action"s, ""s); + const std::string target = form().get("target"s, ""s); + const std::string token = form().get("csrfToken"s, ""s); if (token == csrfToken()) { try { if (action == "add") { - request().response().redirect("/create"); + request().response().redirect("/create"s); } else if (action == "remove") { @@ -74,13 +75,13 @@ void IndexPageController::processForm() std::string IndexPageController::formatPorts(Poco::AutoPtr pDeviceConfig) const { - unsigned httpPort = pDeviceConfig->getUInt("webtunnel.httpPort", 0); - unsigned sshPort = pDeviceConfig->getUInt("webtunnel.sshPort", 0); - unsigned vncPort = pDeviceConfig->getUInt("webtunnel.vncPort", 0); - unsigned rdpPort = pDeviceConfig->getUInt("webtunnel.rdpPort", 0); - bool httpsEnable = pDeviceConfig->getBool("webtunnel.https.enable", false); - std::string portsStr = pDeviceConfig->getString("webtunnel.ports", ""); - Poco::StringTokenizer portsTok(portsStr, ",;", Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); + const unsigned httpPort = pDeviceConfig->getUInt("webtunnel.httpPort"s, 0); + const unsigned sshPort = pDeviceConfig->getUInt("webtunnel.sshPort"s, 0); + const unsigned vncPort = pDeviceConfig->getUInt("webtunnel.vncPort"s, 0); + const unsigned rdpPort = pDeviceConfig->getUInt("webtunnel.rdpPort"s, 0); + const bool httpsEnable = pDeviceConfig->getBool("webtunnel.https.enable"s, false); + const std::string portsStr = pDeviceConfig->getString("webtunnel.ports"s, ""s); + Poco::StringTokenizer portsTok(portsStr, ",;"s, Poco::StringTokenizer::TOK_TRIM | Poco::StringTokenizer::TOK_IGNORE_EMPTY); std::set ports; for (Poco::StringTokenizer::Iterator it = portsTok.begin(); it != portsTok.end(); ++it) { @@ -120,16 +121,16 @@ std::string IndexPageController::deviceStatus(const std::string& id) const switch (status) { case WebTunnelAgent::STATUS_DISCONNECTED: - return "disconnected"; + return "disconnected"s; case WebTunnelAgent::STATUS_CONNECTED: - return "connected"; + return "connected"s; case WebTunnelAgent::STATUS_ERROR: - return "error"; + return "error"s; default: - return "unknown"; + return "unknown"s; } } diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp index 227edc8..480fa07 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp @@ -1,7 +1,7 @@ // // LoginPage.cpp // -// This file has been generated from LoginPage.cpsp on 2021-11-27 20:06:35. +// This file has been generated from LoginPage.cpsp on 2022-03-06 10:00:36. // @@ -46,7 +46,6 @@ LoginPageController ctrl(context(), request, form); if (ctrl.mustRedirect()) return; pageTemplate.set("title", "Gateway"); -pageTemplate.set("domain", ctrl.defaultDomain()); std::ostream& _responseStream = response.send(); Poco::DeflatingOutputStream _gzipStream(_responseStream, Poco::DeflatingStreamBuf::STREAM_GZIP, 1); std::ostream& responseStream = _compressResponse ? _gzipStream : _responseStream; @@ -83,15 +82,15 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << "
\n"; // end include html/header.inc responseStream << "\n"; -#line 22 "/Users/guenter/ws/git/my-devices/gateway/src/LoginPage.cpsp" +#line 21 "/Users/guenter/ws/git/my-devices/gateway/src/LoginPage.cpsp" if (!ctrl.message().empty()) { responseStream << "\n"; responseStream << "
\n"; responseStream << " "; -#line 24 "/Users/guenter/ws/git/my-devices/gateway/src/LoginPage.cpsp" +#line 23 "/Users/guenter/ws/git/my-devices/gateway/src/LoginPage.cpsp" responseStream << ( U::htmlize(ctrl.message()) ); responseStream << "\n"; responseStream << "
\n"; -#line 26 "/Users/guenter/ws/git/my-devices/gateway/src/LoginPage.cpsp" +#line 25 "/Users/guenter/ws/git/my-devices/gateway/src/LoginPage.cpsp" } responseStream << "\n"; responseStream << "
\n"; responseStream << "
\n"; @@ -130,10 +129,7 @@ pageTemplate.set("domain", ctrl.defaultDomain()); responseStream << " "; #line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" responseStream << ( pageTemplate["softwareVersion"] ); - responseStream << " | © 2015-2021 by Applied Informatics GmbH | Gateway Domain: "; -#line 6 "/Users/guenter/ws/git/my-devices/gateway/html/footer.inc" - responseStream << ( U::htmlize(pageTemplate["domain"]) ); - responseStream << "\n"; + responseStream << " | © 2015-2022 by Applied Informatics GmbH\n"; responseStream << "
\n"; responseStream << "
\n"; responseStream << " \n"; diff --git a/src/LoginPage.cpsp b/src/LoginPage.cpsp index c4cd46a..a55a44b 100644 --- a/src/LoginPage.cpsp +++ b/src/LoginPage.cpsp @@ -14,7 +14,6 @@ LoginPageController ctrl(context(), request, form); if (ctrl.mustRedirect()) return; pageTemplate.set("title", "Gateway"); -pageTemplate.set("domain", ctrl.defaultDomain()); %> <%@ include file="../html/header.inc" %> diff --git a/src/LoginPage.h b/src/LoginPage.h index 75ec3b6..226aae8 100644 --- a/src/LoginPage.h +++ b/src/LoginPage.h @@ -1,7 +1,7 @@ // // LoginPage.h // -// This file has been generated from LoginPage.cpsp on 2021-11-27 20:06:35. +// This file has been generated from LoginPage.cpsp on 2022-03-06 10:00:36. // diff --git a/src/LoginPageController.cpp b/src/LoginPageController.cpp index f60ade7..665606d 100644 --- a/src/LoginPageController.cpp +++ b/src/LoginPageController.cpp @@ -16,34 +16,38 @@ #include "Poco/Net/HTMLForm.h" #include "Poco/Net/OAuth20Credentials.h" #include "Poco/Util/JSONConfiguration.h" +#include "Poco/Dynamic/Var.h" #include "Poco/NullStream.h" #include "Poco/StreamCopier.h" +using namespace std::string_literals; + + namespace MyDevices { namespace Gateway { LoginPageController::LoginPageController(DeviceManager::Ptr pDeviceManager, const Poco::Net::HTTPServerRequest& request, const Poco::Net::HTMLForm& form): PageController(pDeviceManager, request, form), - _logger(Poco::Logger::get("LoginPageController")) + _logger(Poco::Logger::get("LoginPageController"s)) { - std::string action = form.get("action", ""); - WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway", request); + const std::string action = form.get("action"s, ""s); + WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway"s, request); if (action == "logout") { if (pSession) pDeviceManager->webSessionManager().remove(pSession); return; } - else if (pSession && pSession->has("username")) + else if (pSession && pSession->has("username"s)) { - _logger.debug("Valid session found, redirecting."); - request.response().redirect("/devices"); + _logger.debug("Valid session found, redirecting."s); + request.response().redirect("/devices"s); return; } - else if (action == "login") + else if (action == "login"s) { - _logger.debug("Processing login form..."); + _logger.debug("Processing login form..."s); processForm(); } } @@ -56,48 +60,58 @@ LoginPageController::~LoginPageController() void LoginPageController::processForm() { - std::string username = form().get("username", ""); - std::string password = form().get("password", ""); + const std::string username = form().get("username"s, ""s); + const std::string password = form().get("password"s, ""s); try { - Poco::URI reflectorURI = Poco::URI(deviceManager()->config()->getString("webtunnel.reflectorURI")); + Poco::URI reflectorURI = Poco::URI(deviceManager()->config()->getString("webtunnel.reflectorURI"s)); Poco::SharedPtr pHTTPClientSession = Poco::Net::HTTPSessionFactory::defaultFactory().createClientSession(reflectorURI); - Poco::Net::HTTPRequest apiRequest(Poco::Net::HTTPRequest::HTTP_GET, "/my-devices/api/token", Poco::Net::HTTPMessage::HTTP_1_1); + Poco::Net::HTTPRequest apiRequest(Poco::Net::HTTPRequest::HTTP_GET, "/my-devices/api/token"s, Poco::Net::HTTPMessage::HTTP_1_1); Poco::Net::HTMLForm params; - params.set("username", username); - params.set("password", password); - params.set("application", "RemoteManagerGateway"); + params.set("username"s, username); + params.set("password"s, password); + params.set("application"s, "RemoteManagerGateway"s); params.prepareSubmit(apiRequest); - _logger.debug("Validating credentials with macchina.io REMOTE server at %s.", reflectorURI.toString()); + _logger.debug("Validating credentials with macchina.io REMOTE server at %s."s, reflectorURI.toString()); std::ostream& requestStream = pHTTPClientSession->sendRequest(apiRequest); params.write(requestStream); Poco::Net::HTTPResponse apiResponse; std::istream& responseStream = pHTTPClientSession->receiveResponse(apiResponse); if (apiResponse.getStatus() == Poco::Net::HTTPResponse::HTTP_OK) { - _logger.information("Login successful for user %s.", username); + _logger.information("Login successful for user %s."s, username); Poco::Util::JSONConfiguration json(responseStream); std::string token = json.getString("token"); - std::string domain = deviceManager()->config()->getString("webtunnel.domain"); - if (verifyDomainAccess(reflectorURI, token, domain)) + std::string domain = deviceManager()->config()->getString("webtunnel.domain"s, "00000000-0000-0000-0000-000000000000"s); + if (domain == "00000000-0000-0000-0000-000000000000" || verifyDomainAccess(reflectorURI, token, domain)) { - int sessionTimeout = deviceManager()->config()->getInt("gateway.sessionTimeout", 3600); - WebSession::Ptr pWebSession = deviceManager()->webSessionManager().create("rmgateway", request(), sessionTimeout); + int sessionTimeout = deviceManager()->config()->getInt("gateway.sessionTimeout"s, 3600); + WebSession::Ptr pWebSession = deviceManager()->webSessionManager().create("rmgateway"s, request(), sessionTimeout); pWebSession->set("username", username); pWebSession->set("token", token); - request().response().redirect("/devices"); + + if (domain == "00000000-0000-0000-0000-000000000000") + { + const std::string defaultDomain = requestDefaultDomain(reflectorURI, username, token); + if (!defaultDomain.empty()) + { + pWebSession->set("domain"s, defaultDomain); + } + } + + request().response().redirect("/devices"s); } else { - _logger.warning("User %s does not have access to gateway domain %s.", username, domain); - message(Poco::format("User account %s does not have access to the gateway's domain %s.", username, domain)); + _logger.warning("User %s does not have access to gateway domain %s."s, username, domain); + message(Poco::format("User account %s does not have access to the gateway's domain %s."s, username, domain)); } } else { - _logger.warning("Login failed for user %s.", username); - message("The given username is not known, the password is wrong or the account has been disabled."); + _logger.warning("Login failed for user %s."s, username); + message("The given username is not known, the password is wrong or the account has been disabled."s); } Poco::NullOutputStream nullStream; Poco::StreamCopier::copyStream(responseStream, nullStream); @@ -113,11 +127,11 @@ bool LoginPageController::verifyDomainAccess(const Poco::URI& reflectorURI, cons { Poco::SharedPtr pHTTPClientSession = Poco::Net::HTTPSessionFactory::defaultFactory().createClientSession(reflectorURI); std::string encodedDomain; - Poco::URI::encode(domain, "?#", encodedDomain); - Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, Poco::format("/my-devices/api/domains/%s", encodedDomain), Poco::Net::HTTPMessage::HTTP_1_1); + Poco::URI::encode(domain, "?#"s, encodedDomain); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, Poco::format("/my-devices/api/domains/%s"s, encodedDomain), Poco::Net::HTTPMessage::HTTP_1_1); Poco::Net::OAuth20Credentials creds(token); creds.authenticate(request); - _logger.debug("Validating domain access with macchina.io REMOTE server at %s.", reflectorURI.toString()); + _logger.debug("Validating domain access with macchina.io REMOTE server at %s."s, reflectorURI.toString()); pHTTPClientSession->sendRequest(request); Poco::Net::HTTPResponse response; std::istream& responseStream = pHTTPClientSession->receiveResponse(response); @@ -127,4 +141,34 @@ bool LoginPageController::verifyDomainAccess(const Poco::URI& reflectorURI, cons } +std::string LoginPageController::requestDefaultDomain(const Poco::URI& reflectorURI, const std::string& username, const std::string& token) +{ + std::string domain; + Poco::SharedPtr pHTTPClientSession = Poco::Net::HTTPSessionFactory::defaultFactory().createClientSession(reflectorURI); + std::string encodedUsername; + Poco::URI::encode(username, "?#"s, encodedUsername); + Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, Poco::format("/my-devices/api/users/%s/attributes/domain"s, encodedUsername), Poco::Net::HTTPMessage::HTTP_1_1); + Poco::Net::OAuth20Credentials creds(token); + creds.authenticate(request); + _logger.debug("Requesting default domain for user %s on server at %s."s, username, reflectorURI.toString()); + pHTTPClientSession->sendRequest(request); + Poco::Net::HTTPResponse response; + std::istream& responseStream = pHTTPClientSession->receiveResponse(response); + if (response.getStatus() == Poco::Net::HTTPResponse::HTTP_OK) + { + std::string json; + Poco::StreamCopier::copyToString(responseStream, json); + Poco::Dynamic::Var var = Poco::Dynamic::Var::parse(json); + domain = var.convert(); + _logger.debug("Default domain for user %s is %s."s, username, domain); + } + else + { + Poco::NullOutputStream nullStream; + Poco::StreamCopier::copyStream(responseStream, nullStream); + } + return domain; +} + + } } // namespace MyDevices::Gateway diff --git a/src/LoginPageController.h b/src/LoginPageController.h index 6fc9138..237edfc 100644 --- a/src/LoginPageController.h +++ b/src/LoginPageController.h @@ -32,6 +32,7 @@ class LoginPageController: public PageController protected: void processForm(); bool verifyDomainAccess(const Poco::URI& reflectorURI, const std::string& token, const std::string& domain); + std::string requestDefaultDomain(const Poco::URI& reflectorURI, const std::string& username, const std::string& token); private: Poco::Logger& _logger; diff --git a/src/MinusIcon.cpp b/src/MinusIcon.cpp index 846f90f..1fc51ed 100644 --- a/src/MinusIcon.cpp +++ b/src/MinusIcon.cpp @@ -1,7 +1,7 @@ // // MinusIcon.cpp // -// This file has been generated from MinusIcon.cpsp on 2021-11-27 19:58:16. +// This file has been generated from MinusIcon.cpsp on 2022-03-06 09:57:47. // diff --git a/src/MinusIcon.h b/src/MinusIcon.h index 7b192dd..3635629 100644 --- a/src/MinusIcon.h +++ b/src/MinusIcon.h @@ -1,7 +1,7 @@ // // MinusIcon.h // -// This file has been generated from MinusIcon.cpsp on 2021-11-27 19:58:16. +// This file has been generated from MinusIcon.cpsp on 2022-03-06 09:57:47. // diff --git a/src/MinusIconX2.cpp b/src/MinusIconX2.cpp index 21a1282..c25ed79 100644 --- a/src/MinusIconX2.cpp +++ b/src/MinusIconX2.cpp @@ -1,7 +1,7 @@ // // MinusIconX2.cpp // -// This file has been generated from MinusIconX2.cpsp on 2021-11-27 19:58:16. +// This file has been generated from MinusIconX2.cpsp on 2022-03-06 09:57:47. // diff --git a/src/MinusIconX2.h b/src/MinusIconX2.h index ca78afb..de0258a 100644 --- a/src/MinusIconX2.h +++ b/src/MinusIconX2.h @@ -1,7 +1,7 @@ // // MinusIconX2.h // -// This file has been generated from MinusIconX2.cpsp on 2021-11-27 19:58:16. +// This file has been generated from MinusIconX2.cpsp on 2022-03-06 09:57:47. // diff --git a/src/PageController.cpp b/src/PageController.cpp index 92f6f28..22fe5fa 100644 --- a/src/PageController.cpp +++ b/src/PageController.cpp @@ -11,6 +11,9 @@ #include "PageController.h" +using namespace std::string_literals; + + namespace MyDevices { namespace Gateway { @@ -42,7 +45,7 @@ void PageController::message(const std::string& text, const std::string& message std::string PageController::defaultDomain() const { - return _pDeviceManager->config()->getString("webtunnel.domain", ""); + return _pDeviceManager->config()->getString("webtunnel.domain"s, ""s); } diff --git a/src/PlusIcon.cpp b/src/PlusIcon.cpp index 2260d08..2ca4f2e 100644 --- a/src/PlusIcon.cpp +++ b/src/PlusIcon.cpp @@ -1,7 +1,7 @@ // // PlusIcon.cpp // -// This file has been generated from PlusIcon.cpsp on 2021-11-27 19:58:16. +// This file has been generated from PlusIcon.cpsp on 2022-03-06 09:57:48. // diff --git a/src/PlusIcon.h b/src/PlusIcon.h index fba11f9..4a6efa4 100644 --- a/src/PlusIcon.h +++ b/src/PlusIcon.h @@ -1,7 +1,7 @@ // // PlusIcon.h // -// This file has been generated from PlusIcon.cpsp on 2021-11-27 19:58:16. +// This file has been generated from PlusIcon.cpsp on 2022-03-06 09:57:48. // diff --git a/src/PlusIconX2.cpp b/src/PlusIconX2.cpp index 784d557..8c89d0b 100644 --- a/src/PlusIconX2.cpp +++ b/src/PlusIconX2.cpp @@ -1,7 +1,7 @@ // // PlusIconX2.cpp // -// This file has been generated from PlusIconX2.cpsp on 2021-11-27 19:58:16. +// This file has been generated from PlusIconX2.cpsp on 2022-03-06 09:57:48. // diff --git a/src/PlusIconX2.h b/src/PlusIconX2.h index 6717775..c5d2e20 100644 --- a/src/PlusIconX2.h +++ b/src/PlusIconX2.h @@ -1,7 +1,7 @@ // // PlusIconX2.h // -// This file has been generated from PlusIconX2.cpsp on 2021-11-27 19:58:16. +// This file has been generated from PlusIconX2.cpsp on 2022-03-06 09:57:48. // diff --git a/src/StatusJSON.cpp b/src/StatusJSON.cpp index f22b629..599a704 100644 --- a/src/StatusJSON.cpp +++ b/src/StatusJSON.cpp @@ -1,7 +1,7 @@ // // StatusJSON.cpp // -// This file has been generated from StatusJSON.cpsp on 2021-11-27 20:06:35. +// This file has been generated from StatusJSON.cpsp on 2022-03-06 10:00:36. // diff --git a/src/StatusJSON.h b/src/StatusJSON.h index 4251f49..554ad4b 100644 --- a/src/StatusJSON.h +++ b/src/StatusJSON.h @@ -1,7 +1,7 @@ // // StatusJSON.h // -// This file has been generated from StatusJSON.cpsp on 2021-11-27 20:06:35. +// This file has been generated from StatusJSON.cpsp on 2022-03-06 10:00:36. // diff --git a/src/StatusJSONController.cpp b/src/StatusJSONController.cpp index 6b4f600..09a48ec 100644 --- a/src/StatusJSONController.cpp +++ b/src/StatusJSONController.cpp @@ -12,6 +12,9 @@ #include "Poco/Net/HTTPServerResponse.h" +using namespace std::string_literals; + + namespace MyDevices { namespace Gateway { @@ -19,8 +22,8 @@ namespace Gateway { StatusJSONController::StatusJSONController(DeviceManager::Ptr pDeviceManager, const Poco::Net::HTTPServerRequest& request, const Poco::Net::HTMLForm& form): PageController(pDeviceManager, request, form) { - WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway", request); - if (!pSession || !pSession->has("username")) + WebSession::Ptr pSession = pDeviceManager->webSessionManager().find("rmgateway"s, request); + if (!pSession || !pSession->has("username"s)) { return; } @@ -44,16 +47,16 @@ std::string StatusJSONController::deviceStatus(const std::string& id) const switch (status) { case WebTunnelAgent::STATUS_DISCONNECTED: - return "disconnected"; + return "disconnected"s; case WebTunnelAgent::STATUS_CONNECTED: - return "connected"; + return "connected"s; case WebTunnelAgent::STATUS_ERROR: - return "error"; + return "error"s; default: - return "unknown"; + return "unknown"s; } } diff --git a/src/Stylesheet.cpp b/src/Stylesheet.cpp index eb3074d..ffca7bb 100644 --- a/src/Stylesheet.cpp +++ b/src/Stylesheet.cpp @@ -1,7 +1,7 @@ // // Stylesheet.cpp // -// This file has been generated from Stylesheet.cpsp on 2021-11-27 20:14:11. +// This file has been generated from Stylesheet.cpsp on 2022-03-06 09:57:50. // diff --git a/src/Stylesheet.h b/src/Stylesheet.h index 90ddd57..6b19eea 100644 --- a/src/Stylesheet.h +++ b/src/Stylesheet.h @@ -1,7 +1,7 @@ // // Stylesheet.h // -// This file has been generated from Stylesheet.cpsp on 2021-11-27 20:14:11. +// This file has been generated from Stylesheet.cpsp on 2022-03-06 09:57:50. // diff --git a/src/Version.h b/src/Version.h index f1fc4a8..e316b06 100644 --- a/src/Version.h +++ b/src/Version.h @@ -19,7 +19,7 @@ namespace Gateway { enum GatewayVersion { GATEWAY_VERSION_MAJOR = 2, - GATEWAY_VERSION_MINOR = 2, + GATEWAY_VERSION_MINOR = 3, GATEWAY_VERSION_PATCH = 0 }; diff --git a/src/WebTunnelAgent.cpp b/src/WebTunnelAgent.cpp index d98e356..5230bdd 100644 --- a/src/WebTunnelAgent.cpp +++ b/src/WebTunnelAgent.cpp @@ -443,7 +443,7 @@ void WebTunnelAgent::scheduleReconnect() retryDelay += _random.next(250*_retryDelay); Poco::Clock nextClock; nextClock += retryDelay; - _logger.information(Poco::format("Will reconnect in %.2f seconds."s, retryDelay/1000000.0)); + _logger.information("Will reconnect in %.2f seconds."s, retryDelay/1000000.0); _pReconnectTask = new ReconnectTask(Ptr(this, true)); _pTimer->schedule(_pReconnectTask, nextClock); }