directus 9.8.0 → 9.10.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.
Files changed (71) hide show
  1. package/README.md +1 -1
  2. package/dist/__mocks__/cache.d.ts +5 -0
  3. package/dist/__mocks__/cache.js +7 -0
  4. package/dist/app.js +3 -0
  5. package/dist/auth/drivers/ldap.js +10 -11
  6. package/dist/auth/drivers/oauth2.js +11 -6
  7. package/dist/auth/drivers/openid.js +9 -6
  8. package/dist/cli/commands/schema/apply.js +9 -3
  9. package/dist/controllers/assets.js +5 -0
  10. package/dist/controllers/files.d.ts +2 -0
  11. package/dist/controllers/files.js +13 -5
  12. package/dist/database/helpers/date/dialects/mssql.d.ts +4 -0
  13. package/dist/database/helpers/date/dialects/mssql.js +12 -0
  14. package/dist/database/helpers/date/dialects/mysql.d.ts +5 -0
  15. package/dist/database/helpers/date/dialects/mysql.js +16 -0
  16. package/dist/database/helpers/date/dialects/oracle.d.ts +4 -0
  17. package/dist/database/helpers/date/dialects/oracle.js +15 -0
  18. package/dist/database/helpers/date/dialects/sqlite.d.ts +1 -0
  19. package/dist/database/helpers/date/dialects/sqlite.js +8 -0
  20. package/dist/database/helpers/date/index.d.ts +3 -3
  21. package/dist/database/helpers/date/index.js +6 -6
  22. package/dist/database/helpers/date/types.d.ts +3 -0
  23. package/dist/database/helpers/date/types.js +10 -0
  24. package/dist/database/helpers/fn/dialects/postgres.js +5 -1
  25. package/dist/database/helpers/index.d.ts +1 -1
  26. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.d.ts +3 -0
  27. package/dist/database/migrations/20220402A-remove-default-value-panel-icon.js +22 -0
  28. package/dist/database/run-ast.js +3 -3
  29. package/dist/database/system-data/fields/collections.yaml +1 -1
  30. package/dist/database/system-data/fields/settings.yaml +0 -1
  31. package/dist/database/system-data/fields/users.yaml +3 -0
  32. package/dist/env.js +9 -3
  33. package/dist/exceptions/index.d.ts +1 -0
  34. package/dist/exceptions/index.js +1 -0
  35. package/dist/exceptions/token-expired.d.ts +4 -0
  36. package/dist/exceptions/token-expired.js +10 -0
  37. package/dist/middleware/cache.js +10 -0
  38. package/dist/services/authorization.js +72 -30
  39. package/dist/services/collections.d.ts +2 -0
  40. package/dist/services/collections.js +10 -0
  41. package/dist/services/fields.js +26 -1
  42. package/dist/services/files.d.ts +5 -1
  43. package/dist/services/files.js +59 -40
  44. package/dist/services/graphql.d.ts +2 -3
  45. package/dist/services/graphql.js +65 -11
  46. package/dist/services/import-export.js +2 -0
  47. package/dist/services/items.js +12 -5
  48. package/dist/services/payload.d.ts +2 -1
  49. package/dist/services/payload.js +22 -17
  50. package/dist/services/specifications.js +1 -3
  51. package/dist/services/users.js +4 -1
  52. package/dist/types/files.d.ts +8 -0
  53. package/dist/utils/apply-query.d.ts +2 -1
  54. package/dist/utils/apply-query.js +134 -156
  55. package/dist/utils/apply-snapshot.d.ts +3 -1
  56. package/dist/utils/apply-snapshot.js +34 -5
  57. package/dist/utils/get-ast-from-query.js +15 -3
  58. package/dist/utils/get-column-path.d.ts +16 -0
  59. package/dist/utils/get-column-path.js +46 -0
  60. package/dist/utils/get-graphql-type.js +1 -0
  61. package/dist/utils/get-local-type.js +5 -0
  62. package/dist/utils/get-relation-info.d.ts +7 -0
  63. package/dist/utils/get-relation-info.js +45 -0
  64. package/dist/utils/get-relation-type.d.ts +1 -1
  65. package/dist/utils/get-schema.js +3 -0
  66. package/dist/utils/jwt.js +1 -1
  67. package/dist/utils/merge-permissions-for-share.js +1 -1
  68. package/dist/utils/reduce-schema.js +18 -11
  69. package/dist/utils/validate-query.js +19 -15
  70. package/example.env +4 -0
  71. package/package.json +18 -19
package/dist/utils/jwt.js CHANGED
@@ -31,7 +31,7 @@ function verifyAccessJWT(token, secret) {
31
31
  }
