diff --git a/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java b/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java index 073b9d5789..df124f0503 100644 --- a/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java +++ b/agents/drivers/mongodb/src/main/java/com/dbx/agent/mongodb/MongoAgent.java @@ -257,7 +257,7 @@ public final class MongoAgent { if (authSource != null && !authSource.isBlank()) { return authSource; } - return defaultString(stringOrNull(connObj, "database"), "admin"); + return "admin"; } private static String urlParam(String urlParams, String key) { diff --git a/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java b/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java index 03c32f4042..b6a3a14e4a 100644 --- a/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java +++ b/agents/drivers/mongodb/src/test/java/com/dbx/agent/mongodb/MongoAgentTest.java @@ -135,11 +135,11 @@ class MongoAgentTest { } @Test - void fallsBackToDefaultDatabaseWhenAuthSourceIsMissing() { + void fallsBackToAdminWhenAuthSourceIsMissing() { JsonObject connection = new JsonObject(); connection.addProperty("database", "gray_lite_twin_fat"); - assertEquals("gray_lite_twin_fat", MongoAgent.authenticationDatabase(connection)); + assertEquals("admin", MongoAgent.authenticationDatabase(connection)); } // ─── TLS: configureBuilder JSON parsing ─── diff --git a/crates/dbx-core/src/models/connection.rs b/crates/dbx-core/src/models/connection.rs index b66ec2cdda..ffdb4ea96e 100644 --- a/crates/dbx-core/src/models/connection.rs +++ b/crates/dbx-core/src/models/connection.rs @@ -1080,7 +1080,7 @@ impl ConnectionConfig { } DatabaseType::Databend => normalize_bare_mysql_url_params(value), DatabaseType::Postgres | DatabaseType::Redshift => normalize_postgres_url_params(value, self.ssl), - DatabaseType::MongoDb => normalize_mongo_url_params(value, self.ssl), + DatabaseType::MongoDb => normalize_mongo_url_params(value, self.ssl, !self.username.trim().is_empty()), _ => value.trim_start_matches('?').to_string(), } } @@ -1170,7 +1170,7 @@ fn normalize_mysql_url_params(value: &str, force_tls: bool, accept_invalid_certs parts.join("&") } -fn normalize_mongo_url_params(value: &str, force_tls: bool) -> String { +fn normalize_mongo_url_params(value: &str, force_tls: bool, default_auth_source: bool) -> String { let value = value.trim_start_matches('?'); let mut parts: Vec = value.split('&').filter(|part| !part.is_empty()).map(str::to_string).collect(); @@ -1179,6 +1179,10 @@ fn normalize_mongo_url_params(value: &str, force_tls: bool) -> String { parts.insert(0, "tls=true".to_string()); } + if default_auth_source && !parts.iter().any(|part| url_param_key_is(part, "authSource")) { + parts.push("authSource=admin".to_string()); + } + parts.join("&") } @@ -2137,10 +2141,32 @@ mod tests { } #[test] - fn mongodb_form_url_without_params_does_not_force_topology_or_auth() { + fn mongodb_form_url_without_params_defaults_auth_source_to_admin() { let config = mongodb_config("root", "secret", Some("admin")); - assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin"); + assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin?authSource=admin"); + } + + #[test] + fn mongodb_form_url_default_database_does_not_change_auth_source() { + let config = mongodb_config("root", "secret", Some("app")); + + assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/app?authSource=admin"); + } + + #[test] + fn mongodb_form_url_without_username_does_not_default_auth_source() { + let config = mongodb_config("", "", Some("app")); + + assert_eq!(config.connection_url(), "mongodb://10.1.2.3:17000/app"); + } + + #[test] + fn mongodb_form_url_preserves_explicit_auth_source() { + let mut config = mongodb_config("root", "secret", Some("app")); + config.url_params = Some("authSource=app".to_string()); + + assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/app?authSource=app"); } #[test] @@ -2228,8 +2254,8 @@ mod tests { let mut config = mongodb_config("root", "secret", Some("admin")); config.ssl = true; - assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin?tls=true"); - assert_eq!(config.redacted_connection_url(), "mongodb://10.1.2.3:17000/admin?tls=true"); + assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin?tls=true&authSource=admin"); + assert_eq!(config.redacted_connection_url(), "mongodb://10.1.2.3:17000/admin?tls=true&authSource=admin"); } #[test]