feature: change stored passphrase

This commit is contained in:
Esteban Ordano 2014-11-04 01:18:30 -03:00
parent 1b647758f1
commit f02e3ebe75
3 changed files with 82 additions and 2 deletions

View File

@ -58,6 +58,7 @@ module.exports = function(app) {
app.post(apiPrefix + '/email/validate', emailPlugin.validate); app.post(apiPrefix + '/email/validate', emailPlugin.validate);
app.get(apiPrefix + '/email/retrieve/:email', emailPlugin.get); app.get(apiPrefix + '/email/retrieve/:email', emailPlugin.get);
app.get(apiPrefix + '/email/validate', emailPlugin.validate); app.get(apiPrefix + '/email/validate', emailPlugin.validate);
app.post(apiPrefix + '/email/change_passphrase', emailPlugin.changePassphrase);
} }
// Address routes // Address routes

View File

@ -240,7 +240,13 @@ emailPlugin.checkPassphrase = function(email, passphrase, callback) {
* @param {Function(err)} callback * @param {Function(err)} callback
*/ */
emailPlugin.savePassphrase = function(email, passphrase, callback) { emailPlugin.savePassphrase = function(email, passphrase, callback) {
emailPlugin.db.put(MAP_EMAIL_TO_SECRET + email, passphrase, callback); emailPlugin.db.put(MAP_EMAIL_TO_SECRET + email, passphrase, function(err) {
if (err) {
logger.error(err);
return callback(emailPlugin.errors.INTERNAL_ERROR);
}
return callback(null);
});
}; };
/** /**
@ -324,7 +330,7 @@ emailPlugin.processPost = function(request, response, email, key, secret, record
} else { } else {
emailPlugin.savePassphrase(email, secret, function(err) { emailPlugin.savePassphrase(email, secret, function(err) {
if (err) { if (err) {
return callback({code: 500, message: err}); return callback(err);
} }
return callback(); return callback();
}); });
@ -477,6 +483,44 @@ emailPlugin.validate = function (request, response) {
}); });
}; };
/**
* Changes an user's passphrase
*
* @param {Express.Request} request
* @param {Express.Response} response
*/
emailPlugin.changePassphrase = function (request, response) {
var queryData = '';
request.on('data', function (data) {
queryData += data;
if (queryData.length > MAX_ALLOWED_STORAGE) {
queryData = '';
response.writeHead(413, {'Content-Type': 'text/plain'}).end();
request.connection.destroy();
}
}).on('end', function () {
var params = querystring.parse(queryData);
var email = params.email;
var oldSecret = params.secret;
var newSecret = params.newSecret;
if (!email || !oldSecret || !newSecret) {
return emailPlugin.returnError(emailPlugin.errors.INVALID_REQUEST, response);
}
emailPlugin.checkPassphrase(email, oldSecret, function (error) {
if (error) {
return emailPlugin.returnError(error, response);
}
emailPlugin.savePassphrase(email, newSecret, function (error) {
if (error) {
return emailPlugin.returnError(error, response);
}
return response.json({success: true}).end();
});
});
});
};
module.exports = emailPlugin; module.exports = emailPlugin;
})(); })();

View File

@ -125,6 +125,7 @@ describe('emailstore test', function() {
it('should validate correctly an email if the secret matches', function() { it('should validate correctly an email if the secret matches', function() {
leveldb_stub.get.onFirstCall().callsArgWith(1, null, secret); leveldb_stub.get.onFirstCall().callsArgWith(1, null, secret);
response.redirect = sinon.stub();
plugin.validate(request, response); plugin.validate(request, response);
@ -167,5 +168,39 @@ describe('emailstore test', function() {
assert(response.end.calledOnce); assert(response.end.calledOnce);
}); });
}); });
describe('changing the user password', function() {
it('should validate the previous passphrase', function() {
request.param = sinon.stub();
request.param.onFirstCall().returns('email');
request.param.onSecondCall().returns('oldSecret');
request.param.onThirdCall().returns('newSecret');
response.status.onFirstCall().returnsThis();
response.json.onFirstCall().returnsThis();
plugin.checkPassphrase = sinon.stub();
plugin.checkPassphrase.onFirstCall().callsArgWith(2, 'error');
plugin.changePassphrase(request, response);
assert(response.status.calledOnce);
assert(response.json.calledOnce);
assert(response.end.calledOnce);
});
it('should change the passphrase', function() {
request.param.onFirstCall().returns('email');
request.param.onSecondCall().returns('oldSecret');
request.param.onThirdCall().returns('newSecret');
response.json.onFirstCall().returnsThis();
plugin.checkPassphrase = sinon.stub();
plugin.checkPassphrase.onFirstCall().callsArgWith(2, null);
plugin.savePassphrase = sinon.stub();
plugin.savePassphrase.onFirstCall().callsArgWith(2, null);
plugin.changePassphrase(request, response);
assert(response.json.calledOnce);
assert(response.end.calledOnce);
});
});
}); });