Skip to content
This repository was archived by the owner on Dec 14, 2023. It is now read-only.

Commit 96c6610

Browse files
committed
move password check to the backend
1 parent 37e83f4 commit 96c6610

File tree

3 files changed

+67
-37
lines changed

3 files changed

+67
-37
lines changed

test/fixtures/users.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11
[
2-
{
2+
{
33
"name": "test1",
44
"email": "[email protected]",
5-
"password": "pass1",
5+
"password": "password1",
66
"termsConditionsAccepted": true,
77
"initUserType":"attendee-u13",
88
"g-recaptcha-response": "03AHJ_VuufpHRAc3bbYfeMunZ-nOYP5rjdSwlw7e4Btq-RGYYvCRTJJkXptbQuBwJDL0ZWQ7eHeQRoTI9iRZlakVlpVDB9rd0kYw2iNcMXG9qNNNBNv_qNjTyE4RwZ3x0zAt2aqg-LjboEqRyLqbOO032kal8wz_GGKbrykJMV0kiSdCbABlSalNHUwlP9II7nGs1me9x84owsr5ZCFkCYtQehguTm6nMe9HRq7hLbQb4hK8HuWwfqQ1z5CIuKk7el5taxNC1h4QuqWsNgGlWAv_Gqp4dJjz683kNCV2vbTlofz6FwttNZwD-mS1l4OrTCdvdX9JBcipXbjlIF1RFyBbXGvSAftp3_ajmoAjstwSdAZVtD1Whm_x8nUo_0pFp6x0n0Y1j8Ztc87oxAXswI-Yvf8JFu8Bhaw_SwAz2Qk7meR2Mvx5lKz_3IzK_b15gnmXenqamBpksv"
99
},
1010
{
1111
"name": "test2",
1212
"email": "[email protected]",
13-
"password": "pass2",
13+
"password": "passiword2",
1414
"termsConditionsAccepted": true,
1515
"initUserType":"attendee-o13",
1616
"g-recaptcha-response": "03AHJ_VuufpHRAc3bbYfeMunZ-nOYP5rjdSwlw7e4Btq-RGYYvCRTJJkXptbQuBwJDL0ZWQ7eHeQRoTI9iRZlakVlpVDB9rd0kYw2iNcMXG9qNNNBNv_qNjTyE4RwZ3x0zAt2aqg-LjboEqRyLqbOO032kal8wz_GGKbrykJMV0kiSdCbABlSalNHUwlP9II7nGs1me9x84owsr5ZCFkCYtQehguTm6nMe9HRq7hLbQb4hK8HuWwfqQ1z5CIuKk7el5taxNC1h4QuqWsNgGlWAv_Gqp4dJjz683kNCV2vbTlofz6FwttNZwD-mS1l4OrTCdvdX9JBcipXbjlIF1RFyBbXGvSAftp3_ajmoAjstwSdAZVtD1Whm_x8nUo_0pFp6x0n0Y1j8Ztc87oxAXswI-Yvf8JFu8Bhaw_SwAz2Qk7meR2Mvx5lKz_3IzK_b15gnmXenqamBpksv"
1717
},
1818
{
1919
"name": "test3",
2020
"email": "[email protected]",
21-
"password": "pass3",
21+
"password": "password3",
2222
"termsConditionsAccepted": true,
2323
"initUserType":"parent-guardian",
2424
"g-recaptcha-response": "03AHJ_VuufpHRAc3bbYfeMunZ-nOYP5rjdSwlw7e4Btq-RGYYvCRTJJkXptbQuBwJDL0ZWQ7eHeQRoTI9iRZlakVlpVDB9rd0kYw2iNcMXG9qNNNBNv_qNjTyE4RwZ3x0zAt2aqg-LjboEqRyLqbOO032kal8wz_GGKbrykJMV0kiSdCbABlSalNHUwlP9II7nGs1me9x84owsr5ZCFkCYtQehguTm6nMe9HRq7hLbQb4hK8HuWwfqQ1z5CIuKk7el5taxNC1h4QuqWsNgGlWAv_Gqp4dJjz683kNCV2vbTlofz6FwttNZwD-mS1l4OrTCdvdX9JBcipXbjlIF1RFyBbXGvSAftp3_ajmoAjstwSdAZVtD1Whm_x8nUo_0pFp6x0n0Y1j8Ztc87oxAXswI-Yvf8JFu8Bhaw_SwAz2Qk7meR2Mvx5lKz_3IzK_b15gnmXenqamBpksv"
2525
},
2626
{
2727
"name": "test4",
2828
"email": "[email protected]",
29-
"password": "pass4",
29+
"password": "password4",
3030
"termsConditionsAccepted": true,
3131
"initUserType":"mentor",
3232
"g-recaptcha-response": "03AHJ_VuufpHRAc3bbYfeMunZ-nOYP5rjdSwlw7e4Btq-RGYYvCRTJJkXptbQuBwJDL0ZWQ7eHeQRoTI9iRZlakVlpVDB9rd0kYw2iNcMXG9qNNNBNv_qNjTyE4RwZ3x0zAt2aqg-LjboEqRyLqbOO032kal8wz_GGKbrykJMV0kiSdCbABlSalNHUwlP9II7nGs1me9x84owsr5ZCFkCYtQehguTm6nMe9HRq7hLbQb4hK8HuWwfqQ1z5CIuKk7el5taxNC1h4QuqWsNgGlWAv_Gqp4dJjz683kNCV2vbTlofz6FwttNZwD-mS1l4OrTCdvdX9JBcipXbjlIF1RFyBbXGvSAftp3_ajmoAjstwSdAZVtD1Whm_x8nUo_0pFp6x0n0Y1j8Ztc87oxAXswI-Yvf8JFu8Bhaw_SwAz2Qk7meR2Mvx5lKz_3IzK_b15gnmXenqamBpksv"
3333
},
3434
{
3535
"name": "test5",
3636
"email": "[email protected]",
37-
"password": "pass5",
37+
"password": "password5",
3838
"termsConditionsAccepted": true,
3939
"initUserType":"champion",
4040
"g-recaptcha-response": "03AHJ_VuufpHRAc3bbYfeMunZ-nOYP5rjdSwlw7e4Btq-RGYYvCRTJJkXptbQuBwJDL0ZWQ7eHeQRoTI9iRZlakVlpVDB9rd0kYw2iNcMXG9qNNNBNv_qNjTyE4RwZ3x0zAt2aqg-LjboEqRyLqbOO032kal8wz_GGKbrykJMV0kiSdCbABlSalNHUwlP9II7nGs1me9x84owsr5ZCFkCYtQehguTm6nMe9HRq7hLbQb4hK8HuWwfqQ1z5CIuKk7el5taxNC1h4QuqWsNgGlWAv_Gqp4dJjz683kNCV2vbTlofz6FwttNZwD-mS1l4OrTCdvdX9JBcipXbjlIF1RFyBbXGvSAftp3_ajmoAjstwSdAZVtD1Whm_x8nUo_0pFp6x0n0Y1j8Ztc87oxAXswI-Yvf8JFu8Bhaw_SwAz2Qk7meR2Mvx5lKz_3IzK_b15gnmXenqamBpksv"

test/users-spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ lab.experiment('Profiles Microservice test', { timeout: 5000}, function () {
6969
lab.test('load', function (done) {
7070
var id = 'f8bbf130-e7c3-4da6-ad0f-28475d4811c7';
7171
seneca.act({role: 'cd-profiles', cmd: 'load', id: id}, done);
72-
});
72+
});
7373

7474
lab.test('user_profile_data', function (done) {
7575
var userId = '';
@@ -92,7 +92,7 @@ lab.experiment('Users Microservice test', { timeout: 5000 }, function(){
9292
function registerUser(user, cb){
9393
seneca.act(user, {role: role, cmd: 'register'}, function(err, res){
9494
if(err) return cb(err);
95-
95+
expect(!res.ok);
9696
return cb();
9797
});
9898
}
@@ -129,7 +129,7 @@ lab.experiment('Users Microservice test', { timeout: 5000 }, function(){
129129
var user = {
130130
"name": "test6",
131131
"email": "[email protected]",
132-
"password": "pass6",
132+
"password": "password6",
133133
"termsConditionsAccepted": true,
134134
"initUserType": "mentor",
135135
"g-recaptcha-response": "03AHJ_VuufpHRAc3bbYfeMunZ-nOYP5rjdSwlw7e4Btq-RGYYvCRTJJkXptbQuBwJDL0ZWQ7eHeQRoTI9iRZlakVlpVDB9rd0kYw2iNcMXG9qNNNBNv_qNjTyE4RwZ3x0zAt2aqg-LjboEqRyLqbOO032kal8wz_GGKbrykJMV0kiSdCbABlSalNHUwlP9II7nGs1me9x84owsr5ZCFkCYtQehguTm6nMe9HRq7hLbQb4hK8HuWwfqQ1z5CIuKk7el5taxNC1h4QuqWsNgGlWAv_Gqp4dJjz683kNCV2vbTlofz6FwttNZwD-mS1l4OrTCdvdX9JBcipXbjlIF1RFyBbXGvSAftp3_ajmoAjstwSdAZVtD1Whm_x8nUo_0pFp6x0n0Y1j8Ztc87oxAXswI-Yvf8JFu8Bhaw_SwAz2Qk7meR2Mvx5lKz_3IzK_b15gnmXenqamBpksv"

users.js

Lines changed: 58 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,23 @@ module.exports = function (options) {
5858
seneca.make(ENTITY_NS).list$(query, done);
5959
}
6060

61+
function checkPassword (args, done) {
62+
var containsNumber = /[0-9]/.test(args.password);
63+
var containsCharacter = /[!|@|#|$|%|^|&|*|(|)|-|_]/.test(args.password);
64+
var containsCapital = /[A-Z]/.test(args.password);
65+
var containsLowerCase = /[a-z]/.test(args.password);
66+
var minPasswordLength = 8;
67+
68+
if (args.password === args.email) {
69+
return done(null, {ok: false, token: args.token, why: 'Password must not be the same as your email address'});
70+
} if ((args.password.length < minPasswordLength) || !(containsNumber || containsCharacter)) {
71+
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'});
72+
} if (_.includes(args.roles, 'cdf-admin') && (!containsNumber || !containsCharacter || !containsCapital || !containsLowerCase)) {
73+
return done(null, {ok: false, token: args.token, why: 'An admin account must contain at least one number, one special character and one capital.'});
74+
}
75+
return done(null, args);
76+
}
77+
6178
function cmd_register (args, done) {
6279
var isChampion = args.isChampion === true;
6380
var locality = args.locality || 'en_US';
@@ -120,29 +137,35 @@ module.exports = function (options) {
120137

121138
args.mailingList = (args.mailingList) ? 1 : 0;
122139

123-
seneca.act({role: 'user', cmd: 'register'}, args, function (err, registerResponse) {
140+
checkPassword(args, function (err, args) {
124141
if (err) return done(err);
125-
if (!registerResponse.ok) {
126-
return done(null, registerResponse);
142+
if (typeof args.ok !== 'undefined' && !args.ok) {
143+
return done(null, args);
127144
}
128-
129-
var user = registerResponse.user;
130-
// Create user profile based on initial user type.
131-
var userType = 'attendee-o13';
132-
if (user.initUserType) userType = user.initUserType.name;
133-
134-
var profileData = {
135-
userId: user.id,
136-
name: user.name,
137-
email: user.email,
138-
userType: userType
139-
};
140-
seneca.act({role: 'cd-profiles', cmd: 'save', profile: profileData}, function (err, profile) {
145+
seneca.act({role: 'user', cmd: 'register'}, args, function (err, registerResponse) {
141146
if (err) return done(err);
142-
if (registerResponse.ok === true && isChampion === true) {
143-
seneca.act({role: 'cd-salesforce', cmd: 'queud_update_users', param: {user: registerResponse.user}, fatal$: false});
147+
if (!registerResponse.ok) {
148+
return done(null, registerResponse);
144149
}
145-
done(null, registerResponse);
150+
151+
var user = registerResponse.user;
152+
// Create user profile based on initial user type.
153+
var userType = 'attendee-o13';
154+
if (user.initUserType) userType = user.initUserType.name;
155+
156+
var profileData = {
157+
userId: user.id,
158+
name: user.name,
159+
email: user.email,
160+
userType: userType
161+
};
162+
seneca.act({role: 'cd-profiles', cmd: 'save', profile: profileData}, function (err, profile) {
163+
if (err) return done(err);
164+
if (registerResponse.ok === true && isChampion === true) {
165+
seneca.act({role: 'cd-salesforce', cmd: 'queud_update_users', param: {user: registerResponse.user}, fatal$: false});
166+
}
167+
done(null, registerResponse);
168+
});
146169
});
147170
});
148171
}
@@ -347,20 +370,27 @@ module.exports = function (options) {
347370
return done(null, { ok: false, token: args.token, why: 'Reset stale.' });
348371
}
349372

350-
var userEntity = seneca.make$('sys/user');
351-
373+
var userEntity = seneca.make$(ENTITY_NS);
352374
userEntity.load$({ id: reset.user }, function (err, user) {
353375
if (err) { return done(err); }
354-
seneca.act({ role: 'user', cmd: 'change_password', user: user, password: args.password, repeat: args.repeat }, function (err, out) {
376+
user.password = args.password;
377+
checkPassword(user, function (err, user) {
355378
if (err) { return done(err); }
379+
if (typeof user.ok !== 'undefined' && !user.ok) {
380+
return done(null, user);
381+
}
382+
delete user.password;
383+
seneca.act({ role: 'user', cmd: 'change_password', user: user, password: args.password, repeat: args.repeat }, function (err, out) {
384+
if (err) { return done(err); }
356385

357-
out.reset = reset;
358-
if (!out.ok) { return done(null, out); }
386+
out.reset = reset;
387+
if (!out.ok) { return done(null, out); }
359388

360-
reset.active = false;
361-
reset.save$(function (err, reset) {
362-
if (err) { return done(err); }
363-
return done(null, { user: user, reset: reset, ok: true });
389+
reset.active = false;
390+
reset.save$(function (err, reset) {
391+
if (err) { return done(err); }
392+
return done(null, { user: user, reset: reset, ok: true });
393+
});
364394
});
365395
});
366396
});

0 commit comments

Comments
 (0)