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 | |
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
-rw-r--r-- | .meteor/versions | 2 | ||||
-rw-r--r-- | client/components/sidebar/sidebar.jade | 2 | ||||
-rw-r--r-- | sandstorm.js | 33 |
3 files changed, 30 insertions, 7 deletions
diff --git a/.meteor/versions b/.meteor/versions index b2d2cff6..5c4c189b 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -64,7 +64,7 @@ jquery@1.11.4 kadira:blaze-layout@2.2.0 kadira:dochead@1.3.2 kadira:flow-router@2.8.0 -kenton:accounts-sandstorm@0.1.7 +kenton:accounts-sandstorm@0.1.8 launch-screen@1.0.4 livedata@1.0.15 localstorage@1.0.5 diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 91047056..f98ea4ee 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -89,7 +89,7 @@ template(name="addMemberPopup") a.name.js-select-member(title="{{profile.name}} ({{username}})") +userAvatar(userId=_id esSearch=true) span.full-name - = profile.name + = profile.fullname | (<span class="username">{{username}}</span>) if isBoardMember .quiet ({{_ 'joined'}}) 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); }); |