AdminAuthorizationHelper.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. const Settings = require('@overleaf/settings')
  2. const Modules = require('../../infrastructure/Modules')
  3. const { expressify } = require('@overleaf/promise-utils')
  4. const SessionManager = require('../Authentication/SessionManager')
  5. const logger = require('@overleaf/logger')
  6. module.exports = {
  7. hasAdminAccess,
  8. canRedirectToAdminDomain,
  9. getAdminCapabilities,
  10. addHasAdminCapabilityToLocals: expressify(addHasAdminCapabilityToLocals),
  11. }
  12. function hasAdminAccess(user) {
  13. if (!Settings.adminPrivilegeAvailable) return false
  14. if (!user) return false
  15. return Boolean(user.isAdmin)
  16. }
  17. async function getAdminCapabilities(user) {
  18. const rawAdminCapabilties = await Modules.promises.hooks.fire(
  19. 'getAdminCapabilities',
  20. user
  21. )
  22. return {
  23. adminCapabilities: [...new Set(rawAdminCapabilties.flat())],
  24. adminCapabilitiesAvailable: rawAdminCapabilties.length > 0,
  25. }
  26. }
  27. async function addHasAdminCapabilityToLocals(req, res, next) {
  28. const user = SessionManager.getSessionUser(req.session)
  29. try {
  30. const { adminCapabilities, adminCapabilitiesAvailable } =
  31. await getAdminCapabilities(user)
  32. res.locals.hasAdminCapability = capability => {
  33. if (!hasAdminAccess(user)) {
  34. return false
  35. }
  36. if (!adminCapabilitiesAvailable) {
  37. // If admin capabilities are not available, then all admins have all capabilities
  38. return true
  39. }
  40. return adminCapabilities.includes(capability)
  41. }
  42. } catch (error) {
  43. if (user) {
  44. // This is unexpected, it probably means that the session user does not exist.
  45. logger.warn({ error, req, user }, 'Failed to get admin capabilities')
  46. }
  47. // A module probably threw so adminCapabilitiesAvailable should be true if we are here so deny to be safe
  48. res.locals.hasAdminCapability = () => false
  49. }
  50. next()
  51. }
  52. function canRedirectToAdminDomain(user) {
  53. if (Settings.adminPrivilegeAvailable) return false
  54. if (!Settings.adminUrl) return false
  55. if (!user) return false
  56. return Boolean(user.isAdmin)
  57. }