From bfdc57a55a479c4a5dcb0e1428eaaa90532ceefd Mon Sep 17 00:00:00 2001 From: Bernd Storath <999999bst@gmail.com> Date: Fri, 7 Mar 2025 14:31:20 +0100 Subject: [PATCH] be able to change dns. implement global override --- src/app/components/Form/NullArrayField.vue | 68 +++++++++++++++++++ src/app/pages/admin/config.vue | 2 +- src/app/pages/clients/[id].vue | 27 +++++--- src/i18n/locales/en.json | 8 ++- .../database/migrations/0000_short_skin.sql | 2 +- .../migrations/meta/0000_snapshot.json | 4 +- .../migrations/meta/0001_snapshot.json | 6 +- .../database/migrations/meta/_journal.json | 4 +- .../database/repositories/client/schema.ts | 4 +- .../database/repositories/client/service.ts | 1 - .../database/repositories/client/types.ts | 2 +- src/server/utils/wgHelper.ts | 2 +- 12 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 src/app/components/Form/NullArrayField.vue diff --git a/src/app/components/Form/NullArrayField.vue b/src/app/components/Form/NullArrayField.vue new file mode 100644 index 00000000..79d137c2 --- /dev/null +++ b/src/app/components/Form/NullArrayField.vue @@ -0,0 +1,68 @@ + + + + {{ emptyText || $t('form.nullNoItems') }} + + + + + + + + + + + + + + diff --git a/src/app/pages/admin/config.vue b/src/app/pages/admin/config.vue index e7217ba7..80d868bb 100644 --- a/src/app/pages/admin/config.vue +++ b/src/app/pages/admin/config.vue @@ -27,7 +27,7 @@ {{ - $t('admin.config.dns') + $t('general.dns') }} diff --git a/src/app/pages/clients/[id].vue b/src/app/pages/clients/[id].vue index 72060349..4e8f9961 100644 --- a/src/app/pages/clients/[id].vue +++ b/src/app/pages/clients/[id].vue @@ -41,21 +41,26 @@ /> - {{ - $t('general.allowedIps') - }} + + {{ $t('general.allowedIps') }} + - {{ - $t('client.serverAllowedIps') - }} + + {{ $t('client.serverAllowedIps') }} + - + + + {{ $t('general.dns') }} + + + {{ $t('form.sectionAdvanced') }} { - await navigateTo('/'); + revert: async (success) => { + if (success) { + await navigateTo('/'); + } else { + await revert(); + } }, } ); diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 3723a09d..12fefc49 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -25,6 +25,7 @@ "updatePassword": "Update Password", "mtu": "MTU", "allowedIps": "Allowed IPs", + "dns": "DNS", "persistentKeepalive": "Persistent Keepalive", "logout": "Logout", "continue": "Continue", @@ -101,7 +102,8 @@ "persistentKeepaliveDesc": "Sets the interval (in seconds) for keep-alive packets. 0 disables it", "hooks": "Hooks", "hooksDescription": "Hooks only work with wg-quick", - "hooksLeaveEmpty": "Only for wg-quick. Otherwise, leave it empty" + "hooksLeaveEmpty": "Only for wg-quick. Otherwise, leave it empty", + "dnsDesc": "DNS server clients will use (overrides global config)" }, "dialog": { "change": "Change", @@ -121,6 +123,7 @@ "sectionGeneral": "General", "sectionAdvanced": "Advanced", "noItems": "No items", + "nullNoItems": "No items. Using global config", "add": "Add" }, "admin": { @@ -140,8 +143,7 @@ "hostDesc": "Public hostname clients will connect to (invalidates config)", "portDesc": "Public UDP port clients will connect to (invalidates config)", "allowedIpsDesc": "Allowed IPs clients will use (invalidates config)", - "dns": "DNS", - "dnsDesc": "DNS server clients will use (invalidates config)", + "dnsDesc": "DNS server clients will use (global config)", "mtuDesc": "MTU clients will use (invalidates config)", "persistentKeepaliveDesc": "Interval in seconds to send keepalives to the server. 0 = disabled (invalidates config)" }, diff --git a/src/server/database/migrations/0000_short_skin.sql b/src/server/database/migrations/0000_short_skin.sql index dfe5cd17..922efb2b 100644 --- a/src/server/database/migrations/0000_short_skin.sql +++ b/src/server/database/migrations/0000_short_skin.sql @@ -16,7 +16,7 @@ CREATE TABLE `clients_table` ( `server_allowed_ips` text NOT NULL, `persistent_keepalive` integer NOT NULL, `mtu` integer NOT NULL, - `dns` text NOT NULL, + `dns` text, `enabled` integer NOT NULL, `created_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, `updated_at` text DEFAULT (CURRENT_TIMESTAMP) NOT NULL, diff --git a/src/server/database/migrations/meta/0000_snapshot.json b/src/server/database/migrations/meta/0000_snapshot.json index 7d3b105e..773ba800 100644 --- a/src/server/database/migrations/meta/0000_snapshot.json +++ b/src/server/database/migrations/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "383501e4-f8de-4413-847f-a9082f6dc398", + "id": "80307290-b752-4fc4-8ba4-c6d39222c7f5", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "clients_table": { @@ -134,7 +134,7 @@ "name": "dns", "type": "text", "primaryKey": false, - "notNull": true, + "notNull": false, "autoincrement": false }, "enabled": { diff --git a/src/server/database/migrations/meta/0001_snapshot.json b/src/server/database/migrations/meta/0001_snapshot.json index 53f320d5..793ae341 100644 --- a/src/server/database/migrations/meta/0001_snapshot.json +++ b/src/server/database/migrations/meta/0001_snapshot.json @@ -1,6 +1,6 @@ { - "id": "bf316694-e2ce-4e29-bd66-ce6c0a9d3c90", - "prevId": "383501e4-f8de-4413-847f-a9082f6dc398", + "id": "241a0a75-03d1-4b39-9a13-e7b1b621e8b2", + "prevId": "80307290-b752-4fc4-8ba4-c6d39222c7f5", "version": "6", "dialect": "sqlite", "tables": { @@ -134,7 +134,7 @@ "name": "dns", "type": "text", "primaryKey": false, - "notNull": true, + "notNull": false, "autoincrement": false }, "enabled": { diff --git a/src/server/database/migrations/meta/_journal.json b/src/server/database/migrations/meta/_journal.json index e8612099..82135bef 100644 --- a/src/server/database/migrations/meta/_journal.json +++ b/src/server/database/migrations/meta/_journal.json @@ -5,14 +5,14 @@ { "idx": 0, "version": "6", - "when": 1741335144499, + "when": 1741354212954, "tag": "0000_short_skin", "breakpoints": true }, { "idx": 1, "version": "6", - "when": 1741335153054, + "when": 1741354219144, "tag": "0001_classy_the_stranger", "breakpoints": true } diff --git a/src/server/database/repositories/client/schema.ts b/src/server/database/repositories/client/schema.ts index 08b2c764..a4166ead 100644 --- a/src/server/database/repositories/client/schema.ts +++ b/src/server/database/repositories/client/schema.ts @@ -3,6 +3,8 @@ import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { oneTimeLink, user } from '../../schema'; +/** null means use value from userConfig */ + export const client = sqliteTable('clients_table', { id: int().primaryKey({ autoIncrement: true }), userId: int('user_id') @@ -28,7 +30,7 @@ export const client = sqliteTable('clients_table', { .notNull(), persistentKeepalive: int('persistent_keepalive').notNull(), mtu: int().notNull(), - dns: text({ mode: 'json' }).$type().notNull(), + dns: text({ mode: 'json' }).$type(), enabled: int({ mode: 'boolean' }).notNull(), createdAt: text('created_at') .notNull() diff --git a/src/server/database/repositories/client/service.ts b/src/server/database/repositories/client/service.ts index 3cc5a2b9..c4f02f3d 100644 --- a/src/server/database/repositories/client/service.ts +++ b/src/server/database/repositories/client/service.ts @@ -116,7 +116,6 @@ export class ClientService { ipv6Address, mtu: clientConfig.defaultMtu, allowedIps: clientConfig.defaultAllowedIps, - dns: clientConfig.defaultDns, persistentKeepalive: clientConfig.defaultPersistentKeepalive, serverAllowedIps: [], enabled: true, diff --git a/src/server/database/repositories/client/types.ts b/src/server/database/repositories/client/types.ts index 06bffc00..6b483790 100644 --- a/src/server/database/repositories/client/types.ts +++ b/src/server/database/repositories/client/types.ts @@ -65,7 +65,7 @@ export const ClientUpdateSchema = schemaForType()( serverAllowedIps: serverAllowedIps, mtu: MtuSchema, persistentKeepalive: PersistentKeepaliveSchema, - dns: DnsSchema, + dns: DnsSchema.nullable(), }) ); diff --git a/src/server/utils/wgHelper.ts b/src/server/utils/wgHelper.ts index 5fdb8604..b2018de6 100644 --- a/src/server/utils/wgHelper.ts +++ b/src/server/utils/wgHelper.ts @@ -59,7 +59,7 @@ PostDown = ${iptablesTemplate(hooks.postDown, wgInterface)}`; return `[Interface] PrivateKey = ${client.privateKey} Address = ${client.ipv4Address}/${cidr4Block}, ${client.ipv6Address}/${cidr6Block} -DNS = ${client.dns.join(', ')} +DNS = ${(client.dns ?? userConfig.defaultDns).join(', ')} MTU = ${client.mtu} ${hookLines.length ? `${hookLines.join('\n')}\n` : ''} [Peer]