32
32
  catch (err) {
33
33
  if (err instanceof jsonwebtoken_1.TokenExpiredError) {
34
- throw new exceptions_1.InvalidTokenException('Token expired.');
34
+ throw new exceptions_1.TokenExpiredException();
35
35
  }
36
36
  else if (err instanceof jsonwebtoken_1.JsonWebTokenError) {
37
37
  throw new exceptions_1.InvalidTokenException('Token invalid.');
@@ -48,7 +48,7 @@ function mergePermissionsForShare(currentPermissions, accountability, schema) {
48
48
  }
49
49
  }
50
50
  // Explicitly filter out permissions to collections unrelated to the root parent item.
51
- const limitedPermissions = currentPermissions.filter(({ collection }) => allowedCollections.includes(collection));
51
+ const limitedPermissions = currentPermissions.filter(({ action, collection }) => allowedCollections.includes(collection) && action === 'read');
52
52
  return (0, merge_permissions_1.mergePermissions)('and', limitedPermissions, generatedPermissions);
53
53
  }
54
54
  exports.mergePermissionsForShare = mergePermissionsForShare;
@@ -25,19 +25,26 @@ function reduceSchema(schema, permissions, actions = ['create', 'read', 'update'
25
25
  return acc;
26
26
  }, {})) !== null && _a !== void 0 ? _a : {};
