m1k1o/neko · error
cannot delete user in multiuser mode
Error message
cannot delete user in multiuser mode
What it means
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.
Source
Thrown at server/internal/member/multiuser/provider.go:81
func (provider *MemberProviderCtx) UpdateProfile(id string, profile types.MemberProfile) error {
return nil
}
func (provider *MemberProviderCtx) UpdatePassword(id string, password string) error {
return errors.New("password can only be modified in config while in multiuser mode")
}
func (provider *MemberProviderCtx) Select(id string) (types.MemberProfile, error) {
return types.MemberProfile{}, errors.New("cannot select user in multiuser mode")
}
func (provider *MemberProviderCtx) SelectAll(limit int, offset int) (map[string]types.MemberProfile, error) {
return map[string]types.MemberProfile{}, nil
}
func (provider *MemberProviderCtx) Delete(id string) error {
return errors.New("cannot delete user in multiuser mode")
}
View on GitHub (pinned to b0f01cedea)
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.
Example fix
// before
err := memberClient.Delete(id)
// after: remove user from config, then reload
// NEKO_MEMBERS_MULTIUSER_USER_LIST='otheruser:pass'
if memberProvider == "multiuser" {
return errors.New("remove user from multiuser config instead")
} Defensive patterns
Strategy: validation
Validate before calling
if memberProvider == "multiuser" {
return errors.New("user deletion unsupported in multiuser mode; remove from config")
}
err := memberClient.Delete(id) Type guard
func isDeleteUnsupportedErr(err error) bool {
return err != nil && strings.Contains(err.Error(), "cannot delete user")
} Try / catch
err := memberClient.Delete(id)
if err != nil {
if isDeleteUnsupportedErr(err) {
log.Printf("remove user from multiuser config instead: %v", err)
}
return err
} Prevention
- 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.
When it happens
Trigger: Any call to the member Delete API (e.g. admin user-removal endpoint) while the member provider is 'multiuser'.
Common situations: 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.
Related errors
- new user is created on first login in multiuser mode
- password can only be modified in config while in multiuser m
- cannot select user in multiuser mode
- new user is created on first login in noauth mode
- noauth mode does not have password
AI-assisted analysis of m1k1o/neko@b0f01cedea (2026-09-01).
Data as JSON: /api/errors/e960e0986b32e97a.
Report an issue: GitHub.