auth.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. ErrNoLDAPServers = errors.New("No LDAP servers are configured")
  11. ErrInvalidCredentials = errors.New("Invalid Username or Password")
  12. ErrNoEmail = errors.New("Login provider didn't return an email address")
  13. ErrProviderDeniedRequest = errors.New("Login provider denied login request")
  14. ErrSignUpNotAllowed = errors.New("Signup is not allowed for this adapter")
  15. ErrTooManyLoginAttempts = errors.New("Too many consecutive incorrect login attempts for user. Login for user temporarily blocked")
  16. ErrPasswordEmpty = errors.New("No password provided")
  17. ErrUsersQuotaReached = errors.New("Users quota reached")
  18. ErrGettingUserQuota = errors.New("Error getting user quota")
  19. ErrUserDisabled = errors.New("User is disabled")
  20. )
  21. func Init() {
  22. bus.AddHandler("auth", AuthenticateUser)
  23. }
  24. // AuthenticateUser authenticates the user via username & password
  25. func AuthenticateUser(query *models.LoginUserQuery) error {
  26. if err := validateLoginAttempts(query.Username); err != nil {
  27. return err
  28. }
  29. if err := validatePasswordSet(query.Password); err != nil {
  30. return err
  31. }
  32. err := loginUsingGrafanaDB(query)
  33. if err == nil || (err != models.ErrUserNotFound && err != ErrInvalidCredentials && err != ErrUserDisabled) {
  34. return err
  35. }
  36. ldapEnabled, ldapErr := loginUsingLDAP(query)
  37. if ldapEnabled {
  38. if ldapErr == nil || ldapErr != ldap.ErrInvalidCredentials {
  39. return ldapErr
  40. }
  41. if err != ErrUserDisabled || ldapErr != ldap.ErrInvalidCredentials {
  42. err = ldapErr
  43. }
  44. }
  45. if err == ErrInvalidCredentials || err == ldap.ErrInvalidCredentials {
  46. saveInvalidLoginAttempt(query)
  47. return ErrInvalidCredentials
  48. }
  49. if err == models.ErrUserNotFound {
  50. return ErrInvalidCredentials
  51. }
  52. return err
  53. }
  54. func validatePasswordSet(password string) error {
  55. if len(password) == 0 {
  56. return ErrPasswordEmpty
  57. }
  58. return nil
  59. }