Skip to content

Commit 1f8710e

Browse files
committed
Enforce system defaults in CreateUser
Allow for overwrites with CreateUserOverwriteOptions
1 parent 9020faa commit 1f8710e

File tree

15 files changed

+140
-76
lines changed

15 files changed

+140
-76
lines changed

cmd/admin.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
repo_module "code.gitea.io/gitea/modules/repository"
2626
"code.gitea.io/gitea/modules/setting"
2727
"code.gitea.io/gitea/modules/storage"
28+
"code.gitea.io/gitea/modules/util"
2829
auth_service "code.gitea.io/gitea/services/auth"
2930
"code.gitea.io/gitea/services/auth/source/oauth2"
3031
"code.gitea.io/gitea/services/auth/source/smtp"
@@ -563,13 +564,15 @@ func runCreateUser(c *cli.Context) error {
563564
Name: username,
564565
Email: c.String("email"),
565566
Passwd: password,
566-
IsActive: true,
567567
IsAdmin: c.Bool("admin"),
568568
MustChangePassword: changePassword,
569-
Theme: setting.UI.DefaultTheme,
570569
}
571570

572-
if err := user_model.CreateUser(u); err != nil {
571+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
572+
IsActive: util.OptionalBoolTrue,
573+
}
574+
575+
if err := user_model.CreateUser(u, overwriteDefault); err != nil {
573576
return fmt.Errorf("CreateUser: %v", err)
574577
}
575578

