소스 검색

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
Maxime Quandalle 9 년 전
부모
커밋
cb3bd86396
3개의 변경된 파일30개의 추가작업 그리고 7개의 파일을 삭제
  1. 1 1
      .meteor/versions
  2. 1 1
      client/components/sidebar/sidebar.jade
  3. 28 5
      sandstorm.js

+ 1 - 1
.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

+ 1 - 1
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'}})

+ 28 - 5
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);
   });