directus 9.23.3 → 9.23.4
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 +12 -12
- package/dist/auth/drivers/ldap.js +22 -22
- package/dist/auth/drivers/local.js +7 -7
- package/dist/auth/drivers/oauth2.js +27 -25
- package/dist/auth/drivers/openid.js +32 -30
- package/dist/auth/drivers/saml.js +10 -10
- package/dist/auth.js +4 -3
- package/dist/cache.js +16 -11
- package/dist/cli/commands/bootstrap/index.js +5 -4
- package/dist/cli/utils/create-db-connection.js +1 -1
- package/dist/cli/utils/create-env/index.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +6 -5
- package/dist/controllers/activity.js +9 -9
- package/dist/controllers/assets.js +19 -18
- package/dist/controllers/auth.js +13 -13
- package/dist/controllers/collections.js +10 -10
- package/dist/controllers/dashboards.js +9 -9
- package/dist/controllers/extensions.js +3 -3
- package/dist/controllers/fields.js +16 -16
- package/dist/controllers/files.js +16 -15
- package/dist/controllers/flows.js +11 -11
- package/dist/controllers/folders.js +9 -9
- package/dist/controllers/graphql.js +6 -6
- package/dist/controllers/items.js +17 -17
- package/dist/controllers/notifications.js +9 -9
- package/dist/controllers/operations.js +9 -9
- package/dist/controllers/panels.js +9 -9
- package/dist/controllers/permissions.js +9 -9
- package/dist/controllers/presets.js +9 -9
- package/dist/controllers/relations.js +10 -10
- package/dist/controllers/revisions.js +3 -3
- package/dist/controllers/roles.js +9 -9
- package/dist/controllers/schema.js +5 -5
- package/dist/controllers/server.js +7 -7
- package/dist/controllers/settings.js +2 -2
- package/dist/controllers/shares.js +13 -13
- package/dist/controllers/users.js +16 -16
- package/dist/controllers/utils.js +5 -5
- package/dist/controllers/webhooks.js +9 -9
- package/dist/database/helpers/fn/types.d.ts +0 -1
- package/dist/database/helpers/fn/types.js +0 -2
- package/dist/database/helpers/index.d.ts +3 -3
- package/dist/database/index.js +5 -5
- package/dist/database/migrations/20210805B-change-image-metadata-structure.js +15 -15
- package/dist/database/migrations/run.js +1 -1
- package/dist/database/run-ast.js +4 -4
- package/dist/database/system-data/collections/index.js +2 -2
- package/dist/database/system-data/fields/index.js +3 -3
- package/dist/env.js +1 -1
- package/dist/extensions.js +10 -10
- package/dist/flows.js +33 -31
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +32 -32
- package/dist/mailer.js +16 -16
- package/dist/messenger.js +4 -4
- package/dist/middleware/authenticate.js +1 -1
- package/dist/middleware/cache.js +11 -11
- package/dist/middleware/collection-exists.js +3 -3
- package/dist/middleware/cors.js +7 -7
- package/dist/middleware/error-handler.js +2 -2
- package/dist/middleware/extract-token.js +2 -2
- package/dist/middleware/graphql.js +12 -6
- package/dist/middleware/rate-limiter-global.js +5 -5
- package/dist/middleware/rate-limiter-ip.js +2 -2
- package/dist/middleware/respond.js +16 -16
- package/dist/middleware/sanitize-query.js +1 -1
- package/dist/operations/exec/index.js +2 -2
- package/dist/rate-limiter.js +1 -1
- package/dist/request/validate-ip.js +2 -2
- package/dist/server.js +4 -4
- package/dist/services/activity.js +14 -14
- package/dist/services/assets.js +6 -6
- package/dist/services/authentication.js +9 -9
- package/dist/services/collections.js +9 -9
- package/dist/services/fields.js +5 -5
- package/dist/services/files.js +12 -12
- package/dist/services/graphql/index.js +100 -98
- package/dist/services/import-export.js +6 -6
- package/dist/services/items.js +6 -6
- package/dist/services/mail/index.js +5 -5
- package/dist/services/meta.js +1 -0
- package/dist/services/notifications.js +4 -4
- package/dist/services/revisions.js +3 -3
- package/dist/services/roles.js +5 -5
- package/dist/services/server.js +27 -27
- package/dist/services/shares.js +9 -9
- package/dist/services/specifications.js +5 -3
- package/dist/services/users.d.ts +1 -5
- package/dist/services/users.js +24 -27
- package/dist/storage/register-locations.js +1 -1
- package/dist/utils/apply-query.js +2 -1
- package/dist/utils/dynamic-import.js +1 -1
- package/dist/utils/generate-hash.js +1 -1
- package/dist/utils/get-ast-from-query.js +1 -1
- package/dist/utils/get-auth-providers.js +1 -1
- package/dist/utils/get-cache-headers.js +3 -3
- package/dist/utils/get-collection-from-alias.js +1 -0
- package/dist/utils/get-default-value.js +1 -1
- package/dist/utils/get-ip-from-req.js +2 -2
- package/dist/utils/get-permissions.js +11 -11
- package/dist/utils/get-schema.js +2 -2
- package/dist/utils/is-url-allowed.js +5 -2
- package/dist/utils/sanitize-query.js +26 -26
- package/dist/utils/should-skip-cache.js +2 -2
- package/dist/utils/track.js +16 -16
- package/dist/utils/validate-query.js +1 -1
- package/dist/utils/validate-storage.js +8 -8
- package/dist/webhooks.js +2 -2
- package/package.json +13 -13
- package/dist/utils/redact-header-cookies.d.ts +0 -1
- package/dist/utils/redact-header-cookies.js +0 -11
- /package/dist/{utils/redact-header-cookies.test.d.ts → logger.test.d.ts} +0 -0
|
@@ -181,7 +181,7 @@ async function getASTFromQuery(collection, query, schema, options) {
|
|
|
181
181
|
continue;
|
|
182
182
|
}
|
|
183
183
|
// update query alias for children parseFields
|
|
184
|
-
const deepAlias = getDeepQuery(deep?.[fieldKey] || {})?.alias;
|
|
184
|
+
const deepAlias = getDeepQuery(deep?.[fieldKey] || {})?.['alias'];
|
|
185
185
|
if (!(0, lodash_1.isEmpty)(deepAlias))
|
|
186
186
|
query.alias = deepAlias;
|
|
187
187
|
child = {
|
|
@@ -7,7 +7,7 @@ exports.getAuthProviders = void 0;
|
|
|
7
7
|
const utils_1 = require("@directus/shared/utils");
|
|
8
8
|
const env_1 = __importDefault(require("../env"));
|
|
9
9
|
function getAuthProviders() {
|
|
10
|
-
return (0, utils_1.toArray)(env_1.default
|
|
10
|
+
return (0, utils_1.toArray)(env_1.default['AUTH_PROVIDERS'])
|
|
11
11
|
.filter((provider) => provider && env_1.default[`AUTH_${provider.toUpperCase()}_DRIVER`])
|
|
12
12
|
.map((provider) => ({
|
|
13
13
|
name: provider,
|
|
@@ -22,7 +22,7 @@ function getCacheControlHeader(req, ttl, globalCacheSettings, personalized) {
|
|
|
22
22
|
if (ttl === undefined || ttl < 0)
|
|
23
23
|
return 'no-cache';
|
|
24
24
|
// When the API cache can invalidate at any moment
|
|
25
|
-
if (globalCacheSettings && env_1.default
|
|
25
|
+
if (globalCacheSettings && env_1.default['CACHE_AUTO_PURGE'] === true)
|
|
26
26
|
return 'no-cache';
|
|
27
27
|
const headerValues = [];
|
|
28
28
|
// When caching depends on the authentication status of the users
|
|
@@ -35,8 +35,8 @@ function getCacheControlHeader(req, ttl, globalCacheSettings, personalized) {
|
|
|
35
35
|
const ttlSeconds = Math.round(ttl / 1000);
|
|
36
36
|
headerValues.push(`max-age=${ttlSeconds}`);
|
|
37
37
|
// When the s-maxage flag should be included
|
|
38
|
-
if (globalCacheSettings && Number.isInteger(env_1.default
|
|
39
|
-
headerValues.push(`s-maxage=${env_1.default
|
|
38
|
+
if (globalCacheSettings && Number.isInteger(env_1.default['CACHE_CONTROL_S_MAXAGE']) && env_1.default['CACHE_CONTROL_S_MAXAGE'] >= 0) {
|
|
39
|
+
headerValues.push(`s-maxage=${env_1.default['CACHE_CONTROL_S_MAXAGE']}`);
|
|
40
40
|
}
|
|
41
41
|
return headerValues.join(', ');
|
|
42
42
|
}
|
|
@@ -9,8 +9,8 @@ const env_1 = __importDefault(require("../env"));
|
|
|
9
9
|
const logger_1 = __importDefault(require("../logger"));
|
|
10
10
|
function getIPFromReq(req) {
|
|
11
11
|
let ip = req.ip;
|
|
12
|
-
if (env_1.default
|
|
13
|
-
const customIPHeaderValue = req.get(env_1.default
|
|
12
|
+
if (env_1.default['IP_CUSTOM_HEADER']) {
|
|
13
|
+
const customIPHeaderValue = req.get(env_1.default['IP_CUSTOM_HEADER']);
|
|
14
14
|
if (typeof customIPHeaderValue === 'string' && (0, net_1.isIP)(customIPHeaderValue) !== 0) {
|
|
15
15
|
ip = customIPHeaderValue;
|
|
16
16
|
}
|
|
@@ -22,7 +22,7 @@ async function getPermissions(accountability, schema) {
|
|
|
22
22
|
let permissions = [];
|
|
23
23
|
const { user, role, app, admin, share_scope } = accountability;
|
|
24
24
|
const cacheKey = `permissions-${(0, object_hash_1.default)({ user, role, app, admin, share_scope })}`;
|
|
25
|
-
if (cache && env_1.default
|
|
25
|
+
if (cache && env_1.default['CACHE_PERMISSIONS'] !== false) {
|
|
26
26
|
let cachedPermissions;
|
|
27
27
|
try {
|
|
28
28
|
cachedPermissions = await (0, cache_1.getSystemCache)(cacheKey);
|
|
@@ -31,20 +31,20 @@ async function getPermissions(accountability, schema) {
|
|
|
31
31
|
logger_1.default.warn(err, `[cache] Couldn't read key ${cacheKey}. ${err.message}`);
|
|
32
32
|
}
|
|
33
33
|
if (cachedPermissions) {
|
|
34
|
-
if (!cachedPermissions
|
|
35
|
-
return processPermissions(accountability, cachedPermissions
|
|
34
|
+
if (!cachedPermissions['containDynamicData']) {
|
|
35
|
+
return processPermissions(accountability, cachedPermissions['permissions'], {});
|
|
36
36
|
}
|
|
37
|
-
const cachedFilterContext = await (0, cache_1.getCacheValue)(cache, `filterContext-${(0, object_hash_1.default)({ user, role, permissions: cachedPermissions
|
|
37
|
+
const cachedFilterContext = await (0, cache_1.getCacheValue)(cache, `filterContext-${(0, object_hash_1.default)({ user, role, permissions: cachedPermissions['permissions'] })}`);
|
|
38
38
|
if (cachedFilterContext) {
|
|
39
|
-
return processPermissions(accountability, cachedPermissions
|
|
39
|
+
return processPermissions(accountability, cachedPermissions['permissions'], cachedFilterContext);
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
|
-
const { permissions: parsedPermissions, requiredPermissionData, containDynamicData, } = parsePermissions(cachedPermissions
|
|
42
|
+
const { permissions: parsedPermissions, requiredPermissionData, containDynamicData, } = parsePermissions(cachedPermissions['permissions']);
|
|
43
43
|
permissions = parsedPermissions;
|
|
44
44
|
const filterContext = containDynamicData
|
|
45
45
|
? await getFilterContext(schema, accountability, requiredPermissionData)
|
|
46
46
|
: {};
|
|
47
|
-
if (containDynamicData && env_1.default
|
|
47
|
+
if (containDynamicData && env_1.default['CACHE_ENABLED'] !== false) {
|
|
48
48
|
await (0, cache_1.setCacheValue)(cache, `filterContext-${(0, object_hash_1.default)({ user, role, permissions })}`, filterContext);
|
|
49
49
|
}
|
|
50
50
|
return processPermissions(accountability, permissions, filterContext);
|
|
@@ -71,9 +71,9 @@ async function getPermissions(accountability, schema) {
|
|
|
71
71
|
const filterContext = containDynamicData
|
|
72
72
|
? await getFilterContext(schema, accountability, requiredPermissionData)
|
|
73
73
|
: {};
|
|
74
|
-
if (cache && env_1.default
|
|
74
|
+
if (cache && env_1.default['CACHE_PERMISSIONS'] !== false) {
|
|
75
75
|
await (0, cache_1.setSystemCache)(cacheKey, { permissions, containDynamicData });
|
|
76
|
-
if (containDynamicData && env_1.default
|
|
76
|
+
if (containDynamicData && env_1.default['CACHE_ENABLED'] !== false) {
|
|
77
77
|
await (0, cache_1.setCacheValue)(cache, `filterContext-${(0, object_hash_1.default)({ user, role, permissions })}`, filterContext);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -137,12 +137,12 @@ async function getFilterContext(schema, accountability, requiredPermissionData)
|
|
|
137
137
|
const rolesService = new roles_1.RolesService({ schema });
|
|
138
138
|
const filterContext = {};
|
|
139
139
|
if (accountability.user && requiredPermissionData.$CURRENT_USER.length > 0) {
|
|
140
|
-
filterContext
|
|
140
|
+
filterContext['$CURRENT_USER'] = await usersService.readOne(accountability.user, {
|
|
141
141
|
fields: requiredPermissionData.$CURRENT_USER,
|
|
142
142
|
});
|
|
143
143
|
}
|
|
144
144
|
if (accountability.role && requiredPermissionData.$CURRENT_ROLE.length > 0) {
|
|
145
|
-
filterContext
|
|
145
|
+
filterContext['$CURRENT_ROLE'] = await rolesService.readOne(accountability.role, {
|
|
146
146
|
fields: requiredPermissionData.$CURRENT_ROLE,
|
|
147
147
|
});
|
|
148
148
|
}
|
package/dist/utils/get-schema.js
CHANGED
|
@@ -21,7 +21,7 @@ async function getSchema(options) {
|
|
|
21
21
|
const database = options?.database || (0, database_1.default)();
|
|
22
22
|
const schemaInspector = (0, schema_1.default)(database);
|
|
23
23
|
let result;
|
|
24
|
-
if (!options?.bypassCache && env_1.default
|
|
24
|
+
if (!options?.bypassCache && env_1.default['CACHE_SCHEMA'] !== false) {
|
|
25
25
|
let cachedSchema;
|
|
26
26
|
try {
|
|
27
27
|
cachedSchema = await (0, cache_1.getSchemaCache)();
|
|
@@ -61,7 +61,7 @@ async function getDatabaseSchema(database, schemaInspector) {
|
|
|
61
61
|
...collections_1.systemCollectionRows,
|
|
62
62
|
];
|
|
63
63
|
for (const [collection, info] of Object.entries(schemaOverview)) {
|
|
64
|
-
if ((0, utils_1.toArray)(env_1.default
|
|
64
|
+
if ((0, utils_1.toArray)(env_1.default['DB_EXCLUDE_TABLES']).includes(collection)) {
|
|
65
65
|
logger_1.default.trace(`Collection "${collection}" is configured to be excluded and will be ignored`);
|
|
66
66
|
continue;
|
|
67
67
|
}
|
|
@@ -13,7 +13,8 @@ function isUrlAllowed(url, allowList) {
|
|
|
13
13
|
const urlAllowList = (0, utils_1.toArray)(allowList);
|
|
14
14
|
if (urlAllowList.includes(url))
|
|
15
15
|
return true;
|
|
16
|
-
const parsedWhitelist = urlAllowList
|
|
16
|
+
const parsedWhitelist = urlAllowList
|
|
17
|
+
.map((allowedURL) => {
|
|
17
18
|
try {
|
|
18
19
|
const { hostname, pathname } = new url_1.URL(allowedURL);
|
|
19
20
|
return hostname + pathname;
|
|
@@ -21,7 +22,9 @@ function isUrlAllowed(url, allowList) {
|
|
|
21
22
|
catch {
|
|
22
23
|
logger_1.default.warn(`Invalid URL used "${url}"`);
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
+
return null;
|
|
26
|
+
})
|
|
27
|
+
.filter((f) => f);
|
|
25
28
|
try {
|
|
26
29
|
const { hostname, pathname } = new url_1.URL(url);
|
|
27
30
|
return parsedWhitelist.includes(hostname + pathname);
|
|
@@ -10,49 +10,49 @@ const logger_1 = __importDefault(require("../logger"));
|
|
|
10
10
|
const types_1 = require("../types");
|
|
11
11
|
function sanitizeQuery(rawQuery, accountability) {
|
|
12
12
|
const query = {};
|
|
13
|
-
if (rawQuery
|
|
14
|
-
const limit = sanitizeLimit(rawQuery
|
|
13
|
+
if (rawQuery['limit'] !== undefined) {
|
|
14
|
+
const limit = sanitizeLimit(rawQuery['limit']);
|
|
15
15
|
if (typeof limit === 'number') {
|
|
16
16
|
query.limit = limit;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
if (rawQuery
|
|
20
|
-
query.fields = sanitizeFields(rawQuery
|
|
19
|
+
if (rawQuery['fields']) {
|
|
20
|
+
query.fields = sanitizeFields(rawQuery['fields']);
|
|
21
21
|
}
|
|
22
|
-
if (rawQuery
|
|
23
|
-
query.group = sanitizeFields(rawQuery
|
|
22
|
+
if (rawQuery['groupBy']) {
|
|
23
|
+
query.group = sanitizeFields(rawQuery['groupBy']);
|
|
24
24
|
}
|
|
25
|
-
if (rawQuery
|
|
26
|
-
query.aggregate = sanitizeAggregate(rawQuery
|
|
25
|
+
if (rawQuery['aggregate']) {
|
|
26
|
+
query.aggregate = sanitizeAggregate(rawQuery['aggregate']);
|
|
27
27
|
}
|
|
28
|
-
if (rawQuery
|
|
29
|
-
query.sort = sanitizeSort(rawQuery
|
|
28
|
+
if (rawQuery['sort']) {
|
|
29
|
+
query.sort = sanitizeSort(rawQuery['sort']);
|
|
30
30
|
}
|
|
31
|
-
if (rawQuery
|
|
32
|
-
query.filter = sanitizeFilter(rawQuery
|
|
31
|
+
if (rawQuery['filter']) {
|
|
32
|
+
query.filter = sanitizeFilter(rawQuery['filter'], accountability || null);
|
|
33
33
|
}
|
|
34
|
-
if (rawQuery
|
|
35
|
-
query.offset = sanitizeOffset(rawQuery
|
|
34
|
+
if (rawQuery['offset']) {
|
|
35
|
+
query.offset = sanitizeOffset(rawQuery['offset']);
|
|
36
36
|
}
|
|
37
|
-
if (rawQuery
|
|
38
|
-
query.page = sanitizePage(rawQuery
|
|
37
|
+
if (rawQuery['page']) {
|
|
38
|
+
query.page = sanitizePage(rawQuery['page']);
|
|
39
39
|
}
|
|
40
|
-
if (rawQuery
|
|
41
|
-
query.meta = sanitizeMeta(rawQuery
|
|
40
|
+
if (rawQuery['meta']) {
|
|
41
|
+
query.meta = sanitizeMeta(rawQuery['meta']);
|
|
42
42
|
}
|
|
43
|
-
if (rawQuery
|
|
44
|
-
query.search = rawQuery
|
|
43
|
+
if (rawQuery['search'] && typeof rawQuery['search'] === 'string') {
|
|
44
|
+
query.search = rawQuery['search'];
|
|
45
45
|
}
|
|
46
|
-
if (rawQuery
|
|
47
|
-
query.export = rawQuery
|
|
46
|
+
if (rawQuery['export']) {
|
|
47
|
+
query.export = rawQuery['export'];
|
|
48
48
|
}
|
|
49
|
-
if (rawQuery
|
|
49
|
+
if (rawQuery['deep']) {
|
|
50
50
|
if (!query.deep)
|
|
51
51
|
query.deep = {};
|
|
52
|
-
query.deep = sanitizeDeep(rawQuery
|
|
52
|
+
query.deep = sanitizeDeep(rawQuery['deep'], accountability);
|
|
53
53
|
}
|
|
54
|
-
if (rawQuery
|
|
55
|
-
query.alias = sanitizeAlias(rawQuery
|
|
54
|
+
if (rawQuery['alias']) {
|
|
55
|
+
query.alias = sanitizeAlias(rawQuery['alias']);
|
|
56
56
|
}
|
|
57
57
|
return query;
|
|
58
58
|
}
|
|
@@ -11,10 +11,10 @@ const url_1 = require("./url");
|
|
|
11
11
|
function shouldSkipCache(req) {
|
|
12
12
|
const env = (0, env_1.getEnv)();
|
|
13
13
|
// Always skip cache for requests coming from the data studio based on Referer header
|
|
14
|
-
const adminUrl = new url_1.Url(env
|
|
14
|
+
const adminUrl = new url_1.Url(env['PUBLIC_URL']).addPath('admin').toString();
|
|
15
15
|
if (req.get('Referer')?.startsWith(adminUrl))
|
|
16
16
|
return true;
|
|
17
|
-
if (env
|
|
17
|
+
if (env['CACHE_SKIP_ALLOWED'] && req.get('cache-control')?.includes('no-store'))
|
|
18
18
|
return true;
|
|
19
19
|
return false;
|
|
20
20
|
}
|
package/dist/utils/track.js
CHANGED
|
@@ -14,13 +14,13 @@ const logger_1 = __importDefault(require("../logger"));
|
|
|
14
14
|
const get_milliseconds_1 = require("./get-milliseconds");
|
|
15
15
|
async function track(event) {
|
|
16
16
|
const axios = (await import('axios')).default;
|
|
17
|
-
if (env_1.default
|
|
17
|
+
if (env_1.default['TELEMETRY'] !== false) {
|
|
18
18
|
const info = await getEnvInfo(event);
|
|
19
19
|
try {
|
|
20
20
|
await axios.post('https://telemetry.directus.io/', info);
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
23
|
-
if (env_1.default
|
|
23
|
+
if (env_1.default['NODE_ENV'] === 'development') {
|
|
24
24
|
logger_1.default.error(err);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -31,9 +31,9 @@ async function getEnvInfo(event) {
|
|
|
31
31
|
return {
|
|
32
32
|
version: package_json_1.version,
|
|
33
33
|
event: event,
|
|
34
|
-
project_id: env_1.default
|
|
34
|
+
project_id: env_1.default['KEY'],
|
|
35
35
|
machine_id: await (0, node_machine_id_1.machineId)(),
|
|
36
|
-
environment: env_1.default
|
|
36
|
+
environment: env_1.default['NODE_ENV'],
|
|
37
37
|
stack: 'node',
|
|
38
38
|
os: {
|
|
39
39
|
arch: os_1.default.arch(),
|
|
@@ -41,36 +41,36 @@ async function getEnvInfo(event) {
|
|
|
41
41
|
release: os_1.default.release(),
|
|
42
42
|
},
|
|
43
43
|
rate_limiter: {
|
|
44
|
-
enabled: env_1.default
|
|
45
|
-
points: +env_1.default
|
|
46
|
-
duration: +env_1.default
|
|
47
|
-
store: env_1.default
|
|
44
|
+
enabled: env_1.default['RATE_LIMITER_ENABLED'],
|
|
45
|
+
points: +env_1.default['RATE_LIMITER_POINTS'],
|
|
46
|
+
duration: +env_1.default['RATE_LIMITER_DURATION'],
|
|
47
|
+
store: env_1.default['RATE_LIMITER_STORE'],
|
|
48
48
|
},
|
|
49
49
|
cache: {
|
|
50
|
-
enabled: env_1.default
|
|
51
|
-
ttl: (0, get_milliseconds_1.getMilliseconds)(env_1.default
|
|
52
|
-
store: env_1.default
|
|
50
|
+
enabled: env_1.default['CACHE_ENABLED'],
|
|
51
|
+
ttl: (0, get_milliseconds_1.getMilliseconds)(env_1.default['CACHE_TTL']),
|
|
52
|
+
store: env_1.default['CACHE_STORE'],
|
|
53
53
|
},
|
|
54
54
|
storage: {
|
|
55
55
|
drivers: getStorageDrivers(),
|
|
56
56
|
},
|
|
57
57
|
cors: {
|
|
58
|
-
enabled: env_1.default
|
|
58
|
+
enabled: env_1.default['CORS_ENABLED'],
|
|
59
59
|
},
|
|
60
60
|
email: {
|
|
61
|
-
transport: env_1.default
|
|
61
|
+
transport: env_1.default['EMAIL_TRANSPORT'],
|
|
62
62
|
},
|
|
63
63
|
auth: {
|
|
64
|
-
providers: (0, utils_1.toArray)(env_1.default
|
|
64
|
+
providers: (0, utils_1.toArray)(env_1.default['AUTH_PROVIDERS'])
|
|
65
65
|
.map((v) => v.trim())
|
|
66
66
|
.filter((v) => v),
|
|
67
67
|
},
|
|
68
|
-
db_client: env_1.default
|
|
68
|
+
db_client: env_1.default['DB_CLIENT'],
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
function getStorageDrivers() {
|
|
72
72
|
const drivers = [];
|
|
73
|
-
const locations = (0, utils_1.toArray)(env_1.default
|
|
73
|
+
const locations = (0, utils_1.toArray)(env_1.default['STORAGE_LOCATIONS'])
|
|
74
74
|
.map((v) => v.trim())
|
|
75
75
|
.filter((v) => v);
|
|
76
76
|
for (const location of locations) {
|
|
@@ -157,7 +157,7 @@ function validateAlias(alias) {
|
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
function validateRelationalDepth(query) {
|
|
160
|
-
const maxRelationalDepth = Number(env_1.default
|
|
160
|
+
const maxRelationalDepth = Number(env_1.default['MAX_RELATIONAL_DEPTH']) > 2 ? Number(env_1.default['MAX_RELATIONAL_DEPTH']) : 2;
|
|
161
161
|
// Process the fields in the same way as api/src/utils/get-ast-from-query.ts
|
|
162
162
|
let fields = ['*'];
|
|
163
163
|
if (query.fields) {
|
|
@@ -11,28 +11,28 @@ const fs_1 = require("fs");
|
|
|
11
11
|
const path_1 = __importDefault(require("path"));
|
|
12
12
|
const utils_1 = require("@directus/shared/utils");
|
|
13
13
|
async function validateStorage() {
|
|
14
|
-
if (env_1.default
|
|
14
|
+
if (env_1.default['DB_CLIENT'] === 'sqlite3') {
|
|
15
15
|
try {
|
|
16
|
-
await (0, fs_extra_1.access)(path_1.default.dirname(env_1.default
|
|
16
|
+
await (0, fs_extra_1.access)(path_1.default.dirname(env_1.default['DB_FILENAME']), fs_1.constants.R_OK | fs_1.constants.W_OK);
|
|
17
17
|
}
|
|
18
18
|
catch {
|
|
19
|
-
logger_1.default.warn(`Directory for SQLite database file (${path_1.default.resolve(path_1.default.dirname(env_1.default
|
|
19
|
+
logger_1.default.warn(`Directory for SQLite database file (${path_1.default.resolve(path_1.default.dirname(env_1.default['DB_FILENAME']))}) is not read/writeable!`);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
const usedStorageDrivers = (0, utils_1.toArray)(env_1.default
|
|
22
|
+
const usedStorageDrivers = (0, utils_1.toArray)(env_1.default['STORAGE_LOCATIONS']).map((location) => env_1.default[`STORAGE_${location.toUpperCase()}_DRIVER`]);
|
|
23
23
|
if (usedStorageDrivers.includes('local')) {
|
|
24
24
|
try {
|
|
25
|
-
await (0, fs_extra_1.access)(env_1.default
|
|
25
|
+
await (0, fs_extra_1.access)(env_1.default['STORAGE_LOCAL_ROOT'], fs_1.constants.R_OK | fs_1.constants.W_OK);
|
|
26
26
|
}
|
|
27
27
|
catch {
|
|
28
|
-
logger_1.default.warn(`Upload directory (${path_1.default.resolve(env_1.default
|
|
28
|
+
logger_1.default.warn(`Upload directory (${path_1.default.resolve(env_1.default['STORAGE_LOCAL_ROOT'])}) is not read/writeable!`);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
try {
|
|
32
|
-
await (0, fs_extra_1.access)(env_1.default
|
|
32
|
+
await (0, fs_extra_1.access)(env_1.default['EXTENSIONS_PATH'], fs_1.constants.R_OK);
|
|
33
33
|
}
|
|
34
34
|
catch {
|
|
35
|
-
logger_1.default.warn(`Extensions directory (${path_1.default.resolve(env_1.default
|
|
35
|
+
logger_1.default.warn(`Extensions directory (${path_1.default.resolve(env_1.default['EXTENSIONS_PATH'])}) is not readable!`);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
exports.validateStorage = validateStorage;
|
package/dist/webhooks.js
CHANGED
|
@@ -18,7 +18,7 @@ async function init() {
|
|
|
18
18
|
await register();
|
|
19
19
|
const messenger = (0, messenger_1.getMessenger)();
|
|
20
20
|
messenger.subscribe('webhooks', (event) => {
|
|
21
|
-
if (event
|
|
21
|
+
if (event['type'] === 'reload') {
|
|
22
22
|
reloadQueue.enqueue(async () => {
|
|
23
23
|
await reload();
|
|
24
24
|
});
|
|
@@ -53,7 +53,7 @@ function unregister() {
|
|
|
53
53
|
exports.unregister = unregister;
|
|
54
54
|
function createHandler(webhook, event) {
|
|
55
55
|
return async (meta, context) => {
|
|
56
|
-
if (webhook.collections.includes(meta
|
|
56
|
+
if (webhook.collections.includes(meta['collection']) === false)
|
|
57
57
|
return;
|
|
58
58
|
const axios = await (0, index_1.getAxios)();
|
|
59
59
|
const webhookPayload = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "directus",
|
|
3
|
-
"version": "9.23.
|
|
3
|
+
"version": "9.23.4",
|
|
4
4
|
"description": "Directus is a real-time API and App dashboard for managing SQL database content",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"directus",
|
|
@@ -144,18 +144,18 @@
|
|
|
144
144
|
"uuid-validate": "0.0.3",
|
|
145
145
|
"vm2": "3.9.14",
|
|
146
146
|
"wellknown": "0.5.0",
|
|
147
|
-
"@directus/app": "9.23.
|
|
148
|
-
"@directus/
|
|
149
|
-
"@directus/
|
|
150
|
-
"@directus/shared": "9.23.
|
|
151
|
-
"@directus/
|
|
152
|
-
"@directus/
|
|
153
|
-
"@directus/storage-driver-azure": "9.23.
|
|
154
|
-
"@directus/storage-driver-cloudinary": "9.23.
|
|
155
|
-
"@directus/storage-driver-gcs": "9.23.
|
|
156
|
-
"@directus/storage-driver-local": "9.23.
|
|
157
|
-
"@directus/storage-driver-s3": "9.23.
|
|
158
|
-
"@directus/utils": "9.23.
|
|
147
|
+
"@directus/app": "9.23.4",
|
|
148
|
+
"@directus/schema": "9.23.4",
|
|
149
|
+
"@directus/extensions-sdk": "9.23.4",
|
|
150
|
+
"@directus/shared": "9.23.4",
|
|
151
|
+
"@directus/storage": "9.23.4",
|
|
152
|
+
"@directus/specs": "9.23.4",
|
|
153
|
+
"@directus/storage-driver-azure": "9.23.4",
|
|
154
|
+
"@directus/storage-driver-cloudinary": "9.23.4",
|
|
155
|
+
"@directus/storage-driver-gcs": "9.23.4",
|
|
156
|
+
"@directus/storage-driver-local": "9.23.4",
|
|
157
|
+
"@directus/storage-driver-s3": "9.23.4",
|
|
158
|
+
"@directus/utils": "9.23.4"
|
|
159
159
|
},
|
|
160
160
|
"devDependencies": {
|
|
161
161
|
"@ngneat/falso": "6.4.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function redactHeaderCookie(cookieHeader: string, cookieNames: string[]): string;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.redactHeaderCookie = void 0;
|
|
4
|
-
function redactHeaderCookie(cookieHeader, cookieNames) {
|
|
5
|
-
for (const cookieName of cookieNames) {
|
|
6
|
-
const re = new RegExp(`(${cookieName}=)([^;]+)`);
|
|
7
|
-
cookieHeader = cookieHeader.replace(re, `$1--redacted--`);
|
|
8
|
-
}
|
|
9
|
-
return cookieHeader;
|
|
10
|
-
}
|
|
11
|
-
exports.redactHeaderCookie = redactHeaderCookie;
|
|
File without changes
|