Sunshine master
Self-hosted game stream host for Moonlight.
confighttp.h
Go to the documentation of this file.
1
5#pragma once
6
7// standard includes
8#include <filesystem>
9#include <memory>
10#include <string>
11
12// lib includes
13#include <nlohmann/json.hpp>
14#include <Simple-Web-Server/server_https.hpp>
15
16// local includes
17#include "thread_safe.h"
18
23#define WEB_DIR SUNSHINE_ASSETS_DIR "/web/"
24
25namespace confighttp {
26 constexpr auto PORT_HTTPS = 1;
27
28 // Type aliases for HTTPS server components
29 using https_server_t = SimpleWeb::Server<SimpleWeb::HTTPS>;
30 using resp_https_t = std::shared_ptr<typename SimpleWeb::ServerBase<SimpleWeb::HTTPS>::Response>;
31 using req_https_t = std::shared_ptr<typename SimpleWeb::ServerBase<SimpleWeb::HTTPS>::Request>;
32
33 // Main server start function
34 void start();
35
36 void print_req(const req_https_t &request);
37 void send_response(const resp_https_t &response, const nlohmann::json &output_tree);
38 void send_unauthorized(const resp_https_t &response, const req_https_t &request);
39 void send_redirect(const resp_https_t &response, const req_https_t &request, const char *path);
40 bool authenticate(const resp_https_t &response, const req_https_t &request);
41 void not_found(const resp_https_t &response, const req_https_t &request, const std::string &error_message = "Not Found");
42 void bad_request(const resp_https_t &response, const req_https_t &request, const std::string &error_message = "Bad Request");
51 bool check_content_type(const resp_https_t &response, const req_https_t &request, const std::string_view &contentType);
52 std::string generate_csrf_token(const std::string &client_id);
61 bool validate_csrf_token(const resp_https_t &response, const req_https_t &request, const std::string &client_id);
62 std::string get_client_id(const req_https_t &request);
71 bool check_app_index(const resp_https_t &response, const req_https_t &request, int index);
72 void getPage(const resp_https_t &response, const req_https_t &request, const char *html_file, bool require_auth = true, bool redirect_if_username = false);
73 void getAsset(const resp_https_t &response, const req_https_t &request);
74 void browseDirectory(const resp_https_t &response, const req_https_t &request);
75 void getLocale(const resp_https_t &response, const req_https_t &request);
76 void getCSRFToken(const resp_https_t &response, const req_https_t &request);
77
78 // Browse helper functions (also exposed for unit testing)
85 bool is_browsable_executable(const std::filesystem::directory_entry &entry, const std::filesystem::file_status &status);
86
93 nlohmann::json build_browse_entries(const std::filesystem::path &dir_path, const std::string &type_str);
94
95#ifdef _WIN32
100 nlohmann::json get_windows_drives();
101#endif
102} // namespace confighttp
103
104// mime types map
108const std::map<std::string, std::string> mime_types = {
109 {"css", "text/css"},
110 {"gif", "image/gif"},
111 {"htm", "text/html"},
112 {"html", "text/html"},
113 {"ico", "image/x-icon"},
114 {"jpeg", "image/jpeg"},
115 {"jpg", "image/jpeg"},
116 {"js", "application/javascript"},
117 {"json", "application/json"},
118 {"png", "image/png"},
119 {"svg", "image/svg+xml"},
120 {"ttf", "font/ttf"},
121 {"txt", "text/plain"},
122 {"woff2", "font/woff2"},
123 {"xml", "text/xml"},
124};
std::string generate_csrf_token(const std::string &client_id)
Generate a new CSRF token for a client.
Definition confighttp.cpp:328
void not_found(const resp_https_t &response, const req_https_t &request, const std::string &error_message)
Send a 404 Not Found response.
Definition confighttp.cpp:237
void getCSRFToken(const resp_https_t &response, const req_https_t &request)
Get a CSRF token for the authenticated user.
Definition confighttp.cpp:596
bool check_app_index(const resp_https_t &response, const req_https_t &request, int index)
Validates the application index and sends an error response if invalid.
Definition confighttp.cpp:451
bool is_browsable_executable(const fs::directory_entry &entry, const fs::file_status &status)
Checks whether a directory entry qualifies as an executable file.
Definition confighttp.cpp:1567
void bad_request(const resp_https_t &response, const req_https_t &request, const std::string &error_message)
Send a 400 Bad Request response.
Definition confighttp.cpp:258
void send_unauthorized(const resp_https_t &response, const req_https_t &request)
Send a 401 Unauthorized response.
Definition confighttp.cpp:144
nlohmann::json build_browse_entries(const fs::path &dir_path, const std::string &type_str)
Lists, filters, and sorts the entries of a directory for the browse API.
Definition confighttp.cpp:1609
void print_req(const req_https_t &request)
Log the request details.
Definition confighttp.cpp:109
std::shared_ptr< SimpleWeb::ServerBase< SimpleWeb::HTTPS >::Response > resp_https_t
Shared HTTPS response object passed to configuration handlers.
Definition confighttp.cpp:65
bool validate_csrf_token(const resp_https_t &response, const req_https_t &request, const std::string &client_id)
Validate CSRF token.
Definition confighttp.cpp:389
void getLocale(const resp_https_t &response, const req_https_t &request)
Get the locale setting. This endpoint does not require authentication.
Definition confighttp.cpp:1037
std::string get_client_id(const req_https_t &request)
Get a unique client identifier for CSRF token management.
Definition confighttp.cpp:308
void send_response(const resp_https_t &response, const nlohmann::json &output_tree)
Send a response.
Definition confighttp.cpp:131
void getPage(const resp_https_t &response, const req_https_t &request, const char *html_file, const bool require_auth, const bool redirect_if_username)
Get an HTML page.
Definition confighttp.cpp:475
std::shared_ptr< SimpleWeb::ServerBase< SimpleWeb::HTTPS >::Request > req_https_t
Shared HTTPS request object received by configuration handlers.
Definition confighttp.cpp:69
void getAsset(const resp_https_t &response, const req_https_t &request)
Get an asset.
Definition confighttp.cpp:551
nlohmann::json get_windows_drives()
Builds a JSON array of available Windows drive letters.
Definition confighttp.cpp:1585
bool check_content_type(const resp_https_t &response, const req_https_t &request, const std::string_view &contentType)
Validate the request content type and send a bad request when mismatched.
Definition confighttp.cpp:277
bool authenticate(const resp_https_t &response, const req_https_t &request)
Authenticate the user.
Definition confighttp.cpp:188
SimpleWeb::Server< SimpleWeb::HTTPS > https_server_t
HTTPS server type used for Sunshine's configuration UI.
Definition confighttp.cpp:56
void start()
Start the HTTPS configuration server.
Definition confighttp.cpp:1751
void browseDirectory(const resp_https_t &response, const req_https_t &request)
Browse the server filesystem.
Definition confighttp.cpp:1672
void send_redirect(const resp_https_t &response, const req_https_t &request, const char *path)
Send a redirect response.
Definition confighttp.cpp:171
const std::map< std::string, std::string > mime_types
File-extension to MIME-type mapping used when serving the Web UI.
Definition confighttp.h:108
constexpr auto PORT_HTTPS
GameStream port offset for port https.
Definition confighttp.h:26
Declarations for thread-safe data structures.