@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
36 lines (34 loc) • 1.73 kB
JavaScript
import database_default from "../../../database/index.js";
import { ItemsService } from "../../../services/items.js";
import { getSchema } from "../../../utils/get-schema.js";
import "../../../services/index.js";
import { isEqual } from "lodash-es";
import { appRecommendedPermissions } from "@directus/system-data";
//#region src/license/entitlements/lib/custom-permission-rules-enabled.ts
function hasCustomRule(permission) {
if (permission.system === true) return false;
return permission.fields?.includes("*") !== true || Object.keys(permission.permissions ?? {}).length > 0 || Object.keys(permission.validation ?? {}).length > 0 || Object.keys(permission.presets ?? {}).length > 0;
}
function isRecommendedAppPermission(permission) {
if (permission.validation || permission.presets) return false;
const foundPermission = appRecommendedPermissions.find((p) => p.action === permission.action && p.collection === permission.collection);
if (!foundPermission) return false;
return isEqual(foundPermission.fields ?? null, permission.fields ?? null) && isEqual(foundPermission.permissions ?? null, permission.permissions ?? null);
}
async function checkCustomPermissionRules(opts) {
const knex = opts?.knex ?? database_default();
return (await new ItemsService("directus_permissions", {
schema: await getSchema({ database: knex }),
knex
}).readByQuery({
limit: -1,
filter: { _or: [
{ permissions: { _nnull: true } },
{ validation: { _nnull: true } },
{ presets: { _nnull: true } },
{ fields: { _nnull: true } }
] }
})).filter((p) => hasCustomRule(p) && !isRecommendedAppPermission(p)).length === 0;
}
//#endregion
export { checkCustomPermissionRules, hasCustomRule, isRecommendedAppPermission };