Skip to content

Commit 06f65cf

Browse files
committed
Clear two types of tokens on Accounts.setPassword
1 parent 64645d8 commit 06f65cf

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

History.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
* `Blaze.remove` on a template's view now correctly removes the DOM
2525
when the template was inserted using `Blaze.renderWithData`. #3130
2626

27-
* Expire a user's password reset tokens when their password is changed.
27+
* Expire a user's password reset and login tokens in all circumstances when
28+
their password is changed.
2829

2930
* Require plain objects as the update parameter when doing replacements
3031
in server-side collections.

packages/accounts-password/password_server.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,12 @@ Accounts.setPassword = function (userId, newPlaintextPassword) {
331331

332332
Meteor.users.update(
333333
{_id: user._id},
334-
{ $unset: {'services.password.srp': 1}, // XXX COMPAT WITH 0.8.1.3
334+
{
335+
$unset: {
336+
'services.password.srp': 1, // XXX COMPAT WITH 0.8.1.3
337+
'services.password.reset': 1,
338+
'services.resume.loginTokens': 1
339+
},
335340
$set: {'services.password.bcrypt': hashPassword(newPlaintextPassword)} }
336341
);
337342
};

packages/accounts-password/password_tests.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -873,8 +873,9 @@ if (Meteor.isServer) (function () {
873873
'passwords - setPassword',
874874
function (test) {
875875
var username = Random.id();
876+
var email = username + '-intercept@example.com';
876877

877-
var userId = Accounts.createUser({username: username});
878+
var userId = Accounts.createUser({username: username, email: email});
878879

879880
var user = Meteor.users.findOne(userId);
880881
// no services yet.
@@ -886,12 +887,22 @@ if (Meteor.isServer) (function () {
886887
var oldSaltedHash = user.services.password.bcrypt;
887888
test.isTrue(oldSaltedHash);
888889

890+
// Send a reset password email (setting a reset token) and insert a login
891+
// token.
892+
Accounts.sendResetPasswordEmail(userId, email);
893+
Accounts._insertLoginToken(userId, Accounts._generateStampedLoginToken());
894+
test.isTrue(Meteor.users.findOne(userId).services.password.reset);
895+
test.isTrue(Meteor.users.findOne(userId).services.resume.loginTokens);
896+
889897
// reset with the same password, see we get a different salted hash
890898
Accounts.setPassword(userId, 'new password');
891899
user = Meteor.users.findOne(userId);
892900
var newSaltedHash = user.services.password.bcrypt;
893901
test.isTrue(newSaltedHash);
894902
test.notEqual(oldSaltedHash, newSaltedHash);
903+
// No more tokens.
904+
test.isFalse(Meteor.users.findOne(userId).services.password.reset);
905+
test.isFalse(Meteor.users.findOne(userId).services.resume.loginTokens);
895906

896907
// cleanup
897908
Meteor.users.remove(userId);

0 commit comments

Comments
 (0)