gitea源码

user.go 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package externalaccount
  4. import (
  5. "context"
  6. "strconv"
  7. "strings"
  8. issues_model "code.gitea.io/gitea/models/issues"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/structs"
  12. "github.com/markbates/goth"
  13. )
  14. func toExternalLoginUser(authSourceID int64, user *user_model.User, gothUser goth.User) *user_model.ExternalLoginUser {
  15. return &user_model.ExternalLoginUser{
  16. ExternalID: gothUser.UserID,
  17. UserID: user.ID,
  18. LoginSourceID: authSourceID,
  19. RawData: gothUser.RawData,
  20. Provider: gothUser.Provider,
  21. Email: gothUser.Email,
  22. Name: gothUser.Name,
  23. FirstName: gothUser.FirstName,
  24. LastName: gothUser.LastName,
  25. NickName: gothUser.NickName,
  26. Description: gothUser.Description,
  27. AvatarURL: gothUser.AvatarURL,
  28. Location: gothUser.Location,
  29. AccessToken: gothUser.AccessToken,
  30. AccessTokenSecret: gothUser.AccessTokenSecret,
  31. RefreshToken: gothUser.RefreshToken,
  32. ExpiresAt: gothUser.ExpiresAt,
  33. }
  34. }
  35. // LinkAccountToUser link the gothUser to the user
  36. func LinkAccountToUser(ctx context.Context, authSourceID int64, user *user_model.User, gothUser goth.User) error {
  37. externalLoginUser := toExternalLoginUser(authSourceID, user, gothUser)
  38. if err := user_model.LinkExternalToUser(ctx, user, externalLoginUser); err != nil {
  39. return err
  40. }
  41. externalID := externalLoginUser.ExternalID
  42. var tp structs.GitServiceType
  43. for _, s := range structs.SupportedFullGitService {
  44. if strings.EqualFold(s.Name(), gothUser.Provider) {
  45. tp = s
  46. break
  47. }
  48. }
  49. if tp.Name() != "" {
  50. return UpdateMigrationsByType(ctx, tp, externalID, user.ID)
  51. }
  52. return nil
  53. }
  54. // EnsureLinkExternalToUser link the gothUser to the user
  55. func EnsureLinkExternalToUser(ctx context.Context, authSourceID int64, user *user_model.User, gothUser goth.User) error {
  56. externalLoginUser := toExternalLoginUser(authSourceID, user, gothUser)
  57. return user_model.EnsureLinkExternalToUser(ctx, externalLoginUser)
  58. }
  59. // UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID
  60. func UpdateMigrationsByType(ctx context.Context, tp structs.GitServiceType, externalUserID string, userID int64) error {
  61. // Skip update if externalUserID is not a valid numeric ID or exceeds int64
  62. if _, err := strconv.ParseInt(externalUserID, 10, 64); err != nil {
  63. return nil
  64. }
  65. if err := issues_model.UpdateIssuesMigrationsByType(ctx, tp, externalUserID, userID); err != nil {
  66. return err
  67. }
  68. if err := issues_model.UpdateCommentsMigrationsByType(ctx, tp, externalUserID, userID); err != nil {
  69. return err
  70. }
  71. if err := repo_model.UpdateReleasesMigrationsByType(ctx, tp, externalUserID, userID); err != nil {
  72. return err
  73. }
  74. if err := issues_model.UpdateReactionsMigrationsByType(ctx, tp, externalUserID, userID); err != nil {
  75. return err
  76. }
  77. return issues_model.UpdateReviewsMigrationsByType(ctx, tp, externalUserID, userID)
  78. }