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

Commit 6544606

Browse files
committed
Add isTrusted flag to register args for internal calls.
- bypasses captcha check - bypasses adding profile password hash
1 parent 2484973 commit 6544606

File tree

1 file changed

+89
-89
lines changed

1 file changed

+89
-89
lines changed

users.js

Lines changed: 89 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -93,25 +93,26 @@ module.exports = function (options) {
9393
seneca.make(ENTITY_NS).list$(query, done);
9494
}
9595

96-
function checkPassword (args, done) {
97-
var containsNumber = /[0-9]/.test(args.password);
98-
var containsCharacter = /[!|@|#|$|%|^|&|*|(|)|-|_]/.test(args.password);
99-
var containsCapital = /[A-Z]/.test(args.password);
100-
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);
101101
var minPasswordLength = 8;
102102

103-
if (args.password === args.email) {
104-
return done(null, {ok: false, token: args.token, why: 'Password must not be the same as your email address'});
105-
} if ((args.password.length < minPasswordLength) || !(containsNumber || containsCharacter)) {
106-
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'});
107-
} if (_.includes(args.roles, 'cdf-admin') && (!containsNumber || !containsCharacter || !containsCapital || !containsLowerCase)) {
108-
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.'};
109109
}
110-
return done(null, args);
110+
return {ok: true};
111111
}
112112

113113
function cmd_register (args, done) {
114114
var profile = args.profile;
115+
var isTrusted = args.isTrusted;
115116
var user = args.user;
116117
var locality = user.locality || 'en_US';
117118
var emailCode = 'auth-register-';
@@ -126,29 +127,28 @@ module.exports = function (options) {
126127
// Roles Available: basic-user, cdf-admin
127128
var seneca = this;
128129

129-
if (!user['g-recaptcha-response']) {
130-
return done(new Error('Error with captcha'));
131-
}
132-
133-
var secret = so['recaptcha_secret_key'];
134-
var captchaResponse = user['g-recaptcha-response'];
135-
136-
var postData = {
137-
url: 'https://www.google.com/recaptcha/api/siteverify',
138-
form: {
139-
response: captchaResponse,
140-
secret: secret
141-
}
142-
};
143-
144-
function addProfilePassword (data, done) {
130+
function addProfilePassword (done) {
145131
profileUtils.encodePassword(user.password).then((profileHash) => {
146132
user.profilePassword = profileHash;
147-
done(null, data);
133+
done(null);
148134
});
149135
}
150136

151137
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+
};
152152
request.post(postData, function (err, response, body) {
153153
if (err) {
154154
return done(err);
@@ -160,69 +160,69 @@ module.exports = function (options) {
160160
return done('captcha-failed');
161161
}
162162

163-
return done(null, body.success);
163+
return done(null);
164164
});
165165
}
166166

167-
function checkPermissions (success, done) {
167+
function checkPermissions (done) {
168168
// if forumMods array contains the users email, make them an admin
169169
if (options.users.cdfAdmins.indexOf(user.email) > -1) {
170170
user.roles = ['cdf-admin'];
171171
} else {
172172
user.roles = ['basic-user'];
173173
}
174174

175-
return done(null, success);
175+
return done(null);
176176
}
177177

178-
function registerUser (success, done) {
178+
function registerUser (done) {
179179
user = _.omit(user, ['g-recaptcha-response', 'zenHostname', 'locality', 'user', 'emailSubject']);
180180

181181
user.mailingList = (user.mailingList) ? 1 : 0;
182+
const passwordCheckResult = checkPassword(user);
182183

183-
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) {
184191
if (err) return done(err);
185-
if (typeof user.ok !== 'undefined' && !user.ok) {
186-
return done(null, user);
192+
if (!registerResponse.ok) {
193+
return done(null, registerResponse);
187194
}
188-
user.name = user.firstName + ' ' + user.lastName;
189-
seneca.act({role: 'user', cmd: 'register'}, user, function (err, registerResponse) {
190-
if (err) return done(err);
191-
if (!registerResponse.ok) {
192-
return done(null, registerResponse);
193-
}
194-
195-
var user = registerResponse.user;
196-
// Create user profile based on initial user type.
197-
var userType = 'attendee-o13';
198-
if (user.initUserType) userType = user.initUserType.name;
199-
200-
_.defaults(profile, {
201-
private: true,
202-
userId: user.id,
203-
name: user.name,
204-
firstName: user.firstName,
205-
lastName: user.lastName,
206-
email: user.email,
207-
userType: userType
208-
});
209195

210-
var profileKeys = _.keys(profile);
211-
var missingKeys = _.difference(requiredProfileFields, profileKeys);
212-
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+
});
213210

214-
seneca.act({role: 'cd-profiles', cmd: 'save', profile: profile}, function (err, profile) {
215-
if (err) return done(err);
216-
done(null, registerResponse);
217-
});
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);
218218
});
219219
});
220220
}
221221

