{"record":{"id":"57e8a3303b1b6e10","repo":"tinyhumansai/openhuman","slug":"provider-name-cannot-be-empty","errorCode":null,"errorMessage":"Provider name cannot be empty","messagePattern":"Provider name cannot be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/security/credentials/core.rs","lineNumber":114,"sourceCode":"    ) -> Result<Option<String>> {\n        let profile = self.get_profile(provider, profile_override)?;\n        let Some(profile) = profile else {\n            return Ok(None);\n        };\n\n        let credential = match profile.kind {\n            AuthProfileKind::Token => profile.token,\n            AuthProfileKind::OAuth => profile.token_set.map(|t| t.access_token),\n        };\n\n        Ok(credential.filter(|t| !t.trim().is_empty()))\n    }\n}\n\npub fn normalize_provider(provider: &str) -> Result<String> {\n    let normalized = provider.trim().to_ascii_lowercase();\n    if normalized.is_empty() {\n        anyhow::bail!(\"Provider name cannot be empty\");\n    }\n    Ok(normalized)\n}\n\npub fn state_dir_from_config(config: &Config) -> PathBuf {\n    config\n        .config_path\n        .parent()\n        .map_or_else(|| PathBuf::from(\".\"), PathBuf::from)\n}\n\npub fn default_profile_id(provider: &str) -> String {\n    profile_id(provider, DEFAULT_PROFILE_NAME)\n}\n\nfn resolve_requested_profile_id(provider: &str, requested: &str) -> String {\n    if requested.contains(':') {\n        requested.to_string()","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/security/credentials/core.rs#L96-L132","documentation":"normalize_provider rejects a provider string that is empty or whitespace-only after trimming. It is a shared input-validation guard used before any profile lookup, activation, or removal, so an unpopulated provider argument never reaches the store and cannot match or mutate an arbitrary profile.","triggerScenarios":"Thrown at src/openhuman/security/credentials/core.rs:114 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Supply a non-empty provider name (e.g. \"github\", \"openai\").","Check the upstream source of the provider value for an unset or blank variable/config field.","Default the provider explicitly at the call site when it is optional."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}