diff --git a/services/web/app/coffee/Features/Project/ProjectController.coffee b/services/web/app/coffee/Features/Project/ProjectController.coffee index e0acd45b6e..ae81a3f541 100644 --- a/services/web/app/coffee/Features/Project/ProjectController.coffee +++ b/services/web/app/coffee/Features/Project/ProjectController.coffee @@ -24,13 +24,16 @@ AnalyticsManager = require "../Analytics/AnalyticsManager" Sources = require "../Authorization/Sources" TokenAccessHandler = require '../TokenAccess/TokenAccessHandler' CollaboratorsHandler = require '../Collaborators/CollaboratorsHandler' +crypto = require 'crypto' module.exports = ProjectController = - _isInPercentageRollout: (objectId, percentage) -> + _isInPercentageRollout: (rolloutName, objectId, percentage) -> if Settings.bypassPercentageRollouts == true return true - counter = parseInt(objectId.toString().substring(18, 24), 16) + data = "#{rolloutName}:#{objectId.toString()}" + md5hash = crypto.createHash('md5').update(data).digest('hex') + counter = parseInt(md5hash.slice(26, 32), 16) return (counter % 100) < percentage updateProjectSettings: (req, res, next) -> @@ -274,7 +277,7 @@ module.exports = ProjectController = timestamp = parseInt(user_id.toString().substring(0, 8), 16) rolloutPercentage = 60 # Percentage of users to roll out to - if !ProjectController._isInPercentageRollout(user_id, rolloutPercentage) + if !ProjectController._isInPercentageRollout('autocompile', user_id, rolloutPercentage) # Don't show if user is not part of roll out return cb(null, { enabled: false, showOnboarding: false }) userSignupDate = new Date(timestamp * 1000) @@ -305,7 +308,11 @@ module.exports = ProjectController = token = TokenAccessHandler.getRequestToken(req, project_id) isTokenMember = results.isTokenMember - enableTokenAccessUI = ProjectController._isInPercentageRollout(project.owner_ref, 0) + enableTokenAccessUI = ProjectController._isInPercentageRollout( + 'linksharing', + project.owner_ref, + 0 + ) AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel)-> return next(error) if error? if !privilegeLevel? or privilegeLevel == PrivilegeLevels.NONE diff --git a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee index 6a8a596d72..498090f790 100644 --- a/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee +++ b/services/web/test/UnitTests/coffee/Project/ProjectControllerTests.coffee @@ -468,3 +468,82 @@ describe "ProjectController", -> opts.showTrackChangesOnboarding.should.equal false done() @ProjectController.loadEditor @req, @res + + describe '_isInPercentageRollout', -> + before -> + @ids = [ + '5a05cd7621f9fe22be131740', + '5a05cd7821f9fe22be131741', + '5a05cd7921f9fe22be131742', + '5a05cd7a21f9fe22be131743', + '5a05cd7b21f9fe22be131744', + '5a05cd7c21f9fe22be131745', + '5a05cd7d21f9fe22be131746', + '5a05cd7e21f9fe22be131747', + '5a05cd7f21f9fe22be131748', + '5a05cd8021f9fe22be131749', + '5a05cd8021f9fe22be13174a', + '5a05cd8121f9fe22be13174b', + '5a05cd8221f9fe22be13174c', + '5a05cd8221f9fe22be13174d', + '5a05cd8321f9fe22be13174e', + '5a05cd8321f9fe22be13174f', + '5a05cd8421f9fe22be131750', + '5a05cd8421f9fe22be131751', + '5a05cd8421f9fe22be131752', + '5a05cd8521f9fe22be131753' + ] + + it 'should produce the expected results', -> + expect( + @ids.map (i) => + @ProjectController._isInPercentageRollout('abcd', i, 50) + ).to.deep.equal [ + false, + false, + false, + false, + false, + false, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + false, + true, + false, + true + ] + expect( + @ids.map (i) => + @ProjectController._isInPercentageRollout('efgh', i, 50) + ).to.deep.equal [ + false, + false, + false, + false, + true, + false, + false, + true, + false, + false, + true, + true, + true, + false, + true, + false, + true, + true, + false, + false + ] + +