From 84ba47b8523721b0116f4049d5489e5f5e154426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Ciarcin=CC=81ski?= Date: Fri, 5 Sep 2025 14:04:42 +0200 Subject: [PATCH] Fix for UUID being nil --- Cargo.lock | 8 ++++---- crates/defguard_core/src/db/models/settings.rs | 16 +++++++++++----- crates/defguard_core/src/handlers/settings.rs | 8 +++----- crates/defguard_core/src/templates.rs | 5 +++-- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6db3cd59b8..62e3c0370f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -575,9 +575,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.35" +version = "1.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" +checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" dependencies = [ "find-msvc-tools", "jobserver", @@ -1545,9 +1545,9 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" [[package]] name = "fixedbitset" diff --git a/crates/defguard_core/src/db/models/settings.rs b/crates/defguard_core/src/db/models/settings.rs index cd4c28124a..d74ebd49ee 100644 --- a/crates/defguard_core/src/db/models/settings.rs +++ b/crates/defguard_core/src/db/models/settings.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use sqlx::{PgExecutor, PgPool, Type, query, query_as}; use struct_patch::Patch; use thiserror::Error; +use uuid::Uuid; use crate::{enterprise::ldap::sync::SyncStatus, global_value, secret::SecretStringWrapper}; @@ -89,7 +90,7 @@ pub struct Settings { pub enrollment_use_welcome_message_as_email: bool, // Instance UUID needed for desktop client #[serde(skip)] - pub uuid: uuid::Uuid, + pub uuid: Uuid, // LDAP pub ldap_url: Option, pub ldap_bind_username: Option, @@ -145,8 +146,8 @@ impl Settings { ldap_group_search_base, ldap_user_search_base, ldap_user_obj_class, \ ldap_group_obj_class, ldap_username_attr, ldap_groupname_attr, \ ldap_group_member_attr, ldap_member_attr, openid_create_account, \ - license, gateway_disconnect_notifications_enabled, ldap_use_starttls, ldap_tls_verify_cert, \ - gateway_disconnect_notifications_inactivity_threshold, \ + license, gateway_disconnect_notifications_enabled, ldap_use_starttls, \ + ldap_tls_verify_cert, gateway_disconnect_notifications_inactivity_threshold, \ gateway_disconnect_notifications_reconnect_notification_enabled, \ ldap_sync_status \"ldap_sync_status: SyncStatus\", \ ldap_enabled, ldap_sync_enabled, ldap_is_authoritative, \ @@ -160,9 +161,14 @@ impl Settings { } /// Checks if given settings are correct - pub fn validate(&self) -> Result<(), SettingsValidationError> { + pub fn validate(&mut self) -> Result<(), SettingsValidationError> { debug!("Validating settings: {self:?}"); - // check if gateway disconnect notifications can be enabled, since it requires SMTP to be configured + if self.uuid.is_nil() { + warn!("Detected empty UUID in settings. Generating a new one."); + self.uuid = Uuid::new_v4(); + } + // Check if gateway disconnect notifications can be enabled, since it requires SMTP to be + // configured. if self.gateway_disconnect_notifications_enabled && !self.smtp_configured() { warn!("Cannot enable gateway disconnect notifications. SMTP is not configured."); return Err(SettingsValidationError::CannotEnableGatewayNotifications); diff --git a/crates/defguard_core/src/handlers/settings.rs b/crates/defguard_core/src/handlers/settings.rs index 77e4d754de..ee7485bca9 100644 --- a/crates/defguard_core/src/handlers/settings.rs +++ b/crates/defguard_core/src/handlers/settings.rs @@ -39,10 +39,7 @@ pub async fn get_settings(_admin: AdminRole, State(appstate): State) - }); } debug!("Retrieved settings"); - Ok(ApiResponse { - json: json!({}), - status: StatusCode::OK, - }) + Ok(ApiResponse::default()) } pub async fn update_settings( @@ -50,7 +47,7 @@ pub async fn update_settings( session: SessionInfo, context: ApiRequestContext, State(appstate): State, - Json(data): Json, + Json(mut data): Json, ) -> ApiResult { debug!("User {} updating settings", session.user.username); @@ -58,6 +55,7 @@ pub async fn update_settings( let before = Settings::get_current_settings(); update_cached_license(data.license.as_deref())?; + data.uuid = before.uuid; data.validate()?; // clone for event let after = data.clone(); diff --git a/crates/defguard_core/src/templates.rs b/crates/defguard_core/src/templates.rs index 8ac28541e6..0c945ffe47 100644 --- a/crates/defguard_core/src/templates.rs +++ b/crates/defguard_core/src/templates.rs @@ -36,6 +36,7 @@ static MAIL_PASSWORD_RESET_START: &str = include_str!("../templates/mail_password_reset_start.tera"); static MAIL_PASSWORD_RESET_SUCCESS: &str = include_str!("../templates/mail_password_reset_success.tera"); +static MAIL_DATETIME_FORMAT: &str = "%A, %B %d, %Y at %r"; #[derive(Error, Debug)] pub enum TemplateError { @@ -78,7 +79,7 @@ fn get_base_tera( let now = Utc::now(); let current_year = format!("{:04}", now.year()); context.insert("current_year", ¤t_year); - context.insert("date_now", &now.format("%A, %B %d, %Y at %r").to_string()); + context.insert("date_now", &now.format(MAIL_DATETIME_FORMAT).to_string()); if let Some(current_session) = session { let device_info = ¤t_session.device_info; @@ -239,7 +240,7 @@ pub fn new_device_login_mail( tera.add_raw_template("mail_base", MAIL_BASE)?; context.insert( "date_now", - &created.format("%A, %B %d, %Y at %r").to_string(), + &created.format(MAIL_DATETIME_FORMAT).to_string(), ); tera.add_raw_template("mail_new_device_login", MAIL_NEW_DEVICE_LOGIN)?;