Browse Source

chore: disable auto imports (#2672)

* disable auto imports

* fix imports

* improve cli imports

* fix imports

* fix import cycle

* fix imports
pull/2660/head
Bernd Storath 2 weeks ago
committed by GitHub
parent
commit
2af5cd04b4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      src/cli/admin/reset.ts
  2. 14
      src/cli/build.js
  3. 2
      src/cli/clients/list.ts
  4. 6
      src/cli/clients/qr.ts
  5. 2
      src/cli/db.ts
  6. 7
      src/cli/index.ts
  7. 7
      src/cli/tsconfig.json
  8. 3
      src/eslint.config.mjs
  9. 13
      src/i18n/localeDetector.ts
  10. 8
      src/nuxt.config.ts
  11. 5
      src/package.json
  12. 15
      src/pnpm-lock.yaml
  13. 3
      src/server/api/admin/general.get.ts
  14. 5
      src/server/api/admin/general.post.ts
  15. 3
      src/server/api/admin/hooks.get.ts
  16. 6
      src/server/api/admin/hooks.post.ts
  17. 6
      src/server/api/admin/interface/cidr.post.ts
  18. 3
      src/server/api/admin/interface/index.get.ts
  19. 8
      src/server/api/admin/interface/index.post.ts
  20. 3
      src/server/api/admin/interface/restart.post.ts
  21. 3
      src/server/api/admin/ip-info.get.ts
  22. 3
      src/server/api/admin/userconfig.get.ts
  23. 6
      src/server/api/admin/userconfig.post.ts
  24. 8
      src/server/api/auth/[provider]/callback.get.ts
  25. 11
      src/server/api/auth/[provider]/index.get.ts
  26. 7
      src/server/api/auth/[provider]/link.get.ts
  27. 4
      src/server/api/auth/cancel.post.ts
  28. 6
      src/server/api/auth/methods.get.ts
  29. 6
      src/server/api/auth/password.post.ts
  30. 4
      src/server/api/auth/pending.get.ts
  31. 3
      src/server/api/auth/unlink.post.ts
  32. 5
      src/server/api/auth/verify-2fa.post.ts
  33. 6
      src/server/api/client/[clientId]/configuration.get.ts
  34. 6
      src/server/api/client/[clientId]/disable.post.ts
  35. 6
      src/server/api/client/[clientId]/enable.post.ts
  36. 5
      src/server/api/client/[clientId]/generateOneTimeLink.post.ts
  37. 6
      src/server/api/client/[clientId]/index.delete.ts
  38. 6
      src/server/api/client/[clientId]/index.get.ts
  39. 6
      src/server/api/client/[clientId]/index.post.ts
  40. 6
      src/server/api/client/[clientId]/qrcode.svg.get.ts
  41. 6
      src/server/api/client/index.get.ts
  42. 6
      src/server/api/client/index.post.ts
  43. 5
      src/server/api/information.get.ts
  44. 5
      src/server/api/me/index.post.ts
  45. 5
      src/server/api/me/password.post.ts
  46. 5
      src/server/api/me/totp.post.ts
  47. 5
      src/server/api/session.delete.ts
  48. 6
      src/server/api/session.get.ts
  49. 5
      src/server/api/setup/2.post.ts
  50. 3
      src/server/api/setup/4.get.ts
  51. 5
      src/server/api/setup/4.post.ts
  52. 6
      src/server/api/setup/migrate.post.ts
  53. 4
      src/server/database/repositories/client/schema.ts
  54. 6
      src/server/database/repositories/client/service.ts
  55. 21
      src/server/database/repositories/client/types.ts
  56. 3
      src/server/database/repositories/general/service.ts
  57. 3
      src/server/database/repositories/general/types.ts
  58. 2
      src/server/database/repositories/hooks/schema.ts
  59. 2
      src/server/database/repositories/hooks/service.ts
  60. 3
      src/server/database/repositories/hooks/types.ts
  61. 3
      src/server/database/repositories/interface/schema.ts
  62. 3
      src/server/database/repositories/interface/service.ts
  63. 16
      src/server/database/repositories/interface/types.ts
  64. 2
      src/server/database/repositories/oneTimeLink/schema.ts
  65. 3
      src/server/database/repositories/oneTimeLink/service.ts
  66. 3
      src/server/database/repositories/oneTimeLink/types.ts
  67. 4
      src/server/database/repositories/user/schema.ts
  68. 7
      src/server/database/repositories/user/service.ts
  69. 3
      src/server/database/repositories/user/types.ts
  70. 2
      src/server/database/repositories/userConfig/schema.ts
  71. 2
      src/server/database/repositories/userConfig/service.ts
  72. 16
      src/server/database/repositories/userConfig/types.ts
  73. 15
      src/server/database/schema.ts
  74. 17
      src/server/database/sqlite.ts
  75. 4
      src/server/middleware/setup.ts
  76. 5
      src/server/plugins/manager.ts
  77. 10
      src/server/routes/cnf/[oneTimeLink].ts
  78. 4
      src/server/routes/metrics/json.get.ts
  79. 7
      src/server/routes/metrics/prometheus.get.ts
  80. 1
      src/server/utils/Database.ts
  81. 9
      src/server/utils/WireGuard.ts
  82. 1
      src/server/utils/cmd.ts
  83. 7
      src/server/utils/config.ts
  84. 1
      src/server/utils/firewall.ts
  85. 5
      src/server/utils/handler.ts
  86. 2
      src/server/utils/ip.ts
  87. 3
      src/server/utils/oauth.ts
  88. 2
      src/server/utils/password.ts
  89. 2
      src/server/utils/qr.ts
  90. 6
      src/server/utils/release.ts
  91. 6
      src/server/utils/session.ts
  92. 3
      src/server/utils/template.ts
  93. 1
      src/server/utils/types.ts
  94. 6
      src/server/utils/wgHelper.ts
  95. 5
      src/test/unit/firewall.spec.ts
  96. 3
      src/test/unit/password.spec.ts
  97. 7
      src/vitest.config.ts

4
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: {

14
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',
});

