{"record":{"id":"826dfd111c6835bd","repo":"moghtech/komodo","slug":"cannot-insert-service-type-configuration-as-additi","errorCode":null,"errorMessage":"Cannot insert Service type configuration as additional login method.","messagePattern":"Cannot insert Service type configuration as additional login method\\.","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"client/core/rs/src/entities/user.rs","lineNumber":228,"sourceCode":"  }\n}\n\n#[typeshare]\n#[derive(Debug, Clone, Default, Serialize, Deserialize)]\n#[cfg_attr(feature = \"utoipa\", derive(utoipa::ToSchema))]\npub struct LinkedLoginsMap(HashMap<UserConfigVariant, UserConfig>);\n\nimpl LinkedLoginsMap {\n  pub fn get(\n    &self,\n    variant: UserConfigVariant,\n  ) -> Option<&UserConfig> {\n    self.0.get(&variant)\n  }\n\n  pub fn update(&mut self, login: UserConfig) -> anyhow::Result<()> {\n    if let UserConfig::Service { .. } = &login {\n      return Err(anyhow!(\n        \"Cannot insert Service type configuration as additional login method.\"\n      ));\n    }\n    self.0.insert((&login).into(), login);\n    Ok(())\n  }\n\n  pub fn remove(&mut self, variant: UserConfigVariant) {\n    self.0.remove(&variant);\n  }\n}\n\n#[typeshare]\n#[derive(Debug, Clone, Default, Serialize, Deserialize)]\n#[cfg_attr(feature = \"utoipa\", derive(utoipa::ToSchema))]\npub struct UserTotpConfig {\n  /// TOTP shared secret, encrypted\n  pub secret: String,","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/moghtech/komodo/blob/780ac68b992094a9fccd5fffb760e0c84fd3c3d1/client/core/rs/src/entities/user.rs#L210-L246","documentation":"UserConfig's update method inserts an additional login method for a user, but a Service-type configuration (API/service identity) cannot be added as an extra login method — only real user login variants are allowed. Inserting a UserConfig::Service returns this error and the map is left unmodified.","triggerScenarios":"Calling user_config.update(UserConfig::Service { .. }) to add a Service config as an additional login method for a user.","commonSituations":"Misunderstanding which UserConfig variants are user login methods vs service identities; copying config-building code that constructs Service variants and passing it into update instead of a Password/OAuth variant.","solutions":["Pass a non-Service UserConfig variant (e.g. Password or OAuth) to update","Handle Service configurations through the dedicated service-identity APIs instead of user login methods","Guard the call site: match on the variant and skip/handle Service before calling update"],"exampleFix":"// before\nuser_config.update(UserConfig::Service { .. })?;\n// after\nmatch &login {\n    UserConfig::Service { .. } => { /* handle via service config API */ }\n    _ => user_config.update(login.clone())?,\n}","handlingStrategy":"type-guard","validationCode":"if matches!(login, UserConfig::Service { .. }) {\n    return Err(anyhow!(\"Service config cannot be an additional login method\"));\n}","typeGuard":"fn is_user_login(cfg: &UserConfig) -> bool { !matches!(cfg, UserConfig::Service { .. }) }","tryCatchPattern":null,"preventionTips":["Remember Service configs are service identities, not user login methods","Pattern-match on UserConfig variants before mutating user login config"],"tags":["auth","user-config","validation"],"backgroundTag":"unsupported-operation","analyzedSha":"780ac68b992094a9fccd5fffb760e0c84fd3c3d1","analyzedAt":"2026-09-08T10:02:44.861Z","contentChangedAt":"2026-09-08T10:02:44.861Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}