2019-10-14 09:10:42 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-10-14 09:10:42 +03:00
package externalaccount
import (
2023-09-25 16:17:37 +03:00
"context"
2019-10-14 09:10:42 +03:00
"strings"
2022-01-02 16:12:35 +03:00
"code.gitea.io/gitea/models/auth"
2023-09-09 00:09:23 +03:00
issues_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-10-14 09:10:42 +03:00
"code.gitea.io/gitea/modules/structs"
"github.com/markbates/goth"
)
2024-02-23 03:08:17 +03:00
func toExternalLoginUser ( ctx context . Context , user * user_model . User , gothUser goth . User , authType auth . Type ) ( * user_model . ExternalLoginUser , error ) {
authSource , err := auth . GetActiveAuthSourceByName ( ctx , gothUser . Provider , authType )
2019-10-14 09:10:42 +03:00
if err != nil {
2021-12-14 11:37:11 +03:00
return nil , err
2019-10-14 09:10:42 +03:00
}
2021-12-14 11:37:11 +03:00
return & user_model . ExternalLoginUser {
2019-10-14 09:10:42 +03:00
ExternalID : gothUser . UserID ,
UserID : user . ID ,
2022-01-02 16:12:35 +03:00
LoginSourceID : authSource . ID ,
2019-10-14 09:10:42 +03:00
RawData : gothUser . RawData ,
Provider : gothUser . Provider ,
Email : gothUser . Email ,
Name : gothUser . Name ,
FirstName : gothUser . FirstName ,
LastName : gothUser . LastName ,
NickName : gothUser . NickName ,
Description : gothUser . Description ,
AvatarURL : gothUser . AvatarURL ,
Location : gothUser . Location ,
AccessToken : gothUser . AccessToken ,
AccessTokenSecret : gothUser . AccessTokenSecret ,
RefreshToken : gothUser . RefreshToken ,
ExpiresAt : gothUser . ExpiresAt ,
2021-12-14 11:37:11 +03:00
} , nil
}
// LinkAccountToUser link the gothUser to the user
2024-02-23 03:08:17 +03:00
func LinkAccountToUser ( ctx context . Context , user * user_model . User , gothUser goth . User , authType auth . Type ) error {
externalLoginUser , err := toExternalLoginUser ( ctx , user , gothUser , authType )
2021-12-14 11:37:11 +03:00
if err != nil {
return err
2019-10-14 09:10:42 +03:00
}
2023-10-14 11:37:24 +03:00
if err := user_model . LinkExternalToUser ( ctx , user , externalLoginUser ) ; err != nil {
2019-10-14 09:10:42 +03:00
return err
}
2019-10-17 05:06:28 +03:00
externalID := externalLoginUser . ExternalID
2019-10-14 09:10:42 +03:00
var tp structs . GitServiceType
for _ , s := range structs . SupportedFullGitService {
if strings . EqualFold ( s . Name ( ) , gothUser . Provider ) {
tp = s
break
}
}
if tp . Name ( ) != "" {
2023-09-25 16:17:37 +03:00
return UpdateMigrationsByType ( ctx , tp , externalID , user . ID )
2019-10-14 09:10:42 +03:00
}
return nil
}
2021-12-14 11:37:11 +03:00
// UpdateExternalUser updates external user's information
2024-02-23 03:08:17 +03:00
func UpdateExternalUser ( ctx context . Context , user * user_model . User , gothUser goth . User , authType auth . Type ) error {
externalLoginUser , err := toExternalLoginUser ( ctx , user , gothUser , authType )
2021-12-14 11:37:11 +03:00
if err != nil {
return err
}
2023-10-14 11:37:24 +03:00
return user_model . UpdateExternalUserByExternalID ( ctx , externalLoginUser )
2021-12-14 11:37:11 +03:00
}
2023-09-09 00:09:23 +03:00
// UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID
2023-09-25 16:17:37 +03:00
func UpdateMigrationsByType ( ctx context . Context , tp structs . GitServiceType , externalUserID string , userID int64 ) error {
2023-09-29 15:12:54 +03:00
if err := issues_model . UpdateIssuesMigrationsByType ( ctx , tp , externalUserID , userID ) ; err != nil {
2023-09-09 00:09:23 +03:00
return err
}
2023-09-29 15:12:54 +03:00
if err := issues_model . UpdateCommentsMigrationsByType ( ctx , tp , externalUserID , userID ) ; err != nil {
2023-09-09 00:09:23 +03:00
return err
}
2023-09-25 16:17:37 +03:00
if err := repo_model . UpdateReleasesMigrationsByType ( ctx , tp , externalUserID , userID ) ; err != nil {
2023-09-09 00:09:23 +03:00
return err
}
2023-09-29 15:12:54 +03:00
if err := issues_model . UpdateReactionsMigrationsByType ( ctx , tp , externalUserID , userID ) ; err != nil {
2023-09-09 00:09:23 +03:00
return err
}
2023-09-29 15:12:54 +03:00
return issues_model . UpdateReviewsMigrationsByType ( ctx , tp , externalUserID , userID )
2023-09-09 00:09:23 +03:00
}