From 7e2277ac0ae2852f3a4fb93cbc6dd7b74a2f66d5 Mon Sep 17 00:00:00 2001 From: Bernd Storath <999999bst@gmail.com> Date: Fri, 10 Jan 2025 22:45:17 +0100 Subject: [PATCH] be able to change interface and general --- src/app/pages/admin/config.vue | 54 ++++++++------- src/app/pages/admin/index.vue | 62 +++++++++++++++-- src/app/pages/admin/interface.vue | 71 +++++++++++++++----- src/i18n/locales/en.json | 3 +- src/nuxt.config.ts | 5 -- src/server/api/admin/general.post.ts | 8 +++ src/server/api/admin/interface.get.ts | 5 ++ src/server/api/admin/interface.post.ts | 8 +++ src/server/utils/types.ts | 10 +++ src/services/database/lowdb.ts | 24 ++++++- src/services/database/migrations/1.ts | 2 + src/services/database/repositories/system.ts | 9 +++ 12 files changed, 206 insertions(+), 55 deletions(-) create mode 100644 src/server/api/admin/general.post.ts create mode 100644 src/server/api/admin/interface.get.ts create mode 100644 src/server/api/admin/interface.post.ts diff --git a/src/app/pages/admin/config.vue b/src/app/pages/admin/config.vue index 5e5cebc6..08b231fa 100644 --- a/src/app/pages/admin/config.vue +++ b/src/app/pages/admin/config.vue @@ -1,31 +1,33 @@ diff --git a/src/app/pages/admin/index.vue b/src/app/pages/admin/index.vue index 42df6089..a9979e2c 100644 --- a/src/app/pages/admin/index.vue +++ b/src/app/pages/admin/index.vue @@ -1,9 +1,59 @@ - + diff --git a/src/app/pages/admin/interface.vue b/src/app/pages/admin/interface.vue index 1bdaffe7..def6fc4a 100644 --- a/src/app/pages/admin/interface.vue +++ b/src/app/pages/admin/interface.vue @@ -1,19 +1,58 @@ - + diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index f675c48b..fb9ab6f4 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -81,7 +81,8 @@ "hostMin": "Host must contain at least 1 character", "port": "Port must be a valid number", "portMin": "Port must be at least 1", - "portMax": "Port must be at most 65535" + "portMax": "Port must be at most 65535", + "sessionTimeout": "Session Timeout must be a valid number" }, "name": "Name", "username": "Username", diff --git a/src/nuxt.config.ts b/src/nuxt.config.ts index 34264ea9..25904814 100644 --- a/src/nuxt.config.ts +++ b/src/nuxt.config.ts @@ -29,11 +29,6 @@ export default defineNuxtConfig({ language: 'en-US', name: 'English', }, - { - code: 'de', - language: 'de-DE', - name: 'Deutsch', - }, ], defaultLocale: 'en', vueI18n: './i18n.config.ts', diff --git a/src/server/api/admin/general.post.ts b/src/server/api/admin/general.post.ts new file mode 100644 index 00000000..738c1c41 --- /dev/null +++ b/src/server/api/admin/general.post.ts @@ -0,0 +1,8 @@ +export default defineEventHandler(async (event) => { + const data = await readValidatedBody( + event, + validateZod(generalUpdateType, event) + ); + await Database.system.updateGeneral(data); + return { success: true }; +}); diff --git a/src/server/api/admin/interface.get.ts b/src/server/api/admin/interface.get.ts new file mode 100644 index 00000000..709de9ca --- /dev/null +++ b/src/server/api/admin/interface.get.ts @@ -0,0 +1,5 @@ +export default defineEventHandler(async () => { + const system = await Database.system.get(); + // TODO: handle through wireguard to update conf accordingly + return system.interface; +}); diff --git a/src/server/api/admin/interface.post.ts b/src/server/api/admin/interface.post.ts new file mode 100644 index 00000000..d0f59a12 --- /dev/null +++ b/src/server/api/admin/interface.post.ts @@ -0,0 +1,8 @@ +export default defineEventHandler(async (event) => { + const data = await readValidatedBody( + event, + validateZod(interfaceUpdateType, event) + ); + await Database.system.updateInterface(data); + return { success: true }; +}); diff --git a/src/server/utils/types.ts b/src/server/utils/types.ts index b6bffec3..f74cdf97 100644 --- a/src/server/utils/types.ts +++ b/src/server/utils/types.ts @@ -157,6 +157,16 @@ export const clientUpdateType = z.object({ persistentKeepalive: z.number({ message: 'zod.persistentKeepalive' }), }); +export const generalUpdateType = z.object({ + sessionTimeout: z.number({ message: 'zod.sessionTimeout' }), +}); + +export const interfaceUpdateType = z.object({ + mtu: z.number({ message: 'zod.mtu' }), + port: port, + device: z.string({ message: 'zod.device' }), +}); + // from https://github.com/airjp73/rvf/blob/7e7c35d98015ea5ecff5affaf89f78296e84e8b9/packages/zod-form-data/src/helpers.ts#L117 type FormDataLikeInput = { [Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>; diff --git a/src/services/database/lowdb.ts b/src/services/database/lowdb.ts index 3983286c..c2575e85 100644 --- a/src/services/database/lowdb.ts +++ b/src/services/database/lowdb.ts @@ -19,7 +19,11 @@ import { type CreateClient, type OneTimeLink, } from './repositories/client'; -import { SystemRepository } from './repositories/system'; +import { + SystemRepository, + type General, + type UpdateWGInterface, +} from './repositories/system'; import { SetupRepository, type Steps } from './repositories/setup'; import type { DeepReadonly } from 'vue'; @@ -81,6 +85,24 @@ class LowDBSystem extends SystemRepository { v.system.userConfig.port = port; }); } + + async updateGeneral(general: General) { + DEBUG('Update General'); + this.#db.update((v) => { + v.system.general = general; + }); + } + + async updateInterface(wgInterface: UpdateWGInterface) { + DEBUG('Update Interface'); + this.#db.update((v) => { + const oldInterface = v.system.interface; + v.system.interface = { + ...oldInterface, + ...wgInterface, + }; + }); + } } class LowDBUser extends UserRepository { diff --git a/src/services/database/migrations/1.ts b/src/services/database/migrations/1.ts index c0f48a79..1bdf04dd 100644 --- a/src/services/database/migrations/1.ts +++ b/src/services/database/migrations/1.ts @@ -64,6 +64,8 @@ export async function run1(db: Low) { clients: {}, }; + // TODO: be able to regenerate this on changes + database.system.iptables.PostUp = `iptables -t nat -A POSTROUTING -s ${database.system.userConfig.address4Range} -o ${database.system.interface.device} -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport ${database.system.interface.port} -j ACCEPT; diff --git a/src/services/database/repositories/system.ts b/src/services/database/repositories/system.ts index e72e5336..fe3caba9 100644 --- a/src/services/database/repositories/system.ts +++ b/src/services/database/repositories/system.ts @@ -63,6 +63,11 @@ export type System = { sessionConfig: SessionConfig; }; +export type UpdateWGInterface = Omit< + WGInterface, + 'privateKey' | 'publicKey' | 'address4' | 'address6' +>; + /** * Interface for system-related database operations. * This interface provides methods for retrieving system configuration data @@ -72,4 +77,8 @@ export abstract class SystemRepository { abstract get(): Promise>; abstract updateClientsHostPort(host: string, port: number): Promise; + + abstract updateGeneral(general: General): Promise; + + abstract updateInterface(wgInterface: UpdateWGInterface): Promise; }