@@ -24,6 +24,7 @@ module.exports = function (options) {
24
24
seneca . add ( { role : plugin , cmd : 'register' } , cmd_register ) ;
25
25
seneca . add ( { role : plugin , cmd : 'promote' } , cmd_promote ) ;
26
26
seneca . add ( { role : plugin , cmd : 'get_users_by_emails' } , cmd_get_users_by_emails ) ;
27
+ seneca . add ( { role : plugin , cmd : 'get_user_by_profile_id' } , cmd_get_user_by_profile_id ) ;
27
28
seneca . add ( { role : plugin , cmd : 'update' } , cmd_update ) ;
28
29
seneca . add ( { role : plugin , cmd : 'get_init_user_types' } , cmd_get_init_user_types ) ;
29
30
seneca . add ( { role : plugin , cmd : 'is_champion' } , cmd_is_champion ) ;
@@ -92,25 +93,26 @@ module.exports = function (options) {
92
93
seneca . make ( ENTITY_NS ) . list$ ( query , done ) ;
93
94
}
94
95
95
- function checkPassword ( args , done ) {
96
- var containsNumber = / [ 0 - 9 ] / . test ( args . password ) ;
97
- var containsCharacter = / [ ! | @ | # | $ | % | ^ | & | * | ( | ) | - | _ ] / . test ( args . password ) ;
98
- var containsCapital = / [ A - Z ] / . test ( args . password ) ;
99
- var containsLowerCase = / [ a - z ] / . test ( args . password ) ;
96
+ function checkPassword ( user ) {
97
+ var containsNumber = / [ 0 - 9 ] / . test ( user . password ) ;
98
+ var containsCharacter = / [ ! | @ | # | $ | % | ^ | & | * | ( | ) | - | _ ] / . test ( user . password ) ;
99
+ var containsCapital = / [ A - Z ] / . test ( user . password ) ;
100
+ var containsLowerCase = / [ a - z ] / . test ( user . password ) ;
100
101
var minPasswordLength = 8 ;
101
102
102
- if ( args . password === args . email ) {
103
- return done ( null , { ok : false , token : args . token , why : 'Password must not be the same as your email address' } ) ;
104
- } if ( ( args . password . length < minPasswordLength ) || ! ( containsNumber || containsCharacter ) ) {
105
- return done ( null , { ok : false , token : args . token , why : 'Password must be a minimum of 8 characters in length and contain at least one number or punctuation character' } ) ;
106
- } if ( _ . includes ( args . roles , 'cdf-admin' ) && ( ! containsNumber || ! containsCharacter || ! containsCapital || ! containsLowerCase ) ) {
107
- return done ( null , { ok : false , token : args . token , why : 'An admin account must contain at least one number, one special character and one capital.' } ) ;
103
+ if ( user . password === user . email ) {
104
+ return { ok : false , token : user . token , why : 'Password must not be the same as your email address' } ;
105
+ } if ( ( user . password . length < minPasswordLength ) || ! ( containsNumber || containsCharacter ) ) {
106
+ return { ok : false , token : user . token , why : 'Password must be a minimum of 8 characters in length and contain at least one number or punctuation character' } ;
107
+ } if ( _ . includes ( user . roles , 'cdf-admin' ) && ( ! containsNumber || ! containsCharacter || ! containsCapital || ! containsLowerCase ) ) {
108
+ return { ok : false , token : user . token , why : 'An admin account must contain at least one number, one special character and one capital.' } ;
108
109
}
109
- return done ( null , args ) ;
110
+ return { ok : true } ;
110
111
}
111
112
112
113
function cmd_register ( args , done ) {
113
114
var profile = args . profile ;
115
+ var isTrusted = args . isTrusted ;
114
116
var user = args . user ;
115
117
var locality = user . locality || 'en_US' ;
116
118
var emailCode = 'auth-register-' ;
@@ -125,29 +127,28 @@ module.exports = function (options) {
125
127
// Roles Available: basic-user, cdf-admin
126
128
var seneca = this ;
127
129
128
- if ( ! user [ 'g-recaptcha-response' ] ) {
129
- return done ( new Error ( 'Error with captcha' ) ) ;
130
- }
131
-
132
- var secret = so [ 'recaptcha_secret_key' ] ;
133
- var captchaResponse = user [ 'g-recaptcha-response' ] ;
134
-
135
- var postData = {
136
- url : 'https://www.google.com/recaptcha/api/siteverify' ,
137
- form : {
138
- response : captchaResponse ,
139
- secret : secret
140
- }
141
- } ;
142
-
143
- function addProfilePassword ( data , done ) {
130
+ function addProfilePassword ( done ) {
144
131
profileUtils . encodePassword ( user . password ) . then ( ( profileHash ) => {
145
132
user . profilePassword = profileHash ;
146
- done ( null , data ) ;
133
+ done ( null ) ;
147
134
} ) ;
148
135
}
149
136
150
137
function verifyCaptcha ( done ) {
138
+ if ( ! user [ 'g-recaptcha-response' ] ) {
139
+ return done ( new Error ( 'Error with captcha' ) ) ;
140
+ }
141
+
142
+ var secret = so [ 'recaptcha_secret_key' ] ;
143
+ var captchaResponse = user [ 'g-recaptcha-response' ] ;
144
+
145
+ var postData = {
146
+ url : 'https://www.google.com/recaptcha/api/siteverify' ,
147
+ form : {
148
+ response : captchaResponse ,
149
+ secret : secret
150
+ }
151
+ } ;
151
152
request . post ( postData , function ( err , response , body ) {
152
153
if ( err ) {
153
154
return done ( err ) ;
@@ -159,69 +160,69 @@ module.exports = function (options) {
159
160
return done ( 'captcha-failed' ) ;
160
161
}
161
162
162
- return done ( null , body . success ) ;
163
+ return done ( null ) ;
163
164
} ) ;
164
165
}
165
166
166
- function checkPermissions ( success , done ) {
167
+ function checkPermissions ( done ) {
167
168
// if forumMods array contains the users email, make them an admin
168
169
if ( options . users . cdfAdmins . indexOf ( user . email ) > - 1 ) {
169
170
user . roles = [ 'cdf-admin' ] ;
170
171
} else {
171
172
user . roles = [ 'basic-user' ] ;
172
173
}
173
174
174
- return done ( null , success ) ;
175
+ return done ( null ) ;
175
176
}
176
177
177
- function registerUser ( success , done ) {
178
+ function registerUser ( done ) {
178
179
user = _ . omit ( user , [ 'g-recaptcha-response' , 'zenHostname' , 'locality' , 'user' , 'emailSubject' ] ) ;
179
180
180
181
user . mailingList = ( user . mailingList ) ? 1 : 0 ;
182
+ const passwordCheckResult = checkPassword ( user ) ;
181
183
182
- checkPassword ( user , function ( err , user ) {
184
+ if ( ! passwordCheckResult . ok ) {
185
+ return done ( null , passwordCheckResult ) ;
186
+ }
187
+ if ( ! user . name ) {
188
+ user . name = user . firstName + ' ' + user . lastName ;
189
+ }
190
+ seneca . act ( { role : 'user' , cmd : 'register' } , user , function ( err , registerResponse ) {
183
191
if ( err ) return done ( err ) ;
184
- if ( typeof user . ok !== 'undefined' && ! user . ok ) {
185
- return done ( null , user ) ;
192
+ if ( ! registerResponse . ok ) {
193
+ return done ( null , registerResponse ) ;
186
194
}
187
- user . name = user . firstName + ' ' + user . lastName ;
188
- seneca . act ( { role : 'user' , cmd : 'register' } , user , function ( err , registerResponse ) {
189
- if ( err ) return done ( err ) ;
190
- if ( ! registerResponse . ok ) {
191
- return done ( null , registerResponse ) ;
192
- }
193
-
194
- var user = registerResponse . user ;
195
- // Create user profile based on initial user type.
196
- var userType = 'attendee-o13' ;
197
- if ( user . initUserType ) userType = user . initUserType . name ;
198
-
199
- _ . defaults ( profile , {
200
- private : true ,
201
- userId : user . id ,
202
- name : user . name ,
203
- firstName : user . firstName ,
204
- lastName : user . lastName ,
205
- email : user . email ,
206
- userType : userType
207
- } ) ;
208
195
209
- var profileKeys = _ . keys ( profile ) ;
210
- var missingKeys = _ . difference ( requiredProfileFields , profileKeys ) ;
211
- if ( _ . isEmpty ( missingKeys ) ) profile . requiredFieldsComplete = true ;
196
+ var user = registerResponse . user ;
197
+ // Create user profile based on initial user type.
198
+ var userType = 'attendee-o13' ;
199
+ if ( user . initUserType ) userType = user . initUserType . name ;
200
+
201
+ _ . defaults ( profile , {
202
+ private : true ,
203
+ userId : user . id ,
204
+ name : user . name ,
205
+ firstName : user . firstName ,
206
+ lastName : user . lastName ,
207
+ email : user . email ,
208
+ userType : userType
209
+ } ) ;
212
210
213
- seneca . act ( { role : 'cd-profiles' , cmd : 'save' , profile : profile } , function ( err , profile ) {
214
- if ( err ) return done ( err ) ;
215
- done ( null , registerResponse ) ;
216
- } ) ;
211
+ var profileKeys = _ . keys ( profile ) ;
212
+ var missingKeys = _ . difference ( requiredProfileFields , profileKeys ) ;
213
+ if ( _ . isEmpty ( missingKeys ) ) profile . requiredFieldsComplete = true ;
214
+
215
+ seneca . act ( { role : 'cd-profiles' , cmd : 'save' , profile : profile } , function ( err , profile ) {
216
+ if ( err ) return done ( err ) ;
217
+ done ( null , registerResponse ) ;
217
218
} ) ;
218
219
} ) ;
219
220
}
220
221
221
222
function sendWelcomeEmail ( registerResponse , done ) {
222
223
if ( registerResponse . ok ) {
223
- seneca . act ( { role : 'email-notifications' , cmd : 'send' } ,
224
- { code : emailCode ,
224
+ seneca . act ( { role : 'email-notifications' , cmd : 'send' } , {
225
+ code : emailCode ,
225
226
locality : locality ,
226
227
to : args . email ,
227
228
subject : emailSubject ,
@@ -235,13 +236,15 @@ module.exports = function (options) {
235
236
}
236
237
}
237
238
238
- async . waterfall ( [
239
- verifyCaptcha ,
239
+ var tasks = [
240
+ ! isTrusted && verifyCaptcha ,
240
241
checkPermissions ,
241
- addProfilePassword ,
242
+ ! isTrusted && addProfilePassword ,
242
243
registerUser ,
243
244
sendWelcomeEmail
244
- ] , function ( err , results ) {
245
+ ] . filter ( Boolean ) ;
246
+
247
+ async . waterfall ( tasks , function ( err , results ) {
245
248
if ( err ) {
246
249
return done ( null , { error : err } ) ;
247
250
}
@@ -306,6 +309,28 @@ module.exports = function (options) {
306
309
}
307
310
}
308
311
312
+ function cmd_get_user_by_profile_id ( args , done ) {
313
+ var seneca = this ;
314
+ var query = { } ;
315
+
316
+ query . profileId = args . profileId ;
317
+ query . limit$ = query . limit$ ? query . limit$ : 1 ;
318
+
319
+ seneca . make ( ENTITY_NS ) . list$ ( query , function ( err , users ) {
320
+ if ( err ) {
321
+ return done ( err ) ;
322
+ }
323
+
324
+ users = _ . map ( users , function ( user ) {
325
+ return { email : user . email , id : user . id , name : user . name } ;
326
+ } ) ;
327
+
328
+ users = _ . uniq ( users , 'email' ) ;
329
+
330
+ done ( null , users [ 0 ] || { } ) ;
331
+ } ) ;
332
+ }
333
+
309
334
function cmd_update ( args , done ) {
310
335
var seneca = this ;
311
336
var user = args . user ;
@@ -435,25 +460,23 @@ module.exports = function (options) {
435
460
userEntity . load$ ( { id : reset . user } , function ( err , user ) {
436
461
if ( err ) { return done ( err ) ; }
437
462
user . password = args . password ;
438
- checkPassword ( user , function ( err , user ) {
463
+ var checkPasswordResult = checkPassword ( user ) ;
464
+ if ( ! checkPasswordResult . ok ) {
465
+ return done ( null , checkPasswordResult ) ;
466
+ }
467
+ delete user . password ;
468
+ seneca . act ( { role : 'user' , cmd : 'change_password' , user : user , password : args . password , repeat : args . repeat } , function ( err , out ) {
439
469
if ( err ) { return done ( err ) ; }
440
- if ( typeof user . ok !== 'undefined' && ! user . ok ) {
441
- return done ( null , user ) ;
442
- }
443
- delete user . password ;
444
- seneca . act ( { role : 'user' , cmd : 'change_password' , user : user , password : args . password , repeat : args . repeat } , function ( err , out ) {
445
- if ( err ) { return done ( err ) ; }
446
470
447
- out . reset = reset ;
448
- if ( ! out . ok ) { return done ( null , out ) ; }
471
+ out . reset = reset ;
472
+ if ( ! out . ok ) { return done ( null , out ) ; }
449
473
450
- seneca . act ( { role : plugin , cmd : 'update_profile_password' } , { password : args . password , user : user } ) ;
474
+ seneca . act ( { role : plugin , cmd : 'update_profile_password' } , { password : args . password , user : user } ) ;
451
475
452
- reset . active = false ;
453
- reset . save$ ( function ( err , reset ) {
454
- if ( err ) { return done ( err ) ; }
455
- return done ( null , { user : user , reset : reset , ok : true } ) ;
456
- } ) ;
476
+ reset . active = false ;
477
+ reset . save$ ( function ( err , reset ) {
478
+ if ( err ) { return done ( err ) ; }
479
+ return done ( null , { user : user , reset : reset , ok : true } ) ;
457
480
} ) ;
458
481
} ) ;
459
482
} ) ;
0 commit comments