{"record":{"id":"25aca9049c9888b9","repo":"m1k1o/neko","slug":"new-user-is-created-on-first-login-in-multiuser-mo","errorCode":null,"errorMessage":"new user is created on first login in multiuser mode","messagePattern":"new user is created on first login in multiuser mode","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/internal/member/multiuser/provider.go","lineNumber":61,"sourceCode":"\t\t\tprofile.Name = username\n\t\t}\n\t\treturn id, profile, nil\n\t}\n\n\t// if logged in as user\n\tif provider.config.UserPassword == password {\n\t\tprofile := provider.config.UserProfile\n\t\tif profile.Name == \"\" {\n\t\t\tprofile.Name = username\n\t\t}\n\t\treturn id, profile, nil\n\t}\n\n\treturn \"\", types.MemberProfile{}, types.ErrMemberInvalidPassword\n}\n\nfunc (provider *MemberProviderCtx) Insert(username string, password string, profile types.MemberProfile) (string, error) {\n\treturn \"\", errors.New(\"new user is created on first login in multiuser mode\")\n}\n\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","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/m1k1o/neko/blob/b0f01cedea68893e85a3fd852c0521238c285695/server/internal/member/multiuser/provider.go#L43-L79","documentation":"In multiuser mode members are defined statically in the config file, and the provider's Authenticate path creates users only on first login from that config. Insert() is therefore an unsupported operation by design: programmatically creating a new member is refused because new users are supposed to appear solely through first login against config-defined credentials.","triggerScenarios":"Any call to the member-management Insert API (e.g. an admin users-create endpoint) while the server runs with member provider 'multiuser'.","commonSituations":"An operator builds admin tooling or scripts against the users API assuming a dynamic member store, but the deployment config uses multiuser mode where members come from config (MULTIUSER_USER/Pass entries); API calls to create users always fail with this message.","solutions":["Add the new user directly in the server config (multiuser user entries) and restart/reload the server; first login then creates the member.","Switch the deployment to a dynamic member provider if runtime user creation is required.","Adjust client tooling to treat multiuser mode as read-only and skip Insert calls (see provider.SelectAll/UpdateProfile which are no-ops)."],"exampleFix":"// before: trying to create a user via API in multiuser mode\nid, err := memberClient.Insert(username, password, profile)\n\n// after: add user to config instead\n// config: NEKO_MEMBERS_MULTIUSER_USER_LIST='user1:pass1,user2:pass2'\n// then let the user log in; Insert is unsupported:\nif memberProvider == \"multiuser\" {\n    return errors.New(\"add user to config; Insert is unsupported in multiuser mode\")\n}","handlingStrategy":"validation","validationCode":"if memberProvider == \"multiuser\" {\n    return errors.New(\"user creation unsupported in multiuser mode; add user to config\")\n}\nid, err := memberClient.Insert(username, password, profile)","typeGuard":"func isModeUnsupportedErr(err error) bool {\n    return err != nil && strings.Contains(err.Error(), \"created on first login\")\n}","tryCatchPattern":"id, err := memberClient.Insert(username, password, profile)\nif err != nil {\n    if isModeUnsupportedErr(err) {\n        log.Printf(\"add user to multiuser config instead: %v\", err)\n    }\n    return err\n}","preventionTips":["Check the configured member provider before calling user-management APIs.","Treat multiuser and noauth providers as read-only (config-driven) stores.","Document that in multiuser mode users appear only on first login against config credentials.","Disable create/delete UI actions in admin panels when the provider is not dynamic."],"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"}