auth.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package login
  2. import (
  3. "errors"
  4. "github.com/grafana/grafana/pkg/bus"
  5. "github.com/grafana/grafana/pkg/models"
  6. "github.com/grafana/grafana/pkg/services/ldap"
  7. )
  8. var (
  9. ErrEmailNotAllowed = errors.New("Required email domain not fulfilled")
  10. ErrInvalidCredentials = errors.New("Invalid Username or Password")
  11. ErrNoEmail = errors.New("Login provider didn't return an email address")
  12. ErrProviderDeniedRequest = errors.New("Login provider denied login request")
  13. ErrSignUpNotAllowed = errors.New("Signup is not allowed for this adapter")
  14. ErrTooManyLoginAttempts = errors.New("Too many consecutive incorrect login attempts for user. Login for user temporarily blocked")
  15. ErrPasswordEmpty = errors.New("No password provided")
  16. ErrUserDisabled = errors.New("User is disabled")
  17. )
  18. func Init() {
  19. bus.AddHandler("auth", AuthenticateUser)
  20. }
  21. // AuthenticateUser authenticates the user via username & password
  22. func AuthenticateUser(query *models.LoginUserQuery) error {
  23. if err := validateLoginAttempts(query.Username); err != nil {
  24. return err
  25. }
  26. if err := validatePasswordSet(query.Password); err != nil {
  27. return err
  28. }
  29. err := loginUsingGrafanaDB(query)
  30. if err == nil || (err != models.ErrUserNotFound && err != ErrInvalidCredentials && err != ErrUserDisabled) {
  31. return err
  32. }
  33. ldapEnabled, ldapErr := loginUsingLDAP(query)
  34. if ldapEnabled {
  35. if ldapErr == nil || ldapErr != ldap.ErrInvalidCredentials {
  36. return ldapErr
  37. }
  38. if err != ErrUserDisabled || ldapErr != ldap.ErrInvalidCredentials {
  39. err = ldapErr
  40. }
  41. }
  42. if err == ErrInvalidCredentials || err == ldap.ErrInvalidCredentials {
  43. saveInvalidLoginAttempt(query)
  44. return ErrInvalidCredentials
  45. }
  46. if err == models.ErrUserNotFound {
  47. return ErrInvalidCredentials
  48. }
  49. return err
  50. }
  51. func validatePasswordSet(password string) error {
  52. if len(password) == 0 {
  53. return ErrPasswordEmpty
  54. }
  55. return nil
  56. }