/** * @file src/confighttp.h * @brief Declarations for the configuration HTTP server. */ #pragma once // standard includes #include #include #include #include #include #include #include #include #include #include // third-party includes #include // local includes #include "config_http_policy.h" #include "http_auth.h" #include "thread_safe.h" #include #define WEB_DIR SUNSHINE_ASSETS_DIR "/web/" using namespace std::chrono_literals; namespace confighttp { using resp_https_t = std::shared_ptr::Response>; using req_https_t = std::shared_ptr::Request>; constexpr auto PORT_HTTPS = policy::https_port_offset; constexpr auto SESSION_EXPIRE_DURATION = 24h * 15; std::string get_web_ui_url(std::string_view path = {}); void start(); // Token scopes for API tokens used by clients. using TokenScope = policy::TokenScope; // Authentication helpers AuthResult check_auth(const req_https_t &request); bool authenticate(resp_https_t response, req_https_t request); std::string get_client_id(const req_https_t &request); std::string generate_csrf_token(const std::string &client_id); bool validate_csrf_token(const resp_https_t &response, const req_https_t &request, const std::string &client_id); // Token scope helpers TokenScope scope_from_string(std::string_view scope); std::string scope_to_string(TokenScope scope); // Web UI endpoints void generateApiToken(resp_https_t response, req_https_t request); void listApiTokens(resp_https_t response, req_https_t request); void revokeApiToken(resp_https_t response, req_https_t request); void getTokenPage(resp_https_t response, req_https_t request); void loginUser(resp_https_t response, req_https_t request); void refreshSession(resp_https_t response, req_https_t request); void authStatus(resp_https_t response, req_https_t request); void logoutUser(resp_https_t response, req_https_t request); void getCSRFToken(resp_https_t response, req_https_t request); void browseDirectory(resp_https_t response, req_https_t request); bool is_browsable_executable(const std::filesystem::directory_entry &entry, const std::filesystem::file_status &status); nlohmann::json build_browse_entries(const std::filesystem::path &dir_path, const std::string &type_str); #ifdef _WIN32 nlohmann::json get_windows_drives(); #endif // Writes the apps file and refreshes the client-visible app cache/list // Callers that perform a read-modify-write transaction should hold this // recursive mutex from the initial read through refresh. std::recursive_mutex &apps_file_mutex(); bool refresh_client_apps_cache(nlohmann::json &file_tree, bool sort_by_name = true); } // namespace confighttp // mime types map (defined in confighttp.cpp) namespace confighttp { extern const std::map mime_types; }