update session structure
This commit is contained in:
@ -3,46 +3,56 @@ import type { Cookies } from '@sveltejs/kit';
|
||||
import * as crypto from 'crypto';
|
||||
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 {
|
||||
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;
|
||||
}
|
||||
|
||||
export function getSession(session: string | Cookies, permissions?: number[]): Permissions | null {
|
||||
let sess: Permissions | null;
|
||||
if (typeof session == 'string') {
|
||||
sess = sessions.get(session)?.permissions || null;
|
||||
} else {
|
||||
const sessionId = session.get('session');
|
||||
sess = sessionId ? sessions.get(sessionId)?.permissions || null : null;
|
||||
}
|
||||
|
||||
if (!sess) {
|
||||
export function getSession(
|
||||
sessionId: string | Cookies,
|
||||
options?: { permissions?: number[] }
|
||||
): Session | null {
|
||||
const session = sessionFromId(sessionId);
|
||||
if (!session) {
|
||||
return null;
|
||||
}
|
||||
for (const perm of permissions || []) {
|
||||
if ((sess.value & perm) == 0) {
|
||||
for (const perm of options?.permissions || []) {
|
||||
if ((session.permissions.value & perm) == 0) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return sess;
|
||||
return session;
|
||||
}
|
||||
|
||||
export function deleteSession(session: string | Cookies) {
|
||||
if (typeof session == 'string') {
|
||||
sessions.delete(session);
|
||||
} else {
|
||||
sessions.delete(session.get('session') || '');
|
||||
export function deleteSession(sessionId: string | Cookies) {
|
||||
const session = sessionFromId(sessionId);
|
||||
if (session) {
|
||||
sessions.splice(sessions.indexOf(session), 1);
|
||||
}
|
||||
}
|
||||
|
||||
export function deleteAllUserSessions(userId: number) {
|
||||
for (const [id, details] of sessions.entries()) {
|
||||
if (details.userId == userId) {
|
||||
sessions.delete(id);
|
||||
}
|
||||
}
|
||||
sessions = sessions.filter((v) => v.userId == userId);
|
||||
}
|
||||
|
Reference in New Issue
Block a user