summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2021-06-27 20:47:35 +0200
committerGitHub <noreply@github.com>2021-06-27 19:47:35 +0100
commit0b27b93728fd3cf2ecc82ac6a2b5859270543ef2 (patch)
treeadbbc5eaec25e5e2c88068d45e3fa75435431dfe /models
parent2a98ec1c3cd2f8396f3b5148fc8c796802f9c236 (diff)
downloadgitea-0b27b93728fd3cf2ecc82ac6a2b5859270543ef2.tar.gz
gitea-0b27b93728fd3cf2ecc82ac6a2b5859270543ef2.zip
Make allowed Visiblity modes configurable for Users (#16271)
Now that #16069 is merged, some sites may wish to enforce that users are all public, limited or private, and/or disallow users from becoming private. This PR adds functionality and settings to constrain a user's ability to change their visibility. Co-authored-by: zeripath <art27@cantab.net>
Diffstat (limited to 'models')
-rw-r--r--models/user.go64
-rw-r--r--models/user_test.go22
2 files changed, 64 insertions, 22 deletions
diff --git a/models/user.go b/models/user.go
index 221c840a7f..47d24aefd6 100644
--- a/models/user.go
+++ b/models/user.go
@@ -863,26 +863,36 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e
return err
}
+ // set system defaults
+ u.KeepEmailPrivate = setting.Service.DefaultKeepEmailPrivate
+ u.Visibility = setting.Service.DefaultUserVisibilityMode
+ u.AllowCreateOrganization = setting.Service.DefaultAllowCreateOrganization && !setting.Admin.DisableRegularOrgCreation
+ u.EmailNotificationsPreference = setting.Admin.DefaultEmailNotification
+ u.MaxRepoCreation = -1
+ u.Theme = setting.UI.DefaultTheme
+
+ // overwrite defaults if set
+ if len(overwriteDefault) != 0 && overwriteDefault[0] != nil {
+ u.Visibility = overwriteDefault[0].Visibility
+ }
+
sess := x.NewSession()
defer sess.Close()
if err = sess.Begin(); err != nil {
return err
}
- isExist, err := isUserExist(sess, 0, u.Name)
- if err != nil {
- return err
- } else if isExist {
- return ErrUserAlreadyExist{u.Name}
- }
+ // validate data
- if err = deleteUserRedirect(sess, u.Name); err != nil {
+ if err := validateUser(u); err != nil {
return err
}
- u.Email = strings.ToLower(u.Email)
- if err = ValidateEmail(u.Email); err != nil {
+ isExist, err := isUserExist(sess, 0, u.Name)
+ if err != nil {
return err
+ } else if isExist {
+ return ErrUserAlreadyExist{u.Name}
}
isExist, err = isEmailUsed(sess, u.Email)
@@ -892,6 +902,8 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e
return ErrEmailAlreadyUsed{u.Email}
}
+ // prepare for database
+
u.LowerName = strings.ToLower(u.Name)
u.AvatarEmail = u.Email
if u.Rands, err = GetUserSalt(); err != nil {
@@ -901,16 +913,10 @@ func CreateUser(u *User, overwriteDefault ...*CreateUserOverwriteOptions) (err e
return err
}
- // set system defaults
- u.KeepEmailPrivate = setting.Service.DefaultKeepEmailPrivate
- u.Visibility = setting.Service.DefaultUserVisibilityMode
- u.AllowCreateOrganization = setting.Service.DefaultAllowCreateOrganization && !setting.Admin.DisableRegularOrgCreation
- u.EmailNotificationsPreference = setting.Admin.DefaultEmailNotification
- u.MaxRepoCreation = -1
- u.Theme = setting.UI.DefaultTheme
- // overwrite defaults if set
- if len(overwriteDefault) != 0 && overwriteDefault[0] != nil {
- u.Visibility = overwriteDefault[0].Visibility
+ // save changes to database
+
+ if err = deleteUserRedirect(sess, u.Name); err != nil {
+ return err
}
if _, err = sess.Insert(u); err != nil {
@@ -1056,12 +1062,22 @@ func checkDupEmail(e Engine, u *User) error {
return nil
}
-func updateUser(e Engine, u *User) (err error) {
+// validateUser check if user is valide to insert / update into database
+func validateUser(u *User) error {
+ if !setting.Service.AllowedUserVisibilityModesSlice.IsAllowedVisibility(u.Visibility) {
+ return fmt.Errorf("visibility Mode not allowed: %s", u.Visibility.String())
+ }
+
u.Email = strings.ToLower(u.Email)
- if err = ValidateEmail(u.Email); err != nil {
+ return ValidateEmail(u.Email)
+}
+
+func updateUser(e Engine, u *User) error {
+ if err := validateUser(u); err != nil {
return err
}
- _, err = e.ID(u.ID).AllCols().Update(u)
+
+ _, err := e.ID(u.ID).AllCols().Update(u)
return err
}
@@ -1076,6 +1092,10 @@ func UpdateUserCols(u *User, cols ...string) error {
}
func updateUserCols(e Engine, u *User, cols ...string) error {
+ if err := validateUser(u); err != nil {
+ return err
+ }
+
_, err := e.ID(u.ID).Cols(cols...).Update(u)
return err
}
diff --git a/models/user_test.go b/models/user_test.go
index 39a1b3c989..34c465c586 100644
--- a/models/user_test.go
+++ b/models/user_test.go
@@ -11,6 +11,7 @@ import (
"testing"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
"github.com/stretchr/testify/assert"
@@ -189,6 +190,7 @@ func TestDeleteUser(t *testing.T) {
func TestEmailNotificationPreferences(t *testing.T) {
assert.NoError(t, PrepareTestDatabase())
+
for _, test := range []struct {
expected string
userID int64
@@ -467,3 +469,23 @@ ssh-dss AAAAB3NzaC1kc3MAAACBAOChCC7lf6Uo9n7BmZ6M8St19PZf4Tn59NriyboW2x/DZuYAz3ib
}
}
}
+
+func TestUpdateUser(t *testing.T) {
+ assert.NoError(t, PrepareTestDatabase())
+ user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+
+ user.KeepActivityPrivate = true
+ assert.NoError(t, UpdateUser(user))
+ user = AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ assert.True(t, user.KeepActivityPrivate)
+
+ setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, false}
+ user.KeepActivityPrivate = false
+ user.Visibility = structs.VisibleTypePrivate
+ assert.Error(t, UpdateUser(user))
+ user = AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
+ assert.True(t, user.KeepActivityPrivate)
+
+ user.Email = "no mail@mail.org"
+ assert.Error(t, UpdateUser(user))
+}