{"record":{"id":"1f2b2fdd14f77ec2","repo":"tinyhumansai/openhuman","slug":"http-cred-name-cannot-be-empty","errorCode":null,"errorMessage":"http_cred name cannot be empty","messagePattern":"http_cred name cannot be empty","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/openhuman/security/credentials/http_creds.rs","lineNumber":288,"sourceCode":"            target: \"credentials\",\n            \"[credentials] http_cred get hit name={key} scheme={}\",\n            scheme.as_str()\n        );\n        Ok(Some(HttpCredential {\n            name: key,\n            scheme,\n            header_name: rec.header_name.clone(),\n            username: rec.username.clone(),\n            secret,\n            created_at: parse_dt(&rec.created_at),\n            updated_at: parse_dt(&rec.updated_at),\n        }))\n    }\n\n    /// Insert or replace a credential, encrypting its secret at rest.\n    pub fn upsert(&self, cred: &HttpCredential) -> Result<()> {\n        let key = Self::normalize_name(&cred.name);\n        anyhow::ensure!(!key.is_empty(), \"http_cred name cannot be empty\");\n\n        let mut persisted = self.read_persisted()?;\n        let encrypted = self\n            .secret_store\n            .encrypt(&cred.secret)\n            .context(\"failed to encrypt http_cred secret\")?;\n\n        let created_at = persisted\n            .credentials\n            .get(&key)\n            .map(|r| r.created_at.clone())\n            .unwrap_or_else(|| cred.created_at.to_rfc3339());\n\n        persisted.credentials.insert(\n            key.clone(),\n            PersistedHttpCredential {\n                scheme: cred.scheme.as_str().to_string(),\n                header_name: cred.header_name.clone(),","sourceCodeStart":270,"sourceCodeEnd":306,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/security/credentials/http_creds.rs#L270-L306","documentation":"An http_cred was passed to `upsert` with an empty name. The name is the credential's lookup key, so an empty string cannot identify it; the guard fires before any encryption-at-rest or store write happens.","triggerScenarios":"Thrown at src/openhuman/security/credentials/http_creds.rs:288 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Provide a non-empty credential name when creating/updating","Trim and validate the name at the call site before upsert"],"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"}