@directus/api 20.0.0-rc.0 → 20.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.js +9 -4
- package/dist/auth/drivers/ldap.js +4 -4
- package/dist/auth/drivers/local.js +4 -4
- package/dist/auth/drivers/oauth2.js +4 -4
- package/dist/auth/drivers/openid.js +4 -2
- package/dist/cache.js +0 -3
- package/dist/cli/commands/bootstrap/index.js +2 -8
- package/dist/cli/commands/init/index.js +10 -9
- package/dist/cli/utils/defaults.d.ts +11 -4
- package/dist/cli/utils/defaults.js +1 -7
- package/dist/constants.d.ts +9 -1
- package/dist/constants.js +10 -0
- package/dist/controllers/auth.js +16 -5
- package/dist/controllers/permissions.js +2 -14
- package/dist/controllers/roles.js +1 -22
- package/dist/controllers/{access.d.ts → tus.d.ts} +1 -0
- package/dist/controllers/tus.js +72 -0
- package/dist/controllers/users.js +55 -0
- package/dist/database/helpers/fn/types.d.ts +1 -2
- package/dist/database/helpers/fn/types.js +1 -1
- package/dist/database/helpers/geometry/dialects/mssql.d.ts +1 -1
- package/dist/database/helpers/geometry/dialects/mssql.js +2 -4
- package/dist/database/helpers/geometry/dialects/mysql.js +1 -1
- package/dist/database/helpers/geometry/dialects/oracle.d.ts +1 -1
- package/dist/database/helpers/geometry/dialects/oracle.js +3 -5
- package/dist/database/helpers/geometry/types.d.ts +1 -1
- package/dist/database/helpers/geometry/types.js +2 -4
- package/dist/database/index.js +1 -2
- package/dist/database/migrations/20240701A-add-tus-data.js +12 -0
- package/dist/database/{run-ast/types.d.ts → run-ast.d.ts} +9 -3
- package/dist/database/run-ast.js +450 -0
- package/dist/flows.js +4 -3
- package/dist/middleware/authenticate.js +7 -2
- package/dist/middleware/cache.js +1 -1
- package/dist/middleware/check-ip.d.ts +2 -0
- package/dist/middleware/check-ip.js +37 -0
- package/dist/middleware/get-permissions.d.ts +3 -0
- package/dist/middleware/get-permissions.js +10 -0
- package/dist/middleware/respond.js +1 -1
- package/dist/services/activity.js +10 -22
- package/dist/services/assets.d.ts +3 -2
- package/dist/services/assets.js +5 -10
- package/dist/services/authentication.js +26 -32
- package/dist/services/authorization.d.ts +17 -0
- package/dist/services/authorization.js +456 -0
- package/dist/services/collections.js +17 -18
- package/dist/services/fields.d.ts +1 -0
- package/dist/services/fields.js +24 -53
- package/dist/services/files/lib/extract-metadata.d.ts +3 -0
- package/dist/services/files/lib/extract-metadata.js +32 -0
- package/dist/services/files/utils/get-metadata.d.ts +5 -0
- package/dist/services/files/utils/get-metadata.js +107 -0
- package/dist/services/files.d.ts +4 -6
- package/dist/services/files.js +24 -140
- package/dist/services/graphql/index.d.ts +3 -3
- package/dist/services/graphql/index.js +22 -126
- package/dist/services/graphql/subscription.js +4 -2
- package/dist/services/import-export.js +4 -18
- package/dist/services/index.d.ts +2 -3
- package/dist/services/index.js +2 -3
- package/dist/services/items.js +44 -115
- package/dist/services/meta.js +23 -60
- package/dist/services/payload.d.ts +10 -9
- package/dist/services/payload.js +3 -18
- package/dist/services/{permissions.d.ts → permissions/index.d.ts} +7 -5
- package/dist/services/{permissions.js → permissions/index.js} +54 -30
- package/dist/{permissions → services/permissions}/lib/with-app-minimal-permissions.d.ts +1 -1
- package/dist/services/permissions/lib/with-app-minimal-permissions.js +13 -0
- package/dist/services/relations.d.ts +6 -0
- package/dist/services/relations.js +29 -26
- package/dist/services/roles.d.ts +12 -4
- package/dist/services/roles.js +424 -57
- package/dist/services/server.js +6 -0
- package/dist/services/shares.d.ts +2 -0
- package/dist/services/shares.js +8 -12
- package/dist/services/specifications.d.ts +2 -2
- package/dist/services/specifications.js +27 -39
- package/dist/services/tus/data-store.d.ts +36 -0
- package/dist/services/tus/data-store.js +214 -0
- package/dist/services/tus/index.d.ts +2 -0
- package/dist/services/tus/index.js +2 -0
- package/dist/services/tus/lockers.d.ts +36 -0
- package/dist/services/tus/lockers.js +83 -0
- package/dist/services/tus/server.d.ts +8 -0
- package/dist/services/tus/server.js +80 -0
- package/dist/services/tus/utils/wait-timeout.d.ts +1 -0
- package/dist/services/tus/utils/wait-timeout.js +13 -0
- package/dist/services/users.d.ts +5 -1
- package/dist/services/users.js +161 -78
- package/dist/services/utils.js +7 -11
- package/dist/services/versions.d.ts +2 -0
- package/dist/services/versions.js +10 -34
- package/dist/storage/register-locations.js +5 -1
- package/dist/telemetry/lib/get-report.js +2 -2
- package/dist/telemetry/utils/check-increased-user-limits.d.ts +7 -0
- package/dist/telemetry/utils/check-increased-user-limits.js +25 -0
- package/dist/telemetry/utils/get-role-counts-by-roles.d.ts +6 -0
- package/dist/telemetry/utils/get-role-counts-by-roles.js +27 -0
- package/dist/telemetry/utils/get-role-counts-by-users.d.ts +11 -0
- package/dist/telemetry/utils/get-role-counts-by-users.js +34 -0
- package/dist/telemetry/utils/get-user-count.d.ts +8 -0
- package/dist/telemetry/utils/get-user-count.js +33 -0
- package/dist/telemetry/utils/get-user-counts-by-roles.d.ts +7 -0
- package/dist/telemetry/utils/get-user-counts-by-roles.js +35 -0
- package/dist/types/ast.d.ts +1 -43
- package/dist/types/items.d.ts +0 -11
- package/dist/utils/apply-query.d.ts +3 -4
- package/dist/utils/apply-query.js +8 -37
- package/dist/utils/get-accountability-for-role.js +25 -16
- package/dist/utils/get-accountability-for-token.js +16 -17
- package/dist/utils/get-ast-from-query.d.ts +13 -0
- package/dist/utils/get-ast-from-query.js +297 -0
- package/dist/utils/get-cache-key.d.ts +1 -1
- package/dist/utils/get-cache-key.js +1 -12
- package/dist/utils/get-column.d.ts +1 -2
- package/dist/utils/get-column.js +0 -1
- package/dist/utils/get-permissions.d.ts +2 -0
- package/dist/utils/get-permissions.js +150 -0
- package/dist/utils/get-service.js +1 -5
- package/dist/utils/merge-permissions-for-share.d.ts +4 -0
- package/dist/utils/merge-permissions-for-share.js +109 -0
- package/dist/utils/merge-permissions.d.ts +3 -0
- package/dist/utils/merge-permissions.js +95 -0
- package/dist/utils/reduce-schema.d.ts +6 -4
- package/dist/utils/reduce-schema.js +34 -14
- package/dist/utils/verify-session-jwt.js +2 -1
- package/dist/websocket/authenticate.d.ts +2 -0
- package/dist/websocket/authenticate.js +12 -0
- package/dist/websocket/controllers/graphql.js +4 -1
- package/dist/websocket/controllers/hooks.js +0 -4
- package/dist/websocket/controllers/rest.js +2 -0
- package/dist/websocket/handlers/subscribe.js +2 -0
- package/dist/websocket/utils/items.d.ts +1 -1
- package/package.json +35 -33
- package/dist/controllers/access.js +0 -148
- package/dist/controllers/policies.d.ts +0 -2
- package/dist/controllers/policies.js +0 -169
- package/dist/database/get-ast-from-query/get-ast-from-query.d.ts +0 -16
- package/dist/database/get-ast-from-query/get-ast-from-query.js +0 -82
- package/dist/database/get-ast-from-query/lib/convert-wildcards.d.ts +0 -13
- package/dist/database/get-ast-from-query/lib/convert-wildcards.js +0 -69
- package/dist/database/get-ast-from-query/lib/parse-fields.d.ts +0 -15
- package/dist/database/get-ast-from-query/lib/parse-fields.js +0 -190
- package/dist/database/get-ast-from-query/utils/get-deep-query.d.ts +0 -14
- package/dist/database/get-ast-from-query/utils/get-deep-query.js +0 -17
- package/dist/database/get-ast-from-query/utils/get-related-collection.d.ts +0 -2
- package/dist/database/get-ast-from-query/utils/get-related-collection.js +0 -13
- package/dist/database/get-ast-from-query/utils/get-relation.d.ts +0 -2
- package/dist/database/get-ast-from-query/utils/get-relation.js +0 -7
- package/dist/database/migrations/20240619A-permissions-policies.js +0 -163
- package/dist/database/run-ast/lib/get-db-query.d.ts +0 -4
- package/dist/database/run-ast/lib/get-db-query.js +0 -194
- package/dist/database/run-ast/lib/parse-current-level.d.ts +0 -7
- package/dist/database/run-ast/lib/parse-current-level.js +0 -41
- package/dist/database/run-ast/run-ast.d.ts +0 -7
- package/dist/database/run-ast/run-ast.js +0 -107
- package/dist/database/run-ast/types.js +0 -1
- package/dist/database/run-ast/utils/apply-case-when.d.ts +0 -16
- package/dist/database/run-ast/utils/apply-case-when.js +0 -26
- package/dist/database/run-ast/utils/apply-parent-filters.d.ts +0 -3
- package/dist/database/run-ast/utils/apply-parent-filters.js +0 -55
- package/dist/database/run-ast/utils/get-column-pre-processor.d.ts +0 -10
- package/dist/database/run-ast/utils/get-column-pre-processor.js +0 -57
- package/dist/database/run-ast/utils/get-field-alias.d.ts +0 -2
- package/dist/database/run-ast/utils/get-field-alias.js +0 -4
- package/dist/database/run-ast/utils/get-inner-query-column-pre-processor.d.ts +0 -5
- package/dist/database/run-ast/utils/get-inner-query-column-pre-processor.js +0 -23
- package/dist/database/run-ast/utils/merge-with-parent-items.d.ts +0 -3
- package/dist/database/run-ast/utils/merge-with-parent-items.js +0 -87
- package/dist/database/run-ast/utils/remove-temporary-fields.d.ts +0 -3
- package/dist/database/run-ast/utils/remove-temporary-fields.js +0 -73
- package/dist/permissions/cache.d.ts +0 -2
- package/dist/permissions/cache.js +0 -23
- package/dist/permissions/lib/fetch-permissions.d.ts +0 -10
- package/dist/permissions/lib/fetch-permissions.js +0 -55
- package/dist/permissions/lib/fetch-policies.d.ts +0 -7
- package/dist/permissions/lib/fetch-policies.js +0 -28
- package/dist/permissions/lib/fetch-roles-tree.d.ts +0 -3
- package/dist/permissions/lib/fetch-roles-tree.js +0 -28
- package/dist/permissions/lib/with-app-minimal-permissions.js +0 -10
- package/dist/permissions/modules/fetch-accountability-collection-access/fetch-accountability-collection-access.d.ts +0 -7
- package/dist/permissions/modules/fetch-accountability-collection-access/fetch-accountability-collection-access.js +0 -56
- package/dist/permissions/modules/fetch-accountability-policy-globals/fetch-accountability-policy-globals.d.ts +0 -3
- package/dist/permissions/modules/fetch-accountability-policy-globals/fetch-accountability-policy-globals.js +0 -16
- package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.d.ts +0 -8
- package/dist/permissions/modules/fetch-allowed-collections/fetch-allowed-collections.js +0 -24
- package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.d.ts +0 -9
- package/dist/permissions/modules/fetch-allowed-field-map/fetch-allowed-field-map.js +0 -31
- package/dist/permissions/modules/fetch-allowed-fields/fetch-allowed-fields.d.ts +0 -16
- package/dist/permissions/modules/fetch-allowed-fields/fetch-allowed-fields.js +0 -27
- package/dist/permissions/modules/fetch-global-access/fetch-global-access.d.ts +0 -10
- package/dist/permissions/modules/fetch-global-access/fetch-global-access.js +0 -23
- package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-roles.d.ts +0 -5
- package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-roles.js +0 -7
- package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-user.d.ts +0 -5
- package/dist/permissions/modules/fetch-global-access/lib/fetch-global-access-for-user.js +0 -10
- package/dist/permissions/modules/fetch-global-access/types.d.ts +0 -4
- package/dist/permissions/modules/fetch-global-access/types.js +0 -1
- package/dist/permissions/modules/fetch-global-access/utils/fetch-global-access-for-query.d.ts +0 -4
- package/dist/permissions/modules/fetch-global-access/utils/fetch-global-access-for-query.js +0 -27
- package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.d.ts +0 -12
- package/dist/permissions/modules/fetch-inconsistent-field-map/fetch-inconsistent-field-map.js +0 -32
- package/dist/permissions/modules/fetch-policies-ip-access/fetch-policies-ip-access.d.ts +0 -4
- package/dist/permissions/modules/fetch-policies-ip-access/fetch-policies-ip-access.js +0 -29
- package/dist/permissions/modules/process-ast/lib/extract-fields-from-children.d.ts +0 -4
- package/dist/permissions/modules/process-ast/lib/extract-fields-from-children.js +0 -49
- package/dist/permissions/modules/process-ast/lib/extract-fields-from-query.d.ts +0 -3
- package/dist/permissions/modules/process-ast/lib/extract-fields-from-query.js +0 -56
- package/dist/permissions/modules/process-ast/lib/field-map-from-ast.d.ts +0 -4
- package/dist/permissions/modules/process-ast/lib/field-map-from-ast.js +0 -8
- package/dist/permissions/modules/process-ast/lib/inject-cases.d.ts +0 -9
- package/dist/permissions/modules/process-ast/lib/inject-cases.js +0 -93
- package/dist/permissions/modules/process-ast/process-ast.d.ts +0 -9
- package/dist/permissions/modules/process-ast/process-ast.js +0 -39
- package/dist/permissions/modules/process-ast/types.d.ts +0 -24
- package/dist/permissions/modules/process-ast/types.js +0 -1
- package/dist/permissions/modules/process-ast/utils/collections-in-field-map.d.ts +0 -2
- package/dist/permissions/modules/process-ast/utils/collections-in-field-map.js +0 -7
- package/dist/permissions/modules/process-ast/utils/dedupe-access.d.ts +0 -12
- package/dist/permissions/modules/process-ast/utils/dedupe-access.js +0 -30
- package/dist/permissions/modules/process-ast/utils/extract-paths-from-query.d.ts +0 -15
- package/dist/permissions/modules/process-ast/utils/extract-paths-from-query.js +0 -50
- package/dist/permissions/modules/process-ast/utils/find-related-collection.d.ts +0 -3
- package/dist/permissions/modules/process-ast/utils/find-related-collection.js +0 -9
- package/dist/permissions/modules/process-ast/utils/flatten-filter.d.ts +0 -3
- package/dist/permissions/modules/process-ast/utils/flatten-filter.js +0 -24
- package/dist/permissions/modules/process-ast/utils/format-a2o-key.d.ts +0 -1
- package/dist/permissions/modules/process-ast/utils/format-a2o-key.js +0 -3
- package/dist/permissions/modules/process-ast/utils/get-info-for-path.d.ts +0 -5
- package/dist/permissions/modules/process-ast/utils/get-info-for-path.js +0 -7
- package/dist/permissions/modules/process-ast/utils/has-item-permissions.d.ts +0 -2
- package/dist/permissions/modules/process-ast/utils/has-item-permissions.js +0 -3
- package/dist/permissions/modules/process-ast/utils/stringify-query-path.d.ts +0 -2
- package/dist/permissions/modules/process-ast/utils/stringify-query-path.js +0 -3
- package/dist/permissions/modules/process-ast/utils/validate-path/create-error.d.ts +0 -3
- package/dist/permissions/modules/process-ast/utils/validate-path/create-error.js +0 -16
- package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-existence.d.ts +0 -2
- package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-existence.js +0 -12
- package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-permissions.d.ts +0 -2
- package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-permissions.js +0 -28
- package/dist/permissions/modules/process-payload/lib/is-field-nullable.d.ts +0 -5
- package/dist/permissions/modules/process-payload/lib/is-field-nullable.js +0 -12
- package/dist/permissions/modules/process-payload/process-payload.d.ts +0 -13
- package/dist/permissions/modules/process-payload/process-payload.js +0 -77
- package/dist/permissions/modules/validate-access/lib/validate-collection-access.d.ts +0 -12
- package/dist/permissions/modules/validate-access/lib/validate-collection-access.js +0 -11
- package/dist/permissions/modules/validate-access/lib/validate-item-access.d.ts +0 -9
- package/dist/permissions/modules/validate-access/lib/validate-item-access.js +0 -33
- package/dist/permissions/modules/validate-access/validate-access.d.ts +0 -14
- package/dist/permissions/modules/validate-access/validate-access.js +0 -28
- package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-count.d.ts +0 -1
- package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-count.js +0 -8
- package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-users.d.ts +0 -5
- package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-users.js +0 -10
- package/dist/permissions/types.d.ts +0 -6
- package/dist/permissions/types.js +0 -1
- package/dist/permissions/utils/create-default-accountability.d.ts +0 -2
- package/dist/permissions/utils/create-default-accountability.js +0 -11
- package/dist/permissions/utils/extract-required-dynamic-variable-context.d.ts +0 -8
- package/dist/permissions/utils/extract-required-dynamic-variable-context.js +0 -27
- package/dist/permissions/utils/fetch-dynamic-variable-context.d.ts +0 -9
- package/dist/permissions/utils/fetch-dynamic-variable-context.js +0 -43
- package/dist/permissions/utils/filter-policies-by-ip.d.ts +0 -2
- package/dist/permissions/utils/filter-policies-by-ip.js +0 -15
- package/dist/permissions/utils/get-unaliased-field-key.d.ts +0 -5
- package/dist/permissions/utils/get-unaliased-field-key.js +0 -17
- package/dist/permissions/utils/process-permissions.d.ts +0 -7
- package/dist/permissions/utils/process-permissions.js +0 -9
- package/dist/permissions/utils/with-cache.d.ts +0 -10
- package/dist/permissions/utils/with-cache.js +0 -25
- package/dist/services/access.d.ts +0 -10
- package/dist/services/access.js +0 -43
- package/dist/services/policies.d.ts +0 -12
- package/dist/services/policies.js +0 -87
- package/dist/telemetry/utils/check-user-limits.d.ts +0 -5
- package/dist/telemetry/utils/check-user-limits.js +0 -19
- package/dist/utils/fetch-user-count/fetch-access-lookup.d.ts +0 -17
- package/dist/utils/fetch-user-count/fetch-access-lookup.js +0 -22
- package/dist/utils/fetch-user-count/fetch-access-roles.d.ts +0 -16
- package/dist/utils/fetch-user-count/fetch-access-roles.js +0 -37
- package/dist/utils/fetch-user-count/fetch-active-users.d.ts +0 -6
- package/dist/utils/fetch-user-count/fetch-active-users.js +0 -3
- package/dist/utils/fetch-user-count/fetch-user-count.d.ts +0 -12
- package/dist/utils/fetch-user-count/fetch-user-count.js +0 -57
- package/dist/utils/fetch-user-count/get-user-count-query.d.ts +0 -20
- package/dist/utils/fetch-user-count/get-user-count-query.js +0 -17
- package/dist/utils/validate-user-count-integrity.d.ts +0 -13
- package/dist/utils/validate-user-count-integrity.js +0 -29
- /package/dist/database/migrations/{20240619A-permissions-policies.d.ts → 20240701A-add-tus-data.d.ts} +0 -0
- /package/dist/{utils → services/files/utils}/parse-image-metadata.d.ts +0 -0
- /package/dist/{utils → services/files/utils}/parse-image-metadata.js +0 -0
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { isEqual, uniqWith } from 'lodash-es';
|
|
2
|
-
import { flattenFilter } from './flatten-filter.js';
|
|
3
|
-
/**
|
|
4
|
-
* Converts the passed Query object into a unique list of path arrays, for example:
|
|
5
|
-
*
|
|
6
|
-
* ```
|
|
7
|
-
* [
|
|
8
|
-
* ['author', 'age'],
|
|
9
|
-
* ['category']
|
|
10
|
-
* ]
|
|
11
|
-
* ```
|
|
12
|
-
*/
|
|
13
|
-
export function extractPathsFromQuery(query) {
|
|
14
|
-
/**
|
|
15
|
-
* All nested paths used in the current query scope.
|
|
16
|
-
* This is generated by flattening the filters and adding in the used sort/aggregate fields.
|
|
17
|
-
*/
|
|
18
|
-
const paths = [];
|
|
19
|
-
const readOnlyPaths = [];
|
|
20
|
-
if (query.filter) {
|
|
21
|
-
flattenFilter(readOnlyPaths, query.filter);
|
|
22
|
-
}
|
|
23
|
-
if (query.sort) {
|
|
24
|
-
for (const field of query.sort) {
|
|
25
|
-
// Sort can have dot notation fields for sorting on m2o values Sort fields can start with
|
|
26
|
-
// `-` to indicate descending order, which should be dropped for permissions checks
|
|
27
|
-
readOnlyPaths.push(field.split('.').map((field) => (field.startsWith('-') ? field.substring(1) : field)));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (query.aggregate) {
|
|
31
|
-
for (const fields of Object.values(query.aggregate)) {
|
|
32
|
-
for (const field of fields) {
|
|
33
|
-
// Aggregate doesn't currently support aggregating on nested fields, but it doesn't hurt
|
|
34
|
-
// to standardize it in the validation layer
|
|
35
|
-
paths.push(field.split('.'));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
if (query.group) {
|
|
40
|
-
for (const field of query.group) {
|
|
41
|
-
// Grouping doesn't currently support grouping on nested fields, but it doesn't hurt to
|
|
42
|
-
// standardize it in the validation layer
|
|
43
|
-
paths.push(field.split('.'));
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
paths: uniqWith(paths, isEqual),
|
|
48
|
-
readOnlyPaths: uniqWith(readOnlyPaths, isEqual),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { getRelationInfo } from '../../../../utils/get-relation-info.js';
|
|
2
|
-
export function findRelatedCollection(collection, field, schema) {
|
|
3
|
-
const { relation } = getRelationInfo(schema.relations, collection, field);
|
|
4
|
-
if (!relation)
|
|
5
|
-
return null;
|
|
6
|
-
const isO2m = relation.related_collection === collection;
|
|
7
|
-
const relatedCollectionName = isO2m ? relation.collection : relation.related_collection;
|
|
8
|
-
return relatedCollectionName;
|
|
9
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export function flattenFilter(paths, filter) {
|
|
2
|
-
if (!filter)
|
|
3
|
-
return;
|
|
4
|
-
const stack = [{ current: filter, path: [] }];
|
|
5
|
-
while (stack.length > 0) {
|
|
6
|
-
const { current, path } = stack.pop();
|
|
7
|
-
if (typeof current === 'object' && current !== null) {
|
|
8
|
-
// If the current nested value is an array, we ignore the array order and flatten all
|
|
9
|
-
// nested objects
|
|
10
|
-
const isArray = Array.isArray(current);
|
|
11
|
-
for (const key in current) {
|
|
12
|
-
stack.push({
|
|
13
|
-
current: current[key],
|
|
14
|
-
path: isArray ? path : [...path, key],
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
paths.push(
|
|
20
|
-
// Ignore all operators and logical grouping in the field paths
|
|
21
|
-
path.filter((part) => part.startsWith('_') === false));
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function formatA2oKey(fieldKey: string, collection: string): string;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { type DirectusError } from '@directus/errors';
|
|
2
|
-
export declare function createCollectionForbiddenError(path: string, collection: string): DirectusError<any>;
|
|
3
|
-
export declare function createFieldsForbiddenError(path: string, collection: string, fields: string[]): DirectusError<any>;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ForbiddenError } from '@directus/errors';
|
|
2
|
-
export function createCollectionForbiddenError(path, collection) {
|
|
3
|
-
const pathSuffix = path === '' ? 'root' : `"${path}"`;
|
|
4
|
-
return new ForbiddenError({
|
|
5
|
-
reason: `You don't have permission to access collection "${collection}" or it does not exist. Queried in ${pathSuffix}.`,
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
export function createFieldsForbiddenError(path, collection, fields) {
|
|
9
|
-
const pathSuffix = path === '' ? 'root' : `"${path}"`;
|
|
10
|
-
const fieldStr = fields.map((field) => `"${field}"`).join(', ');
|
|
11
|
-
return new ForbiddenError({
|
|
12
|
-
reason: fields.length === 1
|
|
13
|
-
? `You don't have permission to access field ${fieldStr} in collection "${collection}" or it does not exist. Queried in ${pathSuffix}.`
|
|
14
|
-
: `You don't have permission to access fields ${fieldStr} in collection "${collection}" or they do not exist. Queried in ${pathSuffix}.`,
|
|
15
|
-
});
|
|
16
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { createCollectionForbiddenError, createFieldsForbiddenError } from './create-error.js';
|
|
2
|
-
export function validatePathExistence(path, collection, fields, schema) {
|
|
3
|
-
const collectionInfo = schema.collections[collection];
|
|
4
|
-
if (collectionInfo === undefined) {
|
|
5
|
-
throw createCollectionForbiddenError(path, collection);
|
|
6
|
-
}
|
|
7
|
-
const requestedFields = Array.from(fields);
|
|
8
|
-
const nonExistentFields = requestedFields.filter((field) => collectionInfo.fields[field] === undefined);
|
|
9
|
-
if (nonExistentFields.length > 0) {
|
|
10
|
-
throw createFieldsForbiddenError(path, collection, nonExistentFields);
|
|
11
|
-
}
|
|
12
|
-
}
|
package/dist/permissions/modules/process-ast/utils/validate-path/validate-path-permissions.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { createCollectionForbiddenError, createFieldsForbiddenError } from './create-error.js';
|
|
2
|
-
export function validatePathPermissions(path, permissions, collection, fields) {
|
|
3
|
-
const permissionsForCollection = permissions.filter((permission) => permission.collection === collection);
|
|
4
|
-
if (permissionsForCollection.length === 0) {
|
|
5
|
-
throw createCollectionForbiddenError(path, collection);
|
|
6
|
-
}
|
|
7
|
-
// Set of all fields that are allowed to be queried combined
|
|
8
|
-
const allowedFields = new Set();
|
|
9
|
-
for (const { fields } of permissionsForCollection) {
|
|
10
|
-
if (!fields) {
|
|
11
|
-
continue;
|
|
12
|
-
}
|
|
13
|
-
for (const field of fields) {
|
|
14
|
-
if (field === '*') {
|
|
15
|
-
// Early exit in case all fields are allowed
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
allowedFields.add(field);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
const requestedFields = Array.from(fields);
|
|
22
|
-
const forbiddenFields = allowedFields.has('*')
|
|
23
|
-
? []
|
|
24
|
-
: requestedFields.filter((field) => allowedFields.has(field) === false);
|
|
25
|
-
if (forbiddenFields.length > 0) {
|
|
26
|
-
throw createFieldsForbiddenError(path, collection, forbiddenFields);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { GENERATE_SPECIAL } from '../../../../constants.js';
|
|
2
|
-
/**
|
|
3
|
-
* Checks if a given field is allowed to be set to `null`.
|
|
4
|
-
*/
|
|
5
|
-
export function isFieldNullable(field) {
|
|
6
|
-
if (field.nullable)
|
|
7
|
-
return true;
|
|
8
|
-
if (field.generated)
|
|
9
|
-
return true;
|
|
10
|
-
const hasGenerateSpecial = GENERATE_SPECIAL.some((name) => field.special.includes(name));
|
|
11
|
-
return hasGenerateSpecial;
|
|
12
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Accountability, Item, PermissionsAction } from '@directus/types';
|
|
2
|
-
import type { Context } from '../../types.js';
|
|
3
|
-
export interface ProcessPayloadOptions {
|
|
4
|
-
accountability: Accountability;
|
|
5
|
-
action: PermissionsAction;
|
|
6
|
-
collection: string;
|
|
7
|
-
payload: Item;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* @note this only validates the top-level fields. The expectation is that this function is called
|
|
11
|
-
* for each level of nested insert separately
|
|
12
|
-
*/
|
|
13
|
-
export declare function processPayload(options: ProcessPayloadOptions, context: Context): Promise<any>;
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { ForbiddenError } from '@directus/errors';
|
|
2
|
-
import { validatePayload } from '@directus/utils';
|
|
3
|
-
import { FailedValidationError, joiValidationErrorItemToErrorExtensions } from '@directus/validation';
|
|
4
|
-
import { assign, difference, uniq } from 'lodash-es';
|
|
5
|
-
import { fetchPermissions } from '../../lib/fetch-permissions.js';
|
|
6
|
-
import { fetchPolicies } from '../../lib/fetch-policies.js';
|
|
7
|
-
import { isFieldNullable } from './lib/is-field-nullable.js';
|
|
8
|
-
/**
|
|
9
|
-
* @note this only validates the top-level fields. The expectation is that this function is called
|
|
10
|
-
* for each level of nested insert separately
|
|
11
|
-
*/
|
|
12
|
-
export async function processPayload(options, context) {
|
|
13
|
-
let permissions;
|
|
14
|
-
let permissionValidationRules = [];
|
|
15
|
-
if (!options.accountability.admin) {
|
|
16
|
-
const policies = await fetchPolicies(options.accountability, context);
|
|
17
|
-
permissions = await fetchPermissions({ action: options.action, policies, collections: [options.collection], accountability: options.accountability }, context);
|
|
18
|
-
if (permissions.length === 0) {
|
|
19
|
-
throw new ForbiddenError({
|
|
20
|
-
reason: `You don't have permission to "${options.action}" from collection "${options.collection}" or it does not exist.`,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
const fieldsAllowed = uniq(permissions.map(({ fields }) => fields ?? []).flat());
|
|
24
|
-
if (fieldsAllowed.includes('*') === false) {
|
|
25
|
-
const fieldsUsed = Object.keys(options.payload);
|
|
26
|
-
const notAllowed = difference(fieldsUsed, fieldsAllowed);
|
|
27
|
-
if (notAllowed.length > 0) {
|
|
28
|
-
const fieldStr = notAllowed.map((field) => `"${field}"`).join(', ');
|
|
29
|
-
throw new ForbiddenError({
|
|
30
|
-
reason: notAllowed.length === 1
|
|
31
|
-
? `You don't have permission to access field ${fieldStr} in collection "${options.collection}" or it does not exist.`
|
|
32
|
-
: `You don't have permission to access fields ${fieldStr} in collection "${options.collection}" or they do not exist.`,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
permissionValidationRules = permissions.map(({ validation }) => validation);
|
|
37
|
-
}
|
|
38
|
-
const fields = Object.values(context.schema.collections[options.collection]?.fields ?? {});
|
|
39
|
-
const fieldValidationRules = [];
|
|
40
|
-
for (const field of fields) {
|
|
41
|
-
if (!isFieldNullable(field)) {
|
|
42
|
-
const isSubmissionRequired = options.action === 'create' && field.defaultValue === null;
|
|
43
|
-
if (isSubmissionRequired) {
|
|
44
|
-
fieldValidationRules.push({
|
|
45
|
-
[field.field]: {
|
|
46
|
-
_submitted: true,
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
fieldValidationRules.push({
|
|
51
|
-
[field.field]: {
|
|
52
|
-
_nnull: true,
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
fieldValidationRules.push(field.validation);
|
|
57
|
-
}
|
|
58
|
-
const validationRules = [...fieldValidationRules, ...permissionValidationRules].filter((rule) => {
|
|
59
|
-
if (rule === null)
|
|
60
|
-
return false;
|
|
61
|
-
if (Object.keys(rule).length === 0)
|
|
62
|
-
return false;
|
|
63
|
-
return true;
|
|
64
|
-
});
|
|
65
|
-
if (validationRules.length > 0) {
|
|
66
|
-
const validationErrors = [];
|
|
67
|
-
validationErrors.push(...validatePayload({ _and: validationRules }, options.payload)
|
|
68
|
-
.map((error) => error.details.map((details) => new FailedValidationError(joiValidationErrorItemToErrorExtensions(details))))
|
|
69
|
-
.flat());
|
|
70
|
-
if (validationErrors.length > 0)
|
|
71
|
-
throw validationErrors;
|
|
72
|
-
}
|
|
73
|
-
if (!permissions)
|
|
74
|
-
return options.payload;
|
|
75
|
-
const presets = permissions.map((permission) => permission.presets);
|
|
76
|
-
return assign({}, ...presets, options.payload);
|
|
77
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Accountability, PermissionsAction } from '@directus/types';
|
|
2
|
-
import type { Context } from '../../../types.js';
|
|
3
|
-
export interface ValidateCollectionAccessOptions {
|
|
4
|
-
accountability: Accountability;
|
|
5
|
-
action: PermissionsAction;
|
|
6
|
-
collection: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Check if you have (limited) access to a given collection by making sure there's at least 1
|
|
10
|
-
* permission rule available for the collection and action combo
|
|
11
|
-
*/
|
|
12
|
-
export declare function validateCollectionAccess(options: ValidateCollectionAccessOptions, context: Context): Promise<boolean>;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { fetchPermissions } from '../../../lib/fetch-permissions.js';
|
|
2
|
-
import { fetchPolicies } from '../../../lib/fetch-policies.js';
|
|
3
|
-
/**
|
|
4
|
-
* Check if you have (limited) access to a given collection by making sure there's at least 1
|
|
5
|
-
* permission rule available for the collection and action combo
|
|
6
|
-
*/
|
|
7
|
-
export async function validateCollectionAccess(options, context) {
|
|
8
|
-
const policies = await fetchPolicies(options.accountability, context);
|
|
9
|
-
const permissions = await fetchPermissions({ action: options.action, policies, collections: [options.collection], accountability: options.accountability }, context);
|
|
10
|
-
return permissions.length > 0;
|
|
11
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { Accountability, PermissionsAction, PrimaryKey } from '@directus/types';
|
|
2
|
-
import type { Context } from '../../../types.js';
|
|
3
|
-
export interface ValidateItemAccessOptions {
|
|
4
|
-
accountability: Accountability;
|
|
5
|
-
action: PermissionsAction;
|
|
6
|
-
collection: string;
|
|
7
|
-
primaryKeys: PrimaryKey[];
|
|
8
|
-
}
|
|
9
|
-
export declare function validateItemAccess(options: ValidateItemAccessOptions, context: Context): Promise<boolean>;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { getAstFromQuery } from '../../../../database/get-ast-from-query/get-ast-from-query.js';
|
|
2
|
-
import { runAst } from '../../../../database/run-ast/run-ast.js';
|
|
3
|
-
import { processAst } from '../../process-ast/process-ast.js';
|
|
4
|
-
export async function validateItemAccess(options, context) {
|
|
5
|
-
const primaryKeyField = context.schema.collections[options.collection]?.primary;
|
|
6
|
-
if (!primaryKeyField) {
|
|
7
|
-
throw new Error(`Cannot find primary key for collection "${options.collection}"`);
|
|
8
|
-
}
|
|
9
|
-
// When we're looking up access to specific items, we have to read them from the database to
|
|
10
|
-
// make sure you are allowed to access them.
|
|
11
|
-
const query = {
|
|
12
|
-
// We don't actually need any of the field data, just want to know if we can read the item as
|
|
13
|
-
// whole or not
|
|
14
|
-
fields: [],
|
|
15
|
-
limit: options.primaryKeys.length,
|
|
16
|
-
filter: {
|
|
17
|
-
[primaryKeyField]: {
|
|
18
|
-
_in: options.primaryKeys,
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
const ast = await getAstFromQuery({
|
|
23
|
-
accountability: options.accountability,
|
|
24
|
-
query,
|
|
25
|
-
collection: options.collection,
|
|
26
|
-
}, context);
|
|
27
|
-
await processAst({ ast, ...options }, context);
|
|
28
|
-
const items = await runAst(ast, context.schema, { knex: context.knex });
|
|
29
|
-
if (items && items.length === options.primaryKeys.length) {
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Accountability, PermissionsAction, PrimaryKey } from '@directus/types';
|
|
2
|
-
import type { Context } from '../../types.js';
|
|
3
|
-
export interface ValidateAccessOptions {
|
|
4
|
-
accountability: Accountability;
|
|
5
|
-
action: PermissionsAction;
|
|
6
|
-
collection: string;
|
|
7
|
-
primaryKeys?: PrimaryKey[];
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Validate if the current user has access to perform action against the given collection and
|
|
11
|
-
* optional primary keys. This is done by reading the item from the database using the access
|
|
12
|
-
* control rules and checking if we got the expected result back
|
|
13
|
-
*/
|
|
14
|
-
export declare function validateAccess(options: ValidateAccessOptions, context: Context): Promise<void>;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { ForbiddenError } from '@directus/errors';
|
|
2
|
-
import { validateCollectionAccess } from './lib/validate-collection-access.js';
|
|
3
|
-
import { validateItemAccess } from './lib/validate-item-access.js';
|
|
4
|
-
/**
|
|
5
|
-
* Validate if the current user has access to perform action against the given collection and
|
|
6
|
-
* optional primary keys. This is done by reading the item from the database using the access
|
|
7
|
-
* control rules and checking if we got the expected result back
|
|
8
|
-
*/
|
|
9
|
-
export async function validateAccess(options, context) {
|
|
10
|
-
if (options.accountability.admin === true) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
let access;
|
|
14
|
-
// If primary keys are passed, we have to confirm the access by actually trying to read the items
|
|
15
|
-
// from the database. If no keys are passed, we can simply check if the collection+action combo
|
|
16
|
-
// exists within permissions
|
|
17
|
-
if (options.primaryKeys) {
|
|
18
|
-
access = await validateItemAccess(options, context);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
access = await validateCollectionAccess(options, context);
|
|
22
|
-
}
|
|
23
|
-
if (!access) {
|
|
24
|
-
throw new ForbiddenError({
|
|
25
|
-
reason: `You don't have permission to "${options.action}" from collection "${options.collection}" or it does not exist.`,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-count.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function validateRemainingAdminCount(count: number): void;
|
package/dist/permissions/modules/validate-remaining-admin/validate-remaining-admin-users.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { type FetchUserCountOptions } from '../../../utils/fetch-user-count/fetch-user-count.js';
|
|
2
|
-
import type { Context } from '../../types.js';
|
|
3
|
-
export interface ValidateRemainingAdminUsersOptions extends Pick<FetchUserCountOptions, 'excludeAccessRows' | 'excludePolicies' | 'excludeUsers' | 'excludeRoles'> {
|
|
4
|
-
}
|
|
5
|
-
export declare function validateRemainingAdminUsers(options: ValidateRemainingAdminUsersOptions, context: Context): Promise<void>;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { fetchUserCount } from '../../../utils/fetch-user-count/fetch-user-count.js';
|
|
2
|
-
import { validateRemainingAdminCount } from './validate-remaining-admin-count.js';
|
|
3
|
-
export async function validateRemainingAdminUsers(options, context) {
|
|
4
|
-
const { admin } = await fetchUserCount({
|
|
5
|
-
...options,
|
|
6
|
-
adminOnly: true,
|
|
7
|
-
knex: context.knex,
|
|
8
|
-
});
|
|
9
|
-
validateRemainingAdminCount(admin);
|
|
10
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Permission } from '@directus/types';
|
|
2
|
-
export interface RequiredPermissionContext {
|
|
3
|
-
$CURRENT_USER: Set<string>;
|
|
4
|
-
$CURRENT_ROLE: Set<string>;
|
|
5
|
-
$CURRENT_ROLES: Set<string>;
|
|
6
|
-
$CURRENT_POLICIES: Set<string>;
|
|
7
|
-
}
|
|
8
|
-
export declare function extractRequiredDynamicVariableContext(permissions: Permission[]): RequiredPermissionContext;
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { deepMap } from '@directus/utils';
|
|
2
|
-
export function extractRequiredDynamicVariableContext(permissions) {
|
|
3
|
-
const permissionContext = {
|
|
4
|
-
$CURRENT_USER: new Set(),
|
|
5
|
-
$CURRENT_ROLE: new Set(),
|
|
6
|
-
$CURRENT_ROLES: new Set(),
|
|
7
|
-
$CURRENT_POLICIES: new Set(),
|
|
8
|
-
};
|
|
9
|
-
for (const permission of permissions) {
|
|
10
|
-
deepMap(permission.permissions, extractPermissionData);
|
|
11
|
-
deepMap(permission.validation, extractPermissionData);
|
|
12
|
-
deepMap(permission.presets, extractPermissionData);
|
|
13
|
-
}
|
|
14
|
-
return permissionContext;
|
|
15
|
-
function extractPermissionData(val) {
|
|
16
|
-
for (const placeholder of [
|
|
17
|
-
'$CURRENT_USER',
|
|
18
|
-
'$CURRENT_ROLE',
|
|
19
|
-
'$CURRENT_ROLES',
|
|
20
|
-
'$CURRENT_POLICIES',
|
|
21
|
-
]) {
|
|
22
|
-
if (typeof val === 'string' && val.startsWith(`${placeholder}.`)) {
|
|
23
|
-
permissionContext[placeholder].add(val.replace(`${placeholder}.`, ''));
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { Accountability, Permission } from '@directus/types';
|
|
2
|
-
import type { Context } from '../types.js';
|
|
3
|
-
export declare const fetchDynamicVariableContext: typeof _fetchDynamicVariableContext;
|
|
4
|
-
export interface FetchDynamicVariableContext {
|
|
5
|
-
accountability: Pick<Accountability, 'user' | 'role' | 'roles'>;
|
|
6
|
-
policies: string[];
|
|
7
|
-
permissions: Permission[];
|
|
8
|
-
}
|
|
9
|
-
export declare function _fetchDynamicVariableContext(options: FetchDynamicVariableContext, context: Context): Promise<Record<string, any>>;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { extractRequiredDynamicVariableContext } from './extract-required-dynamic-variable-context.js';
|
|
2
|
-
import { withCache } from './with-cache.js';
|
|
3
|
-
export const fetchDynamicVariableContext = withCache('permission-dynamic-variables', _fetchDynamicVariableContext, ({ policies, permissions, accountability: { user, role, roles } }) => ({
|
|
4
|
-
policies,
|
|
5
|
-
permissions,
|
|
6
|
-
accountability: {
|
|
7
|
-
user,
|
|
8
|
-
role,
|
|
9
|
-
roles,
|
|
10
|
-
},
|
|
11
|
-
}));
|
|
12
|
-
export async function _fetchDynamicVariableContext(options, context) {
|
|
13
|
-
const { UsersService } = await import('../../services/users.js');
|
|
14
|
-
const { RolesService } = await import('../../services/roles.js');
|
|
15
|
-
const { PoliciesService } = await import('../../services/policies.js');
|
|
16
|
-
const contextData = {};
|
|
17
|
-
const permissionContext = extractRequiredDynamicVariableContext(options.permissions);
|
|
18
|
-
if (options.accountability.user && (permissionContext.$CURRENT_USER?.size ?? 0) > 0) {
|
|
19
|
-
const usersService = new UsersService(context);
|
|
20
|
-
contextData['$CURRENT_USER'] = await usersService.readOne(options.accountability.user, {
|
|
21
|
-
fields: Array.from(permissionContext.$CURRENT_USER),
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
if (options.accountability.role && (permissionContext.$CURRENT_ROLE?.size ?? 0) > 0) {
|
|
25
|
-
const rolesService = new RolesService(context);
|
|
26
|
-
contextData['$CURRENT_ROLE'] = await rolesService.readOne(options.accountability.role, {
|
|
27
|
-
fields: Array.from(permissionContext.$CURRENT_ROLE),
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
if (options.accountability.roles.length > 0 && (permissionContext.$CURRENT_ROLES?.size ?? 0) > 0) {
|
|
31
|
-
const rolesService = new RolesService(context);
|
|
32
|
-
contextData['$CURRENT_ROLES'] = await rolesService.readMany(options.accountability.roles, {
|
|
33
|
-
fields: Array.from(permissionContext.$CURRENT_ROLES),
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
if (options.policies.length > 0 && (permissionContext.$CURRENT_POLICIES?.size ?? 0) > 0) {
|
|
37
|
-
const policiesService = new PoliciesService(context);
|
|
38
|
-
contextData['$CURRENT_POLICIES'] = await policiesService.readMany(options.policies, {
|
|
39
|
-
fields: Array.from(permissionContext.$CURRENT_POLICIES),
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return contextData;
|
|
43
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ipInNetworks } from '../../utils/ip-in-networks.js';
|
|
2
|
-
export function filterPoliciesByIp(policies, ip) {
|
|
3
|
-
return policies.filter(({ policy }) => {
|
|
4
|
-
// Keep policies that don't have an ip address allow list configured
|
|
5
|
-
if (!policy.ip_access || policy.ip_access.length === 0) {
|
|
6
|
-
return true;
|
|
7
|
-
}
|
|
8
|
-
// If the client's IP address is unknown, we can't validate it against the allow list and will
|
|
9
|
-
// have to default to the more secure option of preventing access
|
|
10
|
-
if (!ip) {
|
|
11
|
-
return false;
|
|
12
|
-
}
|
|
13
|
-
return ipInNetworks(ip, policy.ip_access);
|
|
14
|
-
});
|
|
15
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { FieldNode, FunctionFieldNode, NestedCollectionNode } from '../../types/index.js';
|
|
2
|
-
/**
|
|
3
|
-
* Derive the unaliased field key from the given AST node.
|
|
4
|
-
*/
|
|
5
|
-
export declare function getUnaliasedFieldKey(node: NestedCollectionNode | FieldNode | FunctionFieldNode): string;
|