gitea源码

source_authenticate.go 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package ldap
  4. import (
  5. "context"
  6. "strings"
  7. asymkey_model "code.gitea.io/gitea/models/asymkey"
  8. "code.gitea.io/gitea/models/auth"
  9. user_model "code.gitea.io/gitea/models/user"
  10. auth_module "code.gitea.io/gitea/modules/auth"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/optional"
  13. asymkey_service "code.gitea.io/gitea/services/asymkey"
  14. source_service "code.gitea.io/gitea/services/auth/source"
  15. user_service "code.gitea.io/gitea/services/user"
  16. )
  17. // Authenticate queries if login/password is valid against the LDAP directory pool,
  18. // and create a local user if success when enabled.
  19. func (source *Source) Authenticate(ctx context.Context, user *user_model.User, userName, password string) (*user_model.User, error) {
  20. loginName := userName
  21. if user != nil {
  22. loginName = user.LoginName
  23. }
  24. sr := source.SearchEntry(loginName, password, source.AuthSource.Type == auth.DLDAP)
  25. if sr == nil {
  26. // User not in LDAP, do nothing
  27. return nil, user_model.ErrUserNotExist{Name: loginName}
  28. }
  29. // Fallback.
  30. // FIXME: this fallback would cause problems when the "Username" attribute is not set and a user inputs their email.
  31. // In this case, the email would be used as the username, and will cause the "CreateUser" failure for the first login.
  32. if sr.Username == "" {
  33. if strings.Contains(userName, "@") {
  34. log.Error("No username in search result (Username Attribute is not set properly?), using email as username might cause problems")
  35. }
  36. sr.Username = userName
  37. }
  38. if sr.Mail == "" {
  39. sr.Mail = sr.Username + "@localhost.local"
  40. }
  41. isAttributeSSHPublicKeySet := strings.TrimSpace(source.AttributeSSHPublicKey) != ""
  42. // Update User admin flag if exist
  43. if isExist, err := user_model.IsUserExist(ctx, 0, sr.Username); err != nil {
  44. return nil, err
  45. } else if isExist {
  46. if user == nil {
  47. user, err = user_model.GetUserByName(ctx, sr.Username)
  48. if err != nil {
  49. return nil, err
  50. }
  51. }
  52. if user != nil && !user.ProhibitLogin {
  53. opts := &user_service.UpdateOptions{}
  54. if source.AdminFilter != "" && user.IsAdmin != sr.IsAdmin {
  55. // Change existing admin flag only if AdminFilter option is set
  56. opts.IsAdmin = user_service.UpdateOptionFieldFromSync(sr.IsAdmin)
  57. }
  58. if !sr.IsAdmin && source.RestrictedFilter != "" && user.IsRestricted != sr.IsRestricted {
  59. // Change existing restricted flag only if RestrictedFilter option is set
  60. opts.IsRestricted = optional.Some(sr.IsRestricted)
  61. }
  62. if opts.IsAdmin.Has() || opts.IsRestricted.Has() {
  63. if err := user_service.UpdateUser(ctx, user, opts); err != nil {
  64. return nil, err
  65. }
  66. }
  67. }
  68. }
  69. if user != nil {
  70. if isAttributeSSHPublicKeySet && asymkey_model.SynchronizePublicKeys(ctx, user, source.AuthSource, sr.SSHPublicKey) {
  71. if err := asymkey_service.RewriteAllPublicKeys(ctx); err != nil {
  72. return user, err
  73. }
  74. }
  75. } else {
  76. user = &user_model.User{
  77. LowerName: strings.ToLower(sr.Username),
  78. Name: sr.Username,
  79. FullName: composeFullName(sr.Name, sr.Surname, sr.Username),
  80. Email: sr.Mail,
  81. LoginType: source.AuthSource.Type,
  82. LoginSource: source.AuthSource.ID,
  83. LoginName: userName,
  84. IsAdmin: sr.IsAdmin,
  85. }
  86. overwriteDefault := &user_model.CreateUserOverwriteOptions{
  87. IsRestricted: optional.Some(sr.IsRestricted),
  88. IsActive: optional.Some(true),
  89. }
  90. err := user_model.CreateUser(ctx, user, &user_model.Meta{}, overwriteDefault)
  91. if err != nil {
  92. return user, err
  93. }
  94. if isAttributeSSHPublicKeySet && asymkey_model.AddPublicKeysBySource(ctx, user, source.AuthSource, sr.SSHPublicKey) {
  95. if err := asymkey_service.RewriteAllPublicKeys(ctx); err != nil {
  96. return user, err
  97. }
  98. }
  99. if source.AttributeAvatar != "" {
  100. if err := user_service.UploadAvatar(ctx, user, sr.Avatar); err != nil {
  101. return user, err
  102. }
  103. }
  104. }
  105. if source.GroupsEnabled && (source.GroupTeamMap != "" || source.GroupTeamMapRemoval) {
  106. groupTeamMapping, err := auth_module.UnmarshalGroupTeamMapping(source.GroupTeamMap)
  107. if err != nil {
  108. return user, err
  109. }
  110. if err := source_service.SyncGroupsToTeams(ctx, user, sr.Groups, groupTeamMapping, source.GroupTeamMapRemoval); err != nil {
  111. return user, err
  112. }
  113. }
  114. return user, nil
  115. }