gitea源码

pwn.go 1.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package password
  4. import (
  5. "context"
  6. "errors"
  7. "fmt"
  8. "code.gitea.io/gitea/modules/auth/password/pwn"
  9. "code.gitea.io/gitea/modules/setting"
  10. )
  11. var ErrIsPwned = errors.New("password has been pwned")
  12. type ErrIsPwnedRequest struct {
  13. err error
  14. }
  15. func IsErrIsPwnedRequest(err error) bool {
  16. _, ok := err.(ErrIsPwnedRequest)
  17. return ok
  18. }
  19. func (err ErrIsPwnedRequest) Error() string {
  20. return fmt.Sprintf("using Have-I-Been-Pwned service failed: %v", err.err)
  21. }
  22. func (err ErrIsPwnedRequest) Unwrap() error {
  23. return err.err
  24. }
  25. // IsPwned checks whether a password has been pwned
  26. // If a password has not been pwned, no error is returned.
  27. func IsPwned(ctx context.Context, password string) error {
  28. if !setting.PasswordCheckPwn {
  29. return nil
  30. }
  31. client := pwn.New(pwn.WithContext(ctx))
  32. count, err := client.CheckPassword(password, true)
  33. if err != nil {
  34. return ErrIsPwnedRequest{err}
  35. }
  36. if count > 0 {
  37. return ErrIsPwned
  38. }
  39. return nil
  40. }