summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorLanre Adelowo <adelowomailbox@gmail.com>2018-11-15 02:00:04 +0100
committertechknowlogick <hello@techknowlogick.com>2018-11-14 20:00:04 -0500
commitb97af15de67b04fd259bd70a4abbc873f12e9491 (patch)
tree9a88d821a0ec98edc6dba64804ca6d0692df91fe /modules
parent4c1f1f96465e809161f7d634a07eb60b4511db35 (diff)
downloadgitea-b97af15de67b04fd259bd70a4abbc873f12e9491.tar.gz
gitea-b97af15de67b04fd259bd70a4abbc873f12e9491.zip
Block registration based on email domain (#5157)
* implement email domain whitelist
Diffstat (limited to 'modules')
-rw-r--r--modules/auth/user_form.go29
-rw-r--r--modules/auth/user_form_test.go64
-rw-r--r--modules/setting/setting.go2
3 files changed, 95 insertions, 0 deletions
diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go
index 43ddb29c76..c281672fe1 100644
--- a/modules/auth/user_form.go
+++ b/modules/auth/user_form.go
@@ -1,4 +1,5 @@
// Copyright 2014 The Gogs Authors. All rights reserved.
+// Copyright 2018 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
@@ -6,6 +7,9 @@ package auth
import (
"mime/multipart"
+ "strings"
+
+ "code.gitea.io/gitea/modules/setting"
"github.com/go-macaron/binding"
"gopkg.in/macaron.v1"
@@ -84,6 +88,31 @@ func (f *RegisterForm) Validate(ctx *macaron.Context, errs binding.Errors) bindi
return validate(errs, ctx.Data, f, ctx.Locale)
}
+// IsEmailDomainWhitelisted validates that the email address
+// provided by the user matches what has been configured .
+// If the domain whitelist from the config is empty, it marks the
+// email as whitelisted
+func (f RegisterForm) IsEmailDomainWhitelisted() bool {
+ if len(setting.Service.EmailDomainWhitelist) == 0 {
+ return true
+ }
+
+ n := strings.LastIndex(f.Email, "@")
+ if n <= 0 {
+ return false
+ }
+
+ domain := strings.ToLower(f.Email[n+1:])
+
+ for _, v := range setting.Service.EmailDomainWhitelist {
+ if strings.ToLower(v) == domain {
+ return true
+ }
+ }
+
+ return false
+}
+
// MustChangePasswordForm form for updating your password after account creation
// by an admin
type MustChangePasswordForm struct {
diff --git a/modules/auth/user_form_test.go b/modules/auth/user_form_test.go
new file mode 100644
index 0000000000..084174622e
--- /dev/null
+++ b/modules/auth/user_form_test.go
@@ -0,0 +1,64 @@
+// Copyright 2018 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package auth
+
+import (
+ "testing"
+
+ "code.gitea.io/gitea/modules/setting"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestRegisterForm_IsDomainWhiteList_Empty(t *testing.T) {
+ _ = setting.Service
+
+ setting.Service.EmailDomainWhitelist = []string{}
+
+ form := RegisterForm{}
+
+ assert.True(t, form.IsEmailDomainWhitelisted())
+}
+
+func TestRegisterForm_IsDomainWhiteList_InvalidEmail(t *testing.T) {
+ _ = setting.Service
+
+ setting.Service.EmailDomainWhitelist = []string{"gitea.io"}
+
+ tt := []struct {
+ email string
+ }{
+ {"securitygieqqq"},
+ {"hdudhdd"},
+ }
+
+ for _, v := range tt {
+ form := RegisterForm{Email: v.email}
+
+ assert.False(t, form.IsEmailDomainWhitelisted())
+ }
+}
+
+func TestRegisterForm_IsDomainWhiteList_ValidEmail(t *testing.T) {
+ _ = setting.Service
+
+ setting.Service.EmailDomainWhitelist = []string{"gitea.io"}
+
+ tt := []struct {
+ email string
+ valid bool
+ }{
+ {"security@gitea.io", true},
+ {"security@gITea.io", true},
+ {"hdudhdd", false},
+ {"seee@example.com", false},
+ }
+
+ for _, v := range tt {
+ form := RegisterForm{Email: v.email}
+
+ assert.Equal(t, v.valid, form.IsEmailDomainWhitelisted())
+ }
+}
diff --git a/modules/setting/setting.go b/modules/setting/setting.go
index b31162c140..b0bcd2ead8 100644
--- a/modules/setting/setting.go
+++ b/modules/setting/setting.go
@@ -1215,6 +1215,7 @@ var Service struct {
ActiveCodeLives int
ResetPwdCodeLives int
RegisterEmailConfirm bool
+ EmailDomainWhitelist []string
DisableRegistration bool
AllowOnlyExternalRegistration bool
ShowRegistrationButton bool
@@ -1248,6 +1249,7 @@ func newService() {
Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180)
Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool()
Service.AllowOnlyExternalRegistration = sec.Key("ALLOW_ONLY_EXTERNAL_REGISTRATION").MustBool()
+ Service.EmailDomainWhitelist = sec.Key("EMAIL_DOMAIN_WHITELIST").Strings(",")
Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!(Service.DisableRegistration || Service.AllowOnlyExternalRegistration))
Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool()
Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool()