From 044f1a6e4578ab0dd4ae3003f049e84b595c21fd Mon Sep 17 00:00:00 2001 From: tetuaoro <65575727+tetuaoro@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:48:23 +0200 Subject: [PATCH] fix: review --- src/localeDetector.ts | 12 +++-------- src/server/api/account/new.post.ts | 2 +- src/server/api/lang.get.ts | 2 +- src/server/api/session.post.ts | 13 +++++++++--- src/server/middleware/session.ts | 9 +++++++- src/server/utils/session.ts | 6 ++++-- src/services/database/inmemory.ts | 21 +++++++++---------- .../database}/repositories/database.ts | 6 +++--- .../database}/repositories/system/model.ts | 0 .../repositories/system/repository.ts | 6 +++--- .../database}/repositories/types.ts | 3 +-- .../database}/repositories/user/model.ts | 0 .../repositories/user/repository.ts.ts | 6 +++--- 13 files changed, 47 insertions(+), 39 deletions(-) rename src/{ => services/database}/repositories/database.ts (93%) rename src/{ => services/database}/repositories/system/model.ts (100%) rename src/{ => services/database}/repositories/system/repository.ts (77%) rename src/{ => services/database}/repositories/types.ts (91%) rename src/{ => services/database}/repositories/user/model.ts (100%) rename src/{ => services/database}/repositories/user/repository.ts.ts (87%) diff --git a/src/localeDetector.ts b/src/localeDetector.ts index 633b2ea4..c766d486 100644 --- a/src/localeDetector.ts +++ b/src/localeDetector.ts @@ -1,24 +1,18 @@ -// https://i18n.nuxtjs.org/docs/guide/server-side-translations -// Detect based on query, cookie, header export default defineI18nLocaleDetector((event, config) => { - // try to get locale from query - const query = tryQueryLocale(event, { lang: '' }); // disable locale default value with `lang` option + const query = tryQueryLocale(event, { lang: '' }); if (query) { return query.toString(); } - // try to get locale from cookie - const cookie = tryCookieLocale(event, { lang: '', name: 'i18n_locale' }); // disable locale default value with `lang` option + const cookie = tryCookieLocale(event, { lang: '', name: 'i18n_locale' }); if (cookie) { return cookie.toString(); } - // try to get locale from header (`accept-header`) - const header = tryHeaderLocale(event, { lang: '' }); // disable locale default value with `lang` option + const header = tryHeaderLocale(event, { lang: '' }); if (header) { return header.toString(); } - // If the locale cannot be resolved up to this point, it is resolved with the value `defaultLocale` of the locale config passed to the function return config.defaultLocale; }); diff --git a/src/server/api/account/new.post.ts b/src/server/api/account/new.post.ts index d3cfdc31..bcace054 100644 --- a/src/server/api/account/new.post.ts +++ b/src/server/api/account/new.post.ts @@ -1,4 +1,4 @@ -import { DatabaseError } from '~/repositories/database'; +import { DatabaseError } from '~/services/database/repositories/database'; export default defineEventHandler(async (event) => { setHeader(event, 'Content-Type', 'application/json'); diff --git a/src/server/api/lang.get.ts b/src/server/api/lang.get.ts index b7424302..4a926a7a 100644 --- a/src/server/api/lang.get.ts +++ b/src/server/api/lang.get.ts @@ -1,4 +1,4 @@ -export default defineEventHandler(async (event) => { +export default defineEventHandler((event) => { setHeader(event, 'Content-Type', 'application/json'); return Database.getLang(); }); diff --git a/src/server/api/session.post.ts b/src/server/api/session.post.ts index 04fd01b9..625b9bd8 100644 --- a/src/server/api/session.post.ts +++ b/src/server/api/session.post.ts @@ -24,16 +24,23 @@ export default defineEventHandler(async (event) => { // TODO: timing againts timing attack - const conf: SessionConfig = SESSION_CONFIG; + const system = await Database.getSystem(); + if (!system) + throw createError({ + statusCode: 500, + statusMessage: 'Invalid', + }); + + const conf: SessionConfig = system.sessionConfig; if (MAX_AGE && remember) { conf.cookie = { - ...(SESSION_CONFIG.cookie ?? {}), + ...(system.sessionConfig.cookie ?? {}), maxAge: MAX_AGE, }; } const session = await useSession(event, { - ...SESSION_CONFIG, + ...system.sessionConfig, }); const data = await session.update({ diff --git a/src/server/middleware/session.ts b/src/server/middleware/session.ts index 0f288002..91ee154a 100644 --- a/src/server/middleware/session.ts +++ b/src/server/middleware/session.ts @@ -11,7 +11,14 @@ export default defineEventHandler(async (event) => { ) { return; } - const session = await getSession(event, SESSION_CONFIG); + const system = await Database.getSystem(); + if (!system) + throw createError({ + statusCode: 500, + statusMessage: 'Invalid', + }); + + const session = await getSession(event, system.sessionConfig); if (session.id && session.data.authenticated) { return; } diff --git a/src/server/utils/session.ts b/src/server/utils/session.ts index 825379cf..0761cfed 100644 --- a/src/server/utils/session.ts +++ b/src/server/utils/session.ts @@ -4,6 +4,8 @@ export type WGSession = { authenticated: boolean; }; -export function useWGSession(event: H3Event) { - return useSession>(event, SESSION_CONFIG); +export async function useWGSession(event: H3Event) { + const system = await Database.getSystem(); + if (!system) throw new Error('Invalid'); + return useSession>(event, system.sessionConfig); } diff --git a/src/services/database/inmemory.ts b/src/services/database/inmemory.ts index 0a674680..183ae214 100644 --- a/src/services/database/inmemory.ts +++ b/src/services/database/inmemory.ts @@ -2,26 +2,25 @@ import debug from 'debug'; import packageJson from '@/package.json'; import crypto from 'node:crypto'; -import DatabaseProvider, { DatabaseError } from '~/repositories/database'; -import { ChartType, Lang } from '~/repositories/types'; +import DatabaseProvider, { DatabaseError } from './repositories/database'; +import { ChartType, Lang } from './repositories/types'; -import type { SessionConfig } from 'h3'; -import type { ID } from '~/repositories/types'; -import type { System } from '~/repositories/system/model'; -import type { User } from '~/repositories/user/model'; +import type { ID } from './repositories/types'; +import type { System } from './repositories/system/model'; +import type { User } from './repositories/user/model'; import { hashPassword, isPasswordStrong } from '~/server/utils/password'; const DEBUG = debug('InMemoryDB'); // Represent in-memory data structure type InMemoryData = { - system?: System; - users: Array; + system: System | null; + users: User[]; }; // In-Memory Database Provider export default class InMemory extends DatabaseProvider { - protected data: InMemoryData = { users: [] }; + protected data: InMemoryData = { system: null, users: [] }; async connect() { DEBUG('Connection...'); @@ -69,7 +68,7 @@ export default class InMemory extends DatabaseProvider { password: '', name: 'wg-easy', cookie: undefined, - } satisfies SessionConfig, + }, }; this.data.system = system; @@ -77,7 +76,7 @@ export default class InMemory extends DatabaseProvider { } async disconnect() { - this.data = { users: [] }; + this.data = { system: null, users: [] }; } async getSystem() { diff --git a/src/repositories/database.ts b/src/services/database/repositories/database.ts similarity index 93% rename from src/repositories/database.ts rename to src/services/database/repositories/database.ts index a01e1e6a..12aa4102 100644 --- a/src/repositories/database.ts +++ b/src/services/database/repositories/database.ts @@ -1,6 +1,6 @@ import type SystemRepository from './system/repository'; import type UserRepository from './user/repository.ts'; -import type { Undefined, Lang, ID } from './types'; +import type { Lang, ID } from './types'; import type { User } from './user/model'; import type { System } from './system/model'; @@ -24,11 +24,11 @@ export default abstract class DatabaseProvider */ abstract disconnect(): Promise; - abstract getSystem(): Promise; + abstract getSystem(): Promise; abstract getLang(): Promise; abstract getUsers(): Promise>; - abstract getUser(id: ID): Promise; + abstract getUser(id: ID): Promise; abstract newUserWithPassword( username: string, password: string diff --git a/src/repositories/system/model.ts b/src/services/database/repositories/system/model.ts similarity index 100% rename from src/repositories/system/model.ts rename to src/services/database/repositories/system/model.ts diff --git a/src/repositories/system/repository.ts b/src/services/database/repositories/system/repository.ts similarity index 77% rename from src/repositories/system/repository.ts rename to src/services/database/repositories/system/repository.ts index 7a82de5d..b1b05da0 100644 --- a/src/repositories/system/repository.ts +++ b/src/services/database/repositories/system/repository.ts @@ -1,4 +1,4 @@ -import type { Lang, Undefined } from '../types'; +import type { Lang } from '../types'; import type { System } from './model'; /** @@ -9,10 +9,10 @@ import type { System } from './model'; export default interface SystemRepository { /** * Retrieves the system configuration data from the database. - * @returns {Promise} A promise that resolves to the system data + * @returns {Promise} A promise that resolves to the system data * if found, or `undefined` if the system data is not available. */ - getSystem(): Promise; + getSystem(): Promise; /** * Retrieves the system's language setting. diff --git a/src/repositories/types.ts b/src/services/database/repositories/types.ts similarity index 91% rename from src/repositories/types.ts rename to src/services/database/repositories/types.ts index 1437cf30..7bec4bf3 100644 --- a/src/repositories/types.ts +++ b/src/services/database/repositories/types.ts @@ -1,6 +1,5 @@ import type * as crypto from 'node:crypto'; -export type Undefined = null | undefined | 0 | ''; export enum Lang { /* english */ EN = 'en', @@ -46,5 +45,5 @@ export type TrafficStats = { }; export type Prometheus = { enabled: boolean; - password?: HashPassword | Undefined; + password: HashPassword | null; }; diff --git a/src/repositories/user/model.ts b/src/services/database/repositories/user/model.ts similarity index 100% rename from src/repositories/user/model.ts rename to src/services/database/repositories/user/model.ts diff --git a/src/repositories/user/repository.ts.ts b/src/services/database/repositories/user/repository.ts.ts similarity index 87% rename from src/repositories/user/repository.ts.ts rename to src/services/database/repositories/user/repository.ts.ts index 4e39de51..e1532c3a 100644 --- a/src/repositories/user/repository.ts.ts +++ b/src/services/database/repositories/user/repository.ts.ts @@ -1,4 +1,4 @@ -import type { ID, Undefined } from '../types'; +import type { ID } from '../types'; import type { User } from './model'; /** @@ -15,10 +15,10 @@ export default interface UserRepository { /** * Retrieves a user by their ID or User object from the database. * @param {ID} id - The ID of the user or a User object. - * @returns {Promise} A promise that resolves to the user data + * @returns {Promise} A promise that resolves to the user data * if found, or `undefined` if the user is not available. */ - getUser(id: ID): Promise; + getUser(id: ID): Promise; newUserWithPassword(username: string, password: string): Promise;