diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsController.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsController.coffee index 1905d0d0a6..662e3109e3 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsController.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsController.coffee @@ -4,7 +4,8 @@ ProjectEditorHandler = require "../Project/ProjectEditorHandler" EditorRealTimeController = require "../Editor/EditorRealTimeController" LimitationsManager = require "../Subscription/LimitationsManager" UserGetter = require "../User/UserGetter" -mimelib = require("mimelib") +EmailHelpers = require "../Helpers/EmailHelpers" + module.exports = CollaboratorsController = addUserToProject: (req, res, next) -> @@ -16,11 +17,11 @@ module.exports = CollaboratorsController = return res.json { user: false } else {email, privileges} = req.body - - email = mimelib.parseAddresses(email or "")[0]?.address?.toLowerCase() + + email = EmailHelpers.parseEmail(email) if !email? or email == "" return res.status(400).send("invalid email address") - + adding_user_id = req.session?.user?._id CollaboratorsHandler.addEmailToProject project_id, adding_user_id, email, privileges, (error, user_id) => return next(error) if error? @@ -36,7 +37,7 @@ module.exports = CollaboratorsController = CollaboratorsController._removeUserIdFromProject project_id, user_id, (error) -> return next(error) if error? res.sendStatus 204 - + removeSelfFromProject: (req, res, next = (error) ->) -> project_id = req.params.Project_id user_id = req.session?.user?._id @@ -49,4 +50,3 @@ module.exports = CollaboratorsController = return callback(error) if error? EditorRealTimeController.emitToRoom(project_id, 'userRemovedFromProject', user_id) callback() - diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee index 81557fea42..4b48f97304 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsHandler.coffee @@ -1,6 +1,5 @@ UserCreator = require('../User/UserCreator') Project = require("../../models/Project").Project -mimelib = require("mimelib") logger = require('logger-sharelatex') UserGetter = require "../User/UserGetter" ContactManager = require "../Contacts/ContactManager" @@ -8,8 +7,11 @@ CollaboratorsEmailHandler = require "./CollaboratorsEmailHandler" async = require "async" PrivilegeLevels = require "../Authorization/PrivilegeLevels" Errors = require "../Errors/Errors" +EmailHelpers = require "../Helpers/EmailHelpers" + module.exports = CollaboratorsHandler = + getMemberIdsWithPrivilegeLevels: (project_id, callback = (error, members) ->) -> Project.findOne { _id: project_id }, { owner_ref: 1, collaberator_refs: 1, readOnly_refs: 1 }, (error, project) -> return callback(error) if error? @@ -21,12 +23,12 @@ module.exports = CollaboratorsHandler = for member_id in project.collaberator_refs or [] members.push { id: member_id.toString(), privilegeLevel: PrivilegeLevels.READ_AND_WRITE } return callback null, members - + getMemberIds: (project_id, callback = (error, member_ids) ->) -> CollaboratorsHandler.getMemberIdsWithPrivilegeLevels project_id, (error, members) -> return callback(error) if error? return callback null, members.map (m) -> m.id - + getMembersWithPrivilegeLevels: (project_id, callback = (error, members) ->) -> CollaboratorsHandler.getMemberIdsWithPrivilegeLevels project_id, (error, members = []) -> return callback(error) if error? @@ -41,7 +43,7 @@ module.exports = CollaboratorsHandler = (error) -> return callback(error) if error? callback null, result - + getMemberIdPrivilegeLevel: (user_id, project_id, callback = (error, privilegeLevel) ->) -> # In future if the schema changes and getting all member ids is more expensive (multiple documents) # then optimise this. @@ -51,12 +53,12 @@ module.exports = CollaboratorsHandler = if member.id == user_id?.toString() return callback null, member.privilegeLevel return callback null, PrivilegeLevels.NONE - + getMemberCount: (project_id, callback = (error, count) ->) -> CollaboratorsHandler.getMemberIdsWithPrivilegeLevels project_id, (error, members) -> return callback(error) if error? return callback null, (members or []).length - + getCollaboratorCount: (project_id, callback = (error, count) ->) -> CollaboratorsHandler.getMemberCount project_id, (error, count) -> return callback(error) if error? @@ -69,14 +71,14 @@ module.exports = CollaboratorsHandler = if member.id.toString() == user_id.toString() return callback null, true, member.privilegeLevel return callback null, false, null - + getProjectsUserIsCollaboratorOf: (user_id, fields, callback = (error, readAndWriteProjects, readOnlyProjects) ->) -> Project.find {collaberator_refs:user_id}, fields, (err, readAndWriteProjects)=> return callback(err) if err? Project.find {readOnly_refs:user_id}, fields, (err, readOnlyProjects)=> return callback(err) if err? callback(null, readAndWriteProjects, readOnlyProjects) - + removeUserFromProject: (project_id, user_id, callback = (error) ->)-> logger.log user_id: user_id, project_id: project_id, "removing user" conditions = _id:project_id @@ -86,7 +88,7 @@ module.exports = CollaboratorsHandler = if err? logger.error err: err, "problem removing user from project collaberators" callback(err) - + removeUserFromAllProjets: (user_id, callback = (error) ->) -> CollaboratorsHandler.getProjectsUserIsCollaboratorOf user_id, { _id: 1 }, (error, readAndWriteProjects = [], readOnlyProjects = []) -> return callback(error) if error? @@ -98,10 +100,9 @@ module.exports = CollaboratorsHandler = return cb() if !project? CollaboratorsHandler.removeUserFromProject project._id, user_id, cb async.series jobs, callback - + addEmailToProject: (project_id, adding_user_id, unparsed_email, privilegeLevel, callback = (error, user) ->) -> - emails = mimelib.parseAddresses(unparsed_email) - email = emails[0]?.address?.toLowerCase() + email = EmailHelpers.parseEmail(unparsed_email) if !email? or email == "" return callback(new Error("no valid email provided: '#{unparsed_email}'")) UserCreator.getUserOrCreateHoldingAccount email, (error, user) -> @@ -118,7 +119,7 @@ module.exports = CollaboratorsHandler = existing_users = existing_users.map (u) -> u.toString() if existing_users.indexOf(user_id.toString()) > -1 return callback null # User already in Project - + if privilegeLevel == PrivilegeLevels.READ_AND_WRITE level = {"collaberator_refs":user_id} logger.log {privileges: "readAndWrite", user_id, project_id}, "adding user" diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee index 7f5adcc76f..e91dd308a0 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteController.coffee @@ -3,8 +3,9 @@ LimitationsManager = require "../Subscription/LimitationsManager" UserGetter = require "../User/UserGetter" Project = require("../../models/Project").Project CollaboratorsInviteHandler = require('./CollaboratorsInviteHandler') -mimelib = require("mimelib") logger = require('logger-sharelatex') +EmailHelpers = require "../Helpers/EmailHelpers" + module.exports = CollaboratorsInviteController = @@ -28,7 +29,7 @@ module.exports = CollaboratorsInviteController = logger.log {projectId, email, sendingUserId}, "not allowed to invite more users to project" return res.json {invite: null} {email, privileges} = req.body - email = mimelib.parseAddresses(email or "")[0]?.address?.toLowerCase() + email = EmailHelpers.parseEmail(email) if !email? or email == "" logger.log {projectId, email, sendingUserId}, "invalid email address" return res.sendStatus(400) diff --git a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee index 8d71e019fe..57d9169b8f 100644 --- a/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee +++ b/services/web/app/coffee/Features/Collaborators/CollaboratorsInviteHandler.coffee @@ -1,5 +1,4 @@ ProjectInvite = require("../../models/ProjectInvite").ProjectInvite -mimelib = require("mimelib") logger = require('logger-sharelatex') CollaboratorsEmailHandler = require "./CollaboratorsEmailHandler" CollaboratorsHandler = require "./CollaboratorsHandler" diff --git a/services/web/app/coffee/Features/Helpers/EmailHelpers.coffee b/services/web/app/coffee/Features/Helpers/EmailHelpers.coffee new file mode 100644 index 0000000000..6c2644875e --- /dev/null +++ b/services/web/app/coffee/Features/Helpers/EmailHelpers.coffee @@ -0,0 +1,11 @@ +mimelib = require("mimelib") + + +module.exports = EmailHelpers = + + parseEmail: (email) -> + email = mimelib.parseAddresses(email or "")[0]?.address?.toLowerCase() + if !email? or email == "" + return null + else + return email