You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

signin.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package auth
  4. import (
  5. "strings"
  6. "code.gitea.io/gitea/models/auth"
  7. "code.gitea.io/gitea/models/db"
  8. user_model "code.gitea.io/gitea/models/user"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/services/auth/source/oauth2"
  11. "code.gitea.io/gitea/services/auth/source/smtp"
  12. _ "code.gitea.io/gitea/services/auth/source/db" // register the sources (and below)
  13. _ "code.gitea.io/gitea/services/auth/source/ldap" // register the ldap source
  14. _ "code.gitea.io/gitea/services/auth/source/pam" // register the pam source
  15. _ "code.gitea.io/gitea/services/auth/source/sspi" // register the sspi source
  16. )
  17. // UserSignIn validates user name and password.
  18. func UserSignIn(username, password string) (*user_model.User, *auth.Source, error) {
  19. var user *user_model.User
  20. isEmail := false
  21. if strings.Contains(username, "@") {
  22. isEmail = true
  23. emailAddress := user_model.EmailAddress{LowerEmail: strings.ToLower(strings.TrimSpace(username))}
  24. // check same email
  25. has, err := db.GetEngine(db.DefaultContext).Get(&emailAddress)
  26. if err != nil {
  27. return nil, nil, err
  28. }
  29. if has {
  30. if !emailAddress.IsActivated {
  31. return nil, nil, user_model.ErrEmailAddressNotExist{
  32. Email: username,
  33. }
  34. }
  35. user = &user_model.User{ID: emailAddress.UID}
  36. }
  37. } else {
  38. trimmedUsername := strings.TrimSpace(username)
  39. if len(trimmedUsername) == 0 {
  40. return nil, nil, user_model.ErrUserNotExist{Name: username}
  41. }
  42. user = &user_model.User{LowerName: strings.ToLower(trimmedUsername)}
  43. }
  44. if user != nil {
  45. hasUser, err := user_model.GetUser(user)
  46. if err != nil {
  47. return nil, nil, err
  48. }
  49. if hasUser {
  50. source, err := auth.GetSourceByID(user.LoginSource)
  51. if err != nil {
  52. return nil, nil, err
  53. }
  54. if !source.IsActive {
  55. return nil, nil, oauth2.ErrAuthSourceNotActivated
  56. }
  57. authenticator, ok := source.Cfg.(PasswordAuthenticator)
  58. if !ok {
  59. return nil, nil, smtp.ErrUnsupportedLoginType
  60. }
  61. user, err := authenticator.Authenticate(user, user.LoginName, password)
  62. if err != nil {
  63. return nil, nil, err
  64. }
  65. // WARN: DON'T check user.IsActive, that will be checked on reqSign so that
  66. // user could be hint to resend confirm email.
  67. if user.ProhibitLogin {
  68. return nil, nil, user_model.ErrUserProhibitLogin{UID: user.ID, Name: user.Name}
  69. }
  70. return user, source, nil
  71. }
  72. }
  73. sources, err := auth.AllActiveSources()
  74. if err != nil {
  75. return nil, nil, err
  76. }
  77. for _, source := range sources {
  78. if !source.IsActive {
  79. // don't try to authenticate non-active sources
  80. continue
  81. }
  82. authenticator, ok := source.Cfg.(PasswordAuthenticator)
  83. if !ok {
  84. continue
  85. }
  86. authUser, err := authenticator.Authenticate(nil, username, password)
  87. if err == nil {
  88. if !authUser.ProhibitLogin {
  89. return authUser, source, nil
  90. }
  91. err = user_model.ErrUserProhibitLogin{UID: authUser.ID, Name: authUser.Name}
  92. }
  93. if user_model.IsErrUserNotExist(err) {
  94. log.Debug("Failed to login '%s' via '%s': %v", username, source.Name, err)
  95. } else {
  96. log.Warn("Failed to login '%s' via '%s': %v", username, source.Name, err)
  97. }
  98. }
  99. if isEmail {
  100. return nil, nil, user_model.ErrEmailAddressNotExist{Email: username}
  101. }
  102. return nil, nil, user_model.ErrUserNotExist{Name: username}
  103. }