#pragma once #include #include #include #include "Export.h" #include "DateTime.h" #pragma warning(disable : 4455) #define G_SERVER_VERSION "2.0.0" constexpr double G_SERVICE_UPDATE_TIMESPAN = 1000; #define G_SERVER_NAME "U.N.S. Server Core/" G_SERVER_VERSION constexpr auto G_SERVICE_NAME = "UNS_HTTP_ServerCore"; constexpr auto G_ERROR_PAGE = R"( HTTP {:03d}

HTTP ERROR {:03d}


{}

)"; // inline constexpr std::string_view G_HTTP_STD_MONTH[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; // inline constexpr std::string_view G_HTTP_STD_WEEK[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; namespace uns { enum HTTPMethod { H_GET = 0b0000000001, H_PUT = 0b0000000010, H_POST = 0b0000000100, H_HEAD = 0b0000001000, H_TRACE = 0b0000010000, H_PATCH = 0b0000100000, H_DELETE = 0b0001000000, H_OPTIONS = 0b0010000000, H_CONNECT = 0b0100000000, H_UNKNOWN = 0b1000000000, H_ALL_ENABLED = 0b1111111111 }; namespace cors { inline constexpr std::string_view reqh_o = "Origin"; inline constexpr std::string_view reqh_acrm = "Access-Control-Request-Method"; inline constexpr std::string_view reqh_acrh = "Access-Control-Request-Headers"; inline constexpr std::string_view resh_acao = "Access-Control-Allow-Origin"; inline constexpr std::string_view resh_acam = "Access-Control-Allow-Methods"; inline constexpr std::string_view resh_acah = "Access-Control-Allow-Headers"; inline constexpr std::string_view resh_acac = "Access-Control-Allow-Credentials"; inline constexpr std::string_view resh_acma = "Access-Control-Max-Age"; }; using POSTArgs = std::map; std::string UNSWSC_DLL_EXPORT EncodeErrorPage(int code); std::string UNSWSC_DLL_EXPORT EncodeHTTPTime(time_t* time); std::string UNSWSC_DLL_EXPORT btos(bool val); bool UNSWSC_DLL_EXPORT stob(const std::string& obj); DateTime UNSWSC_DLL_EXPORT stot(const std::string& obj); std::string UNSWSC_DLL_EXPORT RestoreURL(const std::string& url); void UNSWSC_DLL_EXPORT Stringsplit(const std::string& str, const std::string& splits, std::vector& res); void UNSWSC_DLL_EXPORT ProcessPOSTArgs(const std::string& args, POSTArgs& args_output); namespace tools { //基于SHA3-256,无暴力破解防护能力,不建议使用 std::string UNSWSC_DLL_EXPORT EncryptPassword(const std::string reg_date, const std::string& password); //安全的密码加密函数,基于libsodium std::string UNSWSC_DLL_EXPORT EncryptPasswordSodium(const std::string& pwd); //密码检查函数 bool UNSWSC_DLL_EXPORT CheckPasswordSodium(const std::string& pwd, const std::string& encrypted); //安全随机数 std::string UNSWSC_DLL_EXPORT SecureRandomHex(size_t bytes); std::string UNSWSC_DLL_EXPORT ToUpper(const std::string& s); std::string UNSWSC_DLL_EXPORT ToLower(const std::string& s); std::string UNSWSC_DLL_EXPORT CalculateFileHashSHA256(const std::string& file); } namespace secure { /** * @brief 基于物理与逻辑边界的路径穿透(目录穿越)安全校验 * @param safe_path 允许访问的沙盒根目录(绝对或相对路径均可) * @param requested_path 客户端传入的、解码后的目标子路径 * @return true 安全(在沙盒内);false 不安全(企图穿越或路径非法) */ bool IsSafePath(const std::string& safe_path, const std::string& requested_path); } }; #undef MIN inline constexpr unsigned long long operator""B(unsigned long long n) { return n; } inline constexpr unsigned long long operator""KB(unsigned long long n) { return (n * 1024); } inline constexpr unsigned long long operator""MB(unsigned long long n) { return (n * 1024 * 1024); } inline constexpr unsigned long long operator""GB(unsigned long long n) { return (n * 1024 * 1024 * 1024); } inline constexpr unsigned long long operator""TB(unsigned long long n) { return (n * 1024 * 1024 * 1024 * 1024); } inline constexpr time_t operator""S(unsigned long long t) { return t; } inline constexpr time_t operator""MIN(unsigned long long t) { return (t * 60); } inline constexpr time_t operator""HOUR(unsigned long long t) { return (t * 60 * 60); } inline constexpr time_t operator""DAY(unsigned long long t) { return (t * 60 * 60 * 24); }