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) {