summaryrefslogtreecommitdiffstats
path: root/sandstorm.js
diff options
context:
space:
mode:
authorMaxime Quandalle <maxime@quandalle.com>2015-11-11 14:15:37 -0800
committerMaxime Quandalle <maxime@quandalle.com>2015-11-11 14:16:40 -0800
commitcb3bd86396e4d19e1f05fcb94e3527f81e70412e (patch)
tree620950043f89ada74b1f9a64fa93a21c2e80d682 /sandstorm.js
parentfc82f7227ac4a38df4d5f1145f0fb5012a1545c1 (diff)
downloadwekan-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.js33
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);
});