added better login support

This commit is contained in:
Lukas Forsberg 2025-10-22 21:37:28 +02:00
parent 5a1297dc80
commit 89e3b95ca2
4 changed files with 25 additions and 12 deletions

View File

@ -1,4 +1,3 @@
#include "crow.h"
#include "utils.hpp"
#include "database.hpp"
#include <optional>

View File

@ -8,6 +8,7 @@
#include <optional>
#include <set>
#include <map>
#include "crow.h"
class Database {
@ -28,7 +29,7 @@ public:
template <typename T>
std::optional<T> getSqlData(sqlite3_stmt* stmt, int i)
{
if ((stmt == nullptr) || (sqlite3_step(stmt) != SQLITE_ROW))
if (stmt == nullptr)
return {};
if constexpr (std::is_same_v<T, int>) {
@ -51,9 +52,10 @@ public:
template <typename T1, typename T2>
std::optional<std::pair<T1, T2>> get(const std::string sql, const QueryData& data){
sqlite3_stmt* stmt = bind(sql, data);
if ((stmt == nullptr) || (sqlite3_step(stmt) != SQLITE_ROW))
if ( (stmt == nullptr) || (sqlite3_step(stmt) != SQLITE_ROW ) ) {
CROW_LOG_ERROR << "Failed to run statement: " << sqlite3_errmsg(m_db);
return {};
}
std::optional<T1> v1 = getSqlData<T1>(stmt, 0);
std::optional<T2> v2 = getSqlData<T2>(stmt, 1);

View File

@ -82,10 +82,11 @@ std::string random_string(size_t length) {
std::optional<int> loginUser(const std::string& username, const std::string& password)
{
auto sql = "SELECT id password_hash FROM users WHERE username = '?' LIMIT 1;";
auto sql = "SELECT id, password_hash FROM users WHERE username = ? LIMIT 1;";
auto db = Database();
if (!db.open())
if (!db.open()){
return {};
}
auto opt_pair = db.get<int, std::string>(sql, {username});
if (opt_pair.has_value()) {
@ -131,7 +132,7 @@ bool initLogin(crow::SimpleApp& app)
return false;
}
// createUser("lukas", "Trollar%4928");
// createUser("lukas", "Trollar4928");
CROW_ROUTE(app, "/login").methods("GET"_method)
([](const crow::request& req){
@ -176,13 +177,15 @@ bool initLogin(crow::SimpleApp& app)
std::optional<int> userId = loginUser(username, password);
if (!userId.has_value()) return crow::response(401, "Invalid credentials");
if (!userId.has_value()) {
return crow::response(401, "Invalid credentials");
}
// set user id
sessions[session_id].user_id = std::to_string(userId.value());
crow::response res;
res.add_header("HX-Redirect", "/dashboard"); // htmx redirect
res.add_header("HX-Redirect", "/templates/dashboard.html"); // htmx redirect
return res;
});

View File

@ -16,15 +16,24 @@ int main() {
crow::SimpleApp app;
CROW_ROUTE(app, "/")([] {
return crow::response(utils::loadFile("templates/index.html"));
auto data = utils::loadFile("templates/index.html");
if (data.empty())
return crow::response(404);
return crow::response(data);
});
CROW_ROUTE(app, "/static/<string>")([](const std::string& file) {
return crow::response(utils::loadFile("static/" + file));
auto data = utils::loadFile("static/" + file);
if (data.empty())
return crow::response(404);
return crow::response(data);
});
CROW_ROUTE(app, "/templates/<string>")([](const std::string& file) {
return crow::response(utils::loadFile("templates/" + file));
auto data = utils::loadFile("templates/" + file);
if (data.empty())
return crow::response(404);
return crow::response(data);
});
// Static file redirector