27
27
  for (const [collectionName, collection] of Object.entries(schema.collections)) {
28
- if (permissions === null || permissions === void 0 ? void 0 : permissions.some((permission) => permission.collection === collectionName && actions.includes(permission.action))) {
29
- const fields = {};
30
- for (const [fieldName, field] of Object.entries(schema.collections[collectionName].fields)) {
31
- if (((_b = allowedFieldsInCollection[collectionName]) === null || _b === void 0 ? void 0 : _b.includes('*')) ||
32
- ((_c = allowedFieldsInCollection[collectionName]) === null || _c === void 0 ? void 0 : _c.includes(fieldName))) {
33
- fields[fieldName] = field;
34
- }
28
+ if (!(permissions === null || permissions === void 0 ? void 0 : permissions.some((permission) => permission.collection === collectionName && actions.includes(permission.action)))) {
29
+ continue;
30
+ }
31
+ const fields = {};
32
+ for (const [fieldName, field] of Object.entries(schema.collections[collectionName].fields)) {
33
+ if (!((_b = allowedFieldsInCollection[collectionName]) === null || _b === void 0 ? void 0 : _b.includes('*')) &&
34
+ !((_c = allowedFieldsInCollection[collectionName]) === null || _c === void 0 ? void 0 : _c.includes(fieldName))) {
35
+ continue;
36
+ }
37
+ const o2mRelation = schema.relations.find((relation) => { var _a; return relation.related_collection === collectionName && ((_a = relation.meta) === null || _a === void 0 ? void 0 : _a.one_field) === fieldName; });
38
+ if (o2mRelation &&
39
+ !(permissions === null || permissions === void 0 ? void 0 : permissions.some((permission) => permission.collection === o2mRelation.collection && actions.includes(permission.action)))) {
40
+ continue;
35
41
  }
36
- reduced.collections[collectionName] = {
37
- ...collection,
38
- fields,
39
- };
42
+ fields[fieldName] = field;
40
43
  }
44
+ reduced.collections[collectionName] = {
45
+ ...collection,
46
+ fields,
47
+ };
41
48
  }
42
49
  reduced.relations = schema.relations.filter((relation) => {
43
50
  var _a, _b, _c;
@@ -47,21 +47,6 @@ function validateFilter(filter) {
47
47
  else if (key.startsWith('_')) {
48
48
  const value = nested;
49
49
  switch (key) {
50
- case '_eq':
51
- case '_neq':
52
- case '_contains':
53
- case '_ncontains':
54
- case '_starts_with':
55
- case '_nstarts_with':
56
- case '_ends_with':
57
- case '_nends_with':
58
- case '_gt':
59
- case '_gte':
60
- case '_lt':
61
- case '_lte':
62
- default:
63
- validateFilterPrimitive(value, key);
64
- break;
65
50
  case '_in':
66
51
  case '_nin':
67
52
  case '_between':
@@ -80,6 +65,25 @@ function validateFilter(filter) {
80
65
  case '_nintersects_bbox':
81
66
  validateGeometry(value, key);
82
67
  break;
68
+ case '_none':
69
+ case '_some':
70
+ validateFilter(nested);
71
+ break;
72
+ case '_eq':
73
+ case '_neq':
74
+ case '_contains':
75
+ case '_ncontains':
76
+ case '_starts_with':
77
+ case '_nstarts_with':
78
+ case '_ends_with':
79
+ case '_nends_with':
80
+ case '_gt':
81
+ case '_gte':
82
+ case '_lt':
83
+ case '_lte':
84
+ default:
85
+ validateFilterPrimitive(value, key);
86
+ break;
83
87
  }
84
88
  }
85
89
  else if ((0, lodash_1.isPlainObject)(nested)) {
package/example.env CHANGED
@@ -123,6 +123,10 @@ STORAGE_LOCAL_ROOT="./uploads"
123
123
  # STORAGE_GOOGLE_KEY_FILENAME="abcdef"
124
124
  # STORAGE_GOOGLE_BUCKET="my-files"
125
125
 
126
+
127
+ ## CSV of additional metadata keys
128
+ # FILE_METADATA_ALLOW_LIST=
129
+
126
130
  ####################################################################################################
127
131
  # Security
128
132
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "directus",
3
- "version": "9.8.0",
3
+ "version": "9.10.0",
4
4
  "license": "GPL-3.0-only",
5
5
  "homepage": "https://github.com/directus/directus#readme",
6
6
  "description": "Directus is a real-time API and App dashboard for managing SQL database content.",
@@ -78,16 +78,16 @@
78
78
  ],
79
79
  "dependencies": {
80
80
  "@aws-sdk/client-ses": "^3.40.0",
81
- "@directus/app": "9.8.0",
82
- "@directus/drive": "9.8.0",
83
- "@directus/drive-azure": "9.8.0",
84
- "@directus/drive-gcs": "9.8.0",
85
- "@directus/drive-s3": "9.8.0",
86
- "@directus/extensions-sdk": "9.8.0",
87
- "@directus/format-title": "9.8.0",
88
- "@directus/schema": "9.8.0",
89
- "@directus/shared": "9.8.0",
90
- "@directus/specs": "9.8.0",
81
+ "@directus/app": "9.10.0",
82
+ "@directus/drive": "9.10.0",
83
+ "@directus/drive-azure": "9.10.0",
84
+ "@directus/drive-gcs": "9.10.0",
85
+ "@directus/drive-s3": "9.10.0",
86
+ "@directus/extensions-sdk": "9.10.0",
87
+ "@directus/format-title": "9.10.0",
88
+ "@directus/schema": "9.10.0",
89
+ "@directus/shared": "9.10.0",
90
+ "@directus/specs": "9.10.0",
91
91
  "@godaddy/terminus": "^4.9.0",
92
92
  "@rollup/plugin-alias": "^3.1.9",
93
93
  "@rollup/plugin-virtual": "^2.0.3",
@@ -124,7 +124,7 @@
124
124
  "json2csv": "^5.0.3",
125
125
  "jsonwebtoken": "^8.5.1",
126
126
  "keyv": "^4.0.3",
127
- "knex": "^0.95.14",
127
+ "knex": "^2.0.0",
128
128
  "knex-schema-inspector": "1.7.3",
129
129
  "ldapjs": "^2.3.1",
130
130
  "liquidjs": "^9.25.0",
@@ -150,8 +150,9 @@
150
150
  "resolve-cwd": "^3.0.0",
151
151
  "rollup": "^2.67.3",
152
152
  "sanitize-html": "^2.6.0",
153
- "sharp": "^0.29.0",
153
+ "sharp": "^0.30.3",
154
154
  "stream-json": "^1.7.1",
155
+ "strip-bom-stream": "^4.0.0",
155
156
  "supertest": "^6.1.6",
156
157
  "tmp-promise": "^3.0.3",
157
158
  "update-check": "^1.5.4",
@@ -161,19 +162,16 @@
161
162
  },
162
163
  "optionalDependencies": {
163
164
  "@keyv/redis": "^2.1.2",
164
- "connect-memcached": "^1.0.0",
165
- "connect-redis": "^6.0.0",
166
- "connect-session-knex": "^2.1.0",
167
165
  "ioredis": "^4.27.6",
168
166
  "keyv-memcache": "^1.2.5",
169
167
  "memcached": "^2.2.2",
170
168
  "mysql": "^2.18.1",
171
169
  "nodemailer-mailgun-transport": "^2.1.3",
172
170
  "pg": "^8.6.0",
173
- "sqlite3": "^5.0.2",
171
+ "sqlite3": "^5.0.6",
174
172
  "tedious": "^13.0.0"
175
173
  },
176
- "gitHead": "2a6db01c42dd1d7524962e7153d1d7e1bd63fb2f",
174
+ "gitHead": "e3a7a7d8879fb7959fb15802734d830001108fbb",
177
175
  "devDependencies": {
178
176
  "@types/async": "3.2.10",
179
177
  "@types/body-parser": "1.19.2",
@@ -214,8 +212,9 @@
214
212
  "@types/wellknown": "0.5.1",
215
213
  "copyfiles": "2.4.1",
216
214
  "cross-env": "7.0.3",
215
+ "form-data": "^4.0.0",
217
216
  "jest": "27.5.1",
218
- "knex-mock-client": "1.6.1",
217
+ "knex-mock-client": "1.7.0",
219
218
  "ts-jest": "27.1.3",
220
219
  "ts-node-dev": "1.1.8",
221
220
  "typescript": "4.5.2"