From 6140c1e765f7db1b8d522f962fc16d9e7ff51667 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 16 Aug 2024 22:44:58 -0400 Subject: [PATCH 1/8] Save initial signup information for users to aid in spam prevention --- models/user/user.go | 19 +++++++++++++++++++ routers/web/auth/auth.go | 2 ++ services/context/access_log.go | 1 + 3 files changed, 22 insertions(+) diff --git a/models/user/user.go b/models/user/user.go index 2a3c1833b91e8..37f4e75536113 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -120,6 +120,11 @@ type User struct { // (ex: in private Gitea instances user won't be allowed to see even organizations/repositories that are set as public) IsRestricted bool `xorm:"NOT NULL DEFAULT false"` + // Store the initial registration of the user, to aid in spam prevention + // Ensure that one IP isn't creating many accounts (following mediawiki approach) + InitialIP string `xorm:"-"` + InitialUserAgent string `xorm:"-"` + AllowGitHook bool AllowImportLocal bool // Allow migrate repository by local path AllowCreateOrganization bool `xorm:"DEFAULT true"` @@ -745,6 +750,20 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa return err } + // insert initial IP and UserAgent + if err = SetUserSetting(ctx, u.ID, "initial_ip", u.InitialIP); err != nil { + return err + } + + // trim user agent string to a reasonable length, if necessary + user_agent := strings.TrimSpace(u.InitialUserAgent) + if len(user_agent) > 255 { + user_agent = user_agent[:255] + } + if err = SetUserSetting(ctx, u.ID, "initial_user_agent", user_agent); err != nil { + return err + } + // insert email address if err := db.Insert(ctx, &EmailAddress{ UID: u.ID, diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 15a80bc104659..8fe640083170c 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -541,6 +541,8 @@ func createAndHandleCreatedUser(ctx *context.Context, tpl base.TplName, form any // createUserInContext creates a user and handles errors within a given context. // Optionally a template can be specified. func createUserInContext(ctx *context.Context, tpl base.TplName, form any, u *user_model.User, overwrites *user_model.CreateUserOverwriteOptions, gothUser *goth.User, allowLink bool) (ok bool) { + u.InitialIP = ctx.RemoteAddr() + u.InitialUserAgent = ctx.Req.UserAgent() if err := user_model.CreateUser(ctx, u, overwrites); err != nil { if allowLink && (user_model.IsErrUserAlreadyExist(err) || user_model.IsErrEmailAlreadyUsed(err)) { if setting.OAuth2Client.AccountLinking == setting.OAuth2AccountLinkingAuto { diff --git a/services/context/access_log.go b/services/context/access_log.go index 0926748ac540f..2f55838120786 100644 --- a/services/context/access_log.go +++ b/services/context/access_log.go @@ -86,6 +86,7 @@ func AccessLogger() func(http.Handler) http.Handler { ResponseWriter: rw, Ctx: map[string]any{ "RemoteAddr": req.RemoteAddr, + "UserAgent": req.UserAgent, "RemoteHost": reqHost, "Req": req, }, From b8e36bc53777a370ac3ddceffae6cc2458dbee79 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 16 Aug 2024 23:08:39 -0400 Subject: [PATCH 2/8] fix lint --- models/user/user.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index 37f4e75536113..1aaa1660e3a4e 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -756,11 +756,11 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa } // trim user agent string to a reasonable length, if necessary - user_agent := strings.TrimSpace(u.InitialUserAgent) - if len(user_agent) > 255 { - user_agent = user_agent[:255] + userAgent := strings.TrimSpace(u.InitialUserAgent) + if len(userAgent) > 255 { + userAgent = userAgent[:255] } - if err = SetUserSetting(ctx, u.ID, "initial_user_agent", user_agent); err != nil { + if err = SetUserSetting(ctx, u.ID, "initial_user_agent", userAgent); err != nil { return err } From 081d32c652d52db4d2fb1f094a26820a8c999a2a Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sat, 17 Aug 2024 18:35:31 -0400 Subject: [PATCH 3/8] add setting --- custom/conf/app.example.ini | 3 +++ models/user/user.go | 24 +++++++++++++----------- modules/setting/security.go | 3 +++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index adec5aff36558..2215adde463cc 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -507,6 +507,9 @@ INTERNAL_TOKEN = ;; stemming from cached/logged plain-text API tokens. ;; In future releases, this will become the default behavior ;DISABLE_QUERY_AUTH_TOKEN = false +;; +;; On user registration, record the IP address and user agent of the user to help identify potential abuse. +;; RECORD_INITIAL_IP = false ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/models/user/user.go b/models/user/user.go index 1aaa1660e3a4e..e79279bf330f7 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -750,18 +750,20 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa return err } - // insert initial IP and UserAgent - if err = SetUserSetting(ctx, u.ID, "initial_ip", u.InitialIP); err != nil { - return err - } + if setting.RecordInitialIP { + // insert initial IP and UserAgent + if err = SetUserSetting(ctx, u.ID, "initial_ip", u.InitialIP); err != nil { + return err + } - // trim user agent string to a reasonable length, if necessary - userAgent := strings.TrimSpace(u.InitialUserAgent) - if len(userAgent) > 255 { - userAgent = userAgent[:255] - } - if err = SetUserSetting(ctx, u.ID, "initial_user_agent", userAgent); err != nil { - return err + // trim user agent string to a reasonable length, if necessary + userAgent := strings.TrimSpace(u.InitialUserAgent) + if len(userAgent) > 255 { + userAgent = userAgent[:255] + } + if err = SetUserSetting(ctx, u.ID, "initial_user_agent", userAgent); err != nil { + return err + } } // insert email address diff --git a/modules/setting/security.go b/modules/setting/security.go index 3d7b1f9ce7759..f4993bd36b435 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -37,6 +37,7 @@ var ( DisableQueryAuthToken bool CSRFCookieName = "_csrf" CSRFCookieHTTPOnly = true + RecordInitialIP = false ) // loadSecret load the secret from ini by uriKey or verbatimKey, only one of them could be set @@ -164,6 +165,8 @@ func loadSecurityFrom(rootCfg ConfigProvider) { // TODO: default value should be true in future releases DisableQueryAuthToken = sec.Key("DISABLE_QUERY_AUTH_TOKEN").MustBool(false) + RecordInitialIP = sec.Key("RECORD_INITIAL_IP").MustBool(false) + // warn if the setting is set to false explicitly if sectionHasDisableQueryAuthToken && !DisableQueryAuthToken { log.Warn("Enabling Query API Auth tokens is not recommended. DISABLE_QUERY_AUTH_TOKEN will default to true in gitea 1.23 and will be removed in gitea 1.24.") From e798b2d8c7d90579ceae4be27b69f2e0b39d83ad Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 19 Aug 2024 16:22:29 -0400 Subject: [PATCH 4/8] Update setting name Use consts Cleanup code meant for different branch --- custom/conf/app.example.ini | 2 +- models/user/setting_keys.go | 4 ++++ models/user/user.go | 6 +++--- modules/setting/security.go | 4 ++-- services/context/access_log.go | 1 - 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini index 2215adde463cc..de0779ebaa6b5 100644 --- a/custom/conf/app.example.ini +++ b/custom/conf/app.example.ini @@ -509,7 +509,7 @@ INTERNAL_TOKEN = ;DISABLE_QUERY_AUTH_TOKEN = false ;; ;; On user registration, record the IP address and user agent of the user to help identify potential abuse. -;; RECORD_INITIAL_IP = false +;; RECORD_USER_SIGNUP_METADATA = false ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/models/user/setting_keys.go b/models/user/setting_keys.go index 72b3974eee435..3149aae18ba68 100644 --- a/models/user/setting_keys.go +++ b/models/user/setting_keys.go @@ -14,4 +14,8 @@ const ( UserActivityPubPrivPem = "activitypub.priv_pem" // UserActivityPubPubPem is user's public key UserActivityPubPubPem = "activitypub.pub_pem" + // SignupIP is the IP address that the user signed up with + SignupIP = "signup.ip" + // SignupUserAgent is the user agent that the user signed up with + SignupUserAgent = "signup.user_agent" ) diff --git a/models/user/user.go b/models/user/user.go index e79279bf330f7..c5ce68cda4567 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -750,9 +750,9 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa return err } - if setting.RecordInitialIP { + if setting.RecordUserSignupMetadata { // insert initial IP and UserAgent - if err = SetUserSetting(ctx, u.ID, "initial_ip", u.InitialIP); err != nil { + if err = SetUserSetting(ctx, u.ID, SignupIP, u.InitialIP); err != nil { return err } @@ -761,7 +761,7 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa if len(userAgent) > 255 { userAgent = userAgent[:255] } - if err = SetUserSetting(ctx, u.ID, "initial_user_agent", userAgent); err != nil { + if err = SetUserSetting(ctx, u.ID, SignupUserAgent, userAgent); err != nil { return err } } diff --git a/modules/setting/security.go b/modules/setting/security.go index f4993bd36b435..3d12fcf8d9fdd 100644 --- a/modules/setting/security.go +++ b/modules/setting/security.go @@ -37,7 +37,7 @@ var ( DisableQueryAuthToken bool CSRFCookieName = "_csrf" CSRFCookieHTTPOnly = true - RecordInitialIP = false + RecordUserSignupMetadata = false ) // loadSecret load the secret from ini by uriKey or verbatimKey, only one of them could be set @@ -165,7 +165,7 @@ func loadSecurityFrom(rootCfg ConfigProvider) { // TODO: default value should be true in future releases DisableQueryAuthToken = sec.Key("DISABLE_QUERY_AUTH_TOKEN").MustBool(false) - RecordInitialIP = sec.Key("RECORD_INITIAL_IP").MustBool(false) + RecordUserSignupMetadata = sec.Key("RECORD_USER_SIGNUP_METADATA").MustBool(false) // warn if the setting is set to false explicitly if sectionHasDisableQueryAuthToken && !DisableQueryAuthToken { diff --git a/services/context/access_log.go b/services/context/access_log.go index 2f55838120786..0926748ac540f 100644 --- a/services/context/access_log.go +++ b/services/context/access_log.go @@ -86,7 +86,6 @@ func AccessLogger() func(http.Handler) http.Handler { ResponseWriter: rw, Ctx: map[string]any{ "RemoteAddr": req.RemoteAddr, - "UserAgent": req.UserAgent, "RemoteHost": reqHost, "Req": req, }, From f97d3b44c2b306e084eadc7d4ec07d8550169952 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 6 Sep 2024 23:13:00 -0400 Subject: [PATCH 5/8] refactor structs --- models/user/user.go | 27 +++++++++++++++------------ routers/web/auth/auth.go | 8 +++++--- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/models/user/user.go b/models/user/user.go index c5ce68cda4567..7586369f9581a 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -120,11 +120,6 @@ type User struct { // (ex: in private Gitea instances user won't be allowed to see even organizations/repositories that are set as public) IsRestricted bool `xorm:"NOT NULL DEFAULT false"` - // Store the initial registration of the user, to aid in spam prevention - // Ensure that one IP isn't creating many accounts (following mediawiki approach) - InitialIP string `xorm:"-"` - InitialUserAgent string `xorm:"-"` - AllowGitHook bool AllowImportLocal bool // Allow migrate repository by local path AllowCreateOrganization bool `xorm:"DEFAULT true"` @@ -155,6 +150,14 @@ type User struct { KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` } +// UserMeta defines the meta information of a user, to be stored in the K/V table +type UserMeta struct { + // Store the initial registration of the user, to aid in spam prevention + // Ensure that one IP isn't creating many accounts (following mediawiki approach) + InitialIP string + InitialUserAgent string +} + func init() { db.RegisterModel(new(User)) } @@ -620,17 +623,17 @@ type CreateUserOverwriteOptions struct { } // CreateUser creates record of a new user. -func CreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { - return createUser(ctx, u, false, overwriteDefault...) +func CreateUser(ctx context.Context, u *User, meta *UserMeta, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { + return createUser(ctx, u, meta, false, overwriteDefault...) } // AdminCreateUser is used by admins to manually create users -func AdminCreateUser(ctx context.Context, u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { - return createUser(ctx, u, true, overwriteDefault...) +func AdminCreateUser(ctx context.Context, u *User, meta *UserMeta, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { + return createUser(ctx, u, meta, true, overwriteDefault...) } // createUser creates record of a new user. -func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { +func createUser(ctx context.Context, u *User, meta *UserMeta, createdByAdmin bool, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { if err = IsUsableUsername(u.Name); err != nil { return err } @@ -752,12 +755,12 @@ func createUser(ctx context.Context, u *User, createdByAdmin bool, overwriteDefa if setting.RecordUserSignupMetadata { // insert initial IP and UserAgent - if err = SetUserSetting(ctx, u.ID, SignupIP, u.InitialIP); err != nil { + if err = SetUserSetting(ctx, u.ID, SignupIP, meta.InitialIP); err != nil { return err } // trim user agent string to a reasonable length, if necessary - userAgent := strings.TrimSpace(u.InitialUserAgent) + userAgent := strings.TrimSpace(meta.InitialUserAgent) if len(userAgent) > 255 { userAgent = userAgent[:255] } diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index 5d28df008934e..b91dcba1bea42 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -541,9 +541,11 @@ func createAndHandleCreatedUser(ctx *context.Context, tpl base.TplName, form any // createUserInContext creates a user and handles errors within a given context. // Optionally a template can be specified. func createUserInContext(ctx *context.Context, tpl base.TplName, form any, u *user_model.User, overwrites *user_model.CreateUserOverwriteOptions, gothUser *goth.User, allowLink bool) (ok bool) { - u.InitialIP = ctx.RemoteAddr() - u.InitialUserAgent = ctx.Req.UserAgent() - if err := user_model.CreateUser(ctx, u, overwrites); err != nil { + meta := &user_model.UserMeta{ + InitialIP: ctx.RemoteAddr(), + InitialUserAgent: ctx.Req.UserAgent(), + } + if err := user_model.CreateUser(ctx, u, meta, overwrites); err != nil { if allowLink && (user_model.IsErrUserAlreadyExist(err) || user_model.IsErrEmailAlreadyUsed(err)) { if setting.OAuth2Client.AccountLinking == setting.OAuth2AccountLinkingAuto { var user *user_model.User From 22b2e4d940c068fdea9144561c067089d2d50184 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 6 Sep 2024 23:25:08 -0400 Subject: [PATCH 6/8] refactor structs --- cmd/admin_user_create.go | 2 +- routers/api/v1/admin/user.go | 2 +- routers/install/install.go | 2 +- routers/web/admin/users.go | 2 +- services/auth/reverseproxy.go | 2 +- services/auth/source/ldap/source_authenticate.go | 2 +- services/auth/source/ldap/source_sync.go | 2 +- services/auth/source/pam/source_authenticate.go | 2 +- services/auth/source/smtp/source_authenticate.go | 2 +- services/auth/sspi.go | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmd/admin_user_create.go b/cmd/admin_user_create.go index f328b753d86da..5041e0704bbce 100644 --- a/cmd/admin_user_create.go +++ b/cmd/admin_user_create.go @@ -158,7 +158,7 @@ func runCreateUser(c *cli.Context) error { IsRestricted: restricted, } - if err := user_model.CreateUser(ctx, u, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { return fmt.Errorf("CreateUser: %w", err) } diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 3e2fefc6da234..8eaca3eb0202e 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -133,7 +133,7 @@ func CreateUser(ctx *context.APIContext) { u.UpdatedUnix = u.CreatedUnix } - if err := user_model.AdminCreateUser(ctx, u, overwriteDefault); err != nil { + if err := user_model.AdminCreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { if user_model.IsErrUserAlreadyExist(err) || user_model.IsErrEmailAlreadyUsed(err) || db.IsErrNameReserved(err) || diff --git a/routers/install/install.go b/routers/install/install.go index fde8b37ed5942..bc0247fcf7812 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -554,7 +554,7 @@ func SubmitInstall(ctx *context.Context) { IsActive: optional.Some(true), } - if err = user_model.CreateUser(ctx, u, overwriteDefault); err != nil { + if err = user_model.CreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { if !user_model.IsErrUserAlreadyExist(err) { setting.InstallLock = false ctx.Data["Err_AdminName"] = true diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index 34bb1dfe26da3..2b3252f701fbd 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -177,7 +177,7 @@ func NewUserPost(ctx *context.Context) { u.MustChangePassword = form.MustChangePassword } - if err := user_model.AdminCreateUser(ctx, u, overwriteDefault); err != nil { + if err := user_model.AdminCreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { switch { case user_model.IsErrUserAlreadyExist(err): ctx.Data["Err_UserName"] = true diff --git a/services/auth/reverseproxy.go b/services/auth/reverseproxy.go index b6aeb0aed2cab..bb29690d4263c 100644 --- a/services/auth/reverseproxy.go +++ b/services/auth/reverseproxy.go @@ -164,7 +164,7 @@ func (r *ReverseProxy) newUser(req *http.Request) *user_model.User { IsActive: optional.Some(true), } - if err := user_model.CreateUser(req.Context(), user, &overwriteDefault); err != nil { + if err := user_model.CreateUser(req.Context(), user, &user_model.UserMeta{}, &overwriteDefault); err != nil { // FIXME: should I create a system notice? log.Error("CreateUser: %v", err) return nil diff --git a/services/auth/source/ldap/source_authenticate.go b/services/auth/source/ldap/source_authenticate.go index 6ebd3ea50ac8c..670fd589f4cf6 100644 --- a/services/auth/source/ldap/source_authenticate.go +++ b/services/auth/source/ldap/source_authenticate.go @@ -89,7 +89,7 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u IsActive: optional.Some(true), } - err := user_model.CreateUser(ctx, user, overwriteDefault) + err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault) if err != nil { return user, err } diff --git a/services/auth/source/ldap/source_sync.go b/services/auth/source/ldap/source_sync.go index 2a95326b9e8d7..1906f6cc4aa76 100644 --- a/services/auth/source/ldap/source_sync.go +++ b/services/auth/source/ldap/source_sync.go @@ -129,7 +129,7 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error { IsActive: optional.Some(true), } - err = user_model.CreateUser(ctx, usr, overwriteDefault) + err = user_model.CreateUser(ctx, usr, &user_model.UserMeta{}, overwriteDefault) if err != nil { log.Error("SyncExternalUsers[%s]: Error creating user %s: %v", source.authSource.Name, su.Username, err) } diff --git a/services/auth/source/pam/source_authenticate.go b/services/auth/source/pam/source_authenticate.go index addd1bd2c958e..7fa4dd2c00334 100644 --- a/services/auth/source/pam/source_authenticate.go +++ b/services/auth/source/pam/source_authenticate.go @@ -63,7 +63,7 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u IsActive: optional.Some(true), } - if err := user_model.CreateUser(ctx, user, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault); err != nil { return user, err } diff --git a/services/auth/source/smtp/source_authenticate.go b/services/auth/source/smtp/source_authenticate.go index 1f0a61c789171..63c2b9c0c9324 100644 --- a/services/auth/source/smtp/source_authenticate.go +++ b/services/auth/source/smtp/source_authenticate.go @@ -79,7 +79,7 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u IsActive: optional.Some(true), } - if err := user_model.CreateUser(ctx, user, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault); err != nil { return user, err } diff --git a/services/auth/sspi.go b/services/auth/sspi.go index 64a127e97a6c3..41df9a4a8ccab 100644 --- a/services/auth/sspi.go +++ b/services/auth/sspi.go @@ -176,7 +176,7 @@ func (s *SSPI) newUser(ctx context.Context, username string, cfg *sspi.Source) ( KeepEmailPrivate: optional.Some(true), EmailNotificationsPreference: &emailNotificationPreference, } - if err := user_model.CreateUser(ctx, user, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault); err != nil { return nil, err } From 13366517dc2226619b460424b400bcd9834065e4 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 6 Sep 2024 23:54:28 -0400 Subject: [PATCH 7/8] refactor structs --- models/user/user_test.go | 8 ++++---- services/auth/source/oauth2/source_sync_test.go | 2 +- services/user/user_test.go | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/models/user/user_test.go b/models/user/user_test.go index 26cda3f89e324..9882b63a7e8b2 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -227,7 +227,7 @@ func TestCreateUserInvalidEmail(t *testing.T) { MustChangePassword: false, } - err := user_model.CreateUser(db.DefaultContext, user) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) assert.Error(t, err) assert.True(t, user_model.IsErrEmailCharIsNotSupported(err)) } @@ -241,7 +241,7 @@ func TestCreateUserEmailAlreadyUsed(t *testing.T) { user.Name = "testuser" user.LowerName = strings.ToLower(user.Name) user.ID = 0 - err := user_model.CreateUser(db.DefaultContext, user) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) assert.Error(t, err) assert.True(t, user_model.IsErrEmailAlreadyUsed(err)) } @@ -258,7 +258,7 @@ func TestCreateUserCustomTimestamps(t *testing.T) { user.ID = 0 user.Email = "unique@example.com" user.CreatedUnix = creationTimestamp - err := user_model.CreateUser(db.DefaultContext, user) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) assert.NoError(t, err) fetched, err := user_model.GetUserByID(context.Background(), user.ID) @@ -283,7 +283,7 @@ func TestCreateUserWithoutCustomTimestamps(t *testing.T) { user.Email = "unique@example.com" user.CreatedUnix = 0 user.UpdatedUnix = 0 - err := user_model.CreateUser(db.DefaultContext, user) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) assert.NoError(t, err) timestampEnd := time.Now().Unix() diff --git a/services/auth/source/oauth2/source_sync_test.go b/services/auth/source/oauth2/source_sync_test.go index e2f04bcb2561d..cad5c04cabb85 100644 --- a/services/auth/source/oauth2/source_sync_test.go +++ b/services/auth/source/oauth2/source_sync_test.go @@ -36,7 +36,7 @@ func TestSource(t *testing.T) { Email: "external@example.com", } - err := user_model.CreateUser(context.Background(), user, &user_model.CreateUserOverwriteOptions{}) + err := user_model.CreateUser(context.Background(), user, &user_model.UserMeta{}, &user_model.CreateUserOverwriteOptions{}) assert.NoError(t, err) e := &user_model.ExternalLoginUser{ diff --git a/services/user/user_test.go b/services/user/user_test.go index bd6019a14fdcf..aa62e188714dd 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -92,7 +92,7 @@ func TestCreateUser(t *testing.T) { MustChangePassword: false, } - assert.NoError(t, user_model.CreateUser(db.DefaultContext, user)) + assert.NoError(t, user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{})) assert.NoError(t, DeleteUser(db.DefaultContext, user, false)) } @@ -177,7 +177,7 @@ func TestCreateUser_Issue5882(t *testing.T) { for _, v := range tt { setting.Admin.DisableRegularOrgCreation = v.disableOrgCreation - assert.NoError(t, user_model.CreateUser(db.DefaultContext, v.user)) + assert.NoError(t, user_model.CreateUser(db.DefaultContext, v.user, &user_model.UserMeta{})) u, err := user_model.GetUserByEmail(db.DefaultContext, v.user.Email) assert.NoError(t, err) From 98a74c1105303f6a555a6b62c1dd68c7ce5e1afc Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sat, 7 Sep 2024 00:02:48 -0400 Subject: [PATCH 8/8] fix lint --- cmd/admin_user_create.go | 2 +- models/user/user.go | 10 +++++----- models/user/user_test.go | 8 ++++---- routers/api/v1/admin/user.go | 2 +- routers/install/install.go | 2 +- routers/web/admin/users.go | 2 +- routers/web/auth/auth.go | 2 +- services/auth/reverseproxy.go | 2 +- services/auth/source/ldap/source_authenticate.go | 2 +- services/auth/source/ldap/source_sync.go | 2 +- services/auth/source/oauth2/source_sync_test.go | 2 +- services/auth/source/pam/source_authenticate.go | 2 +- services/auth/source/smtp/source_authenticate.go | 2 +- services/auth/sspi.go | 2 +- services/user/user_test.go | 4 ++-- 15 files changed, 23 insertions(+), 23 deletions(-) diff --git a/cmd/admin_user_create.go b/cmd/admin_user_create.go index 5041e0704bbce..106d14b25a75f 100644 --- a/cmd/admin_user_create.go +++ b/cmd/admin_user_create.go @@ -158,7 +158,7 @@ func runCreateUser(c *cli.Context) error { IsRestricted: restricted, } - if err := user_model.CreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, u, &user_model.Meta{}, overwriteDefault); err != nil { return fmt.Errorf("CreateUser: %w", err) } diff --git a/models/user/user.go b/models/user/user.go index 7586369f9581a..f93fba8ae0cef 100644 --- a/models/user/user.go +++ b/models/user/user.go @@ -150,8 +150,8 @@ type User struct { KeepActivityPrivate bool `xorm:"NOT NULL DEFAULT false"` } -// UserMeta defines the meta information of a user, to be stored in the K/V table -type UserMeta struct { +// Meta defines the meta information of a user, to be stored in the K/V table +type Meta struct { // Store the initial registration of the user, to aid in spam prevention // Ensure that one IP isn't creating many accounts (following mediawiki approach) InitialIP string @@ -623,17 +623,17 @@ type CreateUserOverwriteOptions struct { } // CreateUser creates record of a new user. -func CreateUser(ctx context.Context, u *User, meta *UserMeta, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { +func CreateUser(ctx context.Context, u *User, meta *Meta, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { return createUser(ctx, u, meta, false, overwriteDefault...) } // AdminCreateUser is used by admins to manually create users -func AdminCreateUser(ctx context.Context, u *User, meta *UserMeta, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { +func AdminCreateUser(ctx context.Context, u *User, meta *Meta, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { return createUser(ctx, u, meta, true, overwriteDefault...) } // createUser creates record of a new user. -func createUser(ctx context.Context, u *User, meta *UserMeta, createdByAdmin bool, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { +func createUser(ctx context.Context, u *User, meta *Meta, createdByAdmin bool, overwriteDefault ...*CreateUserOverwriteOptions) (err error) { if err = IsUsableUsername(u.Name); err != nil { return err } diff --git a/models/user/user_test.go b/models/user/user_test.go index 9882b63a7e8b2..67efb3859fdf3 100644 --- a/models/user/user_test.go +++ b/models/user/user_test.go @@ -227,7 +227,7 @@ func TestCreateUserInvalidEmail(t *testing.T) { MustChangePassword: false, } - err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.Meta{}) assert.Error(t, err) assert.True(t, user_model.IsErrEmailCharIsNotSupported(err)) } @@ -241,7 +241,7 @@ func TestCreateUserEmailAlreadyUsed(t *testing.T) { user.Name = "testuser" user.LowerName = strings.ToLower(user.Name) user.ID = 0 - err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.Meta{}) assert.Error(t, err) assert.True(t, user_model.IsErrEmailAlreadyUsed(err)) } @@ -258,7 +258,7 @@ func TestCreateUserCustomTimestamps(t *testing.T) { user.ID = 0 user.Email = "unique@example.com" user.CreatedUnix = creationTimestamp - err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.Meta{}) assert.NoError(t, err) fetched, err := user_model.GetUserByID(context.Background(), user.ID) @@ -283,7 +283,7 @@ func TestCreateUserWithoutCustomTimestamps(t *testing.T) { user.Email = "unique@example.com" user.CreatedUnix = 0 user.UpdatedUnix = 0 - err := user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{}) + err := user_model.CreateUser(db.DefaultContext, user, &user_model.Meta{}) assert.NoError(t, err) timestampEnd := time.Now().Unix() diff --git a/routers/api/v1/admin/user.go b/routers/api/v1/admin/user.go index 8eaca3eb0202e..b0f40084da38b 100644 --- a/routers/api/v1/admin/user.go +++ b/routers/api/v1/admin/user.go @@ -133,7 +133,7 @@ func CreateUser(ctx *context.APIContext) { u.UpdatedUnix = u.CreatedUnix } - if err := user_model.AdminCreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err := user_model.AdminCreateUser(ctx, u, &user_model.Meta{}, overwriteDefault); err != nil { if user_model.IsErrUserAlreadyExist(err) || user_model.IsErrEmailAlreadyUsed(err) || db.IsErrNameReserved(err) || diff --git a/routers/install/install.go b/routers/install/install.go index bc0247fcf7812..e420d36da5a1b 100644 --- a/routers/install/install.go +++ b/routers/install/install.go @@ -554,7 +554,7 @@ func SubmitInstall(ctx *context.Context) { IsActive: optional.Some(true), } - if err = user_model.CreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err = user_model.CreateUser(ctx, u, &user_model.Meta{}, overwriteDefault); err != nil { if !user_model.IsErrUserAlreadyExist(err) { setting.InstallLock = false ctx.Data["Err_AdminName"] = true diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go index 2b3252f701fbd..48ff8ea04b01f 100644 --- a/routers/web/admin/users.go +++ b/routers/web/admin/users.go @@ -177,7 +177,7 @@ func NewUserPost(ctx *context.Context) { u.MustChangePassword = form.MustChangePassword } - if err := user_model.AdminCreateUser(ctx, u, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err := user_model.AdminCreateUser(ctx, u, &user_model.Meta{}, overwriteDefault); err != nil { switch { case user_model.IsErrUserAlreadyExist(err): ctx.Data["Err_UserName"] = true diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go index b91dcba1bea42..b86c1ff1c23d6 100644 --- a/routers/web/auth/auth.go +++ b/routers/web/auth/auth.go @@ -541,7 +541,7 @@ func createAndHandleCreatedUser(ctx *context.Context, tpl base.TplName, form any // createUserInContext creates a user and handles errors within a given context. // Optionally a template can be specified. func createUserInContext(ctx *context.Context, tpl base.TplName, form any, u *user_model.User, overwrites *user_model.CreateUserOverwriteOptions, gothUser *goth.User, allowLink bool) (ok bool) { - meta := &user_model.UserMeta{ + meta := &user_model.Meta{ InitialIP: ctx.RemoteAddr(), InitialUserAgent: ctx.Req.UserAgent(), } diff --git a/services/auth/reverseproxy.go b/services/auth/reverseproxy.go index bb29690d4263c..36b4ef68f42f4 100644 --- a/services/auth/reverseproxy.go +++ b/services/auth/reverseproxy.go @@ -164,7 +164,7 @@ func (r *ReverseProxy) newUser(req *http.Request) *user_model.User { IsActive: optional.Some(true), } - if err := user_model.CreateUser(req.Context(), user, &user_model.UserMeta{}, &overwriteDefault); err != nil { + if err := user_model.CreateUser(req.Context(), user, &user_model.Meta{}, &overwriteDefault); err != nil { // FIXME: should I create a system notice? log.Error("CreateUser: %v", err) return nil diff --git a/services/auth/source/ldap/source_authenticate.go b/services/auth/source/ldap/source_authenticate.go index 670fd589f4cf6..01cb743720599 100644 --- a/services/auth/source/ldap/source_authenticate.go +++ b/services/auth/source/ldap/source_authenticate.go @@ -89,7 +89,7 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u IsActive: optional.Some(true), } - err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault) + err := user_model.CreateUser(ctx, user, &user_model.Meta{}, overwriteDefault) if err != nil { return user, err } diff --git a/services/auth/source/ldap/source_sync.go b/services/auth/source/ldap/source_sync.go index 1906f6cc4aa76..a6d6d2a0f2fc3 100644 --- a/services/auth/source/ldap/source_sync.go +++ b/services/auth/source/ldap/source_sync.go @@ -129,7 +129,7 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error { IsActive: optional.Some(true), } - err = user_model.CreateUser(ctx, usr, &user_model.UserMeta{}, overwriteDefault) + err = user_model.CreateUser(ctx, usr, &user_model.Meta{}, overwriteDefault) if err != nil { log.Error("SyncExternalUsers[%s]: Error creating user %s: %v", source.authSource.Name, su.Username, err) } diff --git a/services/auth/source/oauth2/source_sync_test.go b/services/auth/source/oauth2/source_sync_test.go index cad5c04cabb85..25408e8727e1f 100644 --- a/services/auth/source/oauth2/source_sync_test.go +++ b/services/auth/source/oauth2/source_sync_test.go @@ -36,7 +36,7 @@ func TestSource(t *testing.T) { Email: "external@example.com", } - err := user_model.CreateUser(context.Background(), user, &user_model.UserMeta{}, &user_model.CreateUserOverwriteOptions{}) + err := user_model.CreateUser(context.Background(), user, &user_model.Meta{}, &user_model.CreateUserOverwriteOptions{}) assert.NoError(t, err) e := &user_model.ExternalLoginUser{ diff --git a/services/auth/source/pam/source_authenticate.go b/services/auth/source/pam/source_authenticate.go index 7fa4dd2c00334..6fd02dc29f87c 100644 --- a/services/auth/source/pam/source_authenticate.go +++ b/services/auth/source/pam/source_authenticate.go @@ -63,7 +63,7 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u IsActive: optional.Some(true), } - if err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, user, &user_model.Meta{}, overwriteDefault); err != nil { return user, err } diff --git a/services/auth/source/smtp/source_authenticate.go b/services/auth/source/smtp/source_authenticate.go index 63c2b9c0c9324..b2e94933a6d2e 100644 --- a/services/auth/source/smtp/source_authenticate.go +++ b/services/auth/source/smtp/source_authenticate.go @@ -79,7 +79,7 @@ func (source *Source) Authenticate(ctx context.Context, user *user_model.User, u IsActive: optional.Some(true), } - if err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, user, &user_model.Meta{}, overwriteDefault); err != nil { return user, err } diff --git a/services/auth/sspi.go b/services/auth/sspi.go index 41df9a4a8ccab..7f8a03a4c67da 100644 --- a/services/auth/sspi.go +++ b/services/auth/sspi.go @@ -176,7 +176,7 @@ func (s *SSPI) newUser(ctx context.Context, username string, cfg *sspi.Source) ( KeepEmailPrivate: optional.Some(true), EmailNotificationsPreference: &emailNotificationPreference, } - if err := user_model.CreateUser(ctx, user, &user_model.UserMeta{}, overwriteDefault); err != nil { + if err := user_model.CreateUser(ctx, user, &user_model.Meta{}, overwriteDefault); err != nil { return nil, err } diff --git a/services/user/user_test.go b/services/user/user_test.go index aa62e188714dd..cd0f5975015d5 100644 --- a/services/user/user_test.go +++ b/services/user/user_test.go @@ -92,7 +92,7 @@ func TestCreateUser(t *testing.T) { MustChangePassword: false, } - assert.NoError(t, user_model.CreateUser(db.DefaultContext, user, &user_model.UserMeta{})) + assert.NoError(t, user_model.CreateUser(db.DefaultContext, user, &user_model.Meta{})) assert.NoError(t, DeleteUser(db.DefaultContext, user, false)) } @@ -177,7 +177,7 @@ func TestCreateUser_Issue5882(t *testing.T) { for _, v := range tt { setting.Admin.DisableRegularOrgCreation = v.disableOrgCreation - assert.NoError(t, user_model.CreateUser(db.DefaultContext, v.user, &user_model.UserMeta{})) + assert.NoError(t, user_model.CreateUser(db.DefaultContext, v.user, &user_model.Meta{})) u, err := user_model.GetUserByEmail(db.DefaultContext, v.user.Email) assert.NoError(t, err)