{"record":{"id":"e960e0986b32e97a","repo":"m1k1o/neko","slug":"cannot-delete-user-in-multiuser-mode","errorCode":null,"errorMessage":"cannot delete user in multiuser mode","messagePattern":"cannot delete user in multiuser mode","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/internal/member/multiuser/provider.go","lineNumber":81,"sourceCode":"\nfunc (provider *MemberProviderCtx) UpdateProfile(id string, profile types.MemberProfile) error {\n\treturn nil\n}\n\nfunc (provider *MemberProviderCtx) UpdatePassword(id string, password string) error {\n\treturn errors.New(\"password can only be modified in config while in multiuser mode\")\n}\n\nfunc (provider *MemberProviderCtx) Select(id string) (types.MemberProfile, error) {\n\treturn types.MemberProfile{}, errors.New(\"cannot select user in multiuser mode\")\n}\n\nfunc (provider *MemberProviderCtx) SelectAll(limit int, offset int) (map[string]types.MemberProfile, error) {\n\treturn map[string]types.MemberProfile{}, nil\n}\n\nfunc (provider *MemberProviderCtx) Delete(id string) error {\n\treturn errors.New(\"cannot delete user in multiuser mode\")\n}\n","sourceCodeStart":63,"sourceCodeEnd":83,"githubUrl":"https://github.com/m1k1o/neko/blob/b0f01cedea68893e85a3fd852c0521238c285695/server/internal/member/multiuser/provider.go#L63-L83","documentation":"In multiuser mode members are static config-defined entries, so deleting a member at runtime is unsupported. Delete() is a stub that always returns this error; user removal must be done by editing the config.","triggerScenarios":"Any call to the member Delete API (e.g. admin user-removal endpoint) while the member provider is 'multiuser'.","commonSituations":"An operator tries to revoke a user via the admin API; in multiuser deployments the user must be removed from the config instead, so the API call always fails.","solutions":["Remove the user's entry from the multiuser config and restart/reload the server.","Invalidate the user's active sessions after removing them from config, since existing sessions may persist.","Switch to a dynamic member provider if runtime user deletion is required."],"exampleFix":"// before\nerr := memberClient.Delete(id)\n\n// after: remove user from config, then reload\n// NEKO_MEMBERS_MULTIUSER_USER_LIST='otheruser:pass'\nif memberProvider == \"multiuser\" {\n    return errors.New(\"remove user from multiuser config instead\")\n}","handlingStrategy":"validation","validationCode":"if memberProvider == \"multiuser\" {\n    return errors.New(\"user deletion unsupported in multiuser mode; remove from config\")\n}\nerr := memberClient.Delete(id)","typeGuard":"func isDeleteUnsupportedErr(err error) bool {\n    return err != nil && strings.Contains(err.Error(), \"cannot delete user\")\n}","tryCatchPattern":"err := memberClient.Delete(id)\nif err != nil {\n    if isDeleteUnsupportedErr(err) {\n        log.Printf(\"remove user from multiuser config instead: %v\", err)\n    }\n    return err\n}","preventionTips":["Gate delete-user actions on the member provider being dynamic.","Remove users by editing multiuser config, then restart/reload the server.","Invalidate active sessions after removing a user from config.","Use a dynamic member provider if runtime user lifecycle is a requirement."],"tags":["multiuser","members","unsupported-operation","config"],"backgroundTag":"unsupported-operation-mode","analyzedSha":"b0f01cedea68893e85a3fd852c0521238c285695","analyzedAt":"2026-09-01T10:35:56.638Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}