models/user/user.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,14 @@ func IsUsableUsername(name string) error {
621621

622622
// CreateUserOverwriteOptions are an optional options who overwrite system defaults on user creation
623623
type CreateUserOverwriteOptions struct {
624-
Visibility structs.VisibleType
624+
KeepEmailPrivate util.OptionalBool
625+
Visibility *structs.VisibleType
626+
AllowCreateOrganization util.OptionalBool
627+
EmailNotificationsPreference *string
628+
MaxRepoCreation *int
629+
Theme *string
630+
IsRestricted util.OptionalBool
631+
IsActive util.OptionalBool
625632
}
626633

627634
// CreateUser creates record of a new user.
@@ -637,11 +644,36 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e
637644
u.EmailNotificationsPreference = setting.Admin.DefaultEmailNotification
638645
u.MaxRepoCreation = -1
639646
u.Theme = setting.UI.DefaultTheme
640-
u.IsRestricted = u.IsRestricted || setting.Service.DefaultUserIsRestricted
647+
u.IsRestricted = setting.Service.DefaultUserIsRestricted
648+
u.IsActive = !(setting.Service.RegisterEmailConfirm || setting.Service.RegisterManualConfirm)
641649

642650
// overwrite defaults if set
643651
if len(overwriteDefault) != 0 && overwriteDefault[0] != nil {
644-
u.Visibility = overwriteDefault[0].Visibility
652+
overwrite := overwriteDefault[0]
653+
if !overwrite.KeepEmailPrivate.IsNone() {
654+
u.KeepEmailPrivate = overwrite.KeepEmailPrivate.IsTrue()
655+
}
656+
if overwrite.Visibility != nil {
657+
u.Visibility = *overwrite.Visibility
658+
}
659+
if !overwrite.AllowCreateOrganization.IsNone() {
660+
u.AllowCreateOrganization = overwrite.AllowCreateOrganization.IsTrue()
661+
}
662+
if overwrite.EmailNotificationsPreference != nil {
663+
u.EmailNotificationsPreference = *overwrite.EmailNotificationsPreference
664+
}
665+
if overwrite.MaxRepoCreation != nil {
666+
u.MaxRepoCreation = *overwrite.MaxRepoCreation
667+
}
668+
if overwrite.Theme != nil {
669+
u.Theme = *overwrite.Theme
670+
}
671+
if !overwrite.IsRestricted.IsNone() {
672+
u.IsRestricted = overwrite.IsRestricted.IsTrue()
673+
}
674+
if !overwrite.IsActive.IsNone() {
675+
u.IsActive = overwrite.IsActive.IsTrue()
676+
}
645677
}
646678

647679
// validate data

routers/api/v1/admin/user.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"code.gitea.io/gitea/modules/password"
2323
"code.gitea.io/gitea/modules/setting"
2424
api "code.gitea.io/gitea/modules/structs"
25+
"code.gitea.io/gitea/modules/util"
2526
"code.gitea.io/gitea/modules/web"
2627
"code.gitea.io/gitea/routers/api/v1/user"
2728
"code.gitea.io/gitea/routers/api/v1/utils"
@@ -82,7 +83,6 @@ func CreateUser(ctx *context.APIContext) {
8283
Email: form.Email,
8384
Passwd: form.Password,
8485
MustChangePassword: true,
85-
IsActive: true,
8686
LoginType: auth.Plain,
8787
}
8888
if form.MustChangePassword != nil {
@@ -108,11 +108,12 @@ func CreateUser(ctx *context.APIContext) {
108108
return
109109
}
110110

111-
var overwriteDefault *user_model.CreateUserOverwriteOptions
111+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
112+
IsActive: util.OptionalBoolTrue,
113+
}
112114
if form.Visibility != "" {
113-
overwriteDefault = &user_model.CreateUserOverwriteOptions{
114-
Visibility: api.VisibilityModes[form.Visibility],
115-
}
115+
visibility := api.VisibilityModes[form.Visibility]
116+
overwriteDefault.Visibility = &visibility
116117
}
117118

118119
if err := user_model.CreateUser(u, overwriteDefault); err != nil {

routers/install/install.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -499,13 +499,16 @@ func SubmitInstall(ctx *context.Context) {
499499
// Create admin account
500500
if len(form.AdminName) > 0 {
501501
u := &user_model.User{
502-
Name: form.AdminName,
503-
Email: form.AdminEmail,
504-
Passwd: form.AdminPasswd,
505-
IsAdmin: true,
506-
IsActive: true,
502+
Name: form.AdminName,
503+
Email: form.AdminEmail,
504+
Passwd: form.AdminPasswd,
505+
IsAdmin: true,
507506
}
508-
if err = user_model.CreateUser(u); err != nil {
507+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
508+
IsActive: new(bool),
509+
}
510+
511+
if err = user_model.CreateUser(u, overwriteDefault); err != nil {
509512
if !user_model.IsErrUserAlreadyExist(err) {
510513
setting.InstallLock = false
511514
ctx.Data["Err_AdminName"] = true

routers/web/admin/users.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,14 @@ func NewUserPost(ctx *context.Context) {
125125
Name: form.UserName,
126126
Email: form.Email,
127127
Passwd: form.Password,
128-
IsActive: true,
129128
LoginType: auth.Plain,
130129
}
131130

131+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
132+
IsActive: util.OptionalBoolTrue,
133+
Visibility: &form.Visibility,
134+
}
135+
132136
if len(form.LoginType) > 0 {
133137
fields := strings.Split(form.LoginType, "-")
134138
if len(fields) == 2 {
@@ -163,7 +167,7 @@ func NewUserPost(ctx *context.Context) {
163167
u.MustChangePassword = form.MustChangePassword
164168
}
165169

166-
if err := user_model.CreateUser(u, &user_model.CreateUserOverwriteOptions{Visibility: form.Visibility}); err != nil {
170+
if err := user_model.CreateUser(u, overwriteDefault); err != nil {
167171
switch {
168172
case user_model.IsErrUserAlreadyExist(err):
169173
ctx.Data["Err_UserName"] = true

routers/web/auth/auth.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -507,10 +507,9 @@ func SignUpPost(ctx *context.Context) {
507507
}
508508

509509
u := &user_model.User{
510-
Name: form.UserName,
511-
Email: form.Email,
512-
Passwd: form.Password,
513-
IsActive: !(setting.Service.RegisterEmailConfirm || setting.Service.RegisterManualConfirm),
510+
Name: form.UserName,
511+
Email: form.Email,
512+
Passwd: form.Password,
514513
}
515514

516515
if !createAndHandleCreatedUser(ctx, tplSignUp, form, u, nil, false) {
@@ -524,17 +523,17 @@ func SignUpPost(ctx *context.Context) {
524523

525524
// createAndHandleCreatedUser calls createUserInContext and
526525
// then handleUserCreated.
527-
func createAndHandleCreatedUser(ctx *context.Context, tpl base.TplName, form interface{}, u *user_model.User, gothUser *goth.User, allowLink bool) bool {
528-
if !createUserInContext(ctx, tpl, form, u, gothUser, allowLink) {
526+
func createAndHandleCreatedUser(ctx *context.Context, tpl base.TplName, form interface{}, u *user_model.User, overwrites *user_model.CreateUserOverwriteOptions, gothUser *goth.User, allowLink bool) bool {
527+
if !createUserInContext(ctx, tpl, form, u, overwrites, gothUser, allowLink) {
529528
return false
530529
}
531530
return handleUserCreated(ctx, u, gothUser)
532531
}
533532

534533
// createUserInContext creates a user and handles errors within a given context.
535534
// Optionally a template can be specified.
536-
func createUserInContext(ctx *context.Context, tpl base.TplName, form interface{}, u *user_model.User, gothUser *goth.User, allowLink bool) (ok bool) {
537-
if err := user_model.CreateUser(u); err != nil {
535+
func createUserInContext(ctx *context.Context, tpl base.TplName, form interface{}, u *user_model.User, overwrites *user_model.CreateUserOverwriteOptions, gothUser *goth.User, allowLink bool) (ok bool) {
536+
if err := user_model.CreateUser(u, overwrites); err != nil {
538537
if allowLink && (user_model.IsErrUserAlreadyExist(err) || user_model.IsErrEmailAlreadyUsed(err)) {
539538
if setting.OAuth2Client.AccountLinking == setting.OAuth2AccountLinkingAuto {
540539
var user *user_model.User

routers/web/auth/linkaccount.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ func LinkAccountPostRegister(ctx *context.Context) {
283283
Name: form.UserName,
284284
Email: form.Email,
285285
Passwd: form.Password,
286-
IsActive: !(setting.Service.RegisterEmailConfirm || setting.Service.RegisterManualConfirm),
287286
LoginType: auth.OAuth2,
288287
LoginSource: authSource.ID,
289288
LoginName: gothUser.UserID,

routers/web/auth/oauth.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"code.gitea.io/gitea/modules/session"
2525
"code.gitea.io/gitea/modules/setting"
2626
"code.gitea.io/gitea/modules/timeutil"
27+
"code.gitea.io/gitea/modules/util"
2728
"code.gitea.io/gitea/modules/web"
2829
"code.gitea.io/gitea/modules/web/middleware"
2930
auth_service "code.gitea.io/gitea/services/auth"
@@ -870,15 +871,18 @@ func SignInOAuthCallback(ctx *context.Context) {
870871
Name: getUserName(&gothUser),
871872
FullName: gothUser.Name,
872873
Email: gothUser.Email,
873-
IsActive: !setting.OAuth2Client.RegisterEmailConfirm,
874874
LoginType: auth.OAuth2,
875875
LoginSource: authSource.ID,
876876
LoginName: gothUser.UserID,
877877
}
878878

879+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
880+
IsActive: util.OptionalBoolOf(!setting.OAuth2Client.RegisterEmailConfirm),
881+
}
882+
879883
setUserGroupClaims(authSource, u, &gothUser)
880884

881-
if !createAndHandleCreatedUser(ctx, base.TplName(""), nil, u, &gothUser, setting.OAuth2Client.AccountLinking != setting.OAuth2AccountLinkingDisabled) {
885+
if !createAndHandleCreatedUser(ctx, base.TplName(""), nil, u, overwriteDefault, &gothUser, setting.OAuth2Client.AccountLinking != setting.OAuth2AccountLinkingDisabled) {
882886
// error already handled
883887
return
884888
}

routers/web/auth/openid.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,12 +423,11 @@ func RegisterOpenIDPost(ctx *context.Context) {
423423
}
424424

425425
u := &user_model.User{
426-
Name: form.UserName,
427-
Email: form.Email,
428-
Passwd: password,
429-
IsActive: !(setting.Service.RegisterEmailConfirm || setting.Service.RegisterManualConfirm),
426+
Name: form.UserName,
427+
Email: form.Email,
428+
Passwd: password,
430429
}
431-
if !createUserInContext(ctx, tplSignUpOID, form, u, nil, false) {
430+
if !createUserInContext(ctx, tplSignUpOID, form, u, nil, nil, false) {
432431
// error already handled
433432
return
434433
}

services/auth/reverseproxy.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
user_model "code.gitea.io/gitea/models/user"
1313
"code.gitea.io/gitea/modules/log"
1414
"code.gitea.io/gitea/modules/setting"
15+
"code.gitea.io/gitea/modules/util"
1516
"code.gitea.io/gitea/modules/web/middleware"
1617
"code.gitea.io/gitea/services/mailer"
1718

@@ -105,11 +106,15 @@ func (r *ReverseProxy) newUser(req *http.Request) *user_model.User {
105106
}
106107

107108
user := &user_model.User{
108-
Name: username,
109-
Email: email,
110-
IsActive: true,
109+
Name: username,
110+
Email: email,
111111
}
112-
if err := user_model.CreateUser(user); err != nil {
112+
113+
overwriteDefault := user_model.CreateUserOverwriteOptions{
114+
IsActive: util.OptionalBoolTrue,
115+
}
116+
117+
if err := user_model.CreateUser(user, &overwriteDefault); err != nil {
113118
// FIXME: should I create a system notice?
114119
log.Error("CreateUser: %v", err)
115120
return nil

services/auth/source/ldap/source_authenticate.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"code.gitea.io/gitea/models/db"
1414
"code.gitea.io/gitea/models/organization"
1515
user_model "code.gitea.io/gitea/models/user"
16+
"code.gitea.io/gitea/modules/util"
1617
"code.gitea.io/gitea/services/mailer"
1718
user_service "code.gitea.io/gitea/services/user"
1819
)
@@ -85,19 +86,21 @@ func (source *Source) Authenticate(user *user_model.User, userName, password str
8586
}
8687

8788
user = &user_model.User{
88-
LowerName: strings.ToLower(sr.Username),
89-
Name: sr.Username,
90-
FullName: composeFullName(sr.Name, sr.Surname, sr.Username),
91-
Email: sr.Mail,
92-
LoginType: source.authSource.Type,
93-
LoginSource: source.authSource.ID,
94-
LoginName: userName,
95-
IsActive: true,
96-
IsAdmin: sr.IsAdmin,
97-
IsRestricted: sr.IsRestricted,
89+
LowerName: strings.ToLower(sr.Username),
90+
Name: sr.Username,
91+
FullName: composeFullName(sr.Name, sr.Surname, sr.Username),
92+
Email: sr.Mail,
93+
LoginType: source.authSource.Type,
94+
LoginSource: source.authSource.ID,
95+
LoginName: userName,
96+
IsAdmin: sr.IsAdmin,
97+
}
98+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
99+
IsRestricted: util.OptionalBoolOf(sr.IsRestricted),
100+
IsActive: util.OptionalBoolTrue,
98101
}
99102

100-
err := user_model.CreateUser(user)
103+
err := user_model.CreateUser(user, overwriteDefault)
101104
if err != nil {
102105
return user, err
103106
}

services/auth/source/ldap/source_sync.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"code.gitea.io/gitea/models/organization"
1616
user_model "code.gitea.io/gitea/models/user"
1717
"code.gitea.io/gitea/modules/log"
18+
"code.gitea.io/gitea/modules/util"
1819
user_service "code.gitea.io/gitea/services/user"
1920
)
2021

@@ -102,19 +103,21 @@ func (source *Source) Sync(ctx context.Context, updateExisting bool) error {
102103
log.Trace("SyncExternalUsers[%s]: Creating user %s", source.authSource.Name, su.Username)
103104

104105
usr = &user_model.User{
105-
LowerName: su.LowerName,
106-
Name: su.Username,
107-
FullName: fullName,
108-
LoginType: source.authSource.Type,
109-
LoginSource: source.authSource.ID,
110-
LoginName: su.Username,
111-
Email: su.Mail,
112-
IsAdmin: su.IsAdmin,
113-
IsRestricted: su.IsRestricted,
114-
IsActive: true,
106+
LowerName: su.LowerName,
107+
Name: su.Username,
108+
FullName: fullName,
109+
LoginType: source.authSource.Type,
110+
LoginSource: source.authSource.ID,
111+
LoginName: su.Username,
112+
Email: su.Mail,
113+
IsAdmin: su.IsAdmin,
114+
}
115+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
116+
IsRestricted: util.OptionalBoolOf(su.IsRestricted),
117+
IsActive: util.OptionalBoolTrue,
115118
}
116119

117-
err = user_model.CreateUser(usr)
120+
err = user_model.CreateUser(usr, overwriteDefault)
118121

119122
if err != nil {
120123
log.Error("SyncExternalUsers[%s]: Error creating user %s: %v", source.authSource.Name, su.Username, err)

services/auth/source/pam/source_authenticate.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
user_model "code.gitea.io/gitea/models/user"
1313
"code.gitea.io/gitea/modules/auth/pam"
1414
"code.gitea.io/gitea/modules/setting"
15+
"code.gitea.io/gitea/modules/util"
1516
"code.gitea.io/gitea/services/mailer"
1617

1718
"github.com/google/uuid"
@@ -58,10 +59,12 @@ func (source *Source) Authenticate(user *user_model.User, userName, password str
5859
LoginType: auth.PAM,
5960
LoginSource: source.authSource.ID,
6061
LoginName: userName, // This is what the user typed in
61-
IsActive: true,
62+
}
63+
overwriteDefault := &user_model.CreateUserOverwriteOptions{
64+
IsActive: util.OptionalBoolTrue,
6265
}
6366

64-
if err := user_model.CreateUser(user); err != nil {
67+
if err := user_model.CreateUser(user, overwriteDefault); err != nil {
6568
return user, err
6669
}
6770

0 commit comments

Comments
 (0)