From 2cd2568ae87da8b5d49f57e47f9b130e5073b365 Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Wed, 21 Jan 2026 18:56:00 +0100 Subject: [PATCH 01/10] Collect version data for proxy/gateway and save it in database --- .../defguard_common/src/db/models/gateway.rs | 2 + crates/defguard_common/src/db/models/proxy.rs | 1 + .../defguard_core/src/grpc/gateway/handler.rs | 8 +++ crates/defguard_core/src/handlers/mail.rs | 65 ++++++++++++------- crates/defguard_proxy_manager/src/lib.rs | 39 +++++++++-- ...0121122631_Add_component_versions.down.sql | 2 + ...260121122631_Add_component_versions.up.sql | 2 + 7 files changed, 92 insertions(+), 27 deletions(-) create mode 100644 migrations/20260121122631_Add_component_versions.down.sql create mode 100644 migrations/20260121122631_Add_component_versions.up.sql diff --git a/crates/defguard_common/src/db/models/gateway.rs b/crates/defguard_common/src/db/models/gateway.rs index f7f25189d7..ccd7edfce4 100644 --- a/crates/defguard_common/src/db/models/gateway.rs +++ b/crates/defguard_common/src/db/models/gateway.rs @@ -17,6 +17,7 @@ pub struct Gateway { pub disconnected_at: Option, pub has_certificate: bool, pub certificate_expiry: Option, + pub version: Option, } impl Gateway { @@ -43,6 +44,7 @@ impl Gateway { disconnected_at: None, has_certificate: false, certificate_expiry: None, + version: None, } } } diff --git a/crates/defguard_common/src/db/models/proxy.rs b/crates/defguard_common/src/db/models/proxy.rs index b95e126a1a..2dbaffb4f6 100644 --- a/crates/defguard_common/src/db/models/proxy.rs +++ b/crates/defguard_common/src/db/models/proxy.rs @@ -12,4 +12,5 @@ pub struct Proxy { pub public_address: String, pub connected_at: Option, pub disconnected_at: Option, + pub version: Option, } diff --git a/crates/defguard_core/src/grpc/gateway/handler.rs b/crates/defguard_core/src/grpc/gateway/handler.rs index ae2f6e86da..6e4d88874d 100644 --- a/crates/defguard_core/src/grpc/gateway/handler.rs +++ b/crates/defguard_core/src/grpc/gateway/handler.rs @@ -461,6 +461,14 @@ impl GatewayHandler { }; info!("Connected to Defguard Gateway {uri}"); + let maybe_info = defguard_version::ComponentInfo::from_metadata(response.metadata()); + let (version, _info) = defguard_version::get_tracing_variables(&maybe_info); + + if let Some(mut gateway) = Gateway::find_by_id(&self.pool, self.gateway.id).await? { + gateway.version = Some(version.to_string()); + gateway.save(&self.pool).await?; + } + let mut resp_stream = response.into_inner(); let mut config_sent = false; diff --git a/crates/defguard_core/src/handlers/mail.rs b/crates/defguard_core/src/handlers/mail.rs index 7f78913bec..38ce9d370f 100644 --- a/crates/defguard_core/src/handlers/mail.rs +++ b/crates/defguard_core/src/handlers/mail.rs @@ -14,7 +14,7 @@ use defguard_mail::{ templates::{self, SessionContext, TemplateError, TemplateLocation, support_data_mail}, }; use lettre::message::header::ContentType; -use reqwest::Url; +use reqwest::{Proxy, Url}; use serde_json::json; use tokio::{ fs::read_to_string, @@ -133,6 +133,21 @@ pub async fn send_support_data( let config = dump_config(&appstate.pool).await; let config = serde_json::to_string_pretty(&config).unwrap_or("Json formatting error".to_string()); + + let proxies: Vec> = + defguard_common::db::models::proxy::Proxy::all(&appstate.pool).await?; + + for proxy in proxies { + info!(proxy.version); + } + + let gateways: Vec> = + defguard_common::db::models::gateway::Gateway::all(&appstate.pool).await?; + + for gateway in gateways { + info!(gateway.version); + } + let config = Attachment { filename: format!("defguard-support-data-{}.json", Utc::now()), content: config.into(), @@ -153,27 +168,33 @@ pub async fn send_support_data( result_tx: Some(tx), }; let (to, subject) = (mail.to.clone(), mail.subject.clone()); - match appstate.mail_tx.send(mail) { - Ok(()) => match rx.recv().await { - Some(Ok(_)) => { - info!( - "User {} sent support mail to {SUPPORT_EMAIL_ADDRESS}", - session.user.username - ); - Ok(ApiResponse { - json: json!({}), - status: StatusCode::OK, - }) - } - Some(Err(err)) => Ok(internal_error(&to, &subject, &err)), - None => Ok(internal_error( - &to, - &subject, - &String::from("None received"), - )), - }, - Err(err) => Ok(internal_error(&to, &subject, &err)), - } + + info!("prepared support mail"); + Ok(ApiResponse { + json: json!({"debug": "Mail content logged, not sent"}), + status: StatusCode::OK, + }) + // match appstate.mail_tx.send(mail) {{} + // Ok(()) => match rx.recv().await { + // Some(Ok(_)) => { + // info!( + // "User {} sent support mail to {SUPPORT_EMAIL_ADDRESS}", + // session.user.username + // ); + // Ok(ApiResponse { + // json: json!({}), + // status: StatusCode::OK, + // }) + // } + // Some(Err(err)) => Ok(internal_error(&to, &subject, &err)), + // None => Ok(internal_error( + // &to, + // &subject, + // &String::from("None received"), + // )), + // }, + // Err(err) => Ok(internal_error(&to, &subject, &err)), + // } } pub fn send_new_device_added_email( diff --git a/crates/defguard_proxy_manager/src/lib.rs b/crates/defguard_proxy_manager/src/lib.rs index 6057dea7be..8ad500747c 100644 --- a/crates/defguard_proxy_manager/src/lib.rs +++ b/crates/defguard_proxy_manager/src/lib.rs @@ -45,7 +45,7 @@ use openidconnect::{AuthorizationCode, Nonce, Scope, core::CoreAuthenticationFlo use reqwest::Url; use secrecy::ExposeSecret; use semver::Version; -use sqlx::PgPool; +use sqlx::{PgPool, types::chrono::Utc}; use thiserror::Error; use tokio::{ sync::{ @@ -223,8 +223,13 @@ impl ProxyManager { if let Some(ref url) = server_config().proxy_url { debug!("Adding proxy from cli arg: {url}"); let url = Url::from_str(url)?; - let proxy = - ProxyServer::new(self.pool.clone(), url, &self.tx, Arc::clone(&self.router)); + let proxy = ProxyServer::new( + self.pool.clone(), + url, + &self.tx, + Arc::clone(&self.router), + None, + ); proxies.push(proxy); } @@ -291,10 +296,17 @@ struct ProxyServer { router: Arc>, /// Proxy server gRPC URL url: Url, + proxy_id: Option, } impl ProxyServer { - pub fn new(pool: PgPool, url: Url, tx: &ProxyTxSet, router: Arc>) -> Self { + pub fn new( + pool: PgPool, + url: Url, + tx: &ProxyTxSet, + router: Arc>, + proxy_id: Option, + ) -> Self { // Instantiate gRPC servers. let services = ProxyServices::new(&pool, tx); @@ -303,6 +315,7 @@ impl ProxyServer { services, router, url, + proxy_id, } } @@ -313,7 +326,8 @@ impl ProxyServer { router: Arc>, ) -> Result { let url = Url::from_str(&format!("http://{}:{}", proxy.address, proxy.port))?; - Ok(Self::new(pool, url, tx, router)) + let proxy_id = proxy.id; + Ok(Self::new(pool, url, tx, router, Some(proxy_id))) } fn endpoint(&self, scheme: Scheme) -> Result { @@ -403,6 +417,21 @@ impl ProxyServer { let (version, info) = get_tracing_variables(&maybe_info); let proxy_is_supported = is_proxy_version_supported(Some(&version)); + if let (Some(proxy_id)) = self.proxy_id { + if let Some(mut proxy) = Proxy::find_by_id(&self.pool, proxy_id).await? { + proxy.version = Some(version.to_string()); + proxy.connected_at = Some(Utc::now().naive_utc()); + proxy.save(&self.pool).await?; + } else { + warn!("Couldn't find proxy by id, URL: {} ", self.url); + } + } else { + warn!( + "Couldn't obtain proxy id, check if proxy exists in database. URL: {}", + self.url + ); + } + let span = tracing::info_span!("proxy_bidi", component = %DefguardComponent::Proxy, version = version.to_string(), info); let _guard = span.enter(); diff --git a/migrations/20260121122631_Add_component_versions.down.sql b/migrations/20260121122631_Add_component_versions.down.sql new file mode 100644 index 0000000000..d45223bf16 --- /dev/null +++ b/migrations/20260121122631_Add_component_versions.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE proxy DROP COLUMN version; +ALTER TABLE gateway DROP COLUMN version; diff --git a/migrations/20260121122631_Add_component_versions.up.sql b/migrations/20260121122631_Add_component_versions.up.sql new file mode 100644 index 0000000000..461804fd0f --- /dev/null +++ b/migrations/20260121122631_Add_component_versions.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE proxy ADD COLUMN version TEXT; +ALTER TABLE gateway ADD COLUMN version TEXT; From a54ed51ae30c394b8361a7603dfed5ef1877bb6d Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Fri, 23 Jan 2026 12:32:53 +0100 Subject: [PATCH 02/10] add component version data in mail --- crates/defguard_core/src/handlers/mail.rs | 91 +++++++++++++---------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/crates/defguard_core/src/handlers/mail.rs b/crates/defguard_core/src/handlers/mail.rs index 38ce9d370f..a636afb387 100644 --- a/crates/defguard_core/src/handlers/mail.rs +++ b/crates/defguard_core/src/handlers/mail.rs @@ -130,23 +130,43 @@ pub async fn send_support_data( "User {} sending support mail to {SUPPORT_EMAIL_ADDRESS}", session.user.username ); - let config = dump_config(&appstate.pool).await; - let config = - serde_json::to_string_pretty(&config).unwrap_or("Json formatting error".to_string()); let proxies: Vec> = defguard_common::db::models::proxy::Proxy::all(&appstate.pool).await?; - - for proxy in proxies { - info!(proxy.version); - } - let gateways: Vec> = defguard_common::db::models::gateway::Gateway::all(&appstate.pool).await?; - for gateway in gateways { - info!(gateway.version); - } + let components_info = json!({ + "proxies": proxies.iter().map(|p| json!({ + "id": p.id, + "name": p.name, + "version": p.version.as_deref().unwrap_or("unknown"), + "address": p.address, + "connected_at": p.connected_at + })).collect::>(), + "gateways": gateways.iter().map(|g| json!({ + "id": g.id, + "network_id": g.network_id, + "version": g.version.as_deref().unwrap_or("unknown"), + "url": g.url, + "has_certificate": g.has_certificate, + "hostname": g.hostname, + "connected_at": g.connected_at, + })).collect::>(), + }); + + let components_json = serde_json::to_string_pretty(&components_info) + .unwrap_or("Json formatting error".to_string()); + + let components = Attachment { + filename: format!("defguard-components-{}.json", Utc::now()), + content: components_json.into(), + content_type: ContentType::TEXT_PLAIN, + }; + + let config = dump_config(&appstate.pool).await; + let config = + serde_json::to_string_pretty(&config).unwrap_or("Json formatting error".to_string()); let config = Attachment { filename: format!("defguard-support-data-{}.json", Utc::now()), @@ -164,37 +184,32 @@ pub async fn send_support_data( to: SUPPORT_EMAIL_ADDRESS.to_string(), subject: SUPPORT_EMAIL_SUBJECT.to_string(), content: support_data_mail()?, - attachments: vec![config, logs], + attachments: vec![components, config, logs], result_tx: Some(tx), }; let (to, subject) = (mail.to.clone(), mail.subject.clone()); - info!("prepared support mail"); - Ok(ApiResponse { - json: json!({"debug": "Mail content logged, not sent"}), - status: StatusCode::OK, - }) - // match appstate.mail_tx.send(mail) {{} - // Ok(()) => match rx.recv().await { - // Some(Ok(_)) => { - // info!( - // "User {} sent support mail to {SUPPORT_EMAIL_ADDRESS}", - // session.user.username - // ); - // Ok(ApiResponse { - // json: json!({}), - // status: StatusCode::OK, - // }) - // } - // Some(Err(err)) => Ok(internal_error(&to, &subject, &err)), - // None => Ok(internal_error( - // &to, - // &subject, - // &String::from("None received"), - // )), - // }, - // Err(err) => Ok(internal_error(&to, &subject, &err)), - // } + match appstate.mail_tx.send(mail) { + Ok(()) => match rx.recv().await { + Some(Ok(_)) => { + info!( + "User {} sent support mail to {SUPPORT_EMAIL_ADDRESS}", + session.user.username + ); + Ok(ApiResponse { + json: json!({}), + status: StatusCode::OK, + }) + } + Some(Err(err)) => Ok(internal_error(&to, &subject, &err)), + None => Ok(internal_error( + &to, + &subject, + &String::from("None received"), + )), + }, + Err(err) => Ok(internal_error(&to, &subject, &err)), + } } pub fn send_new_device_added_email( From f1cfad47ef082775628f13a03c454a07fe191480 Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:22:19 +0100 Subject: [PATCH 03/10] add component info in "download support data" --- crates/defguard_core/src/support.rs | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/crates/defguard_core/src/support.rs b/crates/defguard_core/src/support.rs index f9d0a99d77..0b710cdd12 100644 --- a/crates/defguard_core/src/support.rs +++ b/crates/defguard_core/src/support.rs @@ -52,6 +52,39 @@ pub async fn dump_config(db: &PgPool) -> Value { }; let users_diagnostic_data = unwrap_json(User::all_without_sensitive_data(db).await); + let proxies = match defguard_common::db::models::proxy::Proxy::::all(db).await { + Ok(proxies) => json!( + proxies + .iter() + .map(|p| json!({ + "id": p.id, + "name": p.name, + "version": p.version.as_deref().unwrap_or("unknown"), + "address": p.address, + "connected_at": p.connected_at + })) + .collect::>() + ), + Err(err) => json!({"error": err.to_string()}), + }; + + let gateways = match defguard_common::db::models::gateway::Gateway::::all(db).await { + Ok(gateways) => json!( + gateways + .iter() + .map(|g| json!({ + "id": g.id, + "network_id": g.network_id, + "version": g.version.as_deref().unwrap_or("unknown"), + "url": g.url, + "hostname": g.hostname, + "connected_at": g.connected_at, + })) + .collect::>() + ), + Err(err) => json!({"error": err.to_string()}), + }; + json!({ "settings": settings, "networks": networks, @@ -59,5 +92,7 @@ pub async fn dump_config(db: &PgPool) -> Value { "devices": devices, "users": users_diagnostic_data, "config": server_config(), + "proxies": proxies, + "gateways": gateways, }) } From 290d43ebea6925f36e27aa0951e8f68fdef18109 Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:23:59 +0100 Subject: [PATCH 04/10] remove unused import --- crates/defguard_core/src/handlers/mail.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/defguard_core/src/handlers/mail.rs b/crates/defguard_core/src/handlers/mail.rs index a636afb387..1b38484f36 100644 --- a/crates/defguard_core/src/handlers/mail.rs +++ b/crates/defguard_core/src/handlers/mail.rs @@ -14,7 +14,7 @@ use defguard_mail::{ templates::{self, SessionContext, TemplateError, TemplateLocation, support_data_mail}, }; use lettre::message::header::ContentType; -use reqwest::{Proxy, Url}; +use reqwest::Url; use serde_json::json; use tokio::{ fs::read_to_string, From 9697ee42afcb8873311ffa4f26219cb28cfe00a9 Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:26:17 +0100 Subject: [PATCH 05/10] rename migration --- ...sql => 20260121122631_[2.0.0]_Add_component_versions.down.sql} | 0 ...p.sql => 20260121122631_[2.0.0]_Add_component_versions.up.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename migrations/{20260121122631_Add_component_versions.down.sql => 20260121122631_[2.0.0]_Add_component_versions.down.sql} (100%) rename migrations/{20260121122631_Add_component_versions.up.sql => 20260121122631_[2.0.0]_Add_component_versions.up.sql} (100%) diff --git a/migrations/20260121122631_Add_component_versions.down.sql b/migrations/20260121122631_[2.0.0]_Add_component_versions.down.sql similarity index 100% rename from migrations/20260121122631_Add_component_versions.down.sql rename to migrations/20260121122631_[2.0.0]_Add_component_versions.down.sql diff --git a/migrations/20260121122631_Add_component_versions.up.sql b/migrations/20260121122631_[2.0.0]_Add_component_versions.up.sql similarity index 100% rename from migrations/20260121122631_Add_component_versions.up.sql rename to migrations/20260121122631_[2.0.0]_Add_component_versions.up.sql From 4d71439eaaa052de46927dda9657ccae1d3218ec Mon Sep 17 00:00:00 2001 From: Aleksander <170264518+t-aleksander@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:37:19 +0100 Subject: [PATCH 06/10] fix conflicts related to proxy wizard and multiproxy --- crates/defguard_proxy_manager/src/lib.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/defguard_proxy_manager/src/lib.rs b/crates/defguard_proxy_manager/src/lib.rs index b6e97a9962..13547b1ca3 100644 --- a/crates/defguard_proxy_manager/src/lib.rs +++ b/crates/defguard_proxy_manager/src/lib.rs @@ -192,6 +192,7 @@ impl ProxyManager { // Currently we can't shutdown this proxy since it was started via CLI arguments (no ID in DB) // This should be removed when we do a proper import of old proxies Arc::new(Mutex::new(None)), + None, ); proxies.push(proxy); } @@ -339,7 +340,7 @@ impl ProxyServer { pool, url, tx, - router, + remote_mfa_responses, sessions, shutdown_signal, Some(proxy_id), @@ -423,7 +424,7 @@ impl ProxyServer { let (version, info) = get_tracing_variables(&maybe_info); let proxy_is_supported = is_proxy_version_supported(Some(&version)); - if let (Some(proxy_id)) = self.proxy_id { + if let Some(proxy_id) = self.proxy_id { if let Some(mut proxy) = Proxy::find_by_id(&self.pool, proxy_id).await? { proxy.version = Some(version.to_string()); proxy.connected_at = Some(Utc::now().naive_utc()); From 0917585e457a9676e7fb3888bc96dd8f47891ee1 Mon Sep 17 00:00:00 2001 From: Aleksander <170264518+t-aleksander@users.noreply.github.com> Date: Tue, 27 Jan 2026 11:38:49 +0100 Subject: [PATCH 07/10] fix proto --- proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proto b/proto index ec48aca943..d01bfabe4e 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit ec48aca9438e7cdcb4fcdb01ce6dcb5dac7f8dd3 +Subproject commit d01bfabe4e4f7f419de3682020e708f5861530da From 4937d3f719a48aeda84427d7e8f4d4c1af57817d Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:09:30 +0100 Subject: [PATCH 08/10] typo --- crates/defguard_core/src/handlers/mail.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/defguard_core/src/handlers/mail.rs b/crates/defguard_core/src/handlers/mail.rs index 1b38484f36..473ef65154 100644 --- a/crates/defguard_core/src/handlers/mail.rs +++ b/crates/defguard_core/src/handlers/mail.rs @@ -155,8 +155,8 @@ pub async fn send_support_data( })).collect::>(), }); - let components_json = serde_json::to_string_pretty(&components_info) - .unwrap_or("Json formatting error".to_string()); + let components_json = + serde_json::to_string(&components_info).unwrap_or("JSON formatting error".to_string()); let components = Attachment { filename: format!("defguard-components-{}.json", Utc::now()), @@ -166,7 +166,7 @@ pub async fn send_support_data( let config = dump_config(&appstate.pool).await; let config = - serde_json::to_string_pretty(&config).unwrap_or("Json formatting error".to_string()); + serde_json::to_string_pretty(&config).unwrap_or("JSON formatting error".to_string()); let config = Attachment { filename: format!("defguard-support-data-{}.json", Utc::now()), From adaa1a124bed31ca46428756f0a6845dd420cf70 Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:19:04 +0100 Subject: [PATCH 09/10] sqlx prepare --- ...084479e4aee1d1b2098133ff953c1188346c7cb252e.json} | 7 ++++--- ...e9b574ebdcb7ef45d2f40b8c785353b2cb51c9ee3e8.json} | 12 +++++++++--- ...e7a1f04daff875a766935e93b53df8bbf2be28421a9.json} | 12 +++++++++--- ...354ee7caf1a9fd548f64e067ef2d8ec9b1f1d3ea8fb.json} | 5 +++-- ...db86c75b7ccad57d9cc9caa41502cbe85c6eafb087e.json} | 10 ++++++++-- ...6dcdc0ea2080a4c27137278b2fb761d3b279b69f9db.json} | 10 ++++++++-- ...b23ef96d82a34d3bfa4364cbe9b8368e71445bc20877.json | 6 ++++++ ...6f0772612388c1e322dbc7ce93d92251b3a82caabef.json} | 7 ++++--- ...69f6bddf997807b66e0b532da747b146513c34e15c5c.json | 6 ++++++ ...ae6ba4c284b051bd034a869e38581a0db0c613037ab.json} | 5 +++-- 10 files changed, 60 insertions(+), 20 deletions(-) rename .sqlx/{query-5acdf80bf0c44933e3d74e2c86f56f89123c84fc2351ca92ab1e17525c1097ef.json => query-16802280f46083a640c0f084479e4aee1d1b2098133ff953c1188346c7cb252e.json} (65%) rename .sqlx/{query-ee66d9ce46f283c78402efcd27385327ebeecbefa97c0af2273f7147dab098be.json => query-2ce4e93d1b2c0fd0c8783e9b574ebdcb7ef45d2f40b8c785353b2cb51c9ee3e8.json} (79%) rename .sqlx/{query-b48534fac2ea138d617f3653168c692e787fd1187d3dd2b8c128134c3d83cf92.json => query-4d03f4506afc44d5467c9e7a1f04daff875a766935e93b53df8bbf2be28421a9.json} (80%) rename .sqlx/{query-cef21a0fb292e51a461fc1bc44ec967087f477add7724e08b45ca60baabd2705.json => query-5117dfaead4847c2432f4354ee7caf1a9fd548f64e067ef2d8ec9b1f1d3ea8fb.json} (64%) rename .sqlx/{query-9c70a4374828099fa19032f4394ce3d23b6d3b80d820d022502916dd8adc0262.json => query-671c3ef062fa5c901d26adb86c75b7ccad57d9cc9caa41502cbe85c6eafb087e.json} (83%) rename .sqlx/{query-a0818064c80739debc8a8788dfa8c23bff66bc40eafba7400a7d7db49ab36e2e.json => query-9655c2e6a8f749fe1ea966dcdc0ea2080a4c27137278b2fb761d3b279b69f9db.json} (83%) rename .sqlx/{query-95cc72beeb57a84ed791fcc6873b1033ff78a115ae0a3f4882c28b3becb3d0a5.json => query-cd6c70e9b46c5cdce053d6f0772612388c1e322dbc7ce93d92251b3a82caabef.json} (70%) rename .sqlx/{query-d890aeacd36cbc31d5042a66cf8724f23803f5a9d400d81f39d8d6eacadb7565.json => query-ebb3c3e89e4d1469d6e54ae6ba4c284b051bd034a869e38581a0db0c613037ab.json} (67%) diff --git a/.sqlx/query-5acdf80bf0c44933e3d74e2c86f56f89123c84fc2351ca92ab1e17525c1097ef.json b/.sqlx/query-16802280f46083a640c0f084479e4aee1d1b2098133ff953c1188346c7cb252e.json similarity index 65% rename from .sqlx/query-5acdf80bf0c44933e3d74e2c86f56f89123c84fc2351ca92ab1e17525c1097ef.json rename to .sqlx/query-16802280f46083a640c0f084479e4aee1d1b2098133ff953c1188346c7cb252e.json index b52e770941..67293eca96 100644 --- a/.sqlx/query-5acdf80bf0c44933e3d74e2c86f56f89123c84fc2351ca92ab1e17525c1097ef.json +++ b/.sqlx/query-16802280f46083a640c0f084479e4aee1d1b2098133ff953c1188346c7cb252e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE \"gateway\" SET \"network_id\" = $2,\"url\" = $3,\"hostname\" = $4,\"connected_at\" = $5,\"disconnected_at\" = $6,\"has_certificate\" = $7,\"certificate_expiry\" = $8 WHERE id = $1", + "query": "UPDATE \"gateway\" SET \"network_id\" = $2,\"url\" = $3,\"hostname\" = $4,\"connected_at\" = $5,\"disconnected_at\" = $6,\"has_certificate\" = $7,\"certificate_expiry\" = $8,\"version\" = $9 WHERE id = $1", "describe": { "columns": [], "parameters": { @@ -12,10 +12,11 @@ "Timestamp", "Timestamp", "Bool", - "Timestamp" + "Timestamp", + "Text" ] }, "nullable": [] }, - "hash": "5acdf80bf0c44933e3d74e2c86f56f89123c84fc2351ca92ab1e17525c1097ef" + "hash": "16802280f46083a640c0f084479e4aee1d1b2098133ff953c1188346c7cb252e" } diff --git a/.sqlx/query-ee66d9ce46f283c78402efcd27385327ebeecbefa97c0af2273f7147dab098be.json b/.sqlx/query-2ce4e93d1b2c0fd0c8783e9b574ebdcb7ef45d2f40b8c785353b2cb51c9ee3e8.json similarity index 79% rename from .sqlx/query-ee66d9ce46f283c78402efcd27385327ebeecbefa97c0af2273f7147dab098be.json rename to .sqlx/query-2ce4e93d1b2c0fd0c8783e9b574ebdcb7ef45d2f40b8c785353b2cb51c9ee3e8.json index 5f78596bc5..9c785ac3e0 100644 --- a/.sqlx/query-ee66d9ce46f283c78402efcd27385327ebeecbefa97c0af2273f7147dab098be.json +++ b/.sqlx/query-2ce4e93d1b2c0fd0c8783e9b574ebdcb7ef45d2f40b8c785353b2cb51c9ee3e8.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, \"name\",\"address\",\"port\",\"public_address\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\" FROM \"proxy\" WHERE id = $1", + "query": "SELECT id, \"name\",\"address\",\"port\",\"public_address\",\"connected_at\",\"disconnected_at\",\"version\",\"has_certificate\",\"certificate_expiry\" FROM \"proxy\" WHERE id = $1", "describe": { "columns": [ { @@ -40,11 +40,16 @@ }, { "ordinal": 7, + "name": "version", + "type_info": "Text" + }, + { + "ordinal": 8, "name": "has_certificate", "type_info": "Bool" }, { - "ordinal": 8, + "ordinal": 9, "name": "certificate_expiry", "type_info": "Timestamp" } @@ -62,9 +67,10 @@ false, true, true, + true, false, true ] }, - "hash": "ee66d9ce46f283c78402efcd27385327ebeecbefa97c0af2273f7147dab098be" + "hash": "2ce4e93d1b2c0fd0c8783e9b574ebdcb7ef45d2f40b8c785353b2cb51c9ee3e8" } diff --git a/.sqlx/query-b48534fac2ea138d617f3653168c692e787fd1187d3dd2b8c128134c3d83cf92.json b/.sqlx/query-4d03f4506afc44d5467c9e7a1f04daff875a766935e93b53df8bbf2be28421a9.json similarity index 80% rename from .sqlx/query-b48534fac2ea138d617f3653168c692e787fd1187d3dd2b8c128134c3d83cf92.json rename to .sqlx/query-4d03f4506afc44d5467c9e7a1f04daff875a766935e93b53df8bbf2be28421a9.json index 15e64e3afb..a62f6fc534 100644 --- a/.sqlx/query-b48534fac2ea138d617f3653168c692e787fd1187d3dd2b8c128134c3d83cf92.json +++ b/.sqlx/query-4d03f4506afc44d5467c9e7a1f04daff875a766935e93b53df8bbf2be28421a9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, \"name\",\"address\",\"port\",\"public_address\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\" FROM \"proxy\"", + "query": "SELECT id, \"name\",\"address\",\"port\",\"public_address\",\"connected_at\",\"disconnected_at\",\"version\",\"has_certificate\",\"certificate_expiry\" FROM \"proxy\"", "describe": { "columns": [ { @@ -40,11 +40,16 @@ }, { "ordinal": 7, + "name": "version", + "type_info": "Text" + }, + { + "ordinal": 8, "name": "has_certificate", "type_info": "Bool" }, { - "ordinal": 8, + "ordinal": 9, "name": "certificate_expiry", "type_info": "Timestamp" } @@ -60,9 +65,10 @@ false, true, true, + true, false, true ] }, - "hash": "b48534fac2ea138d617f3653168c692e787fd1187d3dd2b8c128134c3d83cf92" + "hash": "4d03f4506afc44d5467c9e7a1f04daff875a766935e93b53df8bbf2be28421a9" } diff --git a/.sqlx/query-cef21a0fb292e51a461fc1bc44ec967087f477add7724e08b45ca60baabd2705.json b/.sqlx/query-5117dfaead4847c2432f4354ee7caf1a9fd548f64e067ef2d8ec9b1f1d3ea8fb.json similarity index 64% rename from .sqlx/query-cef21a0fb292e51a461fc1bc44ec967087f477add7724e08b45ca60baabd2705.json rename to .sqlx/query-5117dfaead4847c2432f4354ee7caf1a9fd548f64e067ef2d8ec9b1f1d3ea8fb.json index e3f41ec873..145f25c369 100644 --- a/.sqlx/query-cef21a0fb292e51a461fc1bc44ec967087f477add7724e08b45ca60baabd2705.json +++ b/.sqlx/query-5117dfaead4847c2432f4354ee7caf1a9fd548f64e067ef2d8ec9b1f1d3ea8fb.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO \"proxy\" (\"name\",\"address\",\"port\",\"public_address\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\") VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING id", + "query": "INSERT INTO \"proxy\" (\"name\",\"address\",\"port\",\"public_address\",\"connected_at\",\"disconnected_at\",\"version\",\"has_certificate\",\"certificate_expiry\") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9) RETURNING id", "describe": { "columns": [ { @@ -17,6 +17,7 @@ "Text", "Timestamp", "Timestamp", + "Text", "Bool", "Timestamp" ] @@ -25,5 +26,5 @@ false ] }, - "hash": "cef21a0fb292e51a461fc1bc44ec967087f477add7724e08b45ca60baabd2705" + "hash": "5117dfaead4847c2432f4354ee7caf1a9fd548f64e067ef2d8ec9b1f1d3ea8fb" } diff --git a/.sqlx/query-9c70a4374828099fa19032f4394ce3d23b6d3b80d820d022502916dd8adc0262.json b/.sqlx/query-671c3ef062fa5c901d26adb86c75b7ccad57d9cc9caa41502cbe85c6eafb087e.json similarity index 83% rename from .sqlx/query-9c70a4374828099fa19032f4394ce3d23b6d3b80d820d022502916dd8adc0262.json rename to .sqlx/query-671c3ef062fa5c901d26adb86c75b7ccad57d9cc9caa41502cbe85c6eafb087e.json index ed24b8d62a..f673e531f4 100644 --- a/.sqlx/query-9c70a4374828099fa19032f4394ce3d23b6d3b80d820d022502916dd8adc0262.json +++ b/.sqlx/query-671c3ef062fa5c901d26adb86c75b7ccad57d9cc9caa41502cbe85c6eafb087e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, \"network_id\",\"url\",\"hostname\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\" FROM \"gateway\" WHERE id = $1", + "query": "SELECT id, \"network_id\",\"url\",\"hostname\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\",\"version\" FROM \"gateway\" WHERE id = $1", "describe": { "columns": [ { @@ -42,6 +42,11 @@ "ordinal": 7, "name": "certificate_expiry", "type_info": "Timestamp" + }, + { + "ordinal": 8, + "name": "version", + "type_info": "Text" } ], "parameters": { @@ -57,8 +62,9 @@ true, true, false, + true, true ] }, - "hash": "9c70a4374828099fa19032f4394ce3d23b6d3b80d820d022502916dd8adc0262" + "hash": "671c3ef062fa5c901d26adb86c75b7ccad57d9cc9caa41502cbe85c6eafb087e" } diff --git a/.sqlx/query-a0818064c80739debc8a8788dfa8c23bff66bc40eafba7400a7d7db49ab36e2e.json b/.sqlx/query-9655c2e6a8f749fe1ea966dcdc0ea2080a4c27137278b2fb761d3b279b69f9db.json similarity index 83% rename from .sqlx/query-a0818064c80739debc8a8788dfa8c23bff66bc40eafba7400a7d7db49ab36e2e.json rename to .sqlx/query-9655c2e6a8f749fe1ea966dcdc0ea2080a4c27137278b2fb761d3b279b69f9db.json index c321d2e9e7..53deb53137 100644 --- a/.sqlx/query-a0818064c80739debc8a8788dfa8c23bff66bc40eafba7400a7d7db49ab36e2e.json +++ b/.sqlx/query-9655c2e6a8f749fe1ea966dcdc0ea2080a4c27137278b2fb761d3b279b69f9db.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, \"network_id\",\"url\",\"hostname\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\" FROM \"gateway\"", + "query": "SELECT id, \"network_id\",\"url\",\"hostname\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\",\"version\" FROM \"gateway\"", "describe": { "columns": [ { @@ -42,6 +42,11 @@ "ordinal": 7, "name": "certificate_expiry", "type_info": "Timestamp" + }, + { + "ordinal": 8, + "name": "version", + "type_info": "Text" } ], "parameters": { @@ -55,8 +60,9 @@ true, true, false, + true, true ] }, - "hash": "a0818064c80739debc8a8788dfa8c23bff66bc40eafba7400a7d7db49ab36e2e" + "hash": "9655c2e6a8f749fe1ea966dcdc0ea2080a4c27137278b2fb761d3b279b69f9db" } diff --git a/.sqlx/query-a41787c8c8307414165ab23ef96d82a34d3bfa4364cbe9b8368e71445bc20877.json b/.sqlx/query-a41787c8c8307414165ab23ef96d82a34d3bfa4364cbe9b8368e71445bc20877.json index c6ce1e21b0..2408b9888f 100644 --- a/.sqlx/query-a41787c8c8307414165ab23ef96d82a34d3bfa4364cbe9b8368e71445bc20877.json +++ b/.sqlx/query-a41787c8c8307414165ab23ef96d82a34d3bfa4364cbe9b8368e71445bc20877.json @@ -47,6 +47,11 @@ "ordinal": 8, "name": "certificate_expiry", "type_info": "Timestamp" + }, + { + "ordinal": 9, + "name": "version", + "type_info": "Text" } ], "parameters": { @@ -64,6 +69,7 @@ true, true, false, + true, true ] }, diff --git a/.sqlx/query-95cc72beeb57a84ed791fcc6873b1033ff78a115ae0a3f4882c28b3becb3d0a5.json b/.sqlx/query-cd6c70e9b46c5cdce053d6f0772612388c1e322dbc7ce93d92251b3a82caabef.json similarity index 70% rename from .sqlx/query-95cc72beeb57a84ed791fcc6873b1033ff78a115ae0a3f4882c28b3becb3d0a5.json rename to .sqlx/query-cd6c70e9b46c5cdce053d6f0772612388c1e322dbc7ce93d92251b3a82caabef.json index b45febc008..cb69aae3b7 100644 --- a/.sqlx/query-95cc72beeb57a84ed791fcc6873b1033ff78a115ae0a3f4882c28b3becb3d0a5.json +++ b/.sqlx/query-cd6c70e9b46c5cdce053d6f0772612388c1e322dbc7ce93d92251b3a82caabef.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO \"gateway\" (\"network_id\",\"url\",\"hostname\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\") VALUES ($1,$2,$3,$4,$5,$6,$7) RETURNING id", + "query": "INSERT INTO \"gateway\" (\"network_id\",\"url\",\"hostname\",\"connected_at\",\"disconnected_at\",\"has_certificate\",\"certificate_expiry\",\"version\") VALUES ($1,$2,$3,$4,$5,$6,$7,$8) RETURNING id", "describe": { "columns": [ { @@ -17,12 +17,13 @@ "Timestamp", "Timestamp", "Bool", - "Timestamp" + "Timestamp", + "Text" ] }, "nullable": [ false ] }, - "hash": "95cc72beeb57a84ed791fcc6873b1033ff78a115ae0a3f4882c28b3becb3d0a5" + "hash": "cd6c70e9b46c5cdce053d6f0772612388c1e322dbc7ce93d92251b3a82caabef" } diff --git a/.sqlx/query-d10c9a7b0b391aeb8b4869f6bddf997807b66e0b532da747b146513c34e15c5c.json b/.sqlx/query-d10c9a7b0b391aeb8b4869f6bddf997807b66e0b532da747b146513c34e15c5c.json index 6b597e4488..f007870a8d 100644 --- a/.sqlx/query-d10c9a7b0b391aeb8b4869f6bddf997807b66e0b532da747b146513c34e15c5c.json +++ b/.sqlx/query-d10c9a7b0b391aeb8b4869f6bddf997807b66e0b532da747b146513c34e15c5c.json @@ -42,6 +42,11 @@ "ordinal": 7, "name": "certificate_expiry", "type_info": "Timestamp" + }, + { + "ordinal": 8, + "name": "version", + "type_info": "Text" } ], "parameters": { @@ -57,6 +62,7 @@ true, true, false, + true, true ] }, diff --git a/.sqlx/query-d890aeacd36cbc31d5042a66cf8724f23803f5a9d400d81f39d8d6eacadb7565.json b/.sqlx/query-ebb3c3e89e4d1469d6e54ae6ba4c284b051bd034a869e38581a0db0c613037ab.json similarity index 67% rename from .sqlx/query-d890aeacd36cbc31d5042a66cf8724f23803f5a9d400d81f39d8d6eacadb7565.json rename to .sqlx/query-ebb3c3e89e4d1469d6e54ae6ba4c284b051bd034a869e38581a0db0c613037ab.json index 475daea818..6cbaef5106 100644 --- a/.sqlx/query-d890aeacd36cbc31d5042a66cf8724f23803f5a9d400d81f39d8d6eacadb7565.json +++ b/.sqlx/query-ebb3c3e89e4d1469d6e54ae6ba4c284b051bd034a869e38581a0db0c613037ab.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE \"proxy\" SET \"name\" = $2,\"address\" = $3,\"port\" = $4,\"public_address\" = $5,\"connected_at\" = $6,\"disconnected_at\" = $7,\"has_certificate\" = $8,\"certificate_expiry\" = $9 WHERE id = $1", + "query": "UPDATE \"proxy\" SET \"name\" = $2,\"address\" = $3,\"port\" = $4,\"public_address\" = $5,\"connected_at\" = $6,\"disconnected_at\" = $7,\"version\" = $8,\"has_certificate\" = $9,\"certificate_expiry\" = $10 WHERE id = $1", "describe": { "columns": [], "parameters": { @@ -12,11 +12,12 @@ "Text", "Timestamp", "Timestamp", + "Text", "Bool", "Timestamp" ] }, "nullable": [] }, - "hash": "d890aeacd36cbc31d5042a66cf8724f23803f5a9d400d81f39d8d6eacadb7565" + "hash": "ebb3c3e89e4d1469d6e54ae6ba4c284b051bd034a869e38581a0db0c613037ab" } From 26c2ee9c0d8ef7d64c1e0608953c7ef15af13ec9 Mon Sep 17 00:00:00 2001 From: jakub-tldr <78603704+jakub-tldr@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:33:56 +0100 Subject: [PATCH 10/10] remove typing --- crates/defguard_core/src/handlers/mail.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/defguard_core/src/handlers/mail.rs b/crates/defguard_core/src/handlers/mail.rs index 473ef65154..922d1642c4 100644 --- a/crates/defguard_core/src/handlers/mail.rs +++ b/crates/defguard_core/src/handlers/mail.rs @@ -131,10 +131,8 @@ pub async fn send_support_data( session.user.username ); - let proxies: Vec> = - defguard_common::db::models::proxy::Proxy::all(&appstate.pool).await?; - let gateways: Vec> = - defguard_common::db::models::gateway::Gateway::all(&appstate.pool).await?; + let proxies = defguard_common::db::models::proxy::Proxy::all(&appstate.pool).await?; + let gateways = defguard_common::db::models::gateway::Gateway::all(&appstate.pool).await?; let components_info = json!({ "proxies": proxies.iter().map(|p| json!({