@@ -70,30 +70,30 @@ passport.use(
70
70
* Authentificate using Basic Auth (Username + Api Key)
71
71
*/
72
72
passport . use (
73
- new BasicStrategy ( ( userid , key , done ) => {
74
- User . findByUsername ( userid , ( err , user ) => {
75
- if ( err ) {
76
- done ( err ) ;
77
- return ;
78
- }
73
+ new BasicStrategy ( async ( userid , key , done ) => {
74
+ try {
75
+ const user = await User . findByUsername ( userid ) ;
76
+
79
77
if ( ! user ) {
80
- done ( null , false ) ;
81
- return ;
78
+ return done ( null , false ) ;
82
79
}
80
+
83
81
if ( user . banned ) {
84
- done ( null , false , { msg : accountSuspensionMessage } ) ;
85
- return ;
82
+ return done ( null , false , { msg : accountSuspensionMessage } ) ;
86
83
}
87
- user . findMatchingKey ( key , ( innerErr , isMatch , keyDocument ) => {
88
- if ( isMatch ) {
89
- keyDocument . lastUsedAt = Date . now ( ) ;
90
- user . save ( ) ;
91
- done ( null , user ) ;
92
- return ;
93
- }
94
- done ( null , false , { msg : 'Invalid username or API key' } ) ;
95
- } ) ;
96
- } ) ;
84
+
85
+ const { isMatch, keyDocument } = await user . findMatchingKey ( key ) ;
86
+ if ( ! isMatch ) {
87
+ return done ( null , false , { message : 'Invalid API key' } ) ;
88
+ }
89
+
90
+ keyDocument . lastUsedAt = Date . now ( ) ;
91
+ await user . save ( ) ;
92
+ return done ( null , user ) ;
93
+ } catch ( err ) {
94
+ console . error ( err ) ;
95
+ return done ( null , false , { msg : err } ) ;
96
+ }
97
97
} )
98
98
) ;
99
99
@@ -128,20 +128,19 @@ passport.use(
128
128
scope : [ 'user:email' ] ,
129
129
allRawEmails : true
130
130
} ,
131
- ( req , accessToken , refreshToken , profile , done ) => {
132
- User . findOne ( { github : profile . id } , ( findByGithubErr , existingUser ) => {
131
+ async ( req , accessToken , refreshToken , profile , done ) => {
132
+ try {
133
+ const existingUser = await User . findOne ( { github : profile . id } ) ;
134
+
133
135
if ( existingUser ) {
134
136
if ( req . user && req . user . email !== existingUser . email ) {
135
- done ( null , false , {
137
+ return done ( null , false , {
136
138
msg : 'GitHub account is already linked to another account.'
137
139
} ) ;
138
- return ;
139
140
} else if ( existingUser . banned ) {
140
- done ( null , false , { msg : accountSuspensionMessage } ) ;
141
- return ;
141
+ return done ( null , false , { msg : accountSuspensionMessage } ) ;
142
142
}
143
- done ( null , existingUser ) ;
144
- return ;
143
+ return done ( null , existingUser ) ;
145
144
}
146
145
147
146
const emails = getVerifiedEmails ( profile . emails ) ;
@@ -153,58 +152,63 @@ passport.use(
153
152
req . user . tokens . push ( { kind : 'github' , accessToken } ) ;
154
153
req . user . verified = User . EmailConfirmation . Verified ;
155
154
}
156
- req . user . save ( ( saveErr ) => done ( null , req . user ) ) ;
157
- } else {
158
- User . findAllByEmails ( emails , ( findByEmailErr , existingEmailUsers ) => {
159
- if ( existingEmailUsers . length ) {
160
- let existingEmailUser ;
161
- // Handle case where user has made multiple p5.js Editor accounts,
162
- // with emails that are connected to the same GitHub account
163
- if ( existingEmailUsers . length > 1 ) {
164
- existingEmailUser = existingEmailUsers . find (
165
- ( u ) => ( u . email = primaryEmail )
166
- ) ;
167
- } else {
168
- [ existingEmailUser ] = existingEmailUsers ;
169
- }
170
- if ( existingEmailUser . banned ) {
171
- done ( null , false , { msg : accountSuspensionMessage } ) ;
172
- return ;
173
- }
174
- existingEmailUser . email = existingEmailUser . email || primaryEmail ;
175
- existingEmailUser . github = profile . id ;
176
- existingEmailUser . username =
177
- existingEmailUser . username || profile . username ;
178
- existingEmailUser . tokens . push ( { kind : 'github' , accessToken } ) ;
179
- existingEmailUser . name =
180
- existingEmailUser . name || profile . displayName ;
181
- existingEmailUser . verified = User . EmailConfirmation . Verified ;
182
- existingEmailUser . save ( ( saveErr ) =>
183
- done ( null , existingEmailUser )
184
- ) ;
185
- } else {
186
- let { username } = profile ;
187
- User . findByUsername (
188
- username ,
189
- { caseInsensitive : true } ,
190
- ( findByUsernameErr , existingUsernameUser ) => {
191
- if ( existingUsernameUser ) {
192
- username = generateUniqueUsername ( username ) ;
193
- }
194
- const user = new User ( ) ;
195
- user . email = primaryEmail ;
196
- user . github = profile . id ;
197
- user . username = profile . username ;
198
- user . tokens . push ( { kind : 'github' , accessToken } ) ;
199
- user . name = profile . displayName ;
200
- user . verified = User . EmailConfirmation . Verified ;
201
- user . save ( ( saveErr ) => done ( null , user ) ) ;
202
- }
203
- ) ;
204
- }
205
- } ) ;
155
+ req . user . save ( ) ;
156
+ return done ( null , req . user ) ;
157
+ }
158
+
159
+ const existingEmailUsers = await User . findAllByEmails ( emails ) ;
160
+
161
+ if ( existingEmailUsers . length ) {
162
+ let existingEmailUser ;
163
+
164
+ // Handle case where user has made multiple p5.js Editor accounts,
165
+ // with emails that are connected to the same GitHub account
166
+ if ( existingEmailUsers . length > 1 ) {
167
+ existingEmailUser = existingEmailUsers . find (
168
+ ( u ) => ( u . email = primaryEmail )
169
+ ) ;
170
+ } else {
171
+ [ existingEmailUser ] = existingEmailUsers ;
172
+ }
173
+
174
+ if ( existingEmailUser . banned ) {
175
+ return done ( null , false , { msg : accountSuspensionMessage } ) ;
176
+ }
177
+ existingEmailUser . email = existingEmailUser . email || primaryEmail ;
178
+ existingEmailUser . github = profile . id ;
179
+ existingEmailUser . username =
180
+ existingEmailUser . username || profile . username ;
181
+ existingEmailUser . tokens . push ( { kind : 'github' , accessToken } ) ;
182
+ existingEmailUser . name =
183
+ existingEmailUser . name || profile . displayName ;
184
+ existingEmailUser . verified = User . EmailConfirmation . Verified ;
185
+ existingEmailUser . save ( ) ;
186
+ return done ( null , existingEmailUser ) ;
206
187
}
207
- } ) ;
188
+
189
+ let { username } = profile ;
190
+
191
+ const existingUsernameUser = await User . findByUsername ( username , {
192
+ caseInsensitive : true
193
+ } ) ;
194
+
195
+ if ( existingUsernameUser ) {
196
+ username = generateUniqueUsername ( username ) ;
197
+ }
198
+ const user = new User ( ) ;
199
+ user . email = primaryEmail ;
200
+ user . github = profile . id ;
201
+ user . username = profile . username ;
202
+ user . tokens . push ( { kind : 'github' , accessToken } ) ;
203
+ user . name = profile . displayName ;
204
+ user . verified = User . EmailConfirmation . Verified ;
205
+ await user . save ( ) ;
206
+
207
+ return done ( null , user ) ;
208
+ } catch ( err ) {
209
+ console . error ( err ) ;
210
+ return done ( null , false , { msg : err } ) ;
211
+ }
208
212
}
209
213
)
210
214
) ;
@@ -221,92 +225,78 @@ passport.use(
221
225
passReqToCallback : true ,
222
226
scope : [ 'openid email' ]
223
227
} ,
224
- ( req , accessToken , refreshToken , profile , done ) => {
225
- User . findOne (
226
- { google : profile . _json . emails [ 0 ] . value } ,
227
- ( findByGoogleErr , existingUser ) => {
228
- if ( existingUser ) {
229
- if ( req . user && req . user . email !== existingUser . email ) {
230
- done ( null , false , {
231
- msg : 'Google account is already linked to another account.'
232
- } ) ;
233
- return ;
234
- } else if ( existingUser . banned ) {
235
- done ( null , false , { msg : accountSuspensionMessage } ) ;
236
- return ;
237
- }
238
- done ( null , existingUser ) ;
239
- return ;
228
+ async ( req , accessToken , refreshToken , profile , done ) => {
229
+ try {
230
+ const existingUser = await User . findOne ( {
231
+ google : profile . _json . emails [ 0 ] . value
232
+ } ) ;
233
+
234
+ if ( existingUser ) {
235
+ if ( req . user && req . user . email !== existingUser . email ) {
236
+ return done ( null , false , {
237
+ msg : 'Google account is already linked to another account.'
238
+ } ) ;
239
+ } else if ( existingUser . banned ) {
240
+ return done ( null , false , { msg : accountSuspensionMessage } ) ;
240
241
}
241
- const primaryEmail = profile . _json . emails [ 0 ] . value ;
242
-
243
- if ( req . user ) {
244
- if ( ! req . user . google ) {
245
- req . user . google = profile . _json . emails [ 0 ] . value ;
246
- req . user . tokens . push ( { kind : 'google' , accessToken } ) ;
247
- req . user . verified = User . EmailConfirmation . Verified ;
248
- }
249
- req . user . save ( ( saveErr ) => done ( null , req . user ) ) ;
250
- } else {
251
- User . findByEmail (
252
- primaryEmail ,
253
- ( findByEmailErr , existingEmailUser ) => {
254
- let username = profile . _json . emails [ 0 ] . value . split ( '@' ) [ 0 ] ;
255
- User . findByUsername (
256
- username ,
257
- { caseInsensitive : true } ,
258
- ( findByUsernameErr , existingUsernameUser ) => {
259
- if ( existingUsernameUser ) {
260
- username = generateUniqueUsername ( username ) ;
261
- }
262
- // what if a username is already taken from the display name too?
263
- // then, append a random friendly word?
264
- if ( existingEmailUser ) {
265
- if ( existingEmailUser . banned ) {
266
- done ( null , false , { msg : accountSuspensionMessage } ) ;
267
- return ;
268
- }
269
- existingEmailUser . email =
270
- existingEmailUser . email || primaryEmail ;
271
- existingEmailUser . google = profile . _json . emails [ 0 ] . value ;
272
- existingEmailUser . username =
273
- existingEmailUser . username || username ;
274
- existingEmailUser . tokens . push ( {
275
- kind : 'google' ,
276
- accessToken
277
- } ) ;
278
- existingEmailUser . name =
279
- existingEmailUser . name || profile . _json . displayName ;
280
- existingEmailUser . verified =
281
- User . EmailConfirmation . Verified ;
282
- existingEmailUser . save ( ( saveErr ) => {
283
- if ( saveErr ) {
284
- console . log ( saveErr ) ;
285
- }
286
- done ( null , existingEmailUser ) ;
287
- } ) ;
288
- } else {
289
- const user = new User ( ) ;
290
- user . email = primaryEmail ;
291
- user . google = profile . _json . emails [ 0 ] . value ;
292
- user . username = username ;
293
- user . tokens . push ( { kind : 'google' , accessToken } ) ;
294
- user . name = profile . _json . displayName ;
295
- user . verified = User . EmailConfirmation . Verified ;
296
- user . save ( ( saveErr ) => {
297
- if ( saveErr ) {
298
- console . log ( saveErr ) ;
299
- }
300
- done ( null , user ) ;
301
- } ) ;
302
- }
303
- }
304
- ) ;
305
- }
306
- ) ;
242
+ return done ( null , existingUser ) ;
243
+ }
244
+
245
+ const primaryEmail = profile . _json . emails [ 0 ] . value ;
246
+
247
+ if ( req . user ) {
248
+ if ( ! req . user . google ) {
249
+ req . user . google = profile . _json . emails [ 0 ] . value ;
250
+ req . user . tokens . push ( { kind : 'google' , accessToken } ) ;
251
+ req . user . verified = User . EmailConfirmation . Verified ;
307
252
}
253
+ req . user . save ( ) ;
254
+ return done ( null , req . user ) ;
255
+ }
256
+ let username = profile . _json . emails [ 0 ] . value . split ( '@' ) [ 0 ] ;
257
+ const existingEmailUser = await User . findByEmail ( primaryEmail ) ;
258
+ const existingUsernameUser = await User . findByUsername ( username , {
259
+ caseInsensitive : true
260
+ } ) ;
261
+
262
+ if ( existingUsernameUser ) {
263
+ username = generateUniqueUsername ( username ) ;
264
+ }
265
+ // what if a username is already taken from the display name too?
266
+ // then, append a random friendly word?
267
+ if ( existingEmailUser ) {
268
+ if ( existingEmailUser . banned ) {
269
+ return done ( null , false , { msg : accountSuspensionMessage } ) ;
270
+ }
271
+ existingEmailUser . email = existingEmailUser . email || primaryEmail ;
272
+ existingEmailUser . google = profile . _json . emails [ 0 ] . value ;
273
+ existingEmailUser . username = existingEmailUser . username || username ;
274
+ existingEmailUser . tokens . push ( {
275
+ kind : 'google' ,
276
+ accessToken
277
+ } ) ;
278
+ existingEmailUser . name =
279
+ existingEmailUser . name || profile . _json . displayName ;
280
+ existingEmailUser . verified = User . EmailConfirmation . Verified ;
281
+
282
+ await existingEmailUser . save ( ) ;
283
+ return done ( null , existingEmailUser ) ;
308
284
}
309
- ) ;
285
+
286
+ const user = new User ( ) ;
287
+ user . email = primaryEmail ;
288
+ user . google = profile . _json . emails [ 0 ] . value ;
289
+ user . username = username ;
290
+ user . tokens . push ( { kind : 'google' , accessToken } ) ;
291
+ user . name = profile . _json . displayName ;
292
+ user . verified = User . EmailConfirmation . Verified ;
293
+
294
+ await user . save ( ) ;
295
+ return done ( null , user ) ;
296
+ } catch ( err ) {
297
+ console . error ( err ) ;
298
+ return done ( null , false , { msg : err } ) ;
299
+ }
310
300
}
311
301
)
312
302
) ;
0 commit comments