|
@@ -14,12 +14,14 @@ const Modules = require('./Modules')
|
|
|
const Errors = require('../Features/Errors/Errors')
|
|
const Errors = require('../Features/Errors/Errors')
|
|
|
const {
|
|
const {
|
|
|
canRedirectToAdminDomain,
|
|
canRedirectToAdminDomain,
|
|
|
|
|
+ getAdminCapabilities,
|
|
|
hasAdminAccess,
|
|
hasAdminAccess,
|
|
|
} = require('../Features/Helpers/AdminAuthorizationHelper')
|
|
} = require('../Features/Helpers/AdminAuthorizationHelper')
|
|
|
const {
|
|
const {
|
|
|
addOptionalCleanupHandlerAfterDrainingConnections,
|
|
addOptionalCleanupHandlerAfterDrainingConnections,
|
|
|
} = require('./GracefulShutdown')
|
|
} = require('./GracefulShutdown')
|
|
|
const { sanitizeSessionUserForFrontEnd } = require('./FrontEndUser')
|
|
const { sanitizeSessionUserForFrontEnd } = require('./FrontEndUser')
|
|
|
|
|
+const { expressify } = require('@overleaf/promise-utils')
|
|
|
|
|
|
|
|
const IEEE_BRAND_ID = Settings.ieeeBrandId
|
|
const IEEE_BRAND_ID = Settings.ieeeBrandId
|
|
|
|
|
|
|
@@ -312,6 +314,35 @@ module.exports = function (webRouter, privateApiRouter, publicApiRouter) {
|
|
|
next()
|
|
next()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+ webRouter.use(
|
|
|
|
|
+ expressify(async function (req, res, next) {
|
|
|
|
|
+ const user = SessionManager.getSessionUser(req.session)
|
|
|
|
|
+ try {
|
|
|
|
|
+ const { adminCapabilities, adminCapabilitiesAvailable } =
|
|
|
|
|
+ await getAdminCapabilities(user)
|
|
|
|
|
+ res.locals.hasAdminCapability = capability => {
|
|
|
|
|
+ if (!hasAdminAccess(user)) {
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!adminCapabilitiesAvailable) {
|
|
|
|
|
+ // If admin capabilities are not available, then all admins have all capabilities
|
|
|
|
|
+ return true
|
|
|
|
|
+ }
|
|
|
|
|
+ return adminCapabilities.includes(capability)
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ if (user) {
|
|
|
|
|
+ // This is unexpected, it probably means that the session user does not exist.
|
|
|
|
|
+ logger.warn({ error, req, user }, 'Failed to get admin capabilities')
|
|
|
|
|
+ }
|
|
|
|
|
+ // adminCapabilitiesAvailable should be true if we are here so deny to be safe
|
|
|
|
|
+ res.locals.hasAdminCapability = () => false
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ next()
|
|
|
|
|
+ })
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
webRouter.use(function (req, res, next) {
|
|
webRouter.use(function (req, res, next) {
|
|
|
// Clone the nav settings so they can be modified for each request
|
|
// Clone the nav settings so they can be modified for each request
|
|
|
res.locals.nav = {}
|
|
res.locals.nav = {}
|