From 4ad48d4ecc9df78b08678555574307bbf50611fe Mon Sep 17 00:00:00 2001 From: Lukas Forsberg Date: Mon, 9 Feb 2026 18:28:01 +0100 Subject: [PATCH] Added better is logging function --- frontend/src/lib/shadorwun/character.svelte | 8 ++++++ src/login/login.cpp | 18 ++++++++++--- src/login/login.hpp | 30 ++++++--------------- src/shadowrun/ShadowrunApi.cpp | 29 +++++++------------- 4 files changed, 39 insertions(+), 46 deletions(-) diff --git a/frontend/src/lib/shadorwun/character.svelte b/frontend/src/lib/shadorwun/character.svelte index 3cec880..40025cb 100644 --- a/frontend/src/lib/shadorwun/character.svelte +++ b/frontend/src/lib/shadorwun/character.svelte @@ -55,6 +55,12 @@ } } + function handleKeydown(event) { + if (event.ctrlKey && event.key === 's') { + saveCharacterData(); + } + } + async function saveCharacterData() { const res = await fetch(`${API_BASE}/api/shadowrun/characters_data/${currentCharacter.id}`, { method: 'POST', @@ -67,6 +73,8 @@ let inventory = currentCharacter?.inventory || []; + +

Name: {currentCharacter.name}

Character Info

diff --git a/src/login/login.cpp b/src/login/login.cpp index 852bf08..7a9e611 100644 --- a/src/login/login.cpp +++ b/src/login/login.cpp @@ -1,8 +1,8 @@ #include "login.hpp" #include "crow/http_response.h" #include "databasepool.h" -#include "utils.hpp" #include "SessionHandler.hpp" +#include namespace login { @@ -18,12 +18,22 @@ std::string getSessionId(const crow::request& req) { return cookie_header.substr(pos + prefix.size(), Session::SESSION_ID_SIZE); } -bool isLoggedIn(const crow::request& req) { +static crow::response redirectToLogin(){ + crow::response res(302); // 302 = temporary redirect + res.set_header("Location", "/"); + return res; +} + +std::optional isLoggedIn(const crow::request& req) { std::string sessionId = getSessionId(req); if (sessionId.empty()) - return false; + return std::move(redirectToLogin()); + auto userId = sessionHandler.isSessionValid(sessionId); - return userId.has_value(); + if(!userId.has_value()) + return std::move(redirectToLogin()); + + return {}; } std::optional loginUser(const std::string& username, const std::string& password) diff --git a/src/login/login.hpp b/src/login/login.hpp index 8127a4b..9031e59 100644 --- a/src/login/login.hpp +++ b/src/login/login.hpp @@ -9,29 +9,15 @@ namespace login { void initLogin(crow::SimpleApp& app); -bool isLoggedIn(const crow::request& req); - -// login_required lambda that works for any handler with arbitrary args -inline auto login_required = [](auto handler){ - return [handler](auto&&... args) -> crow::response { - // the first argument is always crow::request - const crow::request& req = std::get<0>(std::forward_as_tuple(args...)); - if (!isLoggedIn(req)) { - return crow::response(401, "Login required"); - } - - // call original handler with all arguments - auto result = handler(std::forward(args)...); - - // ensure crow::response return type - if constexpr (std::is_same_v) { - return result; - } else { - return crow::response(result); - } - }; -}; +std::optional isLoggedIn(const crow::request& req); +#define LOGGIN_REQUIERED(reg) \ + { \ + auto res = login::isLoggedIn(req); \ + if (res.has_value()) { \ + return std::move(res.value()); \ + } \ + } } #endif // __LOGIN_H__ \ No newline at end of file diff --git a/src/shadowrun/ShadowrunApi.cpp b/src/shadowrun/ShadowrunApi.cpp index 598bdd8..331cd32 100644 --- a/src/shadowrun/ShadowrunApi.cpp +++ b/src/shadowrun/ShadowrunApi.cpp @@ -30,10 +30,8 @@ void initApi(crow::SimpleApp& app){ CROW_ROUTE(app, "/assets/shadowrun/") ([&](const crow::request& req, const std::string& p) { - if (!login::isLoggedIn(req)) { - return crow::response(401, "Login required"); - } - + LOGGIN_REQUIERED(req); + const filesystem::path assets_dir = "assets/shadowrun/"; filesystem::path file_path = assets_dir / p; return utils::getFile(file_path); @@ -41,10 +39,7 @@ void initApi(crow::SimpleApp& app){ CROW_ROUTE(app, "/api/shadowrun/characters") ([&](const crow::request& req) { - - if (!login::isLoggedIn(req)) { - return crow::response(401, "Login required"); - } + LOGGIN_REQUIERED(req); auto characters = getCharacters(); auto res = @@ -55,9 +50,7 @@ void initApi(crow::SimpleApp& app){ CROW_ROUTE(app, "/api/shadowrun/characters").methods("POST"_method) ([](const crow::request& req) { - if (!login::isLoggedIn(req)) { - return crow::response(401, "Login required"); - } + LOGGIN_REQUIERED(req); nlohmann::json data = nlohmann::json::parse(req.body); // parse JSON from HTTP body auto name = data["name"]; @@ -75,9 +68,8 @@ void initApi(crow::SimpleApp& app){ CROW_ROUTE(app, "/api/shadowrun/characters/") ([&](const crow::request& req, int id) { - if (!login::isLoggedIn(req)) { - return crow::response(401, "Login required"); - } + LOGGIN_REQUIERED(req); + auto optCharacter = getChracter(id); if (!optCharacter.has_value()) return crow::response(404, "Character not found"); @@ -89,9 +81,8 @@ void initApi(crow::SimpleApp& app){ CROW_ROUTE(app, "/api/shadowrun/characters_data/") ([&](const crow::request& req, int id) { - if (!login::isLoggedIn(req)) { - return crow::response(401, "Login required"); - } + LOGGIN_REQUIERED(req); + nlohmann::json j; const auto characterData = getChracterData(id); @@ -119,9 +110,7 @@ void initApi(crow::SimpleApp& app){ CROW_ROUTE(app, "/api/shadowrun/characters_data/").methods("POST"_method) ([&](const crow::request& req, int id) { - if (!login::isLoggedIn(req)) { - return crow::response(401, "Login required"); - } + LOGGIN_REQUIERED(req); nlohmann::json j = nlohmann::json::parse(req.body); for (auto type : magic_enum::enum_values()) {