From 7bf79abcb31c30717adb63781efb5e5965ed2f96 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Mon, 17 Nov 2025 10:39:34 +0100 Subject: [PATCH 01/16] Instance::force_all_traffic model, migration --- ...aed607c915644bc20d99fb2324961a0ee1a5.json} | 14 ++- ...eb5000a1439de8c203821f6174fe3276c25e.json} | 14 ++- ...dc7f6f7d1428fc5698e40c5089417b3c8dcd.json} | 14 ++- ...2d1bf171b4a6e224cc238680e2e856811c62e.json | 92 ------------------- .../20251117093105_force_all_traffic.sql | 1 + src-tauri/proto | 2 +- src-tauri/src/commands.rs | 1 + src-tauri/src/database/models/instance.rs | 13 ++- 8 files changed, 43 insertions(+), 108 deletions(-) rename src-tauri/.sqlx/{query-aa7d2c4c2100151b6f555ade668e72ceef8e7d1e39fcf0bcef0b7433457d3d2a.json => query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json} (79%) rename src-tauri/.sqlx/{query-f4b187b6f90edb7fd65e82a60e786942680cd7c66c42a315de0e62e47c4f2df4.json => query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json} (78%) rename src-tauri/.sqlx/{query-65b503d8af2eb227b555274ec98411966a0a410314d5c109df6477ce799b40d1.json => query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json} (79%) delete mode 100644 src-tauri/.sqlx/query-d8d908979a8573ee2c32828fa562d1bf171b4a6e224cc238680e2e856811c62e.json create mode 100644 src-tauri/migrations/20251117093105_force_all_traffic.sql diff --git a/src-tauri/.sqlx/query-aa7d2c4c2100151b6f555ade668e72ceef8e7d1e39fcf0bcef0b7433457d3d2a.json b/src-tauri/.sqlx/query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json similarity index 79% rename from src-tauri/.sqlx/query-aa7d2c4c2100151b6f555ade668e72ceef8e7d1e39fcf0bcef0b7433457d3d2a.json rename to src-tauri/.sqlx/query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json index bfefdf36..322b6419 100644 --- a/src-tauri/.sqlx/query-aa7d2c4c2100151b6f555ade668e72ceef8e7d1e39fcf0bcef0b7433457d3d2a.json +++ b/src-tauri/.sqlx/query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled, openid_display_name FROM instance WHERE id = $1;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name FROM instance WHERE id = $1;", "describe": { "columns": [ { @@ -44,13 +44,18 @@ "type_info": "Bool" }, { - "name": "enterprise_enabled", + "name": "force_all_traffic", "ordinal": 8, "type_info": "Bool" }, { - "name": "openid_display_name", + "name": "enterprise_enabled", "ordinal": 9, + "type_info": "Bool" + }, + { + "name": "openid_display_name", + "ordinal": 10, "type_info": "Text" } ], @@ -67,8 +72,9 @@ true, false, false, + false, true ] }, - "hash": "aa7d2c4c2100151b6f555ade668e72ceef8e7d1e39fcf0bcef0b7433457d3d2a" + "hash": "0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5" } diff --git a/src-tauri/.sqlx/query-f4b187b6f90edb7fd65e82a60e786942680cd7c66c42a315de0e62e47c4f2df4.json b/src-tauri/.sqlx/query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json similarity index 78% rename from src-tauri/.sqlx/query-f4b187b6f90edb7fd65e82a60e786942680cd7c66c42a315de0e62e47c4f2df4.json rename to src-tauri/.sqlx/query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json index 881650b4..805df22f 100644 --- a/src-tauri/.sqlx/query-f4b187b6f90edb7fd65e82a60e786942680cd7c66c42a315de0e62e47c4f2df4.json +++ b/src-tauri/.sqlx/query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, disable_all_traffic, enterprise_enabled, openid_display_name FROM instance\n WHERE token IS NOT NULL ORDER BY name ASC;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name FROM instance WHERE token IS NOT NULL ORDER BY name ASC;", "describe": { "columns": [ { @@ -44,13 +44,18 @@ "type_info": "Bool" }, { - "name": "enterprise_enabled", + "name": "force_all_traffic", "ordinal": 8, "type_info": "Bool" }, { - "name": "openid_display_name", + "name": "enterprise_enabled", "ordinal": 9, + "type_info": "Bool" + }, + { + "name": "openid_display_name", + "ordinal": 10, "type_info": "Text" } ], @@ -67,8 +72,9 @@ true, false, false, + false, true ] }, - "hash": "f4b187b6f90edb7fd65e82a60e786942680cd7c66c42a315de0e62e47c4f2df4" + "hash": "344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e" } diff --git a/src-tauri/.sqlx/query-65b503d8af2eb227b555274ec98411966a0a410314d5c109df6477ce799b40d1.json b/src-tauri/.sqlx/query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json similarity index 79% rename from src-tauri/.sqlx/query-65b503d8af2eb227b555274ec98411966a0a410314d5c109df6477ce799b40d1.json rename to src-tauri/.sqlx/query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json index 57f2b8f7..7f66f113 100644 --- a/src-tauri/.sqlx/query-65b503d8af2eb227b555274ec98411966a0a410314d5c109df6477ce799b40d1.json +++ b/src-tauri/.sqlx/query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, enterprise_enabled, openid_display_name FROM instance ORDER BY name ASC;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name FROM instance ORDER BY name ASC;", "describe": { "columns": [ { @@ -44,13 +44,18 @@ "type_info": "Bool" }, { - "name": "enterprise_enabled", + "name": "force_all_traffic", "ordinal": 8, "type_info": "Bool" }, { - "name": "openid_display_name", + "name": "enterprise_enabled", "ordinal": 9, + "type_info": "Bool" + }, + { + "name": "openid_display_name", + "ordinal": 10, "type_info": "Text" } ], @@ -67,8 +72,9 @@ true, false, false, + false, true ] }, - "hash": "65b503d8af2eb227b555274ec98411966a0a410314d5c109df6477ce799b40d1" + "hash": "c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd" } diff --git a/src-tauri/.sqlx/query-d8d908979a8573ee2c32828fa562d1bf171b4a6e224cc238680e2e856811c62e.json b/src-tauri/.sqlx/query-d8d908979a8573ee2c32828fa562d1bf171b4a6e224cc238680e2e856811c62e.json deleted file mode 100644 index e023a3a7..00000000 --- a/src-tauri/.sqlx/query-d8d908979a8573ee2c32828fa562d1bf171b4a6e224cc238680e2e856811c62e.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT id, instance_id, name, address, pubkey, endpoint, allowed_ips, dns, network_id,route_all_traffic, keepalive_interval, location_mfa_mode \"location_mfa_mode: LocationMfaMode\", service_location_mode \"service_location_mode: ServiceLocationMode\" FROM location WHERE service_location_mode <= $1 ORDER BY name ASC;", - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Integer" - }, - { - "name": "instance_id", - "ordinal": 1, - "type_info": "Integer" - }, - { - "name": "name", - "ordinal": 2, - "type_info": "Text" - }, - { - "name": "address", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "pubkey", - "ordinal": 4, - "type_info": "Text" - }, - { - "name": "endpoint", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "allowed_ips", - "ordinal": 6, - "type_info": "Text" - }, - { - "name": "dns", - "ordinal": 7, - "type_info": "Text" - }, - { - "name": "network_id", - "ordinal": 8, - "type_info": "Integer" - }, - { - "name": "route_all_traffic", - "ordinal": 9, - "type_info": "Bool" - }, - { - "name": "keepalive_interval", - "ordinal": 10, - "type_info": "Integer" - }, - { - "name": "location_mfa_mode: LocationMfaMode", - "ordinal": 11, - "type_info": "Integer" - }, - { - "name": "service_location_mode: ServiceLocationMode", - "ordinal": 12, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - false, - false - ] - }, - "hash": "d8d908979a8573ee2c32828fa562d1bf171b4a6e224cc238680e2e856811c62e" -} diff --git a/src-tauri/migrations/20251117093105_force_all_traffic.sql b/src-tauri/migrations/20251117093105_force_all_traffic.sql new file mode 100644 index 00000000..c3365142 --- /dev/null +++ b/src-tauri/migrations/20251117093105_force_all_traffic.sql @@ -0,0 +1 @@ +ALTER TABLE instance ADD COLUMN force_all_traffic BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/src-tauri/proto b/src-tauri/proto index db6741ae..e4495e81 160000 --- a/src-tauri/proto +++ b/src-tauri/proto @@ -1 +1 @@ -Subproject commit db6741ae29d030d0ffecd2ef52aebfb51e9c7f37 +Subproject commit e4495e8136d8023f7bde20e4ebc4c33e8841531e diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 14e9f09c..68e6fe85 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -394,6 +394,7 @@ pub async fn all_instances() -> Result>, Error> { active: connected, pubkey: keys.pubkey, disable_all_traffic: instance.disable_all_traffic, + force_all_traffic: instance.force_all_traffic, enterprise_enabled: instance.enterprise_enabled, openid_display_name: instance.openid_display_name, }); diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 1a8339ba..2cf0b42e 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -16,6 +16,7 @@ pub struct Instance { pub username: String, pub token: Option, pub disable_all_traffic: bool, + pub force_all_traffic: bool, pub enterprise_enabled: bool, pub openid_display_name: Option, } @@ -37,6 +38,7 @@ impl From for Instance { username: instance_info.username, token: None, disable_all_traffic: instance_info.disable_all_traffic, + force_all_traffic: instance_info.force_all_traffic.unwrap_or_else(|| false), enterprise_enabled: instance_info.enterprise_enabled, openid_display_name: instance_info.openid_display_name, } @@ -74,7 +76,8 @@ impl Instance { let instances = query_as!( Self, "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", \ - disable_all_traffic, enterprise_enabled, openid_display_name FROM instance ORDER BY name ASC;" + disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name \ + FROM instance ORDER BY name ASC;" ) .fetch_all(executor) .await?; @@ -88,7 +91,8 @@ impl Instance { let instance = query_as!( Self, "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", \ - disable_all_traffic, enterprise_enabled, openid_display_name FROM instance WHERE id = $1;", + disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name \ + FROM instance WHERE id = $1;", id ) .fetch_optional(executor) @@ -122,7 +126,8 @@ impl Instance { let instances = query_as!( Self, "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, \ - disable_all_traffic, enterprise_enabled, openid_display_name FROM instance + disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name \ + FROM instance \ WHERE token IS NOT NULL ORDER BY name ASC;" ) .fetch_all(executor) @@ -176,6 +181,7 @@ impl Instance { username: self.username, token: self.token, disable_all_traffic: self.disable_all_traffic, + force_all_traffic: self.force_all_traffic, enterprise_enabled: self.enterprise_enabled, openid_display_name: self.openid_display_name, }) @@ -192,6 +198,7 @@ pub struct InstanceInfo { pub active: bool, pub pubkey: String, pub disable_all_traffic: bool, + pub force_all_traffic: bool, pub enterprise_enabled: bool, pub openid_display_name: Option, } From 0ccebf396b834b08ecb2668a9a66daa089fbd979 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Mon, 17 Nov 2025 12:08:52 +0100 Subject: [PATCH 02/16] fix Instance::save --- ...d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json | 12 ++++++++++++ ...0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json} | 6 +++--- ...d20e4b03574995383092cdb4d7c3ebda6f933ea0f472.json | 12 ------------ src-tauri/src/database/models/instance.rs | 10 +++++++--- 4 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json rename src-tauri/.sqlx/{query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json => query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json} (55%) delete mode 100644 src-tauri/.sqlx/query-758d3c67336eecafab5fd20e4b03574995383092cdb4d7c3ebda6f933ea0f472.json diff --git a/src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json b/src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json new file mode 100644 index 00000000..2e706762 --- /dev/null +++ b/src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, disable_all_traffic = $6, force_all_traffic = $7, enterprise_enabled = $8, token = $9, openid_display_name = $10 WHERE id = $11;", + "describe": { + "columns": [], + "parameters": { + "Right": 11 + }, + "nullable": [] + }, + "hash": "3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740" +} diff --git a/src-tauri/.sqlx/query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json b/src-tauri/.sqlx/query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json similarity index 55% rename from src-tauri/.sqlx/query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json rename to src-tauri/.sqlx/query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json index 4b7ed9e3..4e06561d 100644 --- a/src-tauri/.sqlx/query-95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08.json +++ b/src-tauri/.sqlx/query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "INSERT INTO instance (name, uuid, url, proxy_url, username, token, disable_all_traffic, enterprise_enabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;", + "query": "INSERT INTO instance (name, uuid, url, proxy_url, username, token, disable_all_traffic, force_all_traffic, enterprise_enabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id;", "describe": { "columns": [ { @@ -10,11 +10,11 @@ } ], "parameters": { - "Right": 8 + "Right": 9 }, "nullable": [ false ] }, - "hash": "95b89ca80a622d2c625c8d5523a8a59d947ae38b9ddf85a12e6c7bc9a6767f08" + "hash": "3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07" } diff --git a/src-tauri/.sqlx/query-758d3c67336eecafab5fd20e4b03574995383092cdb4d7c3ebda6f933ea0f472.json b/src-tauri/.sqlx/query-758d3c67336eecafab5fd20e4b03574995383092cdb4d7c3ebda6f933ea0f472.json deleted file mode 100644 index 40a4087a..00000000 --- a/src-tauri/.sqlx/query-758d3c67336eecafab5fd20e4b03574995383092cdb4d7c3ebda6f933ea0f472.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, disable_all_traffic = $6, enterprise_enabled = $7, token = $8, openid_display_name = $9 WHERE id = $10;", - "describe": { - "columns": [], - "parameters": { - "Right": 10 - }, - "nullable": [] - }, - "hash": "758d3c67336eecafab5fd20e4b03574995383092cdb4d7c3ebda6f933ea0f472" -} diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 2cf0b42e..72a3f216 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -52,13 +52,16 @@ impl Instance { { query!( "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, \ - disable_all_traffic = $6, enterprise_enabled = $7, token = $8, openid_display_name = $9 WHERE id = $10;", + disable_all_traffic = $6, force_all_traffic = $7, enterprise_enabled = $8, token = $9, \ + openid_display_name = $10 \ + WHERE id = $11;", self.name, self.uuid, self.url, self.proxy_url, self.username, self.disable_all_traffic, + self.force_all_traffic, self.enterprise_enabled, self.token, self.openid_display_name, @@ -159,8 +162,8 @@ impl Instance { let proxy_url = self.proxy_url.clone(); let result = query!( "INSERT INTO instance (name, uuid, url, proxy_url, username, token, \ - disable_all_traffic, enterprise_enabled) \ - VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;", + disable_all_traffic, force_all_traffic, enterprise_enabled) \ + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id;", self.name, self.uuid, url, @@ -168,6 +171,7 @@ impl Instance { self.username, self.token, self.disable_all_traffic, + self.force_all_traffic, self.enterprise_enabled ) .fetch_one(executor) From aba1063818b09b85b6152e02a5ac076120d8b5dd Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Mon, 17 Nov 2025 12:33:02 +0100 Subject: [PATCH 03/16] respect the force_all_traffic flag --- .../components/LocationCardRoute/LocationCardRoute.tsx | 1 + src/pages/client/types.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx index 61cc8032..2698a5ce 100644 --- a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx +++ b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx @@ -37,6 +37,7 @@ export const LocationCardRoute = ({ location, selectedDefguardInstance }: Props) { text: LL.pages.client.pages.instancePage.controls.traffic.predefinedTraffic(), value: 0, + disabled: selectedDefguardInstance?.force_all_traffic, }, { text: LL.pages.client.pages.instancePage.controls.traffic.allTraffic(), diff --git a/src/pages/client/types.ts b/src/pages/client/types.ts index 26f32900..cb235314 100644 --- a/src/pages/client/types.ts +++ b/src/pages/client/types.ts @@ -8,6 +8,7 @@ export type DefguardInstance = { active: boolean; pubkey: string; disable_all_traffic: boolean; + force_all_traffic: boolean; openid_display_name?: string; }; From ed2ce8c706fca625eb3ddc6a46e8818ab8aac3c8 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Tue, 18 Nov 2025 11:24:37 +0100 Subject: [PATCH 04/16] update protos --- src-tauri/proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/proto b/src-tauri/proto index e4495e81..74d60d91 160000 --- a/src-tauri/proto +++ b/src-tauri/proto @@ -1 +1 @@ -Subproject commit e4495e8136d8023f7bde20e4ebc4c33e8841531e +Subproject commit 74d60d9171048ba0ccaf8a21b05950fb7a673f09 From c482fa32175f417027fe8d927cad299cf6fe1beb Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 10:07:33 +0100 Subject: [PATCH 05/16] migration, wip on Instance structure --- .../20251117093105_force_all_traffic.sql | 17 +++- src-tauri/src/database/models/instance.rs | 95 +++++++++++++++---- 2 files changed, 91 insertions(+), 21 deletions(-) diff --git a/src-tauri/migrations/20251117093105_force_all_traffic.sql b/src-tauri/migrations/20251117093105_force_all_traffic.sql index c3365142..b6c2ca79 100644 --- a/src-tauri/migrations/20251117093105_force_all_traffic.sql +++ b/src-tauri/migrations/20251117093105_force_all_traffic.sql @@ -1 +1,16 @@ -ALTER TABLE instance ADD COLUMN force_all_traffic BOOLEAN NOT NULL DEFAULT FALSE; +-- add client_traffic_policy column to `instance` table +-- since SQLite does not support native enums we'll store them as integers +-- 0 - None +-- 1 - Disable all traffic +-- 2 - Force all traffic +ALTER TABLE instance ADD COLUMN client_traffic_policy INTEGER NOT NULL DEFAULT 0; + +-- populate new column based on value in `disable_all_traffic` column +UPDATE instance +SET client_traffic_policy = CASE + WHEN disable_all_traffic = true THEN 1 + ELSE 0 +END; + +-- drop the `disable_all_traffic` column since it's no longer needed +ALTER TABLE instance DROP COLUMN disable_all_traffic; diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 72a3f216..a3209bbd 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -1,7 +1,7 @@ use std::fmt; use serde::{Deserialize, Serialize}; -use sqlx::{query, query_as, SqliteExecutor}; +use sqlx::{prelude::Type, query, query_as, SqliteExecutor}; use super::{Id, NoId}; use crate::proto; @@ -15,8 +15,9 @@ pub struct Instance { pub proxy_url: String, pub username: String, pub token: Option, - pub disable_all_traffic: bool, - pub force_all_traffic: bool, + pub client_traffic_policy: ClientTrafficPolicy, + // pub disable_all_traffic: bool, + // pub client_traffic_policy: ClientTrafficPolicy, pub enterprise_enabled: bool, pub openid_display_name: Option, } @@ -29,6 +30,15 @@ impl fmt::Display for Instance { impl From for Instance { fn from(instance_info: proto::InstanceInfo) -> Self { + // Ensure backwards compatibility + let client_traffic_policy = match ( + instance_info.client_traffic_policy, + instance_info.disable_all_traffic, + ) { + (Some(policy), _) => ClientTrafficPolicy::from(policy), + (None, true) => ClientTrafficPolicy::DisableAllTraffic, + (None, false) => ClientTrafficPolicy::None, + }; Self { id: NoId, name: instance_info.name, @@ -37,14 +47,23 @@ impl From for Instance { proxy_url: instance_info.proxy_url, username: instance_info.username, token: None, - disable_all_traffic: instance_info.disable_all_traffic, - force_all_traffic: instance_info.force_all_traffic.unwrap_or_else(|| false), + client_traffic_policy, enterprise_enabled: instance_info.enterprise_enabled, openid_display_name: instance_info.openid_display_name, } } } +impl From for ClientTrafficPolicy { + fn from(value: i32) -> Self { + match value { + 1 => ClientTrafficPolicy::DisableAllTraffic, + 2 => ClientTrafficPolicy::ForceAllTraffic, + _ => ClientTrafficPolicy::None, + } + } +} + impl Instance { pub(crate) async fn save<'e, E>(&mut self, executor: E) -> Result<(), sqlx::Error> where @@ -52,16 +71,15 @@ impl Instance { { query!( "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, \ - disable_all_traffic = $6, force_all_traffic = $7, enterprise_enabled = $8, token = $9, \ - openid_display_name = $10 \ + client_traffic_policy = $6, enterprise_enabled = $7, token = $8, \ + openid_display_name = $9 \ WHERE id = $11;", self.name, self.uuid, self.url, self.proxy_url, self.username, - self.disable_all_traffic, - self.force_all_traffic, + self.client_traffic_policy, self.enterprise_enabled, self.token, self.openid_display_name, @@ -79,7 +97,7 @@ impl Instance { let instances = query_as!( Self, "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", \ - disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name \ + client_traffic_policy, enterprise_enabled, openid_display_name \ FROM instance ORDER BY name ASC;" ) .fetch_all(executor) @@ -94,7 +112,7 @@ impl Instance { let instance = query_as!( Self, "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", \ - disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name \ + client_traffic_policy, enterprise_enabled, openid_display_name \ FROM instance WHERE id = $1;", id ) @@ -129,7 +147,7 @@ impl Instance { let instances = query_as!( Self, "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, \ - disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name \ + client_traffic_policy, enterprise_enabled, openid_display_name \ FROM instance \ WHERE token IS NOT NULL ORDER BY name ASC;" ) @@ -147,7 +165,7 @@ impl PartialEq for Instance { && self.url == other.url && self.proxy_url == other.proxy_url && self.username == other.username - && self.disable_all_traffic == other.disable_all_traffic + && self.client_traffic_policy == other.client_traffic_policy && self.enterprise_enabled == other.enterprise_enabled && self.openid_display_name == other.openid_display_name } @@ -162,16 +180,17 @@ impl Instance { let proxy_url = self.proxy_url.clone(); let result = query!( "INSERT INTO instance (name, uuid, url, proxy_url, username, token, \ - disable_all_traffic, force_all_traffic, enterprise_enabled) \ - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id;", + client_traffic_policy , enterprise_enabled) \ + VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;", self.name, self.uuid, url, proxy_url, self.username, self.token, - self.disable_all_traffic, - self.force_all_traffic, + self.client_traffic_policy, + // self.disable_all_traffic, + // self.force_all_traffic, self.enterprise_enabled ) .fetch_one(executor) @@ -184,8 +203,9 @@ impl Instance { proxy_url: self.proxy_url, username: self.username, token: self.token, - disable_all_traffic: self.disable_all_traffic, - force_all_traffic: self.force_all_traffic, + client_traffic_policy: self.client_traffic_policy, + // disable_all_traffic: self.disable_all_traffic, + // force_all_traffic: self.force_all_traffic, enterprise_enabled: self.enterprise_enabled, openid_display_name: self.openid_display_name, }) @@ -202,7 +222,7 @@ pub struct InstanceInfo { pub active: bool, pub pubkey: String, pub disable_all_traffic: bool, - pub force_all_traffic: bool, + pub client_traffic_policy: ClientTrafficPolicy, pub enterprise_enabled: bool, pub openid_display_name: Option, } @@ -212,3 +232,38 @@ impl fmt::Display for InstanceInfo { write!(f, "{}(ID: {})", self.name, self.id) } } + +/// Describes allowed traffic options for clients connecting to an instance. +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Type)] +#[repr(u32)] +#[serde(rename_all = "snake_case")] +pub enum ClientTrafficPolicy { + /// No restrictions + None = 0, + /// Clients are not allowed to route all traffic through the VPN. + DisableAllTraffic = 1, + /// Clients are forced to route all traffic through the VPN. + ForceAllTraffic = 2, +} + +impl From for ClientTrafficPolicy { + fn from(value: i64) -> Self { + match value { + 1 => ClientTrafficPolicy::DisableAllTraffic, + 2 => ClientTrafficPolicy::ForceAllTraffic, + _ => ClientTrafficPolicy::None, + } + } +} + +// impl From for ClientTrafficPolicy { +// fn from(value: proto::ClientTrafficPolicy) -> Self { +// match value { +// ProtoLocationMfaMode::Unspecified | ProtoLocationMfaMode::Disabled => { +// LocationMfaMode::Disabled +// } +// ProtoLocationMfaMode::Internal => LocationMfaMode::Internal, +// ProtoLocationMfaMode::External => LocationMfaMode::External, +// } +// } +// } From c9b6da040c6f92256828f30c6b86f66fdf2d2876 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 11:47:31 +0100 Subject: [PATCH 06/16] wip client traffic policy disables options TODO: polling should save policy to db --- src-tauri/src/commands.rs | 32 +++++++++++-------- src-tauri/src/database/models/instance.rs | 26 ++++++++++++--- src-tauri/src/enterprise/models/instance.rs | 5 ++- .../LocationCardRoute/LocationCardRoute.tsx | 22 +++++++------ src/pages/client/types.ts | 11 +++++-- 5 files changed, 63 insertions(+), 33 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 68e6fe85..77f65188 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -27,7 +27,7 @@ use crate::{ database::{ models::{ connection::{ActiveConnection, Connection, ConnectionInfo}, - instance::{Instance, InstanceInfo}, + instance::{ClientTrafficPolicy, Instance, InstanceInfo}, location::{Location, LocationMfaMode}, location_stats::LocationStats, tunnel::{Tunnel, TunnelConnection, TunnelConnectionInfo, TunnelStats}, @@ -393,8 +393,9 @@ pub async fn all_instances() -> Result>, Error> { proxy_url: instance.proxy_url, active: connected, pubkey: keys.pubkey, - disable_all_traffic: instance.disable_all_traffic, - force_all_traffic: instance.force_all_traffic, + // disable_all_traffic: instance.disable_all_traffic, + // force_all_traffic: instance.force_all_traffic, + client_traffic_policy: instance.client_traffic_policy, enterprise_enabled: instance.enterprise_enabled, openid_display_name: instance.openid_display_name, }); @@ -576,16 +577,16 @@ pub(crate) async fn do_update_instance( instance.url = instance_info.url; instance.proxy_url = instance_info.proxy_url; instance.username = instance_info.username; - // Make sure to update the locations too if we are disabling all traffic - if instance.disable_all_traffic != instance_info.disable_all_traffic - && instance_info.disable_all_traffic - { - debug!("Disabling all traffic for all locations of instance {instance}"); - Location::disable_all_traffic_for_all(transaction.as_mut(), instance.id).await?; - debug!("Disabled all traffic for all locations of instance {instance}"); - } - instance.disable_all_traffic = instance_info.disable_all_traffic; - instance.enterprise_enabled = instance_info.enterprise_enabled; + // TODO + // // Make sure to update the locations too if we are disabling all traffic + // if instance.disable_all_traffic != instance_info.disable_all_traffic + // && instance_info.disable_all_traffic + // { + // debug!("Disabling all traffic for all locations of instance {instance}"); + // Location::disable_all_traffic_for_all(transaction.as_mut(), instance.id).await?; + // debug!("Disabled all traffic for all locations of instance {instance}"); + // } + instance.client_traffic_policy = instance_info.client_traffic_policy.into(); instance.openid_display_name = instance_info.openid_display_name; instance.uuid = instance_info.id; // Token may be empty if it was not issued @@ -928,7 +929,10 @@ pub async fn update_location_routing( let instance = Instance::find_by_id(&*DB_POOL, location.instance_id) .await? .ok_or(Error::NotFound)?; - if instance.disable_all_traffic && route_all_traffic { + // TODO the same check for ForceAllTraffic + if (instance.client_traffic_policy == ClientTrafficPolicy::DisableAllTraffic) + && route_all_traffic + { error!( "Couldn't update location routing: instance with id {} has \ route_all_traffic disabled.", diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index a3209bbd..322c9f29 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -160,12 +160,17 @@ impl Instance { // This compares proto::InstanceInfo, not to be confused with regular InstanceInfo defined below impl PartialEq for Instance { fn eq(&self, other: &proto::InstanceInfo) -> bool { + // TODO + let Some(other_policy) = other.client_traffic_policy else { + return false; + }; + let other_policy = ClientTrafficPolicy::from(other_policy); self.name == other.name && self.uuid == other.id && self.url == other.url && self.proxy_url == other.proxy_url && self.username == other.username - && self.client_traffic_policy == other.client_traffic_policy + && self.client_traffic_policy == other_policy && self.enterprise_enabled == other.enterprise_enabled && self.openid_display_name == other.openid_display_name } @@ -221,7 +226,7 @@ pub struct InstanceInfo { pub proxy_url: String, pub active: bool, pub pubkey: String, - pub disable_all_traffic: bool, + // pub disable_all_traffic: bool, pub client_traffic_policy: ClientTrafficPolicy, pub enterprise_enabled: bool, pub openid_display_name: Option, @@ -249,9 +254,20 @@ pub enum ClientTrafficPolicy { impl From for ClientTrafficPolicy { fn from(value: i64) -> Self { match value { - 1 => ClientTrafficPolicy::DisableAllTraffic, - 2 => ClientTrafficPolicy::ForceAllTraffic, - _ => ClientTrafficPolicy::None, + 1 => Self::DisableAllTraffic, + 2 => Self::ForceAllTraffic, + _ => Self::None, + } + } +} + +impl From> for ClientTrafficPolicy { + fn from(value: Option) -> Self { + match value { + None => Self::None, + Some(1) => Self::DisableAllTraffic, + Some(2) => Self::ForceAllTraffic, + _ => Self::None, } } } diff --git a/src-tauri/src/enterprise/models/instance.rs b/src-tauri/src/enterprise/models/instance.rs index 6da45fa0..6147cd33 100644 --- a/src-tauri/src/enterprise/models/instance.rs +++ b/src-tauri/src/enterprise/models/instance.rs @@ -1,7 +1,7 @@ use sqlx::SqliteExecutor; use crate::{ - database::models::{instance::Instance, Id}, + database::models::{instance::{ClientTrafficPolicy, Instance}, Id}, error::Error, }; @@ -14,8 +14,7 @@ impl Instance { "Disabling enterprise features for instance {}({})", self.name, self.id ); - self.enterprise_enabled = false; - self.disable_all_traffic = false; + self.client_traffic_policy = ClientTrafficPolicy::None; self.save(executor).await?; debug!( "Disabled enterprise features for instance {}({})", diff --git a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx index 2698a5ce..52a02a42 100644 --- a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx +++ b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx @@ -7,7 +7,7 @@ import { useI18nContext } from '../../../../../../../../i18n/i18n-react'; import { Toggle } from '../../../../../../../../shared/defguard-ui/components/Layout/Toggle/Toggle'; import type { ToggleOption } from '../../../../../../../../shared/defguard-ui/components/Layout/Toggle/types'; import { clientApi } from '../../../../../../clientAPI/clientApi'; -import type { CommonWireguardFields, DefguardInstance } from '../../../../../../types'; +import { ClientTrafficPolicy, type CommonWireguardFields, type DefguardInstance } from '../../../../../../types'; type Props = { location?: CommonWireguardFields; @@ -37,26 +37,30 @@ export const LocationCardRoute = ({ location, selectedDefguardInstance }: Props) { text: LL.pages.client.pages.instancePage.controls.traffic.predefinedTraffic(), value: 0, - disabled: selectedDefguardInstance?.force_all_traffic, + disabled: selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.FORCE_ALL_TRAFFIC, }, { text: LL.pages.client.pages.instancePage.controls.traffic.allTraffic(), value: 1, - disabled: selectedDefguardInstance?.disable_all_traffic, + disabled: selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.DISABLE_ALL_TRAFFIC, }, ]; return res; - }, [LL.pages, selectedDefguardInstance?.disable_all_traffic]); + }, [LL.pages, selectedDefguardInstance?.client_traffic_policy]); + let selected; + if (selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.NONE) { + selected = Number(location?.route_all_traffic); + } else if (selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.DISABLE_ALL_TRAFFIC) { + selected = 0; + } else { + selected = 1; + } return ( { if (!location?.active) { diff --git a/src/pages/client/types.ts b/src/pages/client/types.ts index cb235314..bd42a96d 100644 --- a/src/pages/client/types.ts +++ b/src/pages/client/types.ts @@ -1,3 +1,9 @@ +export enum ClientTrafficPolicy { + NONE = 'none', + DISABLE_ALL_TRAFFIC = 'disable_all_traffic', + FORCE_ALL_TRAFFIC = 'force_all_traffic', +} + export type DefguardInstance = { id: number; uuid: string; @@ -7,8 +13,9 @@ export type DefguardInstance = { // connected active: boolean; pubkey: string; - disable_all_traffic: boolean; - force_all_traffic: boolean; + client_traffic_policy: ClientTrafficPolicy, + // disable_all_traffic: boolean; + // force_all_traffic: boolean; openid_display_name?: string; }; From f713b24cfbcb17b081fef7ea3130e1ea971b5df5 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 12:49:03 +0100 Subject: [PATCH 07/16] fix Instance::client_traffic_policy updates --- src-tauri/src/commands.rs | 30 ++++++++++++++++------- src-tauri/src/database/models/instance.rs | 3 ++- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 77f65188..008b6c7f 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -559,6 +559,11 @@ pub(crate) async fn locations_changed( .map(|config| config.clone().into_location(instance.id)) .collect(); + error!( + "Instance {} locations changed: {}", + instance.name, + db_locations != core_locations + ); Ok(db_locations != core_locations) } @@ -577,15 +582,22 @@ pub(crate) async fn do_update_instance( instance.url = instance_info.url; instance.proxy_url = instance_info.proxy_url; instance.username = instance_info.username; - // TODO - // // Make sure to update the locations too if we are disabling all traffic - // if instance.disable_all_traffic != instance_info.disable_all_traffic - // && instance_info.disable_all_traffic - // { - // debug!("Disabling all traffic for all locations of instance {instance}"); - // Location::disable_all_traffic_for_all(transaction.as_mut(), instance.id).await?; - // debug!("Disabled all traffic for all locations of instance {instance}"); - // } + // Make sure to update the locations too if we are disabling all traffic + let policy = instance_info.client_traffic_policy.into(); + if instance.client_traffic_policy != policy && policy == ClientTrafficPolicy::DisableAllTraffic + { + debug!("Disabling all traffic for all locations of instance {instance}"); + Location::disable_all_traffic_for_all(transaction.as_mut(), instance.id).await?; + debug!("Disabled all traffic for all locations of instance {instance}"); + } + error!( + "## Updating instance {}({:?}) : {:?} -> {:?}({:?})", + instance.name, + instance.client_traffic_policy, + instance.client_traffic_policy, + instance_info.client_traffic_policy, + ClientTrafficPolicy::from(instance_info.client_traffic_policy), + ); instance.client_traffic_policy = instance_info.client_traffic_policy.into(); instance.openid_display_name = instance_info.openid_display_name; instance.uuid = instance_info.id; diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 322c9f29..01c8222a 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -69,11 +69,12 @@ impl Instance { where E: SqliteExecutor<'e>, { + error!("### Executing query: {:?}", self.client_traffic_policy); query!( "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, \ client_traffic_policy = $6, enterprise_enabled = $7, token = $8, \ openid_display_name = $9 \ - WHERE id = $11;", + WHERE id = $10;", self.name, self.uuid, self.url, From 0d99d5d2761f93c54f9c693529e7d4c5bf96e9b7 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 12:54:40 +0100 Subject: [PATCH 08/16] cleanup --- src-tauri/src/commands.rs | 10 ---------- src-tauri/src/database/models/instance.rs | 4 ---- src/pages/client/types.ts | 2 -- 3 files changed, 16 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 008b6c7f..f0f7c027 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -393,8 +393,6 @@ pub async fn all_instances() -> Result>, Error> { proxy_url: instance.proxy_url, active: connected, pubkey: keys.pubkey, - // disable_all_traffic: instance.disable_all_traffic, - // force_all_traffic: instance.force_all_traffic, client_traffic_policy: instance.client_traffic_policy, enterprise_enabled: instance.enterprise_enabled, openid_display_name: instance.openid_display_name, @@ -590,14 +588,6 @@ pub(crate) async fn do_update_instance( Location::disable_all_traffic_for_all(transaction.as_mut(), instance.id).await?; debug!("Disabled all traffic for all locations of instance {instance}"); } - error!( - "## Updating instance {}({:?}) : {:?} -> {:?}({:?})", - instance.name, - instance.client_traffic_policy, - instance.client_traffic_policy, - instance_info.client_traffic_policy, - ClientTrafficPolicy::from(instance_info.client_traffic_policy), - ); instance.client_traffic_policy = instance_info.client_traffic_policy.into(); instance.openid_display_name = instance_info.openid_display_name; instance.uuid = instance_info.id; diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 01c8222a..da2d04fd 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -69,7 +69,6 @@ impl Instance { where E: SqliteExecutor<'e>, { - error!("### Executing query: {:?}", self.client_traffic_policy); query!( "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, \ client_traffic_policy = $6, enterprise_enabled = $7, token = $8, \ @@ -210,8 +209,6 @@ impl Instance { username: self.username, token: self.token, client_traffic_policy: self.client_traffic_policy, - // disable_all_traffic: self.disable_all_traffic, - // force_all_traffic: self.force_all_traffic, enterprise_enabled: self.enterprise_enabled, openid_display_name: self.openid_display_name, }) @@ -227,7 +224,6 @@ pub struct InstanceInfo { pub proxy_url: String, pub active: bool, pub pubkey: String, - // pub disable_all_traffic: bool, pub client_traffic_policy: ClientTrafficPolicy, pub enterprise_enabled: bool, pub openid_display_name: Option, diff --git a/src/pages/client/types.ts b/src/pages/client/types.ts index bd42a96d..38ff61d2 100644 --- a/src/pages/client/types.ts +++ b/src/pages/client/types.ts @@ -14,8 +14,6 @@ export type DefguardInstance = { active: boolean; pubkey: string; client_traffic_policy: ClientTrafficPolicy, - // disable_all_traffic: boolean; - // force_all_traffic: boolean; openid_display_name?: string; }; From c89d54f7fe9625b4f861c2c29234663f1df37a57 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 13:06:58 +0100 Subject: [PATCH 09/16] linting fixes --- .../components/LocationCardRoute/LocationCardRoute.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx index 52a02a42..2088e74d 100644 --- a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx +++ b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx @@ -37,21 +37,21 @@ export const LocationCardRoute = ({ location, selectedDefguardInstance }: Props) { text: LL.pages.client.pages.instancePage.controls.traffic.predefinedTraffic(), value: 0, - disabled: selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.FORCE_ALL_TRAFFIC, + disabled: selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.FORCE_ALL_TRAFFIC, }, { text: LL.pages.client.pages.instancePage.controls.traffic.allTraffic(), value: 1, - disabled: selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.DISABLE_ALL_TRAFFIC, + disabled: selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.DISABLE_ALL_TRAFFIC, }, ]; return res; }, [LL.pages, selectedDefguardInstance?.client_traffic_policy]); - let selected; - if (selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.NONE) { + let selected: number; + if (selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.NONE) { selected = Number(location?.route_all_traffic); - } else if (selectedDefguardInstance?.client_traffic_policy == ClientTrafficPolicy.DISABLE_ALL_TRAFFIC) { + } else if (selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.DISABLE_ALL_TRAFFIC) { selected = 0; } else { selected = 1; From ba3d8dd7a187c7439c07c5e16f72a287345c9bb6 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 13:09:28 +0100 Subject: [PATCH 10/16] sqlx fixtures, clippy fixes --- ...a8cd49d4659d2d6faafdd2de0c985679d0703d.json | 12 ++++++++++++ ...ae1a4c327622977707117bf88b6a43e9e8f96.json} | 18 ++++++------------ ...97cdbdd6290ef6fa0420ddc0682ab10e14727.json} | 18 ++++++------------ ...9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json | 12 ------------ ...6a22e221bdffc8ee37b777f26d02988f69bb1.json} | 18 ++++++------------ ...c9aa248baf9553cea4f47ca9b1f6499bedaa3.json} | 6 +++--- src-tauri/src/database/models/instance.rs | 1 + 7 files changed, 34 insertions(+), 51 deletions(-) create mode 100644 src-tauri/.sqlx/query-0b161da55e36df9d0a10a52474a8cd49d4659d2d6faafdd2de0c985679d0703d.json rename src-tauri/.sqlx/{query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json => query-2d9b3c0595f2d385336d0a86cfdae1a4c327622977707117bf88b6a43e9e8f96.json} (75%) rename src-tauri/.sqlx/{query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json => query-3a157b6bcdba07c456e924798f797cdbdd6290ef6fa0420ddc0682ab10e14727.json} (74%) delete mode 100644 src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json rename src-tauri/.sqlx/{query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json => query-7b9e30e8f67a024fb1ad94f76d16a22e221bdffc8ee37b777f26d02988f69bb1.json} (75%) rename src-tauri/.sqlx/{query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json => query-c4a6b8e1c94eefc619c768ff4aac9aa248baf9553cea4f47ca9b1f6499bedaa3.json} (55%) diff --git a/src-tauri/.sqlx/query-0b161da55e36df9d0a10a52474a8cd49d4659d2d6faafdd2de0c985679d0703d.json b/src-tauri/.sqlx/query-0b161da55e36df9d0a10a52474a8cd49d4659d2d6faafdd2de0c985679d0703d.json new file mode 100644 index 00000000..0f1dbfc0 --- /dev/null +++ b/src-tauri/.sqlx/query-0b161da55e36df9d0a10a52474a8cd49d4659d2d6faafdd2de0c985679d0703d.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, client_traffic_policy = $6, enterprise_enabled = $7, token = $8, openid_display_name = $9 WHERE id = $10;", + "describe": { + "columns": [], + "parameters": { + "Right": 10 + }, + "nullable": [] + }, + "hash": "0b161da55e36df9d0a10a52474a8cd49d4659d2d6faafdd2de0c985679d0703d" +} diff --git a/src-tauri/.sqlx/query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json b/src-tauri/.sqlx/query-2d9b3c0595f2d385336d0a86cfdae1a4c327622977707117bf88b6a43e9e8f96.json similarity index 75% rename from src-tauri/.sqlx/query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json rename to src-tauri/.sqlx/query-2d9b3c0595f2d385336d0a86cfdae1a4c327622977707117bf88b6a43e9e8f96.json index 7f66f113..13579fc7 100644 --- a/src-tauri/.sqlx/query-c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd.json +++ b/src-tauri/.sqlx/query-2d9b3c0595f2d385336d0a86cfdae1a4c327622977707117bf88b6a43e9e8f96.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name FROM instance ORDER BY name ASC;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", client_traffic_policy, enterprise_enabled, openid_display_name FROM instance ORDER BY name ASC;", "describe": { "columns": [ { @@ -39,23 +39,18 @@ "type_info": "Text" }, { - "name": "disable_all_traffic", + "name": "client_traffic_policy", "ordinal": 7, - "type_info": "Bool" - }, - { - "name": "force_all_traffic", - "ordinal": 8, - "type_info": "Bool" + "type_info": "Integer" }, { "name": "enterprise_enabled", - "ordinal": 9, + "ordinal": 8, "type_info": "Bool" }, { "name": "openid_display_name", - "ordinal": 10, + "ordinal": 9, "type_info": "Text" } ], @@ -72,9 +67,8 @@ true, false, false, - false, true ] }, - "hash": "c3299aac934a617a7f5d870bc254dc7f6f7d1428fc5698e40c5089417b3c8dcd" + "hash": "2d9b3c0595f2d385336d0a86cfdae1a4c327622977707117bf88b6a43e9e8f96" } diff --git a/src-tauri/.sqlx/query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json b/src-tauri/.sqlx/query-3a157b6bcdba07c456e924798f797cdbdd6290ef6fa0420ddc0682ab10e14727.json similarity index 74% rename from src-tauri/.sqlx/query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json rename to src-tauri/.sqlx/query-3a157b6bcdba07c456e924798f797cdbdd6290ef6fa0420ddc0682ab10e14727.json index 805df22f..79b463d4 100644 --- a/src-tauri/.sqlx/query-344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e.json +++ b/src-tauri/.sqlx/query-3a157b6bcdba07c456e924798f797cdbdd6290ef6fa0420ddc0682ab10e14727.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name FROM instance WHERE token IS NOT NULL ORDER BY name ASC;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token, client_traffic_policy, enterprise_enabled, openid_display_name FROM instance WHERE token IS NOT NULL ORDER BY name ASC;", "describe": { "columns": [ { @@ -39,23 +39,18 @@ "type_info": "Text" }, { - "name": "disable_all_traffic", + "name": "client_traffic_policy", "ordinal": 7, - "type_info": "Bool" - }, - { - "name": "force_all_traffic", - "ordinal": 8, - "type_info": "Bool" + "type_info": "Integer" }, { "name": "enterprise_enabled", - "ordinal": 9, + "ordinal": 8, "type_info": "Bool" }, { "name": "openid_display_name", - "ordinal": 10, + "ordinal": 9, "type_info": "Text" } ], @@ -72,9 +67,8 @@ true, false, false, - false, true ] }, - "hash": "344d5584059c44fb27e98b831f8beb5000a1439de8c203821f6174fe3276c25e" + "hash": "3a157b6bcdba07c456e924798f797cdbdd6290ef6fa0420ddc0682ab10e14727" } diff --git a/src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json b/src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json deleted file mode 100644 index 2e706762..00000000 --- a/src-tauri/.sqlx/query-3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE instance SET name = $1, uuid = $2, url = $3, proxy_url = $4, username = $5, disable_all_traffic = $6, force_all_traffic = $7, enterprise_enabled = $8, token = $9, openid_display_name = $10 WHERE id = $11;", - "describe": { - "columns": [], - "parameters": { - "Right": 11 - }, - "nullable": [] - }, - "hash": "3a56969af94e96f42d60d9d2fd9bcdf5bcf2d932d1eafb134ed73f3656cbb740" -} diff --git a/src-tauri/.sqlx/query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json b/src-tauri/.sqlx/query-7b9e30e8f67a024fb1ad94f76d16a22e221bdffc8ee37b777f26d02988f69bb1.json similarity index 75% rename from src-tauri/.sqlx/query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json rename to src-tauri/.sqlx/query-7b9e30e8f67a024fb1ad94f76d16a22e221bdffc8ee37b777f26d02988f69bb1.json index 322b6419..3b65dac0 100644 --- a/src-tauri/.sqlx/query-0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5.json +++ b/src-tauri/.sqlx/query-7b9e30e8f67a024fb1ad94f76d16a22e221bdffc8ee37b777f26d02988f69bb1.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", disable_all_traffic, force_all_traffic, enterprise_enabled, openid_display_name FROM instance WHERE id = $1;", + "query": "SELECT id \"id: _\", name, uuid, url, proxy_url, username, token \"token?\", client_traffic_policy, enterprise_enabled, openid_display_name FROM instance WHERE id = $1;", "describe": { "columns": [ { @@ -39,23 +39,18 @@ "type_info": "Text" }, { - "name": "disable_all_traffic", + "name": "client_traffic_policy", "ordinal": 7, - "type_info": "Bool" - }, - { - "name": "force_all_traffic", - "ordinal": 8, - "type_info": "Bool" + "type_info": "Integer" }, { "name": "enterprise_enabled", - "ordinal": 9, + "ordinal": 8, "type_info": "Bool" }, { "name": "openid_display_name", - "ordinal": 10, + "ordinal": 9, "type_info": "Text" } ], @@ -72,9 +67,8 @@ true, false, false, - false, true ] }, - "hash": "0f592e9b8379a31fa318729bea4caed607c915644bc20d99fb2324961a0ee1a5" + "hash": "7b9e30e8f67a024fb1ad94f76d16a22e221bdffc8ee37b777f26d02988f69bb1" } diff --git a/src-tauri/.sqlx/query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json b/src-tauri/.sqlx/query-c4a6b8e1c94eefc619c768ff4aac9aa248baf9553cea4f47ca9b1f6499bedaa3.json similarity index 55% rename from src-tauri/.sqlx/query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json rename to src-tauri/.sqlx/query-c4a6b8e1c94eefc619c768ff4aac9aa248baf9553cea4f47ca9b1f6499bedaa3.json index 4e06561d..ec67166e 100644 --- a/src-tauri/.sqlx/query-3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07.json +++ b/src-tauri/.sqlx/query-c4a6b8e1c94eefc619c768ff4aac9aa248baf9553cea4f47ca9b1f6499bedaa3.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "INSERT INTO instance (name, uuid, url, proxy_url, username, token, disable_all_traffic, force_all_traffic, enterprise_enabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id;", + "query": "INSERT INTO instance (name, uuid, url, proxy_url, username, token, client_traffic_policy , enterprise_enabled) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING id;", "describe": { "columns": [ { @@ -10,11 +10,11 @@ } ], "parameters": { - "Right": 9 + "Right": 8 }, "nullable": [ false ] }, - "hash": "3d6e33f5685565571f2ac0b44042f6f44ad42fe91bb95d86fc602eb1b1710b07" + "hash": "c4a6b8e1c94eefc619c768ff4aac9aa248baf9553cea4f47ca9b1f6499bedaa3" } diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index da2d04fd..0f226c56 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -33,6 +33,7 @@ impl From for Instance { // Ensure backwards compatibility let client_traffic_policy = match ( instance_info.client_traffic_policy, + #[allow(deprecated)] instance_info.disable_all_traffic, ) { (Some(policy), _) => ClientTrafficPolicy::from(policy), From fecef341bda5e023478f261c3057c24bfdaa32fb Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 13:17:27 +0100 Subject: [PATCH 11/16] cargo fmt --- src-tauri/src/enterprise/models/instance.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/enterprise/models/instance.rs b/src-tauri/src/enterprise/models/instance.rs index 6147cd33..b0a03437 100644 --- a/src-tauri/src/enterprise/models/instance.rs +++ b/src-tauri/src/enterprise/models/instance.rs @@ -1,7 +1,10 @@ use sqlx::SqliteExecutor; use crate::{ - database::models::{instance::{ClientTrafficPolicy, Instance}, Id}, + database::models::{ + instance::{ClientTrafficPolicy, Instance}, + Id, + }, error::Error, }; From 8ad1c85a6ccb8c2fec317e208b3af72eec7478cd Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Wed, 19 Nov 2025 13:17:50 +0100 Subject: [PATCH 12/16] reformat frontend --- .../LocationCardRoute/LocationCardRoute.tsx | 19 +++++++++++++++---- src/pages/client/types.ts | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx index 2088e74d..fa2c6003 100644 --- a/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx +++ b/src/pages/client/pages/ClientInstancePage/components/LocationsList/components/LocationCardRoute/LocationCardRoute.tsx @@ -7,7 +7,11 @@ import { useI18nContext } from '../../../../../../../../i18n/i18n-react'; import { Toggle } from '../../../../../../../../shared/defguard-ui/components/Layout/Toggle/Toggle'; import type { ToggleOption } from '../../../../../../../../shared/defguard-ui/components/Layout/Toggle/types'; import { clientApi } from '../../../../../../clientAPI/clientApi'; -import { ClientTrafficPolicy, type CommonWireguardFields, type DefguardInstance } from '../../../../../../types'; +import { + ClientTrafficPolicy, + type CommonWireguardFields, + type DefguardInstance, +} from '../../../../../../types'; type Props = { location?: CommonWireguardFields; @@ -37,12 +41,16 @@ export const LocationCardRoute = ({ location, selectedDefguardInstance }: Props) { text: LL.pages.client.pages.instancePage.controls.traffic.predefinedTraffic(), value: 0, - disabled: selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.FORCE_ALL_TRAFFIC, + disabled: + selectedDefguardInstance?.client_traffic_policy === + ClientTrafficPolicy.FORCE_ALL_TRAFFIC, }, { text: LL.pages.client.pages.instancePage.controls.traffic.allTraffic(), value: 1, - disabled: selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.DISABLE_ALL_TRAFFIC, + disabled: + selectedDefguardInstance?.client_traffic_policy === + ClientTrafficPolicy.DISABLE_ALL_TRAFFIC, }, ]; return res; @@ -51,7 +59,10 @@ export const LocationCardRoute = ({ location, selectedDefguardInstance }: Props) let selected: number; if (selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.NONE) { selected = Number(location?.route_all_traffic); - } else if (selectedDefguardInstance?.client_traffic_policy === ClientTrafficPolicy.DISABLE_ALL_TRAFFIC) { + } else if ( + selectedDefguardInstance?.client_traffic_policy === + ClientTrafficPolicy.DISABLE_ALL_TRAFFIC + ) { selected = 0; } else { selected = 1; diff --git a/src/pages/client/types.ts b/src/pages/client/types.ts index 38ff61d2..3434187b 100644 --- a/src/pages/client/types.ts +++ b/src/pages/client/types.ts @@ -13,7 +13,7 @@ export type DefguardInstance = { // connected active: boolean; pubkey: string; - client_traffic_policy: ClientTrafficPolicy, + client_traffic_policy: ClientTrafficPolicy; openid_display_name?: string; }; From d0e596f8e9182d69fff3c6443be3412db8a4c730 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Thu, 20 Nov 2025 09:12:03 +0100 Subject: [PATCH 13/16] tweak integer to policy conversions --- src-tauri/src/database/models/instance.rs | 44 ++++++----------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index 0f226c56..c2071162 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -16,8 +16,6 @@ pub struct Instance { pub username: String, pub token: Option, pub client_traffic_policy: ClientTrafficPolicy, - // pub disable_all_traffic: bool, - // pub client_traffic_policy: ClientTrafficPolicy, pub enterprise_enabled: bool, pub openid_display_name: Option, } @@ -55,16 +53,6 @@ impl From for Instance { } } -impl From for ClientTrafficPolicy { - fn from(value: i32) -> Self { - match value { - 1 => ClientTrafficPolicy::DisableAllTraffic, - 2 => ClientTrafficPolicy::ForceAllTraffic, - _ => ClientTrafficPolicy::None, - } - } -} - impl Instance { pub(crate) async fn save<'e, E>(&mut self, executor: E) -> Result<(), sqlx::Error> where @@ -195,8 +183,6 @@ impl Instance { self.username, self.token, self.client_traffic_policy, - // self.disable_all_traffic, - // self.force_all_traffic, self.enterprise_enabled ) .fetch_one(executor) @@ -249,12 +235,12 @@ pub enum ClientTrafficPolicy { ForceAllTraffic = 2, } -impl From for ClientTrafficPolicy { - fn from(value: i64) -> Self { +impl From for ClientTrafficPolicy { + fn from(value: i32) -> Self { match value { - 1 => Self::DisableAllTraffic, - 2 => Self::ForceAllTraffic, - _ => Self::None, + 1 => ClientTrafficPolicy::DisableAllTraffic, + 2 => ClientTrafficPolicy::ForceAllTraffic, + _ => ClientTrafficPolicy::None, } } } @@ -263,21 +249,13 @@ impl From> for ClientTrafficPolicy { fn from(value: Option) -> Self { match value { None => Self::None, - Some(1) => Self::DisableAllTraffic, - Some(2) => Self::ForceAllTraffic, - _ => Self::None, + Some(v) => Self::from(v), } } } -// impl From for ClientTrafficPolicy { -// fn from(value: proto::ClientTrafficPolicy) -> Self { -// match value { -// ProtoLocationMfaMode::Unspecified | ProtoLocationMfaMode::Disabled => { -// LocationMfaMode::Disabled -// } -// ProtoLocationMfaMode::Internal => LocationMfaMode::Internal, -// ProtoLocationMfaMode::External => LocationMfaMode::External, -// } -// } -// } +impl From for ClientTrafficPolicy { + fn from(value: i64) -> Self { + Self::from(value as i32) + } +} From a85ade8a1ddce284f8219540a0c1d3e3bdab6b1c Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Thu, 20 Nov 2025 09:20:34 +0100 Subject: [PATCH 14/16] check policy before updating a location --- src-tauri/src/commands.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index f0f7c027..5dd5fe8f 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -927,11 +927,10 @@ pub async fn update_location_routing( match connection_type { ConnectionType::Location => { if let Some(mut location) = Location::find_by_id(&*DB_POOL, location_id).await? { - // Check if the instance has route_all_traffic disabled let instance = Instance::find_by_id(&*DB_POOL, location.instance_id) .await? .ok_or(Error::NotFound)?; - // TODO the same check for ForceAllTraffic + // Check if the instance has route_all_traffic disabled if (instance.client_traffic_policy == ClientTrafficPolicy::DisableAllTraffic) && route_all_traffic { @@ -944,6 +943,19 @@ pub async fn update_location_routing( "Instance has route_all_traffic disabled".into(), )); } + // Check if the instance has route_all_traffic enforced + if (instance.client_traffic_policy == ClientTrafficPolicy::ForceAllTraffic) + && !route_all_traffic + { + error!( + "Couldn't update location routing: instance with id {} has \ + route_all_traffic enforced.", + instance.id + ); + return Err(Error::InternalError( + "Instance has route_all_traffic enforced".into(), + )); + } location.route_all_traffic = route_all_traffic; location.save(&*DB_POOL).await?; From 3edbd69a4da60d65b264a490bf240ce451126342 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Thu, 20 Nov 2025 09:41:39 +0100 Subject: [PATCH 15/16] make PartialEq between proto::InstanceInfo and Instance backwards-compatible --- src-tauri/src/database/models/instance.rs | 32 ++++++++++++----------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src-tauri/src/database/models/instance.rs b/src-tauri/src/database/models/instance.rs index c2071162..0227afce 100644 --- a/src-tauri/src/database/models/instance.rs +++ b/src-tauri/src/database/models/instance.rs @@ -28,16 +28,7 @@ impl fmt::Display for Instance { impl From for Instance { fn from(instance_info: proto::InstanceInfo) -> Self { - // Ensure backwards compatibility - let client_traffic_policy = match ( - instance_info.client_traffic_policy, - #[allow(deprecated)] - instance_info.disable_all_traffic, - ) { - (Some(policy), _) => ClientTrafficPolicy::from(policy), - (None, true) => ClientTrafficPolicy::DisableAllTraffic, - (None, false) => ClientTrafficPolicy::None, - }; + let client_traffic_policy = ClientTrafficPolicy::from(&instance_info); Self { id: NoId, name: instance_info.name, @@ -149,11 +140,7 @@ impl Instance { // This compares proto::InstanceInfo, not to be confused with regular InstanceInfo defined below impl PartialEq for Instance { fn eq(&self, other: &proto::InstanceInfo) -> bool { - // TODO - let Some(other_policy) = other.client_traffic_policy else { - return false; - }; - let other_policy = ClientTrafficPolicy::from(other_policy); + let other_policy = ClientTrafficPolicy::from(other); self.name == other.name && self.uuid == other.id && self.url == other.url @@ -235,6 +222,21 @@ pub enum ClientTrafficPolicy { ForceAllTraffic = 2, } +/// Retrieves `ClientTrafficPolicy` from `proto::InstanceInfo` while ensuring backwards compatibility +impl From<&proto::InstanceInfo> for ClientTrafficPolicy { + fn from(instance: &proto::InstanceInfo) -> Self { + match ( + instance.client_traffic_policy, + #[allow(deprecated)] + instance.disable_all_traffic, + ) { + (Some(policy), _) => ClientTrafficPolicy::from(policy), + (None, true) => ClientTrafficPolicy::DisableAllTraffic, + (None, false) => ClientTrafficPolicy::None, + } + } +} + impl From for ClientTrafficPolicy { fn from(value: i32) -> Self { match value { From be3e3ff09f61a1148a38c25ec1914fed7fd09957 Mon Sep 17 00:00:00 2001 From: Jacek Chmielewski Date: Thu, 20 Nov 2025 14:02:05 +0100 Subject: [PATCH 16/16] remove debug log --- src-tauri/src/commands.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index 5dd5fe8f..be96139c 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -557,11 +557,6 @@ pub(crate) async fn locations_changed( .map(|config| config.clone().into_location(instance.id)) .collect(); - error!( - "Instance {} locations changed: {}", - instance.name, - db_locations != core_locations - ); Ok(db_locations != core_locations) }