2
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: {

6
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: {

2
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' });

7
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

7
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"]
}

3
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,

13
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;
});
};

8
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)),
},
});

5
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",

15
src/pnpm-lock.yaml

@ -14,6 +14,12 @@ importers:
'@heroicons/vue':
specifier: ^2.2.0
version: 2.2.0([email protected]([email protected]))
'@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/[email protected])
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/[email protected])([email protected](@libsql/[email protected]))([email protected])([email protected])
nuxt:
specifier: ^3.21.8
version: 3.21.8(@libsql/[email protected])(@parcel/[email protected])(@types/[email protected])(@vue/[email protected])([email protected])([email protected](@libsql/[email protected])([email protected](@libsql/[email protected])))([email protected](@libsql/[email protected]))([email protected]([email protected]))([email protected])([email protected])([email protected])([email protected]([email protected]))([email protected])([email protected])([email protected])([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]([email protected]))([email protected])
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

3
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;

5
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(

3
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;

6
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(

6
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(

3
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();

8
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(

3
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();

3
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;

3
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;

6
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(

8
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);

11
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(),
});

7
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',

4
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);

6
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(

6
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) => {

4
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);

3
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',

5
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) => {

6
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(

6
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(

6
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(

5
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(

6
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(

6
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(

6
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,

6
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(

6
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(

6
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(

5
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);

5
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(

5
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(

5
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 =

5
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;

6
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);

5
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 }) => {

3
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;

5
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 }) => {

6
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,

4
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 */

6
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';

21
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<typeof client>;
export type ClientNextIpType = Pick<ClientType, 'ipv4Address' | 'ipv6Address'>;

3
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) {

3
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<typeof general>;
const sessionTimeout = z.number({ message: t('zod.general.sessionTimeout') });

2
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` */

2
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) {

3
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<typeof hooks>;
export type HooksUpdateType = Omit<HooksType, 'id' | 'createdAt' | 'updatedAt'>;

3
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', {

3
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';

16
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<typeof wgInterface>;
export type InterfaceCreateType = Omit<

2
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` */

3
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) {

3
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<typeof oneTimeLink>;
const oneTimeLinkType = z

4
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',

7
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 =

3
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<typeof user>;
const username = z

2
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', {

2
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';

16
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<typeof userConfig>;
const host = z

15
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';

17
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');

4
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);

5
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(`

10
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) => {

4
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();
});

7
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();

1
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.

9
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';

1
src/server/utils/cmd.ts

@ -1,4 +1,5 @@
import childProcess from 'child_process';
import { createDebug } from 'obug';
const CMD_DEBUG = createDebug('CMD');

7
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');

1
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';

5
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 {

2
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<typeof parseCidr>;

3
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;

2
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';

2
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';

6
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;

6
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<{

3
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';
/**

1
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';

6
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';

5
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', () => {

3
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 () => {

7
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'],

Loading…
Cancel
Save