diff --git a/src/hooks.server.js b/src/hooks.server.js index f9698bd..8bd92ed 100644 --- a/src/hooks.server.js +++ b/src/hooks.server.js @@ -1,8 +1,27 @@ +import { COOKIE_NAME } from "$lib/constants"; +import { getUserFromSession } from "$lib/database"; + /** @type {import('@sveltejs/kit').Handle} */ export async function handle({ event, resolve }) { if (event.url.pathname !== "/maintenance" && process.env.MAINTENANCE) { return new Response("", { status: 302, headers: { Location: "/maintenance" } }); } + const cookie = event.cookies.get(COOKIE_NAME); + if (!cookie) return await resolve(event); + + let user = await getUserFromSession(cookie, event.getClientAddress()); + if (!user) event.cookies.delete(COOKIE_NAME, { secure: !!process.env.PRODUCTION }); + else + event.locals.user = { + _id: user._id, + username: user.username, + currency: user.currency, + thumbnails: { + headshot: "https://cdn.discordapp.com/attachments/1025862249962819684/1028788210303766558/2022.10-887.png", + bodyshot: "https://media.tenor.com/Lo0GvkoTFR4AAAAd/xbox-xbox-avatar.gif" + } + }; + return await resolve(event); } diff --git a/src/lib/components/UserListed.svelte b/src/lib/components/UserListed.svelte index babe819..c91b66d 100644 --- a/src/lib/components/UserListed.svelte +++ b/src/lib/components/UserListed.svelte @@ -1,6 +1,6 @@
diff --git a/src/lib/database.js b/src/lib/database.js index 10a1e4f..08e4f18 100644 --- a/src/lib/database.js +++ b/src/lib/database.js @@ -28,17 +28,17 @@ async function hashPassword(plaintext) { }); } -async function compareHash(plaintext, hash) { +export async function compareHash(plaintext, hash) { return new Promise((resolve, reject) => { compare(plaintext, hash, (err, result) => resolve(result)); }); } -async function genSession() { +function genSession() { return randomBytes(64).toString("base64"); } -async function genInvite() { +function genInvite() { return `${INVITE_KEY_PREFIX}${randomUUID()}`; } @@ -49,7 +49,8 @@ export async function createUser(username, password, lastip) { _id, username, password: await hashPassword(password), - lastip + lastip, + currency: 100 }; const avatar = { @@ -65,17 +66,55 @@ export async function createUser(username, password, lastip) { Assets: {} }; - await avatars.insertOne(avatar); - return await users.insertOne(user); + await Promise.all([avatars.insertOne(avatar), await users.insertOne(user)]); + + return _id; } export async function createSession(_id, lastip) { const user = await users.findOne({ _id }); - if (!user) throw new Error("That user doesn't exist"); + if (!user) return false; - return await sessions.insertOne({ - _id, - session: genSession(), + const session = genSession(); + + await sessions.insertOne({ + _id: session, + owner: _id, expires: Date.now() + SESSION_EXPIRE }); + + await users.updateOne({ _id: user._id }, { $set: { lastip } }); + + return session; +} + +export async function getUserFromSession(session, lastip) { + const sessionDocument = await sessions.findOne({ _id: session }); + if (!sessionDocument) return false; + + const user = await users.findOne({ _id: sessionDocument.owner }); + if (!user) return false; + + await users.updateOne({ _id: user._id }, { $set: { lastip } }); + + return user; +} + +export async function deleteSession(session, lastip) { + const sessionDocument = await sessions.findOne({ _id: session }); + if (!sessionDocument) return false; + + const user = await users.findOne({ _id: sessionDocument._id }); + if (!user) return false; + + await users.updateOne({ _id: user._id }, { $set: { lastip } }); + + return await sessions.deleteOne({ session }); +} + +export async function getUser(query, projection) { + const user = await users.findOne(query, { projection }); + if (!user) return false; + + return user; } diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js new file mode 100644 index 0000000..53d472f --- /dev/null +++ b/src/routes/(app)/+layout.server.js @@ -0,0 +1,4 @@ +/** @type {import('./$types').LayoutServerLoad} */ +export function load({ locals }) { + return { user: locals.user }; +} diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index c03d0bb..cc8b9b8 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -1,6 +1,9 @@