Prevent registration race condition
This commit is contained in:
parent
33d1075d44
commit
22ba96b9fd
3 changed files with 23 additions and 0 deletions
|
|
@ -738,6 +738,7 @@ Database.prototype.isUsernameTaken = function (name, callback) {
|
|||
});
|
||||
};
|
||||
|
||||
var regInProgress = {};
|
||||
Database.prototype.registerUser = function (name, pw, callback) {
|
||||
var self = this;
|
||||
if(typeof callback !== "function")
|
||||
|
|
@ -748,37 +749,50 @@ Database.prototype.registerUser = function (name, pw, callback) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (regInProgress[name]) {
|
||||
callback("Registration is already in progress", null);
|
||||
return;
|
||||
}
|
||||
|
||||
regInProgress[name] = true;
|
||||
|
||||
var postRegister = function (err, res) {
|
||||
if(err) {
|
||||
delete regInProgress[name];
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
self.createLoginSession(name, function (err, hash) {
|
||||
if(err) {
|
||||
delete regInProgress[name];
|
||||
// Don't confuse people into thinking the registration
|
||||
// failed when it was the session that failed
|
||||
callback(null, "");
|
||||
return;
|
||||
}
|
||||
|
||||
delete regInProgress[name];
|
||||
callback(null, hash);
|
||||
});
|
||||
};
|
||||
|
||||
self.isUsernameTaken(name, function (err, taken) {
|
||||
if(err) {
|
||||
delete regInProgress[name];
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
||||
if(taken) {
|
||||
delete regInProgress[name];
|
||||
callback("Username already taken", null);
|
||||
return;
|
||||
}
|
||||
|
||||
bcrypt.hash(pw, 10, function (err, hash) {
|
||||
if(err) {
|
||||
delete regInProgress[name];
|
||||
callback(err, null);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue