{"record":{"id":"19cf5ca2790d4d9d","repo":"t8y2/dbx","slug":"invalid-tdengine-username","errorCode":null,"errorMessage":"invalid TDengine username","messagePattern":"invalid TDengine username","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/tdengine/src/config.rs","lineNumber":59,"sourceCode":"        .and_then(|mut segments| segments.find(|segment| !segment.is_empty()))\n        .map(|segment| percent_decode_str(segment).decode_utf8_lossy().into_owned())\n        .unwrap_or_default();\n    Ok(BuiltDsn { value: url.into(), database })\n}\n\nfn build_from_fields(params: &ConnectParams) -> Result<Url> {\n    let scheme = if params.ssl { \"wss\" } else { \"ws\" };\n    let host = if params.host.trim().is_empty() { DEFAULT_HOST } else { params.host.trim() };\n    let port = if params.port == 0 { DEFAULT_PORT } else { params.port };\n    let username = if params.username.is_empty() { DEFAULT_USER } else { &params.username };\n    let password = if params.password.is_empty() { DEFAULT_PASSWORD } else { &params.password };\n    let mut url = Url::parse(&format!(\"{scheme}://{DEFAULT_HOST}:{port}/\"))?;\n    if let Ok(address) = host.parse::<IpAddr>() {\n        url.set_ip_host(address).map_err(|_| anyhow::anyhow!(\"invalid TDengine host\"))?;\n    } else {\n        url.set_host(Some(host)).map_err(|_| anyhow::anyhow!(\"invalid TDengine host\"))?;\n    }\n    url.set_username(username).map_err(|_| anyhow::anyhow!(\"invalid TDengine username\"))?;\n    url.set_password(Some(password)).map_err(|_| anyhow::anyhow!(\"invalid TDengine password\"))?;\n    if !params.database.trim().is_empty() {\n        url.set_path(&format!(\"/{}\", params.database.trim()));\n    }\n    Ok(url)\n}\n\nfn apply_connection_fields(url: &mut Url, params: &ConnectParams) -> Result<()> {\n    if url.username().is_empty() {\n        let username = if params.username.is_empty() { DEFAULT_USER } else { &params.username };\n        url.set_username(username).map_err(|_| anyhow::anyhow!(\"invalid TDengine username\"))?;\n    }\n    if url.password().is_none() {\n        let password = if params.password.is_empty() { DEFAULT_PASSWORD } else { &params.password };\n        url.set_password(Some(password)).map_err(|_| anyhow::anyhow!(\"invalid TDengine password\"))?;\n    }\n    if url.path().trim_matches('/').is_empty() && !params.database.trim().is_empty() {\n        url.set_path(&format!(\"/{}\", params.database.trim()));","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/tdengine/src/config.rs#L41-L77","documentation":"In build_from_fields, after the host is applied the driver sets the username on the parsed Url. If url::Url::set_username rejects the value (username containing characters illegal in a URL userinfo component, such as ':' or control characters), the driver maps it to 'invalid TDengine username'. Percent-encodable values are normally accepted, so this fires only for structurally invalid values.","triggerScenarios":"Calling build_dsn with a ConnectParams.username that Url::set_username cannot apply — typically a username containing a ':' (which separates userinfo from password), or raw non-encodable control characters.","commonSituations":"Users putting 'user:password' in the username field instead of splitting them into username/password, or copying credentials with hidden whitespace/control characters from a terminal or config file.","solutions":["Move the password portion out of the username field into params.password.","Ensure the username is a bare identifier (TDengine default is 'root').","Trim whitespace and strip control characters from the username before building ConnectParams."],"exampleFix":"// before\nConnectParams { username: \"root:taosdata\".into(), password: \"\".into(), ..Default::default() }\n// after\nConnectParams { username: \"root\".into(), password: \"taosdata\".into(), ..Default::default() }","handlingStrategy":"validation","validationCode":"// Rust\nfn is_valid_username(u: &str) -> bool {\n    !u.is_empty() && !u.contains(':') && u.chars().all(|c| !c.is_control())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep username and password in separate config fields; never embed ':' in the username.","Trim credentials read from environment variables or files.","Omit username to let the driver apply DEFAULT_USER (root)."],"tags":["tdengine","url-parsing","credentials"],"backgroundTag":"invalid-url-credentials","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}