diff options
author | Maxime Quandalle <maxime@quandalle.com> | 2015-11-11 14:15:37 -0800 |
---|---|---|
committer | Maxime Quandalle <maxime@quandalle.com> | 2015-11-11 14:16:40 -0800 |
commit | cb3bd86396e4d19e1f05fcb94e3527f81e70412e (patch) | |
tree | 620950043f89ada74b1f9a64fa93a21c2e80d682 /sandstorm.js | |
parent | fc82f7227ac4a38df4d5f1145f0fb5012a1545c1 (diff) | |
download | wekan-cb3bd86396e4d19e1f05fcb94e3527f81e70412e.tar.gz wekan-cb3bd86396e4d19e1f05fcb94e3527f81e70412e.tar.bz2 wekan-cb3bd86396e4d19e1f05fcb94e3527f81e70412e.zip |
Improve Sandstorm usernames management
We now use the `preferredHandle` exposed by Sandstorm as source for
the username and append a number if the username is already taken
since we need to ensure username uniqueness (eg 'max', 'max1', 'max2')
Fixes #352
Diffstat (limited to 'sandstorm.js')
-rw-r--r-- | sandstorm.js | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/sandstorm.js b/sandstorm.js index 65f24866..997aed46 100644 --- a/sandstorm.js +++ b/sandstorm.js @@ -22,8 +22,8 @@ if (isSandstorm && Meteor.isServer) { }; function updateUserPermissions(userId, permissions) { - const isActive = permissions.includes('participate'); - const isAdmin = permissions.includes('configure'); + const isActive = permissions.indexOf('participate') > -1; + const isAdmin = permissions.indexOf('configure') > -1; const permissionDoc = { userId, isActive, isAdmin }; const boardMembers = Boards.findOne(sandstormBoard._id).members; @@ -78,17 +78,40 @@ if (isSandstorm && Meteor.isServer) { // unique board document. Note that when the `Users.after.insert` hook is // called, the user is inserted into the database but not connected. So // despite the appearances `userId` is null in this block. - // - // XXX We should support the `preferredHandle` exposed by Sandstorm Users.after.insert((userId, doc) => { if (!Boards.findOne(sandstormBoard._id)) { - Boards.insert(sandstormBoard, {validate: false}); + Boards.insert(sandstormBoard, { validate: false }); Activities.update( { activityTypeId: sandstormBoard._id }, { $set: { userId: doc._id }} ); } + // We rely on username uniqueness for the user mention feature, but + // Sandstorm doesn't enforce this property -- see #352. Our strategy to + // generate unique usernames from the Sandstorm `preferredHandle` is to + // append a number that we increment until we generate a username that no + // one already uses (eg, 'max', 'max1', 'max2'). + function generateUniqueUsername(username, appendNumber) { + return username + String(appendNumber === 0 ? '' : appendNumber); + } + + const username = doc.services.sandstorm.preferredHandle; + let appendNumber = 0; + while (Users.findOne({ + _id: { $ne: doc._id }, + username: generateUniqueUsername(username, appendNumber), + })) { + appendNumber += 1; + } + + Users.update(doc._id, { + $set: { + username: generateUniqueUsername(username, appendNumber), + 'profile.fullname': doc.services.sandstorm.name, + }, + }); + updateUserPermissions(doc._id, doc.services.sandstorm.permissions); }); |