From 642306e69c9d50e87926ffebeb884716b90aae8a Mon Sep 17 00:00:00 2001
From: Peter Jaszkowiak
Date: Thu, 23 Mar 2017 16:00:22 -0600
Subject: [PATCH] Fix #5543
---
src/user/create.js | 34 +++++++++++++++++-----------------
test/user.js | 32 ++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+), 17 deletions(-)
diff --git a/src/user/create.js b/src/user/create.js
index 2620cb67d3..ab413a545d 100644
--- a/src/user/create.js
+++ b/src/user/create.js
@@ -46,7 +46,7 @@ module.exports = function (User) {
async.parallel({
renamedUsername: function (next) {
- renameUsername(userData, next);
+ User.renameUsername(userData, next);
},
userData: function (next) {
plugins.fireHook('filter:user.create', { user: userData, data: data }, next);
@@ -200,28 +200,28 @@ module.exports = function (User) {
callback();
};
- function renameUsername(userData, callback) {
+ User.renameUsername = function (userData, callback) {
meta.userOrGroupExists(userData.userslug, function (err, exists) {
if (err || !exists) {
return callback(err);
}
- var newUsername = '';
- async.forever(function (next) {
- newUsername = userData.username + (Math.floor(Math.random() * 255) + 1);
- User.existsBySlug(newUsername, function (err, exists) {
- if (err) {
- return callback(err);
- }
- if (!exists) {
- next(newUsername);
- } else {
- next();
+ var num = 0;
+
+ function go() {
+ var username = userData.username + ' ' + num.toString(32);
+ var userslug = utils.slugify(username);
+ meta.userOrGroupExists(userslug, function (err, exists) {
+ if (err || !exists) {
+ return callback(err, username);
}
+
+ num += 1;
+ go();
});
- }, function (username) {
- callback(null, username);
- });
+ }
+
+ go();
});
- }
+ };
};
diff --git a/test/user.js b/test/user.js
index 776dbf28de..c83e8cd411 100644
--- a/test/user.js
+++ b/test/user.js
@@ -70,6 +70,38 @@ describe('User', function () {
});
});
+ describe('.renameUsername()', function () {
+ it('should deal with collisions', function (done) {
+ var users = [];
+ for (var i = 0; i < 10; i += 1) {
+ users.push({
+ username: 'Jane Doe',
+ password: 'abcdefghi',
+ email: 'jane.doe' + i + '@example.com',
+ });
+ }
+
+ async.series([
+ function (next) {
+ async.eachSeries(users, function (user, next) {
+ User.create(user, next);
+ }, next);
+ },
+ function (next) {
+ User.renameUsername({
+ username: 'Jane Doe',
+ userslug: 'jane-doe',
+ }, function (err, username) {
+ assert.ifError(err);
+
+ assert.strictEqual(username, 'Jane Doe 9');
+ done();
+ });
+ },
+ ], done);
+ });
+ });
+
describe('.isModerator()', function () {
it('should return false', function (done) {
User.isModerator(testUid, testCid, function (err, isModerator) {