4
4
5
5
package models
6
6
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
+ )
8
15
9
16
// ExternalLoginUser makes the connecting between some existing user and additional external login sources
10
17
type 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
14
35
}
15
36
16
37
// GetExternalLogin checks if a externalID in loginSourceID scope already exists
@@ -32,23 +53,15 @@ func ListAccountLinks(user *User) ([]*ExternalLoginUser, error) {
32
53
return externalAccounts , nil
33
54
}
34
55
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 )
48
61
if err != nil {
49
62
return err
50
63
} else if has {
51
- return ErrExternalLoginUserAlreadyExist {gothUser . UserID , user .ID , loginSource . ID }
64
+ return ErrExternalLoginUserAlreadyExist {externalLoginUser . ExternalID , user .ID , externalLoginUser . LoginSourceID }
52
65
}
53
66
54
67
_ , err = x .Insert (externalLoginUser )
@@ -72,3 +85,97 @@ func removeAllAccountLinks(e Engine, user *User) error {
72
85
_ , err := e .Delete (& ExternalLoginUser {UserID : user .ID })
73
86
return err
74
87
}
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