diff --git a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee index 8234907ff4..70f26157df 100644 --- a/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectDetailsHandler.coffee @@ -64,6 +64,7 @@ module.exports = ProjectDetailsHandler = setPublicAccessLevel : (project_id, newAccessLevel, callback = ->)-> logger.log project_id: project_id, level: newAccessLevel, "set public access level" - if project_id? && newAccessLevel? and _.include [PublicAccessLevels.READ_ONLY, PublicAccessLevels.READ_AND_WRITE, PublicAccessLevels.PRIVATE], newAccessLevel + # TODO: remove the read-only and read-and-write items from here + if project_id? && newAccessLevel? and _.include [PublicAccessLevels.READ_ONLY, PublicAccessLevels.READ_AND_WRITE, PublicAccessLevels.PRIVATE, PublicAccessLevels.TOKEN_BASED], newAccessLevel Project.update {_id:project_id},{publicAccesLevel:newAccessLevel}, (err)-> - callback() \ No newline at end of file + callback() diff --git a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee index c7acdee766..65cf2f5398 100644 --- a/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee +++ b/services/web/app/coffee/Features/Project/ProjectEditorHandler.coffee @@ -18,6 +18,7 @@ module.exports = ProjectEditorHandler = deletedDocs: project.deletedDocs members: [] invites: invites + tokens: project.tokens if !result.invites? result.invites = [] diff --git a/services/web/app/coffee/Features/TokenAccess/TokenAccessController.coffee b/services/web/app/coffee/Features/TokenAccess/TokenAccessController.coffee index 350d55de66..f51a03fabb 100644 --- a/services/web/app/coffee/Features/TokenAccess/TokenAccessController.coffee +++ b/services/web/app/coffee/Features/TokenAccess/TokenAccessController.coffee @@ -1,9 +1,11 @@ ProjectGetter = require "../Project/ProjectGetter" +ProjectController = require "../Project/ProjectController" ProjectEditorHandler = require "../Project/ProjectEditorHandler" UserGetter = require "../User/UserGetter" AuthenticationController = require '../Authentication/AuthenticationController' logger = require 'logger-sharelatex' TokenAccessHandler = require './TokenAccessHandler' +Errors = require '../Errors/Errors' module.exports = TokenAccessController = @@ -20,7 +22,7 @@ module.exports = TokenAccessController = if !project? logger.log {token, userId}, "no project found for readAndWrite token" - return res.sendStatus(404) + return next(new Errors.NotFoundError()) logger.log {userId, projectId: project._id}, "adding user to project with readAndWrite token" TokenAccessHandler.addReadAndWriteUserToProject userId, project._id, (err) -> @@ -28,7 +30,8 @@ module.exports = TokenAccessController = logger.err {err, token, userId, projectId: project._id}, "error adding user to project with readAndWrite token" return next(err) - return res.redirect(307, "/project/#{project._id}") + req.params.Project_id = project._id.toString() + return ProjectController.loadEditor(req, res, next) readOnlyToken: (req, res, next) -> userId = AuthenticationController.getLoggedInUserId(req) @@ -42,12 +45,13 @@ module.exports = TokenAccessController = if !project? logger.log {token, userId}, "no project found for readAndWrite token" - return res.sendStatus(404) + return next(new Errors.NotFoundError()) if !userId? logger.log {userId, projectId: project._id}, "adding anonymous user to project with readOnly token" TokenAccessHandler.grantSessionReadOnlyTokenAccess(req, project._id, token) - return res.redirect(307, "/project/#{project._id}") + req.params.Project_id = project._id.toString() + return ProjectController.loadEditor(req, res, next) else logger.log {userId, projectId: project._id}, "adding user to project with readOnly token" @@ -56,6 +60,7 @@ module.exports = TokenAccessController = logger.err {err, token, userId, projectId: project._id}, "error adding user to project with readAndWrite token" return next(err) - res.redirect(307, "/project/#{project._id}") + req.params.Project_id = project._id.toString() + return ProjectController.loadEditor(req, res, next) diff --git a/services/web/app/views/project/editor/share.pug b/services/web/app/views/project/editor/share.pug index ae59185b9d..cd900c69ef 100644 --- a/services/web/app/views/project/editor/share.pug +++ b/services/web/app/views/project/editor/share.pug @@ -8,15 +8,30 @@ script(type='text/ng-template', id='shareProjectModalTemplate') h3 #{translate("share_project")} .modal-body.modal-body-share .container-fluid + + //- Private .row.public-access-level(ng-show="project.publicAccesLevel == 'private'") .col-xs-12.text-center | #{translate("this_project_is_private")} |    a( href - ng-click="openMakePublicModal()" - ) #{translate("make_public")} - .row.public-access-level(ng-show="project.publicAccesLevel != 'private'") + ng-click="openMakeTokenBasedModal()" + ) #{translate("make_token_based")} + + //- Token-based access + .row.public-access-level(ng-show="project.publicAccesLevel == 'tokenBased'") + .col-xs-12.text-center + strong + | #{translate("this_project_is_token_based_access")} + |    + a( + href + ng-click="openMakePrivateModal()" + ) #{translate("make_private")} + + //- legacy public-access + .row.public-access-level(ng-show="project.publicAccesLevel == 'readAndWrite' || project.publicAccesLevel == 'readOnly'") .col-xs-12.text-center strong(ng-if="project.publicAccesLevel == 'readAndWrite'") #{translate("this_project_is_public")} strong(ng-if="project.publicAccesLevel == 'readOnly'") #{translate("this_project_is_public_read_only")} @@ -25,6 +40,7 @@ script(type='text/ng-template', id='shareProjectModalTemplate') href ng-click="openMakePrivateModal()" ) #{translate("make_private")} + .row.project-member .col-xs-8 {{ project.owner.email }} .text-left( @@ -180,6 +196,24 @@ script(type="text/ng-template", id="makePublicModalTemplate") ng-click="makePublic()" ) #{translate("make_public")} +script(type="text/ng-template", id="makeTokenBasedModalTemplate") + .modal-header + button.close( + type="button" + data-dismiss="modal" + ng-click="cancel()" + ) × + h3 #{translate("make_project_token_based")}? + .modal-body.modal-body-share + p #{translate("make_project_token_based_consequences")} + .modal-footer + button.btn.btn-default( + ng-click="cancel()" + ) #{translate("cancel")} + button.btn.btn-info( + ng-click="makeTokenBased()" + ) #{translate("make_token_based")} + script(type="text/ng-template", id="makePrivateModalTemplate") .modal-header button.close( diff --git a/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee b/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee index 3c72fdbb05..dcd9a2da65 100644 --- a/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee +++ b/services/web/public/coffee/ide/share/controllers/ShareProjectModalController.coffee @@ -192,6 +192,13 @@ define [ scope: $scope } + $scope.openMakeTokenBasedModal = () -> + $modal.open { + templateUrl: "makeTokenBasedModalTemplate" + controller: "MakeTokenBasedModalController" + scope: $scope + } + $scope.done = () -> $modalInstance.close() @@ -212,6 +219,17 @@ define [ $modalInstance.dismiss() ] + App.controller "MakeTokenBasedModalController", ["$scope", "$modalInstance", "settings", ($scope, $modalInstance, settings) -> + + $scope.makeTokenBased = () -> + $scope.project.publicAccesLevel = "tokenBased" + settings.saveProjectAdminSettings({publicAccessLevel: "tokenBased"}) + $modalInstance.close() + + $scope.cancel = () -> + $modalInstance.dismiss() + ] + App.controller "MakePrivateModalController", ["$scope", "$modalInstance", "settings", ($scope, $modalInstance, settings) -> $scope.makePrivate = () -> $scope.project.publicAccesLevel = "private"