diff --git a/src/cli/admin/reset.ts b/src/cli/admin/reset.ts index 07743d2b..a9725b6b 100644 --- a/src/cli/admin/reset.ts +++ b/src/cli/admin/reset.ts @@ -2,8 +2,8 @@ import { defineCommand } from 'citty'; import { consola } from 'consola'; import { eq } from 'drizzle-orm'; -import { db, schema } from '../db'; -import { hashPassword } from '../../server/utils/password'; +import { db, schema } from '#cli/db'; +import { hashPassword } from '#server/utils/password'; export default defineCommand({ meta: { diff --git a/src/cli/build.js b/src/cli/build.js index 143a47bc..14d4010d 100644 --- a/src/cli/build.js +++ b/src/cli/build.js @@ -1,6 +1,7 @@ // @ts-check import { fileURLToPath } from 'node:url'; + import esbuild from 'esbuild'; esbuild.build({ @@ -9,17 +10,6 @@ esbuild.build({ outfile: fileURLToPath(new URL('../.output/server/cli.mjs', import.meta.url)), platform: 'node', format: 'esm', - plugins: [ - { - name: 'make-all-packages-external', - setup(build) { - let filter = /^[^./]|^\.[^./]|^\.\.[^/]/; // Must not start with "/" or "./" or "../" - build.onResolve({ filter }, (args) => ({ - path: args.path, - external: true, - })); - }, - }, - ], + packages: 'external', logLevel: 'info', }); diff --git a/src/cli/clients/list.ts b/src/cli/clients/list.ts index 3b45958d..e060badd 100644 --- a/src/cli/clients/list.ts +++ b/src/cli/clients/list.ts @@ -1,7 +1,7 @@ import { defineCommand } from 'citty'; import { consola } from 'consola'; -import { db } from '../db'; +import { db } from '#cli/db'; export default defineCommand({ meta: { diff --git a/src/cli/clients/qr.ts b/src/cli/clients/qr.ts index 9c76d9ad..f0b7a33d 100644 --- a/src/cli/clients/qr.ts +++ b/src/cli/clients/qr.ts @@ -2,9 +2,9 @@ import { defineCommand } from 'citty'; import { consola } from 'consola'; import { eq } from 'drizzle-orm'; -import { wg } from '../../server/utils/wgHelper'; -import { encodeQRCodeTerm } from '../../server/utils/qr'; -import { db, schema } from '../db'; +import { db, schema } from '#cli/db'; +import { wg } from '#server/utils/wgHelper'; +import { encodeQRCodeTerm } from '#server/utils/qr'; export default defineCommand({ meta: { diff --git a/src/cli/db.ts b/src/cli/db.ts index 70945378..63b68555 100644 --- a/src/cli/db.ts +++ b/src/cli/db.ts @@ -1,7 +1,7 @@ import { createClient } from '@libsql/client'; import { drizzle } from 'drizzle-orm/libsql'; -import * as schema from '../server/database/schema'; +import * as schema from '#server/database/schema'; //const client = createClient({ url: 'file:../data/wg-easy.db' }); const client = createClient({ url: 'file:/etc/wireguard/wg-easy.db' }); diff --git a/src/cli/index.ts b/src/cli/index.ts index 69de8314..bbb2c353 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -6,9 +6,10 @@ import { defineCommand, runMain } from 'citty'; import packageJson from '../package.json'; // Commands -import dbAdminReset from './admin/reset'; -import clientsList from './clients/list'; -import clientsQr from './clients/qr'; +import clientsList from '#cli/clients/list'; +import clientsQr from '#cli/clients/qr'; +import dbAdminReset from '#cli/admin/reset'; + const subCommands = [dbAdminReset, clientsList, clientsQr] as const; // from citty diff --git a/src/cli/tsconfig.json b/src/cli/tsconfig.json index 6a1a3386..698f1a8f 100644 --- a/src/cli/tsconfig.json +++ b/src/cli/tsconfig.json @@ -6,7 +6,12 @@ "esModuleInterop": true, "strict": true, "skipLibCheck": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", + "paths": { + "#cli/*": ["./*"], + "#server/*": ["../server/*"], + "#db/*": ["../server/database/*"] + } }, "include": ["./**/*.ts"] } diff --git a/src/eslint.config.mjs b/src/eslint.config.mjs index a63a9f85..5b12463a 100644 --- a/src/eslint.config.mjs +++ b/src/eslint.config.mjs @@ -1,10 +1,11 @@ import eslintConfigPrettier from 'eslint-config-prettier'; + import withNuxt from './.nuxt/eslint.config.mjs'; export default withNuxt([ { rules: { - 'import/order': 'warn', + 'import/order': ['warn', { 'newlines-between': 'always' }], }, }, eslintConfigPrettier, diff --git a/src/i18n/localeDetector.ts b/src/i18n/localeDetector.ts index 88482a18..466c1772 100644 --- a/src/i18n/localeDetector.ts +++ b/src/i18n/localeDetector.ts @@ -1,4 +1,13 @@ -export default defineI18nLocaleDetector((event, config) => { +import { + tryCookieLocale, + tryHeaderLocale, + tryQueryLocale, +} from '@intlify/utils/h3'; +import type { H3Event } from 'h3'; + +// TODO: use defineI18nLocaleDetector + +export default (event: H3Event, config: { defaultLocale: string }) => { const query = tryQueryLocale(event, { lang: '' }); if (query) { return query.toString(); @@ -18,4 +27,4 @@ export default defineI18nLocaleDetector((event, config) => { } return config.defaultLocale; -}); +}; diff --git a/src/nuxt.config.ts b/src/nuxt.config.ts index ca593b9b..0240aa6c 100644 --- a/src/nuxt.config.ts +++ b/src/nuxt.config.ts @@ -160,21 +160,21 @@ export default defineNuxtConfig({ }, }, nitro: { + imports: { + autoImport: false, + }, esbuild: { options: { // to support big int target: 'node20', }, }, - alias: { - '#db': fileURLToPath(new URL('./server/database/', import.meta.url)), - }, externals: { traceInclude: [fileURLToPath(new URL('./cli/index.ts', import.meta.url))], }, }, alias: { - // for typecheck reasons (https://github.com/nuxt/cli/issues/323) '#db': fileURLToPath(new URL('./server/database/', import.meta.url)), + '#cli': fileURLToPath(new URL('./cli', import.meta.url)), }, }); diff --git a/src/package.json b/src/package.json index 5e7b89ec..52fb6e24 100644 --- a/src/package.json +++ b/src/package.json @@ -23,6 +23,8 @@ "dependencies": { "@eschricht/nuxt-color-mode": "^1.2.0", "@heroicons/vue": "^2.2.0", + "@intlify/h3": "^0.7.4", + "@intlify/utils": "^0.14.1", "@libsql/client": "^0.17.3", "@nuxtjs/i18n": "^10.4.0", "@nuxtjs/tailwindcss": "^6.14.0", @@ -38,12 +40,15 @@ "consola": "^3.4.2", "crc-32": "^1.2.2", "drizzle-orm": "^0.45.2", + "h3": "^1.15.11", "ip-bigint": "^9.0.6", "is-cidr": "^7.0.0", "is-ip": "^5.0.1", "js-sha256": "^0.11.1", "nuxt": "^3.21.8", + "nitropack": "^2.13.4", "obug": "^2.1.2", + "ofetch": "^1.5.1", "openid-client": "^6.8.4", "otpauth": "^9.5.1", "pinia": "^3.0.4", diff --git a/src/pnpm-lock.yaml b/src/pnpm-lock.yaml index a144ffde..7702f681 100644 --- a/src/pnpm-lock.yaml +++ b/src/pnpm-lock.yaml @@ -14,6 +14,12 @@ importers: '@heroicons/vue': specifier: ^2.2.0 version: 2.2.0(vue@3.5.38(typescript@6.0.3)) + '@intlify/h3': + specifier: ^0.7.4 + version: 0.7.4 + '@intlify/utils': + specifier: ^0.14.1 + version: 0.14.1 '@libsql/client': specifier: ^0.17.3 version: 0.17.3 @@ -59,6 +65,9 @@ importers: drizzle-orm: specifier: ^0.45.2 version: 0.45.2(@libsql/client@0.17.3) + h3: + specifier: ^1.15.11 + version: 1.15.11 ip-bigint: specifier: ^9.0.6 version: 9.0.6 @@ -71,12 +80,18 @@ importers: js-sha256: specifier: ^0.11.1 version: 0.11.1 + nitropack: + specifier: ^2.13.4 + version: 2.13.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@libsql/client@0.17.3))(oxc-parser@0.132.0)(srvx@0.11.16) nuxt: specifier: ^3.21.8 version: 3.21.8(@libsql/client@0.17.3)(@parcel/watcher@2.5.6)(@types/node@25.9.3)(@vue/compiler-sfc@3.5.38)(cac@6.7.14)(db0@0.3.4(@libsql/client@0.17.3)(drizzle-orm@0.45.2(@libsql/client@0.17.3)))(drizzle-orm@0.45.2(@libsql/client@0.17.3))(eslint@9.39.4(jiti@1.21.7))(ioredis@5.11.1)(magicast@0.5.3)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.61.1))(rollup@4.61.1)(srvx@0.11.16)(terser@5.48.0)(tsx@4.22.4)(typescript@6.0.3)(vite@7.3.5(@types/node@25.9.3)(jiti@1.21.7)(terser@5.48.0)(tsx@4.22.4)(yaml@2.9.0))(vue-tsc@3.3.4(typescript@6.0.3))(yaml@2.9.0) obug: specifier: ^2.1.2 version: 2.1.2 + ofetch: + specifier: ^1.5.1 + version: 1.5.1 openid-client: specifier: ^6.8.4 version: 6.8.4 diff --git a/src/server/api/admin/general.get.ts b/src/server/api/admin/general.get.ts index 075eefce..32dd7efa 100644 --- a/src/server/api/admin/general.get.ts +++ b/src/server/api/admin/general.get.ts @@ -1,3 +1,6 @@ +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; + export default definePermissionEventHandler('admin', 'any', async () => { const generalConfig = await Database.general.getConfig(); return generalConfig; diff --git a/src/server/api/admin/general.post.ts b/src/server/api/admin/general.post.ts index 414af6d7..5c1d936b 100644 --- a/src/server/api/admin/general.post.ts +++ b/src/server/api/admin/general.post.ts @@ -1,3 +1,8 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { GeneralUpdateSchema } from '#db/repositories/general/types'; export default definePermissionEventHandler( diff --git a/src/server/api/admin/hooks.get.ts b/src/server/api/admin/hooks.get.ts index 035cc252..eec83626 100644 --- a/src/server/api/admin/hooks.get.ts +++ b/src/server/api/admin/hooks.get.ts @@ -1,3 +1,6 @@ +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; + export default definePermissionEventHandler('admin', 'any', async () => { const hooks = await Database.hooks.get(); return hooks; diff --git a/src/server/api/admin/hooks.post.ts b/src/server/api/admin/hooks.post.ts index 1acb94c2..6bf4959a 100644 --- a/src/server/api/admin/hooks.post.ts +++ b/src/server/api/admin/hooks.post.ts @@ -1,3 +1,9 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { HooksUpdateSchema } from '#db/repositories/hooks/types'; export default definePermissionEventHandler( diff --git a/src/server/api/admin/interface/cidr.post.ts b/src/server/api/admin/interface/cidr.post.ts index 95e239cf..612a2d92 100644 --- a/src/server/api/admin/interface/cidr.post.ts +++ b/src/server/api/admin/interface/cidr.post.ts @@ -1,3 +1,9 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { InterfaceCidrUpdateSchema } from '#db/repositories/interface/types'; export default definePermissionEventHandler( diff --git a/src/server/api/admin/interface/index.get.ts b/src/server/api/admin/interface/index.get.ts index 7161aecc..44a4e944 100644 --- a/src/server/api/admin/interface/index.get.ts +++ b/src/server/api/admin/interface/index.get.ts @@ -1,3 +1,6 @@ +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; + export default definePermissionEventHandler('admin', 'any', async () => { const wgInterface = await Database.interfaces.get(); diff --git a/src/server/api/admin/interface/index.post.ts b/src/server/api/admin/interface/index.post.ts index 6fe10d62..8444295b 100644 --- a/src/server/api/admin/interface/index.post.ts +++ b/src/server/api/admin/interface/index.post.ts @@ -1,3 +1,11 @@ +import { createError, readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { WG_ENV } from '#server/utils/config'; +import { firewall } from '#server/utils/firewall'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { InterfaceUpdateSchema } from '#db/repositories/interface/types'; export default definePermissionEventHandler( diff --git a/src/server/api/admin/interface/restart.post.ts b/src/server/api/admin/interface/restart.post.ts index aaf7ae39..c3f95e93 100644 --- a/src/server/api/admin/interface/restart.post.ts +++ b/src/server/api/admin/interface/restart.post.ts @@ -1,3 +1,6 @@ +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; + export default definePermissionEventHandler('admin', 'any', async () => { await WireGuard.Restart(); diff --git a/src/server/api/admin/ip-info.get.ts b/src/server/api/admin/ip-info.get.ts index 1ea6d745..b558c6f4 100644 --- a/src/server/api/admin/ip-info.get.ts +++ b/src/server/api/admin/ip-info.get.ts @@ -1,3 +1,6 @@ +import { definePermissionEventHandler } from '#server/utils/handler'; +import { cachedGetIpInformation } from '#server/utils/ip'; + export default definePermissionEventHandler('admin', 'any', async () => { const result = await cachedGetIpInformation(); return result; diff --git a/src/server/api/admin/userconfig.get.ts b/src/server/api/admin/userconfig.get.ts index b41a81bd..52a175de 100644 --- a/src/server/api/admin/userconfig.get.ts +++ b/src/server/api/admin/userconfig.get.ts @@ -1,3 +1,6 @@ +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; + export default definePermissionEventHandler('admin', 'any', async () => { const userConfig = await Database.userConfigs.get(); return userConfig; diff --git a/src/server/api/admin/userconfig.post.ts b/src/server/api/admin/userconfig.post.ts index ff150b0c..3ff004be 100644 --- a/src/server/api/admin/userconfig.post.ts +++ b/src/server/api/admin/userconfig.post.ts @@ -1,3 +1,9 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { UserConfigUpdateSchema } from '#db/repositories/userConfig/types'; export default definePermissionEventHandler( diff --git a/src/server/api/auth/[provider]/callback.get.ts b/src/server/api/auth/[provider]/callback.get.ts index ecc6fce5..ec6f4c42 100644 --- a/src/server/api/auth/[provider]/callback.get.ts +++ b/src/server/api/auth/[provider]/callback.get.ts @@ -1,3 +1,11 @@ +import { createError, defineEventHandler, sendRedirect } from 'h3'; + +import Database from '#server/utils/Database'; +import { SERVER_DEBUG } from '#server/utils/config'; +import { buildOauthConfig, getUserInfo } from '#server/utils/oauth'; +import { useWGSession } from '#server/utils/session'; +import { assertUnreachable } from '#server/utils/types'; + export default defineEventHandler(async (event) => { const { config, provider, providerConfig } = await buildOauthConfig(event); diff --git a/src/server/api/auth/[provider]/index.get.ts b/src/server/api/auth/[provider]/index.get.ts index dd973195..f3f4c64e 100644 --- a/src/server/api/auth/[provider]/index.get.ts +++ b/src/server/api/auth/[provider]/index.get.ts @@ -1,6 +1,17 @@ +import { + defineEventHandler, + getRequestHost, + getValidatedQuery, + sendRedirect, +} from 'h3'; import * as client from 'openid-client'; import { z } from 'zod'; +import { WG_ENV } from '#server/utils/config'; +import { buildOauthConfig } from '#server/utils/oauth'; +import { useWGSession } from '#server/utils/session'; +import { validateZod } from '#server/utils/types'; + const OauthQuerySchema = z.object({ link: z.coerce.boolean().optional(), }); diff --git a/src/server/api/auth/[provider]/link.get.ts b/src/server/api/auth/[provider]/link.get.ts index 51b6191d..0d7de85d 100644 --- a/src/server/api/auth/[provider]/link.get.ts +++ b/src/server/api/auth/[provider]/link.get.ts @@ -1,3 +1,10 @@ +import { createError, sendRedirect } from 'h3'; + +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { buildOauthConfig, getUserInfo } from '#server/utils/oauth'; +import { useWGSession } from '#server/utils/session'; + export default definePermissionEventHandler( 'me', 'update', diff --git a/src/server/api/auth/cancel.post.ts b/src/server/api/auth/cancel.post.ts index dfa62f12..fa54be0c 100644 --- a/src/server/api/auth/cancel.post.ts +++ b/src/server/api/auth/cancel.post.ts @@ -1,3 +1,7 @@ +import { defineEventHandler } from 'h3'; + +import { useWGSession } from '#server/utils/session'; + export default defineEventHandler(async (event) => { const session = await useWGSession(event); diff --git a/src/server/api/auth/methods.get.ts b/src/server/api/auth/methods.get.ts index 48b9fb2e..abae6827 100644 --- a/src/server/api/auth/methods.get.ts +++ b/src/server/api/auth/methods.get.ts @@ -1,3 +1,9 @@ +import { defineEventHandler } from 'h3'; + +import { WG_ENV } from '#server/utils/config'; +import { OAUTH_PROVIDERS } from '#server/utils/oauth'; +import type { OAUTH_PROVIDER } from '#server/utils/oauth'; + export default defineEventHandler(() => { return { providers: WG_ENV.OAUTH_PROVIDERS?.reduce( diff --git a/src/server/api/auth/password.post.ts b/src/server/api/auth/password.post.ts index ba9dd6f8..90c8fddc 100644 --- a/src/server/api/auth/password.post.ts +++ b/src/server/api/auth/password.post.ts @@ -1,3 +1,9 @@ +import { createError, defineEventHandler, readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { SERVER_DEBUG, WG_ENV } from '#server/utils/config'; +import { useWGSession } from '#server/utils/session'; +import { assertUnreachable, validateZod } from '#server/utils/types'; import { UserLoginSchema } from '#db/repositories/user/types'; export default defineEventHandler(async (event) => { diff --git a/src/server/api/auth/pending.get.ts b/src/server/api/auth/pending.get.ts index cb974baf..9de80688 100644 --- a/src/server/api/auth/pending.get.ts +++ b/src/server/api/auth/pending.get.ts @@ -1,3 +1,7 @@ +import { createError, defineEventHandler } from 'h3'; + +import { useWGSession } from '#server/utils/session'; + export default defineEventHandler(async (event) => { const session = await useWGSession(event); diff --git a/src/server/api/auth/unlink.post.ts b/src/server/api/auth/unlink.post.ts index 6be0e644..b9f8373c 100644 --- a/src/server/api/auth/unlink.post.ts +++ b/src/server/api/auth/unlink.post.ts @@ -1,3 +1,6 @@ +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; + export default definePermissionEventHandler( 'me', 'update', diff --git a/src/server/api/auth/verify-2fa.post.ts b/src/server/api/auth/verify-2fa.post.ts index c4ce0638..c0d40532 100644 --- a/src/server/api/auth/verify-2fa.post.ts +++ b/src/server/api/auth/verify-2fa.post.ts @@ -1,3 +1,8 @@ +import { createError, defineEventHandler, readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { useWGSession } from '#server/utils/session'; +import { assertUnreachable, validateZod } from '#server/utils/types'; import { Verify2faSchema } from '#db/repositories/user/types'; export default defineEventHandler(async (event) => { diff --git a/src/server/api/client/[clientId]/configuration.get.ts b/src/server/api/client/[clientId]/configuration.get.ts index 847f1735..50891c63 100644 --- a/src/server/api/client/[clientId]/configuration.get.ts +++ b/src/server/api/client/[clientId]/configuration.get.ts @@ -1,3 +1,9 @@ +import { createError, getValidatedRouterParams, setHeader } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/[clientId]/disable.post.ts b/src/server/api/client/[clientId]/disable.post.ts index 0338045f..99f722f5 100644 --- a/src/server/api/client/[clientId]/disable.post.ts +++ b/src/server/api/client/[clientId]/disable.post.ts @@ -1,3 +1,9 @@ +import { getValidatedRouterParams } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/[clientId]/enable.post.ts b/src/server/api/client/[clientId]/enable.post.ts index 16f2fbb8..f8b71bb9 100644 --- a/src/server/api/client/[clientId]/enable.post.ts +++ b/src/server/api/client/[clientId]/enable.post.ts @@ -1,3 +1,9 @@ +import { createError, getValidatedRouterParams } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/[clientId]/generateOneTimeLink.post.ts b/src/server/api/client/[clientId]/generateOneTimeLink.post.ts index 9363ed93..82eb97a9 100644 --- a/src/server/api/client/[clientId]/generateOneTimeLink.post.ts +++ b/src/server/api/client/[clientId]/generateOneTimeLink.post.ts @@ -1,3 +1,8 @@ +import { getValidatedRouterParams } from 'h3'; + +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/[clientId]/index.delete.ts b/src/server/api/client/[clientId]/index.delete.ts index 2267e89d..a4923d1f 100644 --- a/src/server/api/client/[clientId]/index.delete.ts +++ b/src/server/api/client/[clientId]/index.delete.ts @@ -1,3 +1,9 @@ +import { getValidatedRouterParams } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/[clientId]/index.get.ts b/src/server/api/client/[clientId]/index.get.ts index eb630a16..87428de2 100644 --- a/src/server/api/client/[clientId]/index.get.ts +++ b/src/server/api/client/[clientId]/index.get.ts @@ -1,3 +1,9 @@ +import { createError, getValidatedRouterParams } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/[clientId]/index.post.ts b/src/server/api/client/[clientId]/index.post.ts index 82f49b52..c52361eb 100644 --- a/src/server/api/client/[clientId]/index.post.ts +++ b/src/server/api/client/[clientId]/index.post.ts @@ -1,3 +1,9 @@ +import { getValidatedRouterParams, readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema, ClientUpdateSchema, diff --git a/src/server/api/client/[clientId]/qrcode.svg.get.ts b/src/server/api/client/[clientId]/qrcode.svg.get.ts index 6d25d577..4de6d7d0 100644 --- a/src/server/api/client/[clientId]/qrcode.svg.get.ts +++ b/src/server/api/client/[clientId]/qrcode.svg.get.ts @@ -1,3 +1,9 @@ +import { getValidatedRouterParams, setHeader } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientGetSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/index.get.ts b/src/server/api/client/index.get.ts index ca64f1d8..e2b41d78 100644 --- a/src/server/api/client/index.get.ts +++ b/src/server/api/client/index.get.ts @@ -1,3 +1,9 @@ +import { getValidatedQuery } from 'h3'; + +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; +import { roles } from '#shared/utils/permissions'; import { ClientQuerySchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/client/index.post.ts b/src/server/api/client/index.post.ts index e8e5da37..67f320ae 100644 --- a/src/server/api/client/index.post.ts +++ b/src/server/api/client/index.post.ts @@ -1,3 +1,9 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { ClientCreateSchema } from '#db/repositories/client/types'; export default definePermissionEventHandler( diff --git a/src/server/api/information.get.ts b/src/server/api/information.get.ts index ff9e2373..765dda7b 100644 --- a/src/server/api/information.get.ts +++ b/src/server/api/information.get.ts @@ -1,5 +1,10 @@ +import { defineEventHandler } from 'h3'; import { gt } from 'semver'; +import Database from '#server/utils/Database'; +import { RELEASE, WG_ENV } from '#server/utils/config'; +import { cachedFetchLatestRelease } from '#server/utils/release'; + export default defineEventHandler(async () => { const latestRelease = await cachedFetchLatestRelease(); const updateAvailable = gt(latestRelease.version, RELEASE); diff --git a/src/server/api/me/index.post.ts b/src/server/api/me/index.post.ts index daf19c55..99aef710 100644 --- a/src/server/api/me/index.post.ts +++ b/src/server/api/me/index.post.ts @@ -1,3 +1,8 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { UserUpdateSchema } from '#db/repositories/user/types'; export default definePermissionEventHandler( diff --git a/src/server/api/me/password.post.ts b/src/server/api/me/password.post.ts index 87ace186..bfabbbbd 100644 --- a/src/server/api/me/password.post.ts +++ b/src/server/api/me/password.post.ts @@ -1,3 +1,8 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { UserUpdatePasswordSchema } from '#db/repositories/user/types'; export default definePermissionEventHandler( diff --git a/src/server/api/me/totp.post.ts b/src/server/api/me/totp.post.ts index f3782828..c59ba350 100644 --- a/src/server/api/me/totp.post.ts +++ b/src/server/api/me/totp.post.ts @@ -1,4 +1,9 @@ +import { createError, readValidatedBody } from 'h3'; import { Secret, TOTP } from 'otpauth'; + +import Database from '#server/utils/Database'; +import { definePermissionEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { UserUpdateTotpSchema } from '#db/repositories/user/types'; type Response = diff --git a/src/server/api/session.delete.ts b/src/server/api/session.delete.ts index 1ee6ddce..9ff6e269 100644 --- a/src/server/api/session.delete.ts +++ b/src/server/api/session.delete.ts @@ -1,3 +1,8 @@ +import { createError, defineEventHandler } from 'h3'; + +import { SERVER_DEBUG } from '#server/utils/config'; +import { useWGSession } from '#server/utils/session'; + export default defineEventHandler(async (event) => { const session = await useWGSession(event); const sessionId = session.id; diff --git a/src/server/api/session.get.ts b/src/server/api/session.get.ts index 7cb38bb6..8d7cb540 100644 --- a/src/server/api/session.get.ts +++ b/src/server/api/session.get.ts @@ -1,3 +1,9 @@ +import { createError, defineEventHandler } from 'h3'; + +import Database from '#server/utils/Database'; +import { useWGSession } from '#server/utils/session'; +import type { SharedPublicUser } from '#shared/utils/permissions'; + export default defineEventHandler(async (event) => { const session = await useWGSession(event); diff --git a/src/server/api/setup/2.post.ts b/src/server/api/setup/2.post.ts index 29c0c769..85dea17a 100644 --- a/src/server/api/setup/2.post.ts +++ b/src/server/api/setup/2.post.ts @@ -1,3 +1,8 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { defineSetupEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { UserSetupSchema } from '#db/repositories/user/types'; export default defineSetupEventHandler(2, async ({ event }) => { diff --git a/src/server/api/setup/4.get.ts b/src/server/api/setup/4.get.ts index 4c2a5186..154c059c 100644 --- a/src/server/api/setup/4.get.ts +++ b/src/server/api/setup/4.get.ts @@ -1,3 +1,6 @@ +import { defineSetupEventHandler } from '#server/utils/handler'; +import { cachedGetIpInformation } from '#server/utils/ip'; + export default defineSetupEventHandler(4, async () => { const result = await cachedGetIpInformation(); return result; diff --git a/src/server/api/setup/4.post.ts b/src/server/api/setup/4.post.ts index 192fce38..3f872068 100644 --- a/src/server/api/setup/4.post.ts +++ b/src/server/api/setup/4.post.ts @@ -1,3 +1,8 @@ +import { readValidatedBody } from 'h3'; + +import Database from '#server/utils/Database'; +import { defineSetupEventHandler } from '#server/utils/handler'; +import { validateZod } from '#server/utils/types'; import { UserConfigSetupSchema } from '#db/repositories/userConfig/types'; export default defineSetupEventHandler(4, async ({ event }) => { diff --git a/src/server/api/setup/migrate.post.ts b/src/server/api/setup/migrate.post.ts index 9c0a549a..f73abad7 100644 --- a/src/server/api/setup/migrate.post.ts +++ b/src/server/api/setup/migrate.post.ts @@ -1,7 +1,13 @@ +import { readValidatedBody } from 'h3'; import { parseCidr } from 'cidr-tools'; import { stringifyIp } from 'ip-bigint'; import { z } from 'zod'; +import Database from '#server/utils/Database'; +import { defineSetupEventHandler } from '#server/utils/handler'; +import { nextIP } from '#server/utils/ip'; +import { FileSchema, validateZod } from '#server/utils/types'; + export default defineSetupEventHandler('migrate', async ({ event }) => { const { file } = await readValidatedBody( event, diff --git a/src/server/database/repositories/client/schema.ts b/src/server/database/repositories/client/schema.ts index f60e0547..827f59a9 100644 --- a/src/server/database/repositories/client/schema.ts +++ b/src/server/database/repositories/client/schema.ts @@ -1,7 +1,9 @@ import { sql, relations } from 'drizzle-orm'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; -import { oneTimeLink, user, wgInterface } from '../../schema'; +import { wgInterface } from '#db/repositories/interface/schema'; +import { oneTimeLink } from '#db/repositories/oneTimeLink/schema'; +import { user } from '#db/repositories/user/schema'; /** null means use value from userConfig */ diff --git a/src/server/database/repositories/client/service.ts b/src/server/database/repositories/client/service.ts index 82acbfac..14b664b1 100644 --- a/src/server/database/repositories/client/service.ts +++ b/src/server/database/repositories/client/service.ts @@ -1,5 +1,6 @@ import { eq, sql, or, like, and } from 'drizzle-orm'; import { containsCidr, parseCidr } from 'cidr-tools'; + import { client } from './schema'; import type { ClientCreateFromExistingType, @@ -7,6 +8,11 @@ import type { ClientQueryType, UpdateClientType, } from './types'; + +import Database from '#server/utils/Database'; +import { nextIP } from '#server/utils/ip'; +import type { ID } from '#server/utils/types'; +import { wg } from '#server/utils/wgHelper'; import type { DBType } from '#db/sqlite'; import { wgInterface, userConfig } from '#db/schema'; diff --git a/src/server/database/repositories/client/types.ts b/src/server/database/repositories/client/types.ts index 4c609771..f7497e31 100644 --- a/src/server/database/repositories/client/types.ts +++ b/src/server/database/repositories/client/types.ts @@ -1,9 +1,28 @@ import type { InferSelectModel } from 'drizzle-orm'; import z from 'zod'; - import { isIPv4, isIPv6 } from 'is-ip'; + import type { client } from './schema'; +import { + AddressSchema, + AllowedIpsSchema, + DnsSchema, + EnabledSchema, + FirewallIpsSchema, + HookSchema, + ISchema, + JcSchema, + JmaxSchema, + JminSchema, + MtuSchema, + PersistentKeepaliveSchema, + controlStringRefine, + safeStringRefine, + schemaForType, + t, +} from '#server/utils/types'; + export type ClientType = InferSelectModel; export type ClientNextIpType = Pick; diff --git a/src/server/database/repositories/general/service.ts b/src/server/database/repositories/general/service.ts index ef629fd8..cc477a48 100644 --- a/src/server/database/repositories/general/service.ts +++ b/src/server/database/repositories/general/service.ts @@ -1,6 +1,9 @@ import { sql } from 'drizzle-orm'; + import { general } from './schema'; import type { GeneralUpdateType } from './types'; + +import { hashPassword, isValidPasswordHash } from '#server/utils/password'; import type { DBType } from '#db/sqlite'; function createPreparedStatement(db: DBType) { diff --git a/src/server/database/repositories/general/types.ts b/src/server/database/repositories/general/types.ts index 3097f645..55e3ce6b 100644 --- a/src/server/database/repositories/general/types.ts +++ b/src/server/database/repositories/general/types.ts @@ -1,7 +1,10 @@ import type { InferSelectModel } from 'drizzle-orm'; import z from 'zod'; + import type { general } from './schema'; +import { safeStringRefine, t } from '#server/utils/types'; + export type GeneralType = InferSelectModel; const sessionTimeout = z.number({ message: t('zod.general.sessionTimeout') }); diff --git a/src/server/database/repositories/hooks/schema.ts b/src/server/database/repositories/hooks/schema.ts index 001eecf0..5db89ae2 100644 --- a/src/server/database/repositories/hooks/schema.ts +++ b/src/server/database/repositories/hooks/schema.ts @@ -1,7 +1,7 @@ import { sql } from 'drizzle-orm'; import { sqliteTable, text } from 'drizzle-orm/sqlite-core'; -import { wgInterface } from '../../schema'; +import { wgInterface } from '#db/repositories/interface/schema'; export const hooks = sqliteTable('hooks_table', { /** same as `wgInterface.name` */ diff --git a/src/server/database/repositories/hooks/service.ts b/src/server/database/repositories/hooks/service.ts index b3ea4073..41af78b8 100644 --- a/src/server/database/repositories/hooks/service.ts +++ b/src/server/database/repositories/hooks/service.ts @@ -1,6 +1,8 @@ import { eq, sql } from 'drizzle-orm'; + import { hooks } from './schema'; import type { HooksUpdateType } from './types'; + import type { DBType } from '#db/sqlite'; function createPreparedStatement(db: DBType) { diff --git a/src/server/database/repositories/hooks/types.ts b/src/server/database/repositories/hooks/types.ts index f9bba9a4..e5368cc7 100644 --- a/src/server/database/repositories/hooks/types.ts +++ b/src/server/database/repositories/hooks/types.ts @@ -1,7 +1,10 @@ import type { InferSelectModel } from 'drizzle-orm'; import z from 'zod'; + import type { hooks } from './schema'; +import { HookSchema, schemaForType } from '#server/utils/types'; + export type HooksType = InferSelectModel; export type HooksUpdateType = Omit; diff --git a/src/server/database/repositories/interface/schema.ts b/src/server/database/repositories/interface/schema.ts index bf1bd315..b7c221de 100644 --- a/src/server/database/repositories/interface/schema.ts +++ b/src/server/database/repositories/interface/schema.ts @@ -1,7 +1,8 @@ import { sql, relations } from 'drizzle-orm'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; -import { userConfig, hooks } from '../../schema'; +import { hooks } from '#db/repositories/hooks/schema'; +import { userConfig } from '#db/repositories/userConfig/schema'; // maybe support multiple interfaces in the future export const wgInterface = sqliteTable('interfaces_table', { diff --git a/src/server/database/repositories/interface/service.ts b/src/server/database/repositories/interface/service.ts index 4c0d0b42..d6866cbb 100644 --- a/src/server/database/repositories/interface/service.ts +++ b/src/server/database/repositories/interface/service.ts @@ -1,7 +1,10 @@ import { eq, sql } from 'drizzle-orm'; import { parseCidr } from 'cidr-tools'; + import { wgInterface } from './schema'; import type { InterfaceCidrUpdateType, InterfaceUpdateType } from './types'; + +import { nextIP } from '#server/utils/ip'; import { client as clientSchema } from '#db/schema'; import type { DBType } from '#db/sqlite'; diff --git a/src/server/database/repositories/interface/types.ts b/src/server/database/repositories/interface/types.ts index 5e46cfc6..501a6add 100644 --- a/src/server/database/repositories/interface/types.ts +++ b/src/server/database/repositories/interface/types.ts @@ -1,8 +1,24 @@ import type { InferSelectModel } from 'drizzle-orm'; import z from 'zod'; import isCidr from 'is-cidr'; + import type { wgInterface } from './schema'; +import { + EnabledSchema, + HSchema, + ISchema, + JcSchema, + JmaxSchema, + JminSchema, + MtuSchema, + PortSchema, + SSchema, + safeStringRefine, + schemaForType, + t, +} from '#server/utils/types'; + export type InterfaceType = InferSelectModel; export type InterfaceCreateType = Omit< diff --git a/src/server/database/repositories/oneTimeLink/schema.ts b/src/server/database/repositories/oneTimeLink/schema.ts index 3d0f4caf..ccd6aa84 100644 --- a/src/server/database/repositories/oneTimeLink/schema.ts +++ b/src/server/database/repositories/oneTimeLink/schema.ts @@ -1,7 +1,7 @@ import { sql, relations } from 'drizzle-orm'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; -import { client } from '../../schema'; +import { client } from '#db/repositories/client/schema'; export const oneTimeLink = sqliteTable('one_time_links_table', { /** same as `client.id` */ diff --git a/src/server/database/repositories/oneTimeLink/service.ts b/src/server/database/repositories/oneTimeLink/service.ts index 68328d13..c2e8dbee 100644 --- a/src/server/database/repositories/oneTimeLink/service.ts +++ b/src/server/database/repositories/oneTimeLink/service.ts @@ -1,6 +1,9 @@ import { eq, sql } from 'drizzle-orm'; import CRC32 from 'crc-32'; + import { oneTimeLink } from './schema'; + +import type { ID } from '#server/utils/types'; import type { DBType } from '#db/sqlite'; function createPreparedStatement(db: DBType) { diff --git a/src/server/database/repositories/oneTimeLink/types.ts b/src/server/database/repositories/oneTimeLink/types.ts index f05270df..d022c298 100644 --- a/src/server/database/repositories/oneTimeLink/types.ts +++ b/src/server/database/repositories/oneTimeLink/types.ts @@ -1,7 +1,10 @@ import type { InferSelectModel } from 'drizzle-orm'; import { z } from 'zod'; + import type { oneTimeLink } from './schema'; +import { safeStringRefine, t } from '#server/utils/types'; + export type OneTimeLinkType = InferSelectModel; const oneTimeLinkType = z diff --git a/src/server/database/repositories/user/schema.ts b/src/server/database/repositories/user/schema.ts index ede3d577..3e83f80f 100644 --- a/src/server/database/repositories/user/schema.ts +++ b/src/server/database/repositories/user/schema.ts @@ -1,7 +1,9 @@ import { sql, relations } from 'drizzle-orm'; import { int, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core'; -import { client } from '../../schema'; +import { client } from '#db/repositories/client/schema'; +import type { Role } from '#shared/utils/permissions'; +import type { OAUTH_PROVIDER } from '#server/utils/oauth'; export const user = sqliteTable( 'users_table', diff --git a/src/server/database/repositories/user/service.ts b/src/server/database/repositories/user/service.ts index b84ed365..ed88f2d0 100644 --- a/src/server/database/repositories/user/service.ts +++ b/src/server/database/repositories/user/service.ts @@ -1,7 +1,14 @@ import { eq, sql, and } from 'drizzle-orm'; import { TOTP } from 'otpauth'; + import { user } from './schema'; import type { UserType } from './types'; + +import { WG_ENV } from '#server/utils/config'; +import type { OAUTH_PROVIDER } from '#server/utils/oauth'; +import { hashPassword, isPasswordValid } from '#server/utils/password'; +import type { ID } from '#server/utils/types'; +import { roles } from '#shared/utils/permissions'; import type { DBType } from '#db/sqlite'; type LoginResult = diff --git a/src/server/database/repositories/user/types.ts b/src/server/database/repositories/user/types.ts index 043d560b..925483c7 100644 --- a/src/server/database/repositories/user/types.ts +++ b/src/server/database/repositories/user/types.ts @@ -1,7 +1,10 @@ import type { InferSelectModel } from 'drizzle-orm'; import z from 'zod'; + import type { user } from './schema'; +import { safeStringRefine, t } from '#server/utils/types'; + export type UserType = InferSelectModel; const username = z diff --git a/src/server/database/repositories/userConfig/schema.ts b/src/server/database/repositories/userConfig/schema.ts index 3e8497a1..fed957a1 100644 --- a/src/server/database/repositories/userConfig/schema.ts +++ b/src/server/database/repositories/userConfig/schema.ts @@ -1,7 +1,7 @@ import { sql } from 'drizzle-orm'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; -import { wgInterface } from '../../schema'; +import { wgInterface } from '#db/repositories/interface/schema'; // default* means clients store it themselves export const userConfig = sqliteTable('user_configs_table', { diff --git a/src/server/database/repositories/userConfig/service.ts b/src/server/database/repositories/userConfig/service.ts index ecc3c4cc..db18c8d0 100644 --- a/src/server/database/repositories/userConfig/service.ts +++ b/src/server/database/repositories/userConfig/service.ts @@ -1,6 +1,8 @@ import { eq, sql } from 'drizzle-orm'; + import { userConfig } from './schema'; import type { UserConfigUpdateType } from './types'; + import { wgInterface } from '#db/schema'; import type { DBType } from '#db/sqlite'; diff --git a/src/server/database/repositories/userConfig/types.ts b/src/server/database/repositories/userConfig/types.ts index 3043ea14..48183044 100644 --- a/src/server/database/repositories/userConfig/types.ts +++ b/src/server/database/repositories/userConfig/types.ts @@ -1,7 +1,23 @@ import type { InferSelectModel } from 'drizzle-orm'; import z from 'zod'; + import type { userConfig } from './schema'; +import { + AllowedIpsSchema, + DnsSchema, + ISchema, + JcSchema, + JmaxSchema, + JminSchema, + MtuSchema, + PersistentKeepaliveSchema, + PortSchema, + safeStringRefine, + schemaForType, + t, +} from '#server/utils/types'; + export type UserConfigType = InferSelectModel; const host = z diff --git a/src/server/database/schema.ts b/src/server/database/schema.ts index ae12a76c..028de639 100644 --- a/src/server/database/schema.ts +++ b/src/server/database/schema.ts @@ -1,8 +1,7 @@ -// Make sure to not use any Path Aliases in these files -export * from './repositories/client/schema'; -export * from './repositories/general/schema'; -export * from './repositories/hooks/schema'; -export * from './repositories/interface/schema'; -export * from './repositories/oneTimeLink/schema'; -export * from './repositories/user/schema'; -export * from './repositories/userConfig/schema'; +export * from '#db/repositories/client/schema'; +export * from '#db/repositories/general/schema'; +export * from '#db/repositories/hooks/schema'; +export * from '#db/repositories/interface/schema'; +export * from '#db/repositories/oneTimeLink/schema'; +export * from '#db/repositories/user/schema'; +export * from '#db/repositories/userConfig/schema'; diff --git a/src/server/database/sqlite.ts b/src/server/database/sqlite.ts index 4b0f6723..89e64f34 100644 --- a/src/server/database/sqlite.ts +++ b/src/server/database/sqlite.ts @@ -4,14 +4,15 @@ import { createClient } from '@libsql/client'; import { createDebug } from 'obug'; import { eq } from 'drizzle-orm'; -import * as schema from './schema'; -import { ClientService } from './repositories/client/service'; -import { GeneralService } from './repositories/general/service'; -import { UserService } from './repositories/user/service'; -import { UserConfigService } from './repositories/userConfig/service'; -import { InterfaceService } from './repositories/interface/service'; -import { HooksService } from './repositories/hooks/service'; -import { OneTimeLinkService } from './repositories/oneTimeLink/service'; +import { GeneralService } from '#db/repositories/general/service'; +import { UserService } from '#db/repositories/user/service'; +import { UserConfigService } from '#db/repositories/userConfig/service'; +import { InterfaceService } from '#db/repositories/interface/service'; +import { HooksService } from '#db/repositories/hooks/service'; +import { OneTimeLinkService } from '#db/repositories/oneTimeLink/service'; +import { ClientService } from '#db/repositories/client/service'; +import * as schema from '#db/schema'; +import { WG_ENV, WG_INITIAL_ENV } from '#server/utils/config'; const DB_DEBUG = createDebug('Database'); diff --git a/src/server/middleware/setup.ts b/src/server/middleware/setup.ts index 374cad7b..bbeaac9e 100644 --- a/src/server/middleware/setup.ts +++ b/src/server/middleware/setup.ts @@ -1,3 +1,7 @@ +import { defineEventHandler, getRequestURL, sendRedirect } from 'h3'; + +import Database from '#server/utils/Database'; + /* First setup of wg-easy */ export default defineEventHandler(async (event) => { const url = getRequestURL(event); diff --git a/src/server/plugins/manager.ts b/src/server/plugins/manager.ts index f12811b5..67d894cd 100644 --- a/src/server/plugins/manager.ts +++ b/src/server/plugins/manager.ts @@ -1,3 +1,8 @@ +import { defineNitroPlugin } from 'nitropack/runtime'; + +import WireGuard from '#server/utils/WireGuard'; +import { RELEASE } from '#server/utils/config'; + export default defineNitroPlugin((nitroApp) => { console.log(` ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ diff --git a/src/server/routes/cnf/[oneTimeLink].ts b/src/server/routes/cnf/[oneTimeLink].ts index ecc4273a..a75b691d 100644 --- a/src/server/routes/cnf/[oneTimeLink].ts +++ b/src/server/routes/cnf/[oneTimeLink].ts @@ -1,3 +1,13 @@ +import { + createError, + defineEventHandler, + getValidatedRouterParams, + setHeader, +} from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { validateZod } from '#server/utils/types'; import { OneTimeLinkGetSchema } from '#db/repositories/oneTimeLink/types'; export default defineEventHandler(async (event) => { diff --git a/src/server/routes/metrics/json.get.ts b/src/server/routes/metrics/json.get.ts index ae9b2879..cd4f3dad 100644 --- a/src/server/routes/metrics/json.get.ts +++ b/src/server/routes/metrics/json.get.ts @@ -1,3 +1,7 @@ +import WireGuard from '#server/utils/WireGuard'; +import { defineMetricsHandler } from '#server/utils/handler'; +import { isPeerConnected } from '#shared/utils/time'; + export default defineMetricsHandler('json', async () => { return getMetricsJSON(); }); diff --git a/src/server/routes/metrics/prometheus.get.ts b/src/server/routes/metrics/prometheus.get.ts index 23a1b638..f67a93b2 100644 --- a/src/server/routes/metrics/prometheus.get.ts +++ b/src/server/routes/metrics/prometheus.get.ts @@ -1,3 +1,10 @@ +import { setHeader } from 'h3'; + +import Database from '#server/utils/Database'; +import WireGuard from '#server/utils/WireGuard'; +import { defineMetricsHandler } from '#server/utils/handler'; +import { isPeerConnected } from '#shared/utils/time'; + export default defineMetricsHandler('prometheus', async ({ event }) => { setHeader(event, 'Content-Type', 'text/plain'); return getPrometheusResponse(); diff --git a/src/server/utils/Database.ts b/src/server/utils/Database.ts index 76ae6797..e2b578dd 100644 --- a/src/server/utils/Database.ts +++ b/src/server/utils/Database.ts @@ -1,3 +1,4 @@ +import WireGuard from '#server/utils/WireGuard'; /** * Changing the Database Provider * This design allows for easy swapping of different database implementations. diff --git a/src/server/utils/WireGuard.ts b/src/server/utils/WireGuard.ts index d3d990c7..a810dfde 100644 --- a/src/server/utils/WireGuard.ts +++ b/src/server/utils/WireGuard.ts @@ -1,5 +1,14 @@ import fs from 'node:fs/promises'; + import { createDebug } from 'obug'; + +import Database from '#server/utils/Database'; +import { OLD_ENV, WG_ENV } from '#server/utils/config'; +import { firewall } from '#server/utils/firewall'; +import { encodeQRCode } from '#server/utils/qr'; +import type { ID } from '#server/utils/types'; +import { wg } from '#server/utils/wgHelper'; +import { setIntervalImmediately } from '#shared/utils/time'; import type { InterfaceType } from '#db/repositories/interface/types'; import type { ClientQueryType } from '#db/repositories/client/types'; diff --git a/src/server/utils/cmd.ts b/src/server/utils/cmd.ts index 70c979c9..9a0b41c2 100644 --- a/src/server/utils/cmd.ts +++ b/src/server/utils/cmd.ts @@ -1,4 +1,5 @@ import childProcess from 'child_process'; + import { createDebug } from 'obug'; const CMD_DEBUG = createDebug('CMD'); diff --git a/src/server/utils/config.ts b/src/server/utils/config.ts index 38f6ae8e..3aa1fb8d 100644 --- a/src/server/utils/config.ts +++ b/src/server/utils/config.ts @@ -1,6 +1,13 @@ import { createDebug } from 'obug'; import packageJson from '@@/package.json'; +import { exec } from '#server/utils/cmd'; +import { + OAUTH_PROVIDERS, + isConfiguredOauthProvider, + isValidOauthProvider, +} from '#server/utils/oauth'; + export const RELEASE = 'v' + packageJson.version; export const SERVER_DEBUG = createDebug('Server'); diff --git a/src/server/utils/firewall.ts b/src/server/utils/firewall.ts index 76ad1c64..da07f13a 100644 --- a/src/server/utils/firewall.ts +++ b/src/server/utils/firewall.ts @@ -1,6 +1,7 @@ import { createDebug } from 'obug'; import { isIPv6 } from 'is-ip'; +import { exec } from '#server/utils/cmd'; import type { ClientType } from '#db/repositories/client/types'; import type { InterfaceType } from '#db/repositories/interface/types'; import type { UserConfigType } from '#db/repositories/userConfig/types'; diff --git a/src/server/utils/handler.ts b/src/server/utils/handler.ts index 5f0baa08..0be82757 100644 --- a/src/server/utils/handler.ts +++ b/src/server/utils/handler.ts @@ -1,4 +1,9 @@ +import { createError, defineEventHandler, getHeader } from 'h3'; import type { EventHandlerRequest, EventHandlerResponse, H3Event } from 'h3'; + +import Database from '#server/utils/Database'; +import { isPasswordValid } from '#server/utils/password'; +import { getCurrentUser } from '#server/utils/session'; import type { UserType } from '#db/repositories/user/types'; import type { SetupStepType } from '#db/repositories/general/types'; import { diff --git a/src/server/utils/ip.ts b/src/server/utils/ip.ts index c3c097e1..557cc344 100644 --- a/src/server/utils/ip.ts +++ b/src/server/utils/ip.ts @@ -1,8 +1,10 @@ import { Resolver } from 'node:dns/promises'; import { networkInterfaces } from 'node:os'; + import { stringifyIp } from 'ip-bigint'; import type { parseCidr } from 'cidr-tools'; +import { cacheFunction } from '#server/utils/cache'; import type { ClientNextIpType } from '#db/repositories/client/types'; type ParsedCidr = ReturnType; diff --git a/src/server/utils/oauth.ts b/src/server/utils/oauth.ts index 1e32dd3c..30fa62d4 100644 --- a/src/server/utils/oauth.ts +++ b/src/server/utils/oauth.ts @@ -1,6 +1,9 @@ +import { createError, getRequestURL, getRouterParam } from 'h3'; import type { H3Event } from 'h3'; import * as client from 'openid-client'; +import { WG_ENV } from '#server/utils/config'; + type OAuthConfig = { friendlyName: string; server: string; diff --git a/src/server/utils/password.ts b/src/server/utils/password.ts index 0a4e0c62..edc48fd1 100644 --- a/src/server/utils/password.ts +++ b/src/server/utils/password.ts @@ -1,5 +1,3 @@ -// ! Auto Imports are not supported in this file - import argon2 from 'argon2'; import { deserialize } from '@phc/format'; diff --git a/src/server/utils/qr.ts b/src/server/utils/qr.ts index a597be7a..8378a35a 100644 --- a/src/server/utils/qr.ts +++ b/src/server/utils/qr.ts @@ -1,5 +1,3 @@ -// ! Auto Imports are not supported in this file - import type { ErrorCorrection } from 'qr'; import { encodeQR } from 'qr'; diff --git a/src/server/utils/release.ts b/src/server/utils/release.ts index 93d6d786..d53a3c24 100644 --- a/src/server/utils/release.ts +++ b/src/server/utils/release.ts @@ -1,3 +1,9 @@ +import { createError } from 'h3'; +import { $fetch } from 'ofetch'; + +import { cacheFunction } from '#server/utils/cache'; +import { RELEASE, SERVER_DEBUG, WG_ENV } from '#server/utils/config'; + type GithubRelease = { tag_name: string; body: string; diff --git a/src/server/utils/session.ts b/src/server/utils/session.ts index 0e123307..a9a12275 100644 --- a/src/server/utils/session.ts +++ b/src/server/utils/session.ts @@ -1,4 +1,10 @@ +import { createError, getHeader, getSession, useSession } from 'h3'; import type { H3Event } from 'h3'; + +import Database from '#server/utils/Database'; +import { WG_ENV } from '#server/utils/config'; +import { isPasswordValid } from '#server/utils/password'; +import type { ID } from '#server/utils/types'; import type { UserType } from '#db/repositories/user/types'; export type WGSession = Partial<{ diff --git a/src/server/utils/template.ts b/src/server/utils/template.ts index 504a15dc..c3f1b0d9 100644 --- a/src/server/utils/template.ts +++ b/src/server/utils/template.ts @@ -1,5 +1,4 @@ -// ! Auto Imports are not supported in this file - +import { WG_ENV } from '#server/utils/config'; import type { InterfaceType } from '#db/repositories/interface/types'; /** diff --git a/src/server/utils/types.ts b/src/server/utils/types.ts index b18bf2f0..be707967 100644 --- a/src/server/utils/types.ts +++ b/src/server/utils/types.ts @@ -1,3 +1,4 @@ +import { useTranslation } from '@intlify/h3'; import type { ZodType } from 'zod'; import z from 'zod'; import type { H3Event, EventHandlerRequest } from 'h3'; diff --git a/src/server/utils/wgHelper.ts b/src/server/utils/wgHelper.ts index 0ad7ceff..1d312b66 100644 --- a/src/server/utils/wgHelper.ts +++ b/src/server/utils/wgHelper.ts @@ -1,9 +1,9 @@ -// ! Auto Imports are not supported in this file - import { parseCidr } from 'cidr-tools'; import { stringifyIp } from 'ip-bigint'; -import { removeNewlines } from './template'; +import { removeNewlines, iptablesTemplate } from '#server/utils/template'; +import { exec } from '#server/utils/cmd'; +import { WG_ENV } from '#server/utils/config'; import type { ClientType } from '#db/repositories/client/types'; import type { InterfaceType } from '#db/repositories/interface/types'; import type { UserConfigType } from '#db/repositories/userConfig/types'; diff --git a/src/test/unit/firewall.spec.ts b/src/test/unit/firewall.spec.ts index 2b95ca21..b21afd8d 100644 --- a/src/test/unit/firewall.spec.ts +++ b/src/test/unit/firewall.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from 'vitest'; -import { firewallTestExports } from '../../server/utils/firewall'; -import { typesTestExports } from '../../server/utils/types'; + +import { firewallTestExports } from '#server/utils/firewall'; +import { typesTestExports } from '#server/utils/types'; describe('firewall', () => { describe('isValidFirewallEntry', () => { diff --git a/src/test/unit/password.spec.ts b/src/test/unit/password.spec.ts index 5f404530..f8a37458 100644 --- a/src/test/unit/password.spec.ts +++ b/src/test/unit/password.spec.ts @@ -1,9 +1,10 @@ import { expect, test, describe } from 'vitest'; + import { hashPassword, isPasswordValid, isValidPasswordHash, -} from '../../server/utils/password'; +} from '#server/utils/password'; describe('password', () => { test('password', async () => { diff --git a/src/vitest.config.ts b/src/vitest.config.ts index a59685a7..3a37baa0 100644 --- a/src/vitest.config.ts +++ b/src/vitest.config.ts @@ -1,9 +1,16 @@ +import { fileURLToPath } from 'node:url'; + import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { projects: [ { + resolve: { + alias: { + '#server': fileURLToPath(new URL('./server', import.meta.url)), + }, + }, test: { name: 'unit', include: ['test/unit/*.{test,spec}.ts'],