1
0
Fork 0
mirror of synced 2024-09-28 15:21:28 +12:00
budibase/packages/server/src/middleware/authorized.js

83 lines
1.8 KiB
JavaScript
Raw Normal View History

2020-05-28 04:23:01 +12:00
const {
adminPermissions,
ADMIN_LEVEL_ID,
POWERUSER_LEVEL_ID,
2020-06-19 03:59:31 +12:00
BUILDER_LEVEL_ID,
2020-05-28 04:23:01 +12:00
BUILDER,
} = require("../utilities/accessLevels")
2020-10-12 23:57:37 +13:00
const environment = require("../environment")
const { apiKeyTable } = require("../db/dynamoClient")
2020-05-28 04:23:01 +12:00
module.exports = (permName, getItemId) => async (ctx, next) => {
2020-10-12 23:57:37 +13:00
if (
environment.CLOUD &&
ctx.headers["x-api-key"] &&
ctx.headers["x-instanceid"]
) {
// api key header passed by external webhook
const apiKeyInfo = await apiKeyTable.get({
primary: ctx.headers["x-api-key"],
})
if (apiKeyInfo) {
ctx.auth = {
authenticated: true,
external: true,
apiKey: ctx.headers["x-api-key"],
}
2020-10-12 23:57:37 +13:00
ctx.user = {
instanceId: ctx.headers["x-instanceid"],
}
return next()
}
ctx.throw(403, "API key invalid")
}
if (!ctx.auth.authenticated) {
2020-05-28 04:23:01 +12:00
ctx.throw(403, "Session not authenticated")
}
2020-06-19 03:59:31 +12:00
if (!ctx.user) {
ctx.throw(403, "User not found")
}
if (ctx.user.accessLevel._id === BUILDER_LEVEL_ID) {
return next()
2020-05-28 04:23:01 +12:00
}
if (permName === BUILDER) {
ctx.throw(403, "Not Authorized")
return
}
const permissionId = ({ name, itemId }) => name + (itemId ? `-${itemId}` : "")
if (ctx.user.accessLevel._id === ADMIN_LEVEL_ID) {
return next()
2020-05-28 04:23:01 +12:00
}
const thisPermissionId = permissionId({
name: permName,
itemId: getItemId && getItemId(ctx),
})
// power user has everything, except the admin specific perms
if (
ctx.user.accessLevel._id === POWERUSER_LEVEL_ID &&
!adminPermissions.map(permissionId).includes(thisPermissionId)
) {
return next()
2020-05-28 04:23:01 +12:00
}
if (
ctx.user.accessLevel.permissions
.map(permissionId)
.includes(thisPermissionId)
) {
return next()
2020-05-28 04:23:01 +12:00
}
ctx.throw(403, "Not Authorized")
}