44
55package models
66
7- import "github.com/markbates/goth"
7+ import (
8+ "time"
9+
10+ "code.gitea.io/gitea/modules/structs"
11+
12+ "github.com/markbates/goth"
13+ "xorm.io/builder"
14+ )
815
916// ExternalLoginUser makes the connecting between some existing user and additional external login sources
1017type ExternalLoginUser struct {
11- ExternalID string `xorm:"pk NOT NULL"`
12- UserID int64 `xorm:"INDEX NOT NULL"`
13- LoginSourceID int64 `xorm:"pk NOT NULL"`
18+ ExternalID string `xorm:"pk NOT NULL"`
19+ UserID int64 `xorm:"INDEX NOT NULL"`
20+ LoginSourceID int64 `xorm:"pk NOT NULL"`
21+ RawData map [string ]interface {} `xorm:"TEXT JSON"`
22+ Provider string `xorm:"index VARCHAR(25)"`
23+ Email string
24+ Name string
25+ FirstName string
26+ LastName string
27+ NickName string
28+ Description string
29+ AvatarURL string
30+ Location string
31+ AccessToken string
32+ AccessTokenSecret string
33+ RefreshToken string
34+ ExpiresAt time.Time
1435}
1536
1637// GetExternalLogin checks if a externalID in loginSourceID scope already exists
@@ -32,23 +53,15 @@ func ListAccountLinks(user *User) ([]*ExternalLoginUser, error) {
3253 return externalAccounts , nil
3354}
3455
35- // LinkAccountToUser link the gothUser to the user
36- func LinkAccountToUser (user * User , gothUser goth.User ) error {
37- loginSource , err := GetActiveOAuth2LoginSourceByName (gothUser .Provider )
38- if err != nil {
39- return err
40- }
41-
42- externalLoginUser := & ExternalLoginUser {
43- ExternalID : gothUser .UserID ,
44- UserID : user .ID ,
45- LoginSourceID : loginSource .ID ,
46- }
47- has , err := x .Get (externalLoginUser )
56+ // LinkExternalToUser link the external user to the user
57+ func LinkExternalToUser (user * User , externalLoginUser * ExternalLoginUser ) error {
58+ has , err := x .Where ("external_id=? AND login_source_id=?" , externalLoginUser .ExternalID , externalLoginUser .LoginSourceID ).
59+ NoAutoCondition ().
60+ Exist (externalLoginUser )
4861 if err != nil {
4962 return err
5063 } else if has {
51- return ErrExternalLoginUserAlreadyExist {gothUser . UserID , user .ID , loginSource . ID }
64+ return ErrExternalLoginUserAlreadyExist {externalLoginUser . ExternalID , user .ID , externalLoginUser . LoginSourceID }
5265 }
5366
5467 _ , err = x .Insert (externalLoginUser )
@@ -72,3 +85,97 @@ func removeAllAccountLinks(e Engine, user *User) error {
7285 _ , err := e .Delete (& ExternalLoginUser {UserID : user .ID })
7386 return err
7487}
88+
89+ // GetUserIDByExternalUserID get user id according to provider and userID
90+ func GetUserIDByExternalUserID (provider string , userID string ) (int64 , error ) {
91+ var id int64
92+ _ , err := x .Table ("external_login_user" ).
93+ Select ("user_id" ).
94+ Where ("provider=?" , provider ).
95+ And ("external_id=?" , userID ).
96+ Get (& id )
97+ if err != nil {
98+ return 0 , err
99+ }
100+ return id , nil
101+ }
102+
103+ // UpdateExternalUser updates external user's information
104+ func UpdateExternalUser (user * User , gothUser goth.User ) error {
105+ loginSource , err := GetActiveOAuth2LoginSourceByName (gothUser .Provider )
106+ if err != nil {
107+ return err
108+ }
109+ externalLoginUser := & ExternalLoginUser {
110+ ExternalID : gothUser .UserID ,
111+ UserID : user .ID ,
112+ LoginSourceID : loginSource .ID ,
113+ RawData : gothUser .RawData ,
114+ Provider : gothUser .Provider ,
115+ Email : gothUser .Email ,
116+ Name : gothUser .Name ,
117+ FirstName : gothUser .FirstName ,
118+ LastName : gothUser .LastName ,
119+ NickName : gothUser .NickName ,
120+ Description : gothUser .Description ,
121+ AvatarURL : gothUser .AvatarURL ,
122+ Location : gothUser .Location ,
123+ AccessToken : gothUser .AccessToken ,
124+ AccessTokenSecret : gothUser .AccessTokenSecret ,
125+ RefreshToken : gothUser .RefreshToken ,
126+ ExpiresAt : gothUser .ExpiresAt ,
127+ }
128+
129+ has , err := x .Where ("external_id=? AND login_source_id=?" , gothUser .UserID , loginSource .ID ).
130+ NoAutoCondition ().
131+ Exist (externalLoginUser )
132+ if err != nil {
133+ return err
134+ } else if ! has {
135+ return ErrExternalLoginUserNotExist {user .ID , loginSource .ID }
136+ }
137+
138+ _ , err = x .Where ("external_id=? AND login_source_id=?" , gothUser .UserID , loginSource .ID ).AllCols ().Update (externalLoginUser )
139+ return err
140+ }
141+
142+ // FindExternalUserOptions represents an options to find external users
143+ type FindExternalUserOptions struct {
144+ Provider string
145+ Limit int
146+ Start int
147+ }
148+
149+ func (opts FindExternalUserOptions ) toConds () builder.Cond {
150+ var cond = builder .NewCond ()
151+ if len (opts .Provider ) > 0 {
152+ cond = cond .And (builder.Eq {"provider" : opts .Provider })
153+ }
154+ return cond
155+ }
156+
157+ // FindExternalUsersByProvider represents external users via provider
158+ func FindExternalUsersByProvider (opts FindExternalUserOptions ) ([]ExternalLoginUser , error ) {
159+ var users []ExternalLoginUser
160+ err := x .Where (opts .toConds ()).
161+ Limit (opts .Limit , opts .Start ).
162+ Asc ("id" ).
163+ Find (& users )
164+ if err != nil {
165+ return nil , err
166+ }
167+ return users , nil
168+ }
169+
170+ // UpdateMigrationsByType updates all migrated repositories' posterid from gitServiceType to replace originalAuthorID to posterID
171+ func UpdateMigrationsByType (tp structs.GitServiceType , externalUserID , userID int64 ) error {
172+ if err := UpdateIssuesMigrationsByType (tp , externalUserID , userID ); err != nil {
173+ return err
174+ }
175+
176+ if err := UpdateCommentsMigrationsByType (tp , externalUserID , userID ); err != nil {
177+ return err
178+ }
179+
180+ return UpdateReleasesMigrationsByType (tp , externalUserID , userID )
181+ }
0 commit comments