fix: address mongodb params review
This commit is contained in:
parent
8c1a75d3d5
commit
47f507f9ba
|
|
@ -234,34 +234,12 @@ impl ConnectionConfig {
|
|||
format!("ssl-mode=disabled&{}", filtered.join("&"))
|
||||
}
|
||||
}
|
||||
DatabaseType::Postgres | DatabaseType::Redshift => value.trim_start_matches('?').to_string(),
|
||||
DatabaseType::MongoDb => self.normalized_mongodb_url_params(value),
|
||||
DatabaseType::Postgres | DatabaseType::Redshift | DatabaseType::MongoDb => {
|
||||
value.trim_start_matches('?').to_string()
|
||||
}
|
||||
_ => value.trim_start_matches('?').to_string(),
|
||||
}
|
||||
}
|
||||
|
||||
fn normalized_mongodb_url_params(&self, value: &str) -> String {
|
||||
let mut params: Vec<String> = value
|
||||
.trim_start_matches('?')
|
||||
.split('&')
|
||||
.filter(|param| !param.trim().is_empty())
|
||||
.map(str::to_string)
|
||||
.collect();
|
||||
|
||||
push_query_param_if_missing(&mut params, "directConnection", "directConnection=true".to_string());
|
||||
|
||||
if !self.username.is_empty() {
|
||||
let auth_source = self.database.as_deref().filter(|db| !db.is_empty()).unwrap_or("admin");
|
||||
push_query_param_if_missing(
|
||||
&mut params,
|
||||
"authSource",
|
||||
format!("authSource={}", encode_url_part(auth_source)),
|
||||
);
|
||||
push_query_param_if_missing(&mut params, "authMechanism", "authMechanism=SCRAM-SHA-1".to_string());
|
||||
}
|
||||
|
||||
params.join("&")
|
||||
}
|
||||
}
|
||||
|
||||
fn encode_url_part(value: &str) -> String {
|
||||
|
|
@ -276,15 +254,6 @@ fn bracket_ipv6(host: &str) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
fn push_query_param_if_missing(params: &mut Vec<String>, key: &str, value: String) {
|
||||
if !params
|
||||
.iter()
|
||||
.any(|param| param.split_once('=').map(|(name, _)| name).unwrap_or(param.as_str()).eq_ignore_ascii_case(key))
|
||||
{
|
||||
params.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{ConnectionConfig, DatabaseType};
|
||||
|
|
@ -364,23 +333,20 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn mongodb_form_url_adds_legacy_direct_connection_params() {
|
||||
fn mongodb_form_url_without_params_does_not_force_topology_or_auth() {
|
||||
let config = mongodb_config("root", "secret", Some("admin"));
|
||||
|
||||
assert_eq!(
|
||||
config.connection_url(),
|
||||
"mongodb://root:secret@10.1.2.3:17000/admin?directConnection=true&authSource=admin&authMechanism=SCRAM-SHA-1"
|
||||
);
|
||||
assert_eq!(config.connection_url(), "mongodb://root:secret@10.1.2.3:17000/admin");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mongodb_form_url_respects_custom_auth_params() {
|
||||
fn mongodb_form_url_appends_custom_params() {
|
||||
let mut config = mongodb_config("root", "secret", Some("app"));
|
||||
config.url_params = Some("authSource=admin&authMechanism=SCRAM-SHA-256&retryWrites=false".to_string());
|
||||
config.url_params = Some("?authSource=admin&authMechanism=SCRAM-SHA-1&directConnection=true".to_string());
|
||||
|
||||
assert_eq!(
|
||||
config.connection_url(),
|
||||
"mongodb://root:secret@10.1.2.3:17000/app?authSource=admin&authMechanism=SCRAM-SHA-256&retryWrites=false&directConnection=true"
|
||||
"mongodb://root:secret@10.1.2.3:17000/app?authSource=admin&authMechanism=SCRAM-SHA-1&directConnection=true"
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -422,15 +388,13 @@ mod tests {
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn redacted_mongodb_url_keeps_compatibility_params_without_credentials() {
|
||||
let config = mongodb_config("root", "secret", Some("admin"));
|
||||
fn redacted_mongodb_url_keeps_custom_params_without_credentials() {
|
||||
let mut config = mongodb_config("root", "secret", Some("admin"));
|
||||
config.url_params = Some("authSource=admin&authMechanism=SCRAM-SHA-1".to_string());
|
||||
|
||||
let url = config.redacted_connection_url();
|
||||
|
||||
assert_eq!(
|
||||
url,
|
||||
"mongodb://10.1.2.3:17000/admin?directConnection=true&authSource=admin&authMechanism=SCRAM-SHA-1"
|
||||
);
|
||||
assert_eq!(url, "mongodb://10.1.2.3:17000/admin?authSource=admin&authMechanism=SCRAM-SHA-1");
|
||||
assert!(!url.contains("root"));
|
||||
assert!(!url.contains("secret"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ export default {
|
|||
sshExposeLan: "Expose tunnel to LAN",
|
||||
dmCompatHint: "Requires DM PG compatibility mode (set COMPATIBLE_MODE=7 in dm.ini and restart)",
|
||||
mongoLegacyHint:
|
||||
"MongoDB form connections add directConnection automatically; authenticated connections default to the selected database as auth source (admin when blank) and SCRAM-SHA-1, which you can override here.",
|
||||
"For older MongoDB servers, enter authSource=admin&authMechanism=SCRAM-SHA-1 here; add directConnection=true only when needed for direct standalone connections.",
|
||||
compatible: "Compatible",
|
||||
mainstream: "Popular",
|
||||
color: "Color",
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ export default {
|
|||
sshExposeLan: "允许局域网访问隧道",
|
||||
dmCompatHint: "需要开启达梦 PG 兼容模式(dm.ini 中设置 COMPATIBLE_MODE=7 并重启服务)",
|
||||
mongoLegacyHint:
|
||||
"MongoDB 表单连接会自动补充 directConnection;带用户名时默认使用当前数据库认证源(留空为 admin)和 SCRAM-SHA-1,可在此覆盖。",
|
||||
"连接旧版 MongoDB 时,可在此填写 authSource=admin&authMechanism=SCRAM-SHA-1;直连单节点时可按需追加 directConnection=true。",
|
||||
compatible: "兼容",
|
||||
mainstream: "主流",
|
||||
color: "颜色",
|
||||
|
|
|
|||
Loading…
Reference in New Issue