mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-06-01 13:21:37 +02:00
42 lines
1.3 KiB
JavaScript
42 lines
1.3 KiB
JavaScript
import logger from '@overleaf/logger'
|
|
import AuthorizationManager from '../../../../app/src/Features/Authorization/AuthorizationManager.mjs'
|
|
import GitBridgePATManager from './GitBridgePATManager.mjs'
|
|
|
|
const permissionChecks = {
|
|
read: AuthorizationManager.promises.canUserReadProject,
|
|
write: AuthorizationManager.promises.canUserWriteProjectContent
|
|
}
|
|
|
|
export default function ensureTokenProjectAccess(permission) {
|
|
const checkPermission = permissionChecks[permission]
|
|
if (!checkPermission) {
|
|
throw new Error(`Invalid permission: ${permission}`)
|
|
}
|
|
|
|
return async function (req, res, next) {
|
|
try {
|
|
const projectId = req.params.project_id
|
|
if (!projectId) return res.sendStatus(400)
|
|
|
|
const header = req.headers.authorization || ''
|
|
const [scheme, token] = header.trim().split(/\s+/, 2)
|
|
if (scheme?.toLowerCase() !== 'bearer' || !token) {
|
|
return res.sendStatus(401)
|
|
}
|
|
|
|
const userId = await GitBridgePATManager.getUserId(token)
|
|
if (!userId) return res.sendStatus(401)
|
|
|
|
const allowed = await checkPermission(userId, projectId, null)
|
|
|
|
if (!allowed) return res.sendStatus(403)
|
|
|
|
req.user_id = userId
|
|
return next()
|
|
} catch (err) {
|
|
logger.error({ err }, 'Failed to check personal access token')
|
|
return res.sendStatus(500)
|
|
}
|
|
}
|
|
}
|