aboutsummaryrefslogtreecommitdiffstats
path: root/modules/password
diff options
context:
space:
mode:
Diffstat (limited to 'modules/password')
-rw-r--r--modules/password/password.go9
-rw-r--r--modules/password/pwn.go30
2 files changed, 37 insertions, 2 deletions
diff --git a/modules/password/password.go b/modules/password/password.go
index 1c4b9c514a..e1f1f769ec 100644
--- a/modules/password/password.go
+++ b/modules/password/password.go
@@ -6,6 +6,7 @@ package password
import (
"bytes"
+ goContext "context"
"crypto/rand"
"math/big"
"strings"
@@ -88,7 +89,7 @@ func IsComplexEnough(pwd string) bool {
return true
}
-// Generate a random password
+// Generate a random password
func Generate(n int) (string, error) {
NewComplexity()
buffer := make([]byte, n)
@@ -101,7 +102,11 @@ func Generate(n int) (string, error) {
}
buffer[j] = validChars[rnd.Int64()]
}
- if IsComplexEnough(string(buffer)) && string(buffer[0]) != " " && string(buffer[n-1]) != " " {
+ pwned, err := IsPwned(goContext.Background(), string(buffer))
+ if err != nil {
+ return "", err
+ }
+ if IsComplexEnough(string(buffer)) && !pwned && string(buffer[0]) != " " && string(buffer[n-1]) != " " {
return string(buffer), nil
}
}
diff --git a/modules/password/pwn.go b/modules/password/pwn.go
new file mode 100644
index 0000000000..938524e6de
--- /dev/null
+++ b/modules/password/pwn.go
@@ -0,0 +1,30 @@
+// Copyright 2020 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.
+
+package password
+
+import (
+ "context"
+
+ "code.gitea.io/gitea/modules/setting"
+
+ "go.jolheiser.com/pwn"
+)
+
+// IsPwned checks whether a password has been pwned
+// NOTE: This func returns true if it encounters an error under the assumption that you ALWAYS want to check against
+// HIBP, so not getting a response should block a password until it can be verified.
+func IsPwned(ctx context.Context, password string) (bool, error) {
+ if !setting.PasswordCheckPwn {
+ return false, nil
+ }
+
+ client := pwn.New(pwn.WithContext(ctx))
+ count, err := client.CheckPassword(password, true)
+ if err != nil {
+ return true, err
+ }
+
+ return count > 0, nil
+}