222222
function sendWelcomeEmail (registerResponse, done) {
223223
if (registerResponse.ok) {
224-
seneca.act({role: 'email-notifications', cmd: 'send'},
225-
{code: emailCode,
224+
seneca.act({role: 'email-notifications', cmd: 'send'}, {
225+
code: emailCode,
226226
locality: locality,
227227
to: args.email,
228228
subject: emailSubject,
@@ -236,13 +236,15 @@ module.exports = function (options) {
236236
}
237237
}
238238

239-
async.waterfall([
240-
verifyCaptcha,
239+
var tasks = [
240+
!isTrusted && verifyCaptcha,
241241
checkPermissions,
242-
addProfilePassword,
242+
!isTrusted && addProfilePassword,
243243
registerUser,
244244
sendWelcomeEmail
245-
], function (err, results) {
245+
].filter(Boolean);
246+
247+
async.waterfall(tasks, function (err, results) {
246248
if (err) {
247249
return done(null, {error: err});
248250
}
@@ -306,20 +308,20 @@ module.exports = function (options) {
306308
}
307309
}
308310

309-
function cmd_get_user_by_profile_id(args, done) {
311+
function cmd_get_user_by_profile_id (args, done) {
310312
var seneca = this;
311313
var query = {};
312-
314+
313315
query.profileId = args.profileId;
314316
query.limit$ = query.limit$ ? query.limit$ : 1;
315-
317+
316318
seneca.make(ENTITY_NS).list$(query, function (err, users) {
317319
if (err) {
318320
return done(err);
319321
}
320322

321323
users = _.map(users, function (user) {
322-
return {email: user.email, id: user.id, name: user.name };
324+
return {email: user.email, id: user.id, name: user.name};
323325
});
324326

325327
users = _.uniq(users, 'email');
@@ -457,25 +459,23 @@ module.exports = function (options) {
457459
userEntity.load$({ id: reset.user }, function (err, user) {
458460
if (err) { return done(err); }
459461
user.password = args.password;
460-
checkPassword(user, function (err, user) {
462+
var checkPasswordResult = checkPassword(user);
463+
if (!checkPasswordResult.ok) {
464+
return done(null, checkPasswordResult);
465+
}
466+
delete user.password;
467+
seneca.act({ role: 'user', cmd: 'change_password', user: user, password: args.password, repeat: args.repeat }, function (err, out) {
461468
if (err) { return done(err); }
462-
if (typeof user.ok !== 'undefined' && !user.ok) {
463-
return done(null, user);
464-
}
465-
delete user.password;
466-
seneca.act({ role: 'user', cmd: 'change_password', user: user, password: args.password, repeat: args.repeat }, function (err, out) {
467-
if (err) { return done(err); }
468469

469-
out.reset = reset;
470-
if (!out.ok) { return done(null, out); }
470+
out.reset = reset;
471+
if (!out.ok) { return done(null, out); }
471472

472-
seneca.act({role: plugin, cmd: 'update_profile_password'}, {password: args.password, user: user});
473+
seneca.act({role: plugin, cmd: 'update_profile_password'}, {password: args.password, user: user});
473474

474-
reset.active = false;
475-
reset.save$(function (err, reset) {
476-
if (err) { return done(err); }
477-
return done(null, { user: user, reset: reset, ok: true });
478-
});
475+
reset.active = false;
476+
reset.save$(function (err, reset) {
477+
if (err) { return done(err); }
478+
return done(null, { user: user, reset: reset, ok: true });
479479
});
480480
});
481481
});

0 commit comments

Comments
 (0)