update session structure
This commit is contained in:
parent
a88ae62edf
commit
1b6e3c522f
@ -3,46 +3,56 @@ import type { Cookies } from '@sveltejs/kit';
|
|||||||
import * as crypto from 'crypto';
|
import * as crypto from 'crypto';
|
||||||
import type { Admin } from '$lib/server/database';
|
import type { Admin } from '$lib/server/database';
|
||||||
|
|
||||||
const sessions: Map<string, { userId: number; permissions: Permissions }> = new Map();
|
export interface Session {
|
||||||
|
sessionId: string;
|
||||||
|
userId: number;
|
||||||
|
permissions: Permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
let sessions: Session[] = [];
|
||||||
|
|
||||||
|
function sessionFromId(sessionId: string | Cookies): Session | null {
|
||||||
|
const sessId = sessionIdFromStringOrCookies(sessionId);
|
||||||
|
return sessions.find((v) => v.sessionId == sessId) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sessionIdFromStringOrCookies(input: string | Cookies): string | null {
|
||||||
|
return typeof input == 'string' ? input : input.get('session') || null;
|
||||||
|
}
|
||||||
|
|
||||||
export function addSession(user: { id: number; permissions: Permissions } | Admin): string {
|
export function addSession(user: { id: number; permissions: Permissions } | Admin): string {
|
||||||
const session = crypto.randomBytes(16).toString('hex');
|
const session = crypto.randomBytes(16).toString('hex');
|
||||||
sessions.set(session, { userId: user.id, permissions: user.permissions });
|
sessions.push({
|
||||||
|
sessionId: session,
|
||||||
|
userId: user.id,
|
||||||
|
permissions: user.permissions
|
||||||
|
});
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getSession(session: string | Cookies, permissions?: number[]): Permissions | null {
|
export function getSession(
|
||||||
let sess: Permissions | null;
|
sessionId: string | Cookies,
|
||||||
if (typeof session == 'string') {
|
options?: { permissions?: number[] }
|
||||||
sess = sessions.get(session)?.permissions || null;
|
): Session | null {
|
||||||
} else {
|
const session = sessionFromId(sessionId);
|
||||||
const sessionId = session.get('session');
|
if (!session) {
|
||||||
sess = sessionId ? sessions.get(sessionId)?.permissions || null : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sess) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
for (const perm of permissions || []) {
|
for (const perm of options?.permissions || []) {
|
||||||
if ((sess.value & perm) == 0) {
|
if ((session.permissions.value & perm) == 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sess;
|
return session;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deleteSession(session: string | Cookies) {
|
export function deleteSession(sessionId: string | Cookies) {
|
||||||
if (typeof session == 'string') {
|
const session = sessionFromId(sessionId);
|
||||||
sessions.delete(session);
|
if (session) {
|
||||||
} else {
|
sessions.splice(sessions.indexOf(session), 1);
|
||||||
sessions.delete(session.get('session') || '');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function deleteAllUserSessions(userId: number) {
|
export function deleteAllUserSessions(userId: number) {
|
||||||
for (const [id, details] of sessions.entries()) {
|
sessions = sessions.filter((v) => v.userId == userId);
|
||||||
if (details.userId == userId) {
|
|
||||||
sessions.delete(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
import type { PageServerLoad } from './$types';
|
import type { PageServerLoad } from './$types';
|
||||||
import { Admin } from '$lib/server/database';
|
import { Admin } from '$lib/server/database';
|
||||||
import { getSession } from '$lib/server/session';
|
import { getSession } from '$lib/server/session';
|
||||||
|
import { Permissions } from '$lib/permissions';
|
||||||
|
|
||||||
export const load: PageServerLoad = async ({ cookies }) => {
|
export const load: PageServerLoad = async ({ cookies }) => {
|
||||||
const admins = await Admin.findAll({ attributes: { exclude: ['password'] } });
|
let admins: Admin[] = [];
|
||||||
|
if (getSession(cookies, { permissions: [Permissions.AdminRead] }) != null) {
|
||||||
|
admins = await Admin.findAll({ attributes: { exclude: ['password'] } });
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
admins: JSON.parse(JSON.stringify(admins)),
|
admins: JSON.parse(JSON.stringify(admins)),
|
||||||
permissions: getSession(cookies.get('session') || '')!.value
|
permissions: getSession(cookies.get('session') || '')!.permissions.value
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -5,7 +5,7 @@ import { Admin } from '$lib/server/database';
|
|||||||
import { env as publicEnv } from '$env/dynamic/public';
|
import { env as publicEnv } from '$env/dynamic/public';
|
||||||
|
|
||||||
export const POST = (async ({ request, cookies }) => {
|
export const POST = (async ({ request, cookies }) => {
|
||||||
if (getSession(cookies, [Permissions.AdminWrite]) == null) {
|
if (getSession(cookies, { permissions: [Permissions.AdminWrite] }) == null) {
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 401
|
status: 401
|
||||||
});
|
});
|
||||||
@ -34,7 +34,7 @@ export const POST = (async ({ request, cookies }) => {
|
|||||||
}) satisfies RequestHandler;
|
}) satisfies RequestHandler;
|
||||||
|
|
||||||
export const PATCH = (async ({ request, cookies }) => {
|
export const PATCH = (async ({ request, cookies }) => {
|
||||||
if (getSession(cookies, [Permissions.AdminWrite]) == null) {
|
if (getSession(cookies, { permissions: [Permissions.AdminWrite] }) == null) {
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 401
|
status: 401
|
||||||
});
|
});
|
||||||
@ -52,7 +52,7 @@ export const PATCH = (async ({ request, cookies }) => {
|
|||||||
const updatePayload: { [key: string]: any } = {};
|
const updatePayload: { [key: string]: any } = {};
|
||||||
if (data['username']) updatePayload.username = data['username'];
|
if (data['username']) updatePayload.username = data['username'];
|
||||||
if (data['password']) updatePayload.password = data['password'];
|
if (data['password']) updatePayload.password = data['password'];
|
||||||
if (data['permissions']) updatePayload.permissions = data['permissions'];
|
if (data['permissions']) updatePayload.permissions = new Permissions(data['permissions']);
|
||||||
|
|
||||||
let user = await Admin.findOne({ where: { id: id } });
|
let user = await Admin.findOne({ where: { id: id } });
|
||||||
if (!user) {
|
if (!user) {
|
||||||
@ -74,7 +74,7 @@ export const PATCH = (async ({ request, cookies }) => {
|
|||||||
}) satisfies RequestHandler;
|
}) satisfies RequestHandler;
|
||||||
|
|
||||||
export const DELETE = (async ({ request, cookies }) => {
|
export const DELETE = (async ({ request, cookies }) => {
|
||||||
if (getSession(cookies, [Permissions.AdminWrite]) == null) {
|
if (getSession(cookies, { permissions: [Permissions.AdminWrite] }) == null) {
|
||||||
return new Response(null, {
|
return new Response(null, {
|
||||||
status: 401
|
status: 401
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user