SecurityManager.coffee 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. logger = require('logger-sharelatex')
  2. crypto = require 'crypto'
  3. Assert = require 'assert'
  4. Settings = require 'settings-sharelatex'
  5. User = require('../models/User').User
  6. Project = require('../models/Project').Project
  7. HomeController = require("../Features/StaticPages/HomeController")
  8. AuthenticationController = require("../Features/Authentication/AuthenticationController")
  9. _ = require('underscore')
  10. metrics = require('../infrastructure/Metrics')
  11. querystring = require('querystring')
  12. module.exports =
  13. restricted : (req, res, next)->
  14. if req.session.user?
  15. res.render 'user/restricted',
  16. title:'Restricted'
  17. else
  18. logger.log "user not logged in and trying to access #{req.url}, being redirected to login"
  19. res.redirect '/register'
  20. getCurrentUser: (req, callback) ->
  21. if req.session.user?
  22. User.findById req.session.user._id, callback
  23. else
  24. callback null, null
  25. requestCanAccessProject : (req, res, next)->
  26. doRequest = (req, res, next) ->
  27. getRequestUserAndProject req, res, {allow_auth_token: options?.allow_auth_token}, (err, user, project)->
  28. if !project? or project.archived
  29. return HomeController.notFound(req, res, next)
  30. userCanAccessProject user, project, (canAccess, permissionLevel)->
  31. if canAccess
  32. next()
  33. else if user?
  34. logger.log "user_id: #{user._id} email: #{user.email} trying to access restricted page #{req.path}"
  35. res.redirect('/restricted')
  36. else
  37. logger.log "user not logged in and trying to access #{req.url}, being redirected to login"
  38. req.query.redir = req._parsedUrl.pathname
  39. url = "/register?#{querystring.stringify(req.query)}"
  40. res.redirect url
  41. email = "not logged in user"
  42. if arguments.length > 1
  43. options =
  44. allow_auth_token: false
  45. doRequest.apply(this, arguments)
  46. else
  47. options = req
  48. return doRequest
  49. requestCanModifyProject : (req, res, next)->
  50. getRequestUserAndProject req, res, {}, (err, user, project)=>
  51. userCanModifyProject user, project, (canModify)->
  52. if canModify
  53. next()
  54. else
  55. logger.log "user_id: #{user._id} email: #{user.email} can not modify project redirecting to restricted page"
  56. res.redirect('/restricted')
  57. userCanModifyProject : userCanModifyProject = (user, project, callback)->
  58. if !user? or !project?
  59. callback false
  60. else if userIsOwner user, project
  61. callback true
  62. else if userIsCollaberator user, project
  63. callback true
  64. else if project.publicAccesLevel == "readAndWrite"
  65. callback true
  66. else if user.isAdmin
  67. callback true
  68. else
  69. callback false
  70. requestIsOwner : (req, res, next)->
  71. getRequestUserAndProject req, res, {}, (err, user, project)->
  72. if userIsOwner user, project || user.isAdmin
  73. next()
  74. else
  75. logger.log user_id: user?._id, email: user?.email, "user is not owner of project redirecting to restricted page"
  76. res.redirect('/restricted')
  77. requestIsAdmin : isAdmin = (req, res, next)->
  78. logger.log "checking if user is admin"
  79. user = req.session.user
  80. if(user? && user.isAdmin)
  81. logger.log user: user, "User is admin"
  82. next()
  83. else
  84. res.redirect('/restricted')
  85. logger.log user:user, "is not admin redirecting to restricted page"
  86. userCanAccessProject : userCanAccessProject = (user, project, callback)=>
  87. if !user?
  88. user = {_id:'anonymous-user'}
  89. if !project?
  90. callback false
  91. logger.log user:user, project:project, "Checking if can access"
  92. if userIsOwner user, project
  93. callback true, "owner"
  94. else if userIsCollaberator user, project
  95. callback true, "readAndWrite"
  96. else if userIsReadOnly user, project
  97. callback true, "readOnly"
  98. else if user.isAdmin
  99. logger.log user:user, project:project, "user is admin and can access project"
  100. callback true, "owner"
  101. else if project.publicAccesLevel == "readAndWrite"
  102. logger.log user:user, project:project, "project is a public read and write project"
  103. callback true, "readAndWrite"
  104. else if project.publicAccesLevel == "readOnly"
  105. logger.log user:user, project:project, "project is a public read only project"
  106. callback true, "readOnly"
  107. else
  108. metrics.inc "security.denied"
  109. logger.log user:user, project:project, "Security denied - user can not enter project"
  110. callback false
  111. userIsOwner : userIsOwner = (user, project)->
  112. if !user?
  113. return false
  114. else
  115. userId = user._id+''
  116. ownerRef = getProjectIdFromRef(project.owner_ref)
  117. if userId == ownerRef
  118. true
  119. else
  120. false
  121. userIsCollaberator : userIsCollaberator = (user, project)->
  122. if !user?
  123. return false
  124. else
  125. userId = user._id+''
  126. result = false
  127. _.each project.collaberator_refs, (colabRef)->
  128. colabRef = getProjectIdFromRef(colabRef)
  129. if colabRef == userId
  130. result = true
  131. return result
  132. userIsReadOnly : userIsReadOnly = (user, project)->
  133. if !user?
  134. return false
  135. else
  136. userId = user._id+''
  137. result = false
  138. _.each project.readOnly_refs, (readOnlyRef)->
  139. readOnlyRef = getProjectIdFromRef(readOnlyRef)
  140. if readOnlyRef == userId
  141. result = true
  142. return result
  143. getRequestUserAndProject = (req, res, options, callback)->
  144. project_id = req.params.Project_id
  145. Project.findById project_id, 'name owner_ref readOnly_refs collaberator_refs publicAccesLevel archived', (err, project)=>
  146. if err?
  147. logger.err err:err, "error getting project for security check"
  148. return callback err
  149. AuthenticationController.getLoggedInUser req, options, (err, user)=>
  150. if err?
  151. logger.err err:err, "error getting last logged in user for security check"
  152. callback err, user, project
  153. getProjectIdFromRef = (ref)->
  154. if !ref?
  155. return null
  156. else if ref._id?
  157. return ref._id+''
  158. else
  159. return ref+''