Browse Source

be able to update user config

pull/1572/head
Bernd Storath 3 months ago
parent
commit
ae6d3b97a8
  1. 32
      src/app/pages/admin/config.vue
  2. 7
      src/i18n/locales/en.json
  3. 1
      src/server/api/admin/interface.get.ts
  4. 1
      src/server/api/admin/interface.post.ts
  5. 9
      src/server/api/admin/userconfig.post.ts
  6. 31
      src/server/utils/types.ts
  7. 12
      src/services/database/lowdb.ts
  8. 4
      src/services/database/repositories/system.ts

32
src/app/pages/admin/config.vue

@ -1,6 +1,6 @@
<template>
<main v-if="data">
<FormElement>
<FormElement @submit.prevent="submit">
<FormGroup>
<FormHeading>Connection</FormHeading>
<FormTextField id="host" v-model="data.host" label="Host" />
@ -25,6 +25,7 @@
</FormGroup>
<FormGroup>
<FormHeading>Actions</FormHeading>
<FormActionField type="submit" label="Save" />
<FormActionField label="Revert!" @click="revert" />
</FormGroup>
</FormElement>
@ -32,11 +33,40 @@
</template>
<script lang="ts" setup>
const toast = useToast();
const { data: _data, refresh } = await useFetch(`/api/admin/userconfig`, {
method: 'get',
});
const data = toRef(_data.value);
async function submit() {
try {
const res = await $fetch(`/api/admin/userconfig`, {
method: 'post',
body: data.value,
});
toast.showToast({
type: 'success',
title: 'Success',
message: 'Saved',
});
if (!res.success) {
throw new Error('Failed to save');
}
await refreshNuxtData();
} catch (e) {
if (e instanceof Error) {
toast.showToast({
type: 'error',
title: 'Error',
message: e.message,
});
}
}
}
async function revert() {
await refresh();
data.value = toRef(_data.value).value;

7
src/i18n/locales/en.json

@ -53,7 +53,11 @@
"name": "Name must be a valid string",
"nameMin": "Name must be at least 1 Character",
"mtu": "MTU must be a valid number",
"mtuMin": "MTU must be at least 1280",
"mtuMax": "MTU must be at most 9000",
"persistentKeepalive": "Persistent Keepalive must be a valid number",
"persistentKeepaliveMin": "Persistent Keepalive must be at least 0",
"persistentKeepaliveMax": "Persistent Keepalive must be at most 65535",
"file": "File must be a valid string",
"username": "Username must be a valid string",
"usernameMin": "Username must be at least 8 Characters",
@ -82,7 +86,8 @@
"port": "Port must be a valid number",
"portMin": "Port must be at least 1",
"portMax": "Port must be at most 65535",
"sessionTimeout": "Session Timeout must be a valid number"
"sessionTimeout": "Session Timeout must be a valid number",
"device": "Device has to be a valid string"
},
"name": "Name",
"username": "Username",

1
src/server/api/admin/interface.get.ts

@ -1,5 +1,4 @@
export default defineEventHandler(async () => {
const system = await Database.system.get();
// TODO: handle through wireguard to update conf accordingly
return system.interface;
});

1
src/server/api/admin/interface.post.ts

@ -4,5 +4,6 @@ export default defineEventHandler(async (event) => {
validateZod(interfaceUpdateType, event)
);
await Database.system.updateInterface(data);
await WireGuard.saveConfig();
return { success: true };
});

9
src/server/api/admin/userconfig.post.ts

@ -0,0 +1,9 @@
export default defineEventHandler(async (event) => {
const data = await readValidatedBody(
event,
validateZod(userConfigUpdateType, event)
);
await Database.system.updateUserConfig(data);
await WireGuard.saveConfig();
return { success: true };
});

31
src/server/utils/types.ts

@ -143,18 +143,30 @@ const address6 = z
.min(1, { message: 'zod.address6Min' })
.pipe(safeStringRefine);
const allowedIPs = z
.array(address, { message: 'zod.allowedIPs' })
.min(1, { message: 'zod.allowedIPsMin' });
const mtu = z
.number({ message: 'zod.mtu' })
.min(1280, { message: 'zod.mtuMin' })
.max(9000, { message: 'zod.mtuMax' });
const persistentKeepalive = z
.number({ message: 'zod.persistentKeepalive' })
.min(0, 'zod.persistentKeepaliveMin')
.max(65535, 'zod.persistentKeepaliveMax');
export const clientUpdateType = z.object({
name: name,
enabled: z.boolean(),
expiresAt: expireDate,
address4: address4,
address6: address6,
allowedIPs: z
.array(address, { message: 'zod.allowedIPs' })
.min(1, { message: 'zod.allowedIPsMin' }),
allowedIPs: allowedIPs,
serverAllowedIPs: z.array(address, { message: 'zod.serverAllowedIPs' }),
mtu: z.number({ message: 'zod.mtu' }),
persistentKeepalive: z.number({ message: 'zod.persistentKeepalive' }),
mtu: mtu,
persistentKeepalive: persistentKeepalive,
});
export const generalUpdateType = z.object({
@ -167,6 +179,15 @@ export const interfaceUpdateType = z.object({
device: z.string({ message: 'zod.device' }),
});
export const userConfigUpdateType = z.object({
host: host,
port: port,
allowedIps: allowedIPs,
defaultDns: z.array(address, { message: 'zod.dns' }),
mtu: mtu,
persistentKeepalive: persistentKeepalive,
});
// from https://github.com/airjp73/rvf/blob/7e7c35d98015ea5ecff5affaf89f78296e84e8b9/packages/zod-form-data/src/helpers.ts#L117
type FormDataLikeInput = {
[Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>;

12
src/services/database/lowdb.ts

@ -22,6 +22,7 @@ import {
import {
SystemRepository,
type General,
type UpdateWGConfig,
type UpdateWGInterface,
} from './repositories/system';
import { SetupRepository, type Steps } from './repositories/setup';
@ -103,6 +104,17 @@ class LowDBSystem extends SystemRepository {
};
});
}
async updateUserConfig(userConfig: UpdateWGConfig) {
DEBUG('Update User Config');
this.#db.update((v) => {
const oldUserConfig = v.system.userConfig;
v.system.userConfig = {
...oldUserConfig,
...userConfig,
};
});
}
}
class LowDBUser extends UserRepository {

4
src/services/database/repositories/system.ts

@ -68,6 +68,8 @@ export type UpdateWGInterface = Omit<
'privateKey' | 'publicKey' | 'address4' | 'address6'
>;
export type UpdateWGConfig = Omit<WGConfig, 'address4Range' | 'address6Range'>;
/**
* Interface for system-related database operations.
* This interface provides methods for retrieving system configuration data
@ -81,4 +83,6 @@ export abstract class SystemRepository {
abstract updateGeneral(general: General): Promise<void>;
abstract updateInterface(wgInterface: UpdateWGInterface): Promise<void>;
abstract updateUserConfig(userConfig: UpdateWGConfig): Promise<void>;
}

Loading…
Cancel
Save