@directus/api 18.2.1 → 19.0.1
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 +0 -3
- package/dist/auth/drivers/ldap.js +1 -1
- package/dist/auth/drivers/local.js +1 -1
- package/dist/auth/drivers/oauth2.js +1 -1
- package/dist/auth/drivers/openid.js +1 -1
- package/dist/cache.js +1 -1
- package/dist/cli/utils/create-env/env-stub.liquid +2 -2
- package/dist/controllers/activity.js +1 -1
- package/dist/controllers/assets.js +9 -12
- package/dist/controllers/auth.js +7 -6
- package/dist/controllers/collections.js +1 -2
- package/dist/controllers/dashboards.js +1 -2
- package/dist/controllers/extensions.js +30 -0
- package/dist/controllers/fields.js +1 -3
- package/dist/controllers/flows.js +1 -2
- package/dist/controllers/folders.js +1 -2
- package/dist/controllers/items.js +3 -4
- package/dist/controllers/notifications.js +1 -2
- package/dist/controllers/operations.js +1 -2
- package/dist/controllers/panels.js +1 -2
- package/dist/controllers/presets.js +1 -2
- package/dist/controllers/roles.js +1 -2
- package/dist/controllers/translations.js +1 -2
- package/dist/controllers/users.js +1 -2
- package/dist/controllers/webhooks.js +10 -74
- package/dist/database/migrations/20240122A-add-report-url-fields.d.ts +3 -0
- package/dist/database/migrations/20240122A-add-report-url-fields.js +14 -0
- package/dist/database/migrations/20240204A-marketplace.js +17 -5
- package/dist/database/migrations/20240305A-change-useragent-type.d.ts +3 -0
- package/dist/database/migrations/20240305A-change-useragent-type.js +19 -0
- package/dist/database/migrations/20240311A-deprecate-webhooks.d.ts +13 -0
- package/dist/database/migrations/20240311A-deprecate-webhooks.js +125 -0
- package/dist/database/run-ast.js +4 -3
- package/dist/extensions/manager.d.ts +1 -0
- package/dist/extensions/manager.js +4 -1
- package/dist/middleware/authenticate.js +1 -1
- package/dist/services/activity.d.ts +2 -1
- package/dist/services/authorization.d.ts +2 -2
- package/dist/services/collections.d.ts +1 -1
- package/dist/services/collections.js +8 -7
- package/dist/services/extensions.d.ts +3 -0
- package/dist/services/extensions.js +42 -10
- package/dist/services/fields.d.ts +2 -1
- package/dist/services/fields.js +37 -7
- package/dist/services/files.d.ts +2 -2
- package/dist/services/flows.d.ts +2 -2
- package/dist/services/graphql/index.d.ts +2 -2
- package/dist/services/graphql/index.js +5 -0
- package/dist/services/import-export.js +4 -3
- package/dist/services/items.d.ts +2 -2
- package/dist/services/items.js +9 -8
- package/dist/services/notifications.d.ts +2 -2
- package/dist/services/operations.d.ts +2 -2
- package/dist/services/payload.d.ts +2 -2
- package/dist/services/permissions/index.d.ts +2 -2
- package/dist/services/relations.js +10 -3
- package/dist/services/revisions.d.ts +2 -1
- package/dist/services/roles.d.ts +2 -2
- package/dist/services/roles.js +2 -1
- package/dist/services/shares.d.ts +2 -1
- package/dist/services/shares.js +1 -1
- package/dist/services/tfa.d.ts +2 -1
- package/dist/services/tfa.js +1 -1
- package/dist/services/users.d.ts +2 -2
- package/dist/services/users.js +3 -2
- package/dist/services/utils.d.ts +2 -2
- package/dist/services/utils.js +2 -2
- package/dist/services/versions.d.ts +1 -1
- package/dist/services/webhooks.d.ts +8 -4
- package/dist/services/webhooks.js +15 -12
- package/dist/types/items.d.ts +1 -8
- package/dist/types/services.d.ts +1 -2
- package/dist/utils/apply-diff.js +2 -1
- package/dist/utils/get-ast-from-query.js +1 -1
- package/dist/utils/get-auth-providers.d.ts +3 -1
- package/dist/utils/get-auth-providers.js +15 -4
- package/dist/utils/get-cache-headers.js +0 -3
- package/dist/utils/get-schema.d.ts +1 -1
- package/dist/utils/get-schema.js +52 -29
- package/dist/utils/merge-version-data.js +1 -1
- package/dist/utils/transaction.d.ts +9 -0
- package/dist/utils/transaction.js +15 -0
- package/dist/utils/validate-keys.d.ts +1 -2
- package/dist/websocket/controllers/base.d.ts +1 -3
- package/dist/websocket/controllers/base.js +12 -3
- package/dist/websocket/utils/items.d.ts +1 -1
- package/license +1 -1
- package/package.json +39 -37
- package/dist/webhooks.d.ts +0 -4
- package/dist/webhooks.js +0 -80
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
2
|
/// <reference types="node" resolution-mode="require"/>
|
|
3
3
|
/// <reference types="node" resolution-mode="require"/>
|
|
4
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
5
4
|
/// <reference types="node/http.js" />
|
|
6
5
|
/// <reference types="pino-http" />
|
|
7
6
|
import type { IncomingMessage, Server as httpServer } from 'http';
|
|
8
|
-
import type { ParsedUrlQuery } from 'querystring';
|
|
9
7
|
import type { RateLimiterAbstract } from 'rate-limiter-flexible';
|
|
10
8
|
import type internal from 'stream';
|
|
11
9
|
import WebSocket from 'ws';
|
|
@@ -34,7 +32,7 @@ export default abstract class SocketController {
|
|
|
34
32
|
protected getRateLimiter(): RateLimiterAbstract | null;
|
|
35
33
|
private catchInvalidMessages;
|
|
36
34
|
protected handleUpgrade(request: IncomingMessage, socket: internal.Duplex, head: Buffer): Promise<void>;
|
|
37
|
-
protected
|
|
35
|
+
protected handleTokenUpgrade({ request, socket, head }: UpgradeContext, token: string): Promise<void>;
|
|
38
36
|
protected handleHandshakeUpgrade({ request, socket, head }: UpgradeContext): Promise<void>;
|
|
39
37
|
createClient(ws: WebSocket, { accountability, expires_at }: AuthenticationState): WebSocketClient;
|
|
40
38
|
protected parseMessage(data: string): WebSocketMessage;
|
|
@@ -16,6 +16,7 @@ import { getExpiresAtForToken } from '../utils/get-expires-at-for-token.js';
|
|
|
16
16
|
import { getMessageType } from '../utils/message.js';
|
|
17
17
|
import { waitForAnyMessage, waitForMessageType } from '../utils/wait-for-message.js';
|
|
18
18
|
import { registerWebSocketEvents } from './hooks.js';
|
|
19
|
+
import cookie from 'cookie';
|
|
19
20
|
const TOKEN_CHECK_INTERVAL = 15 * 60 * 1000; // 15 minutes
|
|
20
21
|
const logger = useLogger();
|
|
21
22
|
export default class SocketController {
|
|
@@ -96,9 +97,18 @@ export default class SocketController {
|
|
|
96
97
|
socket.destroy();
|
|
97
98
|
return;
|
|
98
99
|
}
|
|
100
|
+
const env = useEnv();
|
|
101
|
+
const cookies = request.headers.cookie ? cookie.parse(request.headers.cookie) : {};
|
|
99
102
|
const context = { request, socket, head };
|
|
103
|
+
const sessionCookieName = env['SESSION_COOKIE_NAME'];
|
|
104
|
+
if (cookies[sessionCookieName]) {
|
|
105
|
+
const token = cookies[sessionCookieName];
|
|
106
|
+
await this.handleTokenUpgrade(context, token);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
100
109
|
if (this.authentication.mode === 'strict') {
|
|
101
|
-
|
|
110
|
+
const token = query['access_token'];
|
|
111
|
+
await this.handleTokenUpgrade(context, token);
|
|
102
112
|
return;
|
|
103
113
|
}
|
|
104
114
|
if (this.authentication.mode === 'handshake') {
|
|
@@ -111,10 +121,9 @@ export default class SocketController {
|
|
|
111
121
|
this.server.emit('connection', ws, state);
|
|
112
122
|
});
|
|
113
123
|
}
|
|
114
|
-
async
|
|
124
|
+
async handleTokenUpgrade({ request, socket, head }, token) {
|
|
115
125
|
let accountability, expires_at;
|
|
116
126
|
try {
|
|
117
|
-
const token = query['access_token'];
|
|
118
127
|
accountability = await getAccountabilityForToken(token);
|
|
119
128
|
expires_at = getExpiresAtForToken(token);
|
|
120
129
|
}
|
|
@@ -39,5 +39,5 @@ export declare function getFieldsPayload(subscription: PSubscription, accountabi
|
|
|
39
39
|
* @param event Event data
|
|
40
40
|
* @returns the fetched data
|
|
41
41
|
*/
|
|
42
|
-
export declare function getItemsPayload(subscription: PSubscription, accountability: Accountability | null, schema: SchemaOverview, event?: WebSocketEvent): Promise<string | number | import("
|
|
42
|
+
export declare function getItemsPayload(subscription: PSubscription, accountability: Accountability | null, schema: SchemaOverview, event?: WebSocketEvent): Promise<string | number | import("@directus/types").Item | (string | number)[] | import("@directus/types").Item[]>;
|
|
43
43
|
export {};
|
package/license
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Licensor: Monospace, Inc.
|
|
2
2
|
|
|
3
3
|
Licensed Work: Directus
|
|
4
|
-
The Licensed Work is Copyright ©
|
|
4
|
+
The Licensed Work is Copyright © 2024 Monospace, Inc.
|
|
5
5
|
|
|
6
6
|
Additional Use Grant: You may use the Licensed Work in production as long as
|
|
7
7
|
your Total Finances do not exceed US $5,000,000 for the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@directus/api",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "19.0.1",
|
|
4
4
|
"description": "Directus is a real-time API and App dashboard for managing SQL database content",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"directus",
|
|
@@ -59,15 +59,15 @@
|
|
|
59
59
|
],
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"@authenio/samlify-node-xmllint": "2.0.0",
|
|
62
|
-
"@aws-sdk/client-ses": "3.
|
|
63
|
-
"@directus/format-title": "10.1.0",
|
|
62
|
+
"@aws-sdk/client-ses": "3.552.0",
|
|
64
63
|
"@godaddy/terminus": "4.12.1",
|
|
65
64
|
"@rollup/plugin-alias": "5.1.0",
|
|
66
65
|
"@rollup/plugin-node-resolve": "15.2.3",
|
|
67
66
|
"@rollup/plugin-virtual": "3.0.2",
|
|
67
|
+
"@types/cookie": "0.6.0",
|
|
68
68
|
"argon2": "0.40.1",
|
|
69
69
|
"async": "3.2.5",
|
|
70
|
-
"axios": "1.6.
|
|
70
|
+
"axios": "1.6.8",
|
|
71
71
|
"busboy": "1.6.0",
|
|
72
72
|
"bytes": "3.1.2",
|
|
73
73
|
"camelcase": "8.0.0",
|
|
@@ -75,10 +75,11 @@
|
|
|
75
75
|
"chokidar": "3.6.0",
|
|
76
76
|
"commander": "12.0.0",
|
|
77
77
|
"content-disposition": "0.5.4",
|
|
78
|
+
"cookie": "0.6.0",
|
|
78
79
|
"cookie-parser": "1.4.6",
|
|
79
80
|
"cors": "2.8.5",
|
|
80
81
|
"cron-parser": "4.9.0",
|
|
81
|
-
"date-fns": "3.
|
|
82
|
+
"date-fns": "3.6.0",
|
|
82
83
|
"deep-diff": "1.0.2",
|
|
83
84
|
"destroy": "1.2.0",
|
|
84
85
|
"dotenv": "16.4.5",
|
|
@@ -86,7 +87,7 @@
|
|
|
86
87
|
"eventemitter2": "6.4.9",
|
|
87
88
|
"execa": "8.0.1",
|
|
88
89
|
"exif-reader": "2.0.1",
|
|
89
|
-
"express": "4.
|
|
90
|
+
"express": "4.19.2",
|
|
90
91
|
"flat": "6.0.1",
|
|
91
92
|
"fs-extra": "11.2.0",
|
|
92
93
|
"glob-to-regexp": "0.4.1",
|
|
@@ -95,7 +96,7 @@
|
|
|
95
96
|
"graphql-ws": "5.15.0",
|
|
96
97
|
"helmet": "7.1.0",
|
|
97
98
|
"icc": "3.0.0",
|
|
98
|
-
"inquirer": "9.2.
|
|
99
|
+
"inquirer": "9.2.16",
|
|
99
100
|
"ioredis": "5.3.2",
|
|
100
101
|
"ip-matching": "2.1.2",
|
|
101
102
|
"isolated-vm": "4.7.2",
|
|
@@ -109,18 +110,18 @@
|
|
|
109
110
|
"ldapjs": "2.3.3",
|
|
110
111
|
"liquidjs": "10.10.1",
|
|
111
112
|
"lodash-es": "4.17.21",
|
|
112
|
-
"marked": "12.0.
|
|
113
|
+
"marked": "12.0.1",
|
|
113
114
|
"micromustache": "8.0.3",
|
|
114
115
|
"mime-types": "2.1.35",
|
|
115
116
|
"minimatch": "9.0.3",
|
|
116
117
|
"mnemonist": "0.39.8",
|
|
117
118
|
"ms": "2.1.3",
|
|
118
|
-
"nanoid": "5.0.
|
|
119
|
+
"nanoid": "5.0.7",
|
|
119
120
|
"node-machine-id": "1.1.12",
|
|
120
121
|
"node-schedule": "2.1.1",
|
|
121
|
-
"nodemailer": "6.9.
|
|
122
|
+
"nodemailer": "6.9.13",
|
|
122
123
|
"object-hash": "3.0.0",
|
|
123
|
-
"openapi3-ts": "4.
|
|
124
|
+
"openapi3-ts": "4.3.1",
|
|
124
125
|
"openid-client": "5.6.5",
|
|
125
126
|
"ora": "8.0.1",
|
|
126
127
|
"otplib": "12.0.1",
|
|
@@ -135,7 +136,7 @@
|
|
|
135
136
|
"rate-limiter-flexible": "5.0.0",
|
|
136
137
|
"rollup": "4.12.0",
|
|
137
138
|
"samlify": "2.8.11",
|
|
138
|
-
"sanitize-html": "2.
|
|
139
|
+
"sanitize-html": "2.13.0",
|
|
139
140
|
"sharp": "0.33.2",
|
|
140
141
|
"snappy": "7.2.2",
|
|
141
142
|
"stream-json": "1.8.0",
|
|
@@ -145,28 +146,29 @@
|
|
|
145
146
|
"ws": "8.16.0",
|
|
146
147
|
"zod": "3.22.4",
|
|
147
148
|
"zod-validation-error": "3.0.3",
|
|
148
|
-
"@directus/app": "
|
|
149
|
-
"@directus/env": "1.1.
|
|
150
|
-
"@directus/constants": "11.0.3",
|
|
149
|
+
"@directus/app": "12.0.1",
|
|
150
|
+
"@directus/env": "1.1.1",
|
|
151
151
|
"@directus/errors": "0.2.4",
|
|
152
|
-
"@directus/extensions": "1.0.
|
|
153
|
-
"@directus/
|
|
154
|
-
"@directus/extensions
|
|
155
|
-
"@directus/
|
|
156
|
-
"@directus/
|
|
157
|
-
"@directus/
|
|
152
|
+
"@directus/extensions-registry": "1.0.3",
|
|
153
|
+
"@directus/constants": "11.0.3",
|
|
154
|
+
"@directus/extensions": "1.0.3",
|
|
155
|
+
"@directus/extensions-sdk": "11.0.3",
|
|
156
|
+
"@directus/format-title": "10.1.1",
|
|
157
|
+
"@directus/memory": "1.0.6",
|
|
158
|
+
"@directus/pressure": "1.0.18",
|
|
158
159
|
"@directus/schema": "11.0.1",
|
|
160
|
+
"@directus/specs": "10.2.8",
|
|
161
|
+
"@directus/storage-driver-azure": "10.0.19",
|
|
159
162
|
"@directus/storage": "10.0.11",
|
|
160
|
-
"@directus/storage-driver-
|
|
161
|
-
"@directus/storage-driver-
|
|
162
|
-
"@directus/storage-driver-
|
|
163
|
+
"@directus/storage-driver-gcs": "10.0.19",
|
|
164
|
+
"@directus/storage-driver-cloudinary": "10.0.19",
|
|
165
|
+
"@directus/storage-driver-s3": "10.0.20",
|
|
166
|
+
"@directus/storage-driver-supabase": "1.0.11",
|
|
163
167
|
"@directus/storage-driver-local": "10.0.18",
|
|
164
|
-
"@directus/
|
|
165
|
-
"@directus/
|
|
166
|
-
"@directus/
|
|
167
|
-
"
|
|
168
|
-
"@directus/validation": "0.0.13",
|
|
169
|
-
"directus": "10.10.4"
|
|
168
|
+
"@directus/system-data": "1.0.2",
|
|
169
|
+
"@directus/validation": "0.0.14",
|
|
170
|
+
"@directus/utils": "11.0.7",
|
|
171
|
+
"directus": "10.10.6"
|
|
170
172
|
},
|
|
171
173
|
"devDependencies": {
|
|
172
174
|
"@ngneat/falso": "7.2.0",
|
|
@@ -191,34 +193,34 @@
|
|
|
191
193
|
"@types/lodash-es": "4.17.12",
|
|
192
194
|
"@types/mime-types": "2.1.4",
|
|
193
195
|
"@types/ms": "0.7.34",
|
|
194
|
-
"@types/node": "18.19.
|
|
196
|
+
"@types/node": "18.19.26",
|
|
195
197
|
"@types/node-schedule": "2.1.6",
|
|
196
198
|
"@types/nodemailer": "6.4.14",
|
|
197
199
|
"@types/object-hash": "3.0.6",
|
|
198
200
|
"@types/papaparse": "5.3.14",
|
|
199
|
-
"@types/qs": "6.9.
|
|
201
|
+
"@types/qs": "6.9.14",
|
|
200
202
|
"@types/sanitize-html": "2.11.0",
|
|
201
203
|
"@types/stream-json": "1.7.7",
|
|
202
204
|
"@types/tar": "6.1.11",
|
|
203
205
|
"@types/wellknown": "0.5.8",
|
|
204
206
|
"@types/ws": "8.5.10",
|
|
205
|
-
"@vitest/coverage-v8": "1.
|
|
207
|
+
"@vitest/coverage-v8": "1.4.0",
|
|
206
208
|
"copyfiles": "2.4.1",
|
|
207
209
|
"form-data": "4.0.0",
|
|
208
210
|
"knex-mock-client": "2.0.1",
|
|
209
211
|
"typescript": "5.3.3",
|
|
210
212
|
"vitest": "1.3.1",
|
|
211
213
|
"@directus/random": "0.2.7",
|
|
212
|
-
"@directus/
|
|
213
|
-
"@directus/
|
|
214
|
+
"@directus/types": "11.1.0",
|
|
215
|
+
"@directus/tsconfig": "1.0.1"
|
|
214
216
|
},
|
|
215
217
|
"optionalDependencies": {
|
|
216
218
|
"@keyv/redis": "2.8.4",
|
|
217
219
|
"mysql": "2.18.1",
|
|
218
220
|
"nodemailer-mailgun-transport": "2.1.5",
|
|
219
221
|
"nodemailer-sendgrid": "1.0.3",
|
|
220
|
-
"oracledb": "6.
|
|
221
|
-
"pg": "8.11.
|
|
222
|
+
"oracledb": "6.4.0",
|
|
223
|
+
"pg": "8.11.4",
|
|
222
224
|
"sqlite3": "5.1.7",
|
|
223
225
|
"tedious": "17.0.0"
|
|
224
226
|
},
|
package/dist/webhooks.d.ts
DELETED
package/dist/webhooks.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { useBus } from './bus/index.js';
|
|
2
|
-
import getDatabase from './database/index.js';
|
|
3
|
-
import emitter from './emitter.js';
|
|
4
|
-
import { useLogger } from './logger.js';
|
|
5
|
-
import { getAxios } from './request/index.js';
|
|
6
|
-
import { WebhooksService } from './services/webhooks.js';
|
|
7
|
-
import { getSchema } from './utils/get-schema.js';
|
|
8
|
-
import { JobQueue } from './utils/job-queue.js';
|
|
9
|
-
let registered = [];
|
|
10
|
-
const reloadQueue = new JobQueue();
|
|
11
|
-
export async function init() {
|
|
12
|
-
await register();
|
|
13
|
-
const messenger = useBus();
|
|
14
|
-
messenger.subscribe('webhooks', (event) => {
|
|
15
|
-
if (event['type'] === 'reload') {
|
|
16
|
-
reloadQueue.enqueue(async () => {
|
|
17
|
-
await reload();
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
export async function reload() {
|
|
23
|
-
unregister();
|
|
24
|
-
await register();
|
|
25
|
-
}
|
|
26
|
-
export async function register() {
|
|
27
|
-
const webhookService = new WebhooksService({ knex: getDatabase(), schema: await getSchema() });
|
|
28
|
-
const webhooks = await webhookService.readByQuery({ filter: { status: { _eq: 'active' } } });
|
|
29
|
-
for (const webhook of webhooks) {
|
|
30
|
-
for (const action of webhook.actions) {
|
|
31
|
-
const event = `items.${action}`;
|
|
32
|
-
const handler = createHandler(webhook, event);
|
|
33
|
-
emitter.onAction(event, handler);
|
|
34
|
-
registered.push({ event, handler });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
export function unregister() {
|
|
39
|
-
for (const { event, handler } of registered) {
|
|
40
|
-
emitter.offAction(event, handler);
|
|
41
|
-
}
|
|
42
|
-
registered = [];
|
|
43
|
-
}
|
|
44
|
-
function createHandler(webhook, event) {
|
|
45
|
-
const logger = useLogger();
|
|
46
|
-
return async (meta, context) => {
|
|
47
|
-
if (webhook.collections.includes(meta['collection']) === false)
|
|
48
|
-
return;
|
|
49
|
-
const axios = await getAxios();
|
|
50
|
-
const webhookPayload = {
|
|
51
|
-
event,
|
|
52
|
-
accountability: context.accountability
|
|
53
|
-
? {
|
|
54
|
-
user: context.accountability.user,
|
|
55
|
-
role: context.accountability.role,
|
|
56
|
-
}
|
|
57
|
-
: null,
|
|
58
|
-
...meta,
|
|
59
|
-
};
|
|
60
|
-
try {
|
|
61
|
-
await axios({
|
|
62
|
-
url: webhook.url,
|
|
63
|
-
method: webhook.method,
|
|
64
|
-
data: webhook.data ? webhookPayload : null,
|
|
65
|
-
headers: mergeHeaders(webhook.headers),
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
logger.warn(`Webhook "${webhook.name}" (id: ${webhook.id}) failed`);
|
|
70
|
-
logger.warn(error);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
function mergeHeaders(headerArray) {
|
|
75
|
-
const headers = {};
|
|
76
|
-
for (const { header, value } of headerArray ?? []) {
|
|
77
|
-
headers[header] = value;
|
|
78
|
-
}
|
|
79
|
-
return headers;
|
|
80
|
-
}
|