From 83d1771fa8f473a9963420530b516816b5248fbc Mon Sep 17 00:00:00 2001 From: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> Date: Fri, 10 Mar 2023 11:20:32 -0500 Subject: [PATCH 1/2] use single endpoint for web assets (cherry picked from commit 61a21b2bed2f6b34e1f29192e9a85d511bd5df01) --- src/confighttp.cpp | 83 +++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 53 deletions(-) diff --git a/src/confighttp.cpp b/src/confighttp.cpp index 5f54aebb8fb..8c6d1818fdc 100644 --- a/src/confighttp.cpp +++ b/src/confighttp.cpp @@ -230,44 +230,23 @@ void getTroubleshootingPage(resp_https_t response, req_https_t request) { response->write(header + content); } -void getFaviconImage(resp_https_t response, req_https_t request) { - // todo - combine function with getSunshineLogoImage and possibly getNodeModules - // todo - use mime_types map - print_req(request); - - std::ifstream in(WEB_DIR "images/favicon.ico", std::ios::binary); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "image/x-icon"); - response->write(SimpleWeb::StatusCode::success_ok, in, headers); -} - -void getSunshineLogoImage(resp_https_t response, req_https_t request) { - // todo - combine function with getFaviconImage and possibly getNodeModules - // todo - use mime_types map - print_req(request); - - std::ifstream in(WEB_DIR "images/logo-sunshine-45.png", std::ios::binary); - SimpleWeb::CaseInsensitiveMultimap headers; - headers.emplace("Content-Type", "image/png"); - response->write(SimpleWeb::StatusCode::success_ok, in, headers); -} - bool isChildPath(fs::path const &base, fs::path const &query) { auto relPath = fs::relative(base, query); return *(relPath.begin()) != fs::path(".."); } -void getNodeModules(resp_https_t response, req_https_t request) { +void getServerAsset(resp_https_t response, req_https_t request) { print_req(request); fs::path webDirPath(WEB_DIR); fs::path nodeModulesPath(webDirPath / "node_modules"); + fs::path imagesPath(webDirPath / "images"); // .relative_path is needed to shed any leading slash that might exist in the request path auto filePath = fs::weakly_canonical(webDirPath / fs::path(request->path).relative_path()); - // Don't do anything if file does not exist or is outside the node_modules directory - if(!isChildPath(filePath, nodeModulesPath)) { - BOOST_LOG(warning) << "Someone requested a path " << filePath << " that is outside the node_modules folder"; + // Don't do anything if file does not exist or is outside the web directory + if(!isChildPath(filePath, nodeModulesPath) && !isChildPath(filePath, imagesPath)) { + BOOST_LOG(warning) << "Someone requested a path " << filePath << " that is outside the web directory"; response->write(SimpleWeb::StatusCode::client_error_bad_request, "Bad Request"); } else if(!fs::exists(filePath)) { @@ -706,33 +685,31 @@ void start() { auto port_https = map_port(PORT_HTTPS); https_server_t server { config::nvhttp.cert, config::nvhttp.pkey }; - server.default_resource["GET"] = not_found; - server.resource["^/$"]["GET"] = getIndexPage; - server.resource["^/pin$"]["GET"] = getPinPage; - server.resource["^/apps$"]["GET"] = getAppsPage; - server.resource["^/clients$"]["GET"] = getClientsPage; - server.resource["^/config$"]["GET"] = getConfigPage; - server.resource["^/password$"]["GET"] = getPasswordPage; - server.resource["^/welcome$"]["GET"] = getWelcomePage; - server.resource["^/troubleshooting$"]["GET"] = getTroubleshootingPage; - server.resource["^/api/pin$"]["POST"] = savePin; - server.resource["^/api/apps$"]["GET"] = getApps; - server.resource["^/api/logs$"]["GET"] = getLogs; - server.resource["^/api/apps$"]["POST"] = saveApp; - server.resource["^/api/config$"]["GET"] = getConfig; - server.resource["^/api/config$"]["POST"] = saveConfig; - server.resource["^/api/restart$"]["POST"] = restart; - server.resource["^/api/password$"]["POST"] = savePassword; - server.resource["^/api/apps/([0-9]+)$"]["DELETE"] = deleteApp; - server.resource["^/api/clients/unpair$"]["POST"] = unpairAll; - server.resource["^/api/apps/close$"]["POST"] = closeApp; - server.resource["^/api/covers/upload$"]["POST"] = uploadCover; - server.resource["^/images/favicon.ico$"]["GET"] = getFaviconImage; - server.resource["^/images/logo-sunshine-45.png$"]["GET"] = getSunshineLogoImage; - server.resource["^/node_modules\\/.+$"]["GET"] = getNodeModules; - server.config.reuse_address = true; - server.config.address = "0.0.0.0"s; - server.config.port = port_https; + server.default_resource["GET"] = not_found; + server.resource["^/$"]["GET"] = getIndexPage; + server.resource["^/pin$"]["GET"] = getPinPage; + server.resource["^/apps$"]["GET"] = getAppsPage; + server.resource["^/clients$"]["GET"] = getClientsPage; + server.resource["^/config$"]["GET"] = getConfigPage; + server.resource["^/password$"]["GET"] = getPasswordPage; + server.resource["^/welcome$"]["GET"] = getWelcomePage; + server.resource["^/troubleshooting$"]["GET"] = getTroubleshootingPage; + server.resource["^/api/pin$"]["POST"] = savePin; + server.resource["^/api/apps$"]["GET"] = getApps; + server.resource["^/api/logs$"]["GET"] = getLogs; + server.resource["^/api/apps$"]["POST"] = saveApp; + server.resource["^/api/config$"]["GET"] = getConfig; + server.resource["^/api/config$"]["POST"] = saveConfig; + server.resource["^/api/restart$"]["POST"] = restart; + server.resource["^/api/password$"]["POST"] = savePassword; + server.resource["^/api/apps/([0-9]+)$"]["DELETE"] = deleteApp; + server.resource["^/api/clients/unpair$"]["POST"] = unpairAll; + server.resource["^/api/apps/close$"]["POST"] = closeApp; + server.resource["^/api/covers/upload$"]["POST"] = uploadCover; + server.resource["^/(node_modules)|(images)\\/.+$"]["GET"] = getServerAsset; + server.config.reuse_address = true; + server.config.address = "0.0.0.0"s; + server.config.port = port_https; auto accept_and_run = [&](auto *server) { try { From fd4a5e838c45071e12886947359496c687839838 Mon Sep 17 00:00:00 2001 From: Daniel <790119+DanTheMan827@users.noreply.github.com> Date: Sun, 26 Feb 2023 11:22:26 -0600 Subject: [PATCH 2/2] PWA icons and SVG logo --- docs/source/conf.py | 2 +- .../common/assets/web/header-no-nav.html | 15 ++++++ src_assets/common/assets/web/header.html | 17 +++++- .../web/images/android-chrome-192x192.png | Bin 0 -> 18152 bytes .../web/images/android-chrome-512x512.png | Bin 0 -> 55942 bytes .../images/apple-touch-icon-precomposed.png | Bin 0 -> 10326 bytes .../assets/web/images/apple-touch-icon.png | Bin 0 -> 9045 bytes .../assets/web/images/browserconfig.xml | 12 +++++ .../assets/web/images/favicon-16x16.png | Bin 0 -> 1099 bytes .../assets/web/images/favicon-194x194.png | Bin 0 -> 12603 bytes .../assets/web/images/favicon-32x32.png | Bin 0 -> 1838 bytes .../assets/web/images/logo-sunshine-45.png | Bin 2115 -> 0 bytes .../assets/web/images/mstile-144x144.png | Bin 0 -> 9062 bytes .../assets/web/images/mstile-150x150.png | Bin 0 -> 8616 bytes .../assets/web/images/mstile-310x150.png | Bin 0 -> 9231 bytes .../assets/web/images/mstile-310x310.png | Bin 0 -> 19299 bytes .../common/assets/web/images/mstile-70x70.png | Bin 0 -> 5958 bytes .../assets/web/images/safari-pinned-tab.svg | 51 ++++++++++++++++++ .../common/assets/web/images/site.webmanifest | 19 +++++++ .../common/assets/web/images/sunshine.svg | 27 ++++++++++ 20 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 src_assets/common/assets/web/images/android-chrome-192x192.png create mode 100644 src_assets/common/assets/web/images/android-chrome-512x512.png create mode 100644 src_assets/common/assets/web/images/apple-touch-icon-precomposed.png create mode 100644 src_assets/common/assets/web/images/apple-touch-icon.png create mode 100644 src_assets/common/assets/web/images/browserconfig.xml create mode 100644 src_assets/common/assets/web/images/favicon-16x16.png create mode 100644 src_assets/common/assets/web/images/favicon-194x194.png create mode 100644 src_assets/common/assets/web/images/favicon-32x32.png delete mode 100644 src_assets/common/assets/web/images/logo-sunshine-45.png create mode 100644 src_assets/common/assets/web/images/mstile-144x144.png create mode 100644 src_assets/common/assets/web/images/mstile-150x150.png create mode 100644 src_assets/common/assets/web/images/mstile-310x150.png create mode 100644 src_assets/common/assets/web/images/mstile-310x310.png create mode 100644 src_assets/common/assets/web/images/mstile-70x70.png create mode 100644 src_assets/common/assets/web/images/safari-pinned-tab.svg create mode 100644 src_assets/common/assets/web/images/site.webmanifest create mode 100644 src_assets/common/assets/web/images/sunshine.svg diff --git a/docs/source/conf.py b/docs/source/conf.py index a6643721853..f11ece54683 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -72,7 +72,7 @@ # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] -html_logo = os.path.join(root_dir, 'sunshine.png') +html_logo = os.path.join(root_dir, 'src_assets', 'common', 'assets', 'web', 'images', 'sunshine.svg') # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. diff --git a/src_assets/common/assets/web/header-no-nav.html b/src_assets/common/assets/web/header-no-nav.html index 28ef76defe5..1f5b814725d 100644 --- a/src_assets/common/assets/web/header-no-nav.html +++ b/src_assets/common/assets/web/header-no-nav.html @@ -4,7 +4,22 @@ + Sunshine + + + + + + + + + + + + + + diff --git a/src_assets/common/assets/web/header.html b/src_assets/common/assets/web/header.html index 800414779e4..209a0d90bc5 100644 --- a/src_assets/common/assets/web/header.html +++ b/src_assets/common/assets/web/header.html @@ -4,8 +4,23 @@ + Sunshine + + + + + + + + + + + + + + @@ -19,7 +34,7 @@ >
- Sunshine + Sunshine