Stundenaufzeichnung/src/hooks.server.ts

113 lines
3.1 KiB
TypeScript
Raw Normal View History

2025-04-20 22:35:12 +02:00
import type { Handle } from "@sveltejs/kit";
2025-06-05 14:32:12 +02:00
import { error, redirect } from "@sveltejs/kit";
2025-07-27 18:07:11 +02:00
import { sequence } from "@sveltejs/kit/hooks";
import { env } from "$env/dynamic/private"
2025-07-27 18:07:11 +02:00
import { csrf } from "$lib/server/csrf"
2025-06-05 14:32:12 +02:00
import SessionStore from "$lib/server/session_store"
import { init_db, close_db, create_user, do_users_exist } from "$lib/server/database";
2025-07-11 05:10:46 +02:00
import Logs from "$lib/server/log";
let local_setup: {user_setup: (() => void) | ((username: string, password: string) => void) }= {
user_setup: () => {}
2025-07-21 04:59:36 +02:00
}
2025-04-20 22:35:12 +02:00
async function init() {
2025-07-11 05:10:46 +02:00
Logs.process.info("Initializing server");
Logs.process.debug(`ORIGIN: ${env.ORIGIN}`);
2025-07-11 05:10:46 +02:00
2025-04-20 22:35:12 +02:00
if (process.env.APP_USER_DATA_PATH == null) {
2025-07-11 05:10:46 +02:00
throw new Error("APP_USER_DATA_PATH is not defined. Exiting.");
2025-04-20 22:35:12 +02:00
}
if (process.env.APP_TMP_USER_DATA_PATH == null) {
2025-07-11 05:10:46 +02:00
throw new Error("APP_TMP_USER_DATA_PATH is not defined. Exiting.");
2025-04-20 22:35:12 +02:00
}
2025-04-20 22:35:12 +02:00
await init_db();
if (!do_users_exist()) {
local_setup.user_setup = (username: string, password: string) => {
Logs.user.info("Creating first user")
create_user({name: "name", gender: "x", address: "home", username: username, password: password });
local_setup.user_setup = () => {}
}
}
2025-07-11 05:10:46 +02:00
Logs.process.info("Initializing of server complete")
}
function deinit() {
close_db();
}
2025-04-20 22:35:12 +02:00
process.on('exit', (_) => {
deinit();
2025-07-11 05:10:46 +02:00
Logs.process.info("Exiting server")
process.exit(0);
});
2025-04-20 22:35:12 +02:00
process.on('SIGINT', (_) => {
2025-07-11 05:10:46 +02:00
Logs.process.info("Received SIGINT, shutting down")
process.exit(0);
})
2025-07-11 05:10:46 +02:00
process.on("uncaughtExceptionMonitor", (error, origin) => {
Logs.process.fatal(`Encountered uncaught exception (origin: ${origin}): ${error.name}${error.cause ? (" caused by "+error.cause) : ""}: ${error.message} `)
})
await init();
2025-07-27 18:07:11 +02:00
export let handle: Handle = sequence(csrf([], []), async function ({ event, resolve }) {
2025-07-21 04:59:36 +02:00
event.locals.setup = local_setup
2025-06-05 14:32:12 +02:00
2025-07-11 05:10:46 +02:00
Logs.route.debug(`incoming ${event.request.method} request to: ${event.url.href} (route id: ${event.route.id})`);
2025-06-18 14:50:54 +02:00
event.setHeaders({
//"Strict-Transport-Security": "max-age=63072000; includeSubdomains; preload",
"X-Frame-Options": "Deny",
"X-Content-Type-Options": "nosniff",
"Referrer-Policy": "strict-origin-when-cross-origin"
})
2025-06-05 14:32:12 +02:00
if (event.route.id == null) {
2025-07-11 05:10:46 +02:00
Logs.route.info(`Tried to access a route which does not exist: ${event.url.href}`)
2025-06-05 14:32:12 +02:00
return error(404, "This page does not exist.");
}
const token = event.cookies.get("session_id")
const user = SessionStore.get_user_by_access_token(token ?? "")
2025-07-27 06:34:54 +02:00
Logs.user.debug(user ? `Found user ${user.id} for session token` : "No user for session token")
2025-06-05 14:32:12 +02:00
if (!token || !user) {
if (event.request.method == "POST" && event.route.id != "/login") {
return error(401, "Invalid Session");
}
if (token) {
2025-07-27 06:34:54 +02:00
Logs.user.debug("recieved an invalid session id. Deleting on client.")
2025-06-05 14:32:12 +02:00
event.cookies.delete("session_id", { path: "/" });
}
2025-04-20 22:35:12 +02:00
2025-06-05 14:32:12 +02:00
if (event.route.id == "/login") {
return await resolve(event);
} else {
event.url.searchParams.set("redirect", event.route.id);
return redirect(302, `/login?${event.url.searchParams}`);
2025-06-05 14:32:12 +02:00
}
2025-04-20 22:35:12 +02:00
}
event.locals.user = user;
return await resolve(event);
2025-07-27 18:07:11 +02:00
})