@tellescope/sdk 1.255.16 → 1.255.18

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 (31) hide show
  1. package/lib/cjs/sdk.d.ts +1 -0
  2. package/lib/cjs/sdk.d.ts.map +1 -1
  3. package/lib/cjs/sdk.js.map +1 -1
  4. package/lib/cjs/tests/api_tests/organization_api_keys.test.js +2 -2
  5. package/lib/cjs/tests/api_tests/organization_api_keys.test.js.map +1 -1
  6. package/lib/cjs/tests/api_tests/scoped_api_keys.test.d.ts +6 -0
  7. package/lib/cjs/tests/api_tests/scoped_api_keys.test.d.ts.map +1 -0
  8. package/lib/cjs/tests/api_tests/scoped_api_keys.test.js +414 -0
  9. package/lib/cjs/tests/api_tests/scoped_api_keys.test.js.map +1 -0
  10. package/lib/cjs/tests/tests.d.ts.map +1 -1
  11. package/lib/cjs/tests/tests.js +147 -143
  12. package/lib/cjs/tests/tests.js.map +1 -1
  13. package/lib/esm/sdk.d.ts +1 -0
  14. package/lib/esm/sdk.d.ts.map +1 -1
  15. package/lib/esm/sdk.js.map +1 -1
  16. package/lib/esm/tests/api_tests/organization_api_keys.test.js +2 -2
  17. package/lib/esm/tests/api_tests/organization_api_keys.test.js.map +1 -1
  18. package/lib/esm/tests/api_tests/scoped_api_keys.test.d.ts +6 -0
  19. package/lib/esm/tests/api_tests/scoped_api_keys.test.d.ts.map +1 -0
  20. package/lib/esm/tests/api_tests/scoped_api_keys.test.js +407 -0
  21. package/lib/esm/tests/api_tests/scoped_api_keys.test.js.map +1 -0
  22. package/lib/esm/tests/tests.d.ts.map +1 -1
  23. package/lib/esm/tests/tests.js +147 -143
  24. package/lib/esm/tests/tests.js.map +1 -1
  25. package/lib/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +8 -8
  27. package/src/sdk.ts +3 -0
  28. package/src/tests/api_tests/organization_api_keys.test.ts +2 -2
  29. package/src/tests/api_tests/scoped_api_keys.test.ts +319 -0
  30. package/src/tests/tests.ts +2 -0
  31. package/test_generated.pdf +0 -0
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.scoped_api_keys_tests = void 0;
43
+ require('source-map-support').install();
44
+ var axios_1 = __importDefault(require("axios"));
45
+ var sdk_1 = require("../../sdk");
46
+ var testing_1 = require("@tellescope/testing");
47
+ var setup_1 = require("../setup");
48
+ var types_models_1 = require("@tellescope/types-models");
49
+ var host = process.env.API_URL || "http://localhost:8080";
50
+ var TEST_EMAIL = "scoped-api-keys@tellescope.com";
51
+ var scoped_api_keys_tests = function (_a) {
52
+ var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
53
+ return __awaiter(void 0, void 0, void 0, function () {
54
+ var form, buildUrl, bodyFor, keyIds, formResponseIds, fileIds, throwawayUserId, throwawayRoleId, scoped_1, headerResult, pathResult, scopedSession_1, uploadedFile_1, blockedFileEndpoints, _i, blockedFileEndpoints_1, _b, label, call, apiKeysRole, throwawayUser, _c, otherSdk_1, _d, nonAdminKey, unscoped_1, unscopedKeyValue_1, apiKeys, _e, keyIds_1, id, _f, formResponseIds_1, id, _g, fileIds_1, id, enduser, err_1;
55
+ var _h;
56
+ var _j, _k, _l, _m;
57
+ return __generator(this, function (_o) {
58
+ switch (_o.label) {
59
+ case 0:
60
+ (0, testing_1.log_header)("Scoped API Keys (form-ingestion)");
61
+ return [4 /*yield*/, sdk.api.forms.createOne({ title: "Scoped API Key Test Form" })];
62
+ case 1:
63
+ form = _o.sent();
64
+ buildUrl = function (pathSegment) {
65
+ var url = new URL("".concat(host, "/v1/webhooks/form-ingestion/").concat(pathSegment));
66
+ url.searchParams.set('formId', form.id);
67
+ url.searchParams.set('returnJSON', 'true');
68
+ return url.toString();
69
+ };
70
+ bodyFor = function (responder_uuid) { return ({
71
+ answers: [{ key: 'email', value: TEST_EMAIL }],
72
+ responder_uuid: responder_uuid,
73
+ finalized: true,
74
+ }); };
75
+ keyIds = [];
76
+ formResponseIds = [];
77
+ fileIds = [];
78
+ _o.label = 2;
79
+ case 2:
80
+ _o.trys.push([2, , 37, 59]);
81
+ return [4 /*yield*/, sdk.api.api_keys.createOne({ scopes: [types_models_1.FORM_INGESTION_API_KEY_SCOPE] })];
82
+ case 3:
83
+ scoped_1 = _o.sent();
84
+ keyIds.push(scoped_1.id);
85
+ (0, testing_1.assert)(!!scoped_1.id && !!scoped_1.key, "scoped key create returned no id/key", "admin creates a form-ingestion-scoped key");
86
+ // record reflects the scope for its creator (CREATOR_ONLY_ACCESS read)
87
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key record stores scopes", function () { return sdk.api.api_keys.getOne(scoped_1.id); }, { onResult: function (k) { return JSON.stringify(k.scopes) === JSON.stringify([types_models_1.FORM_INGESTION_API_KEY_SCOPE]); } })
88
+ // =============================================
89
+ // (b) Scoped key is rejected on all general /v1 auth
90
+ // =============================================
91
+ ];
92
+ case 4:
93
+ // record reflects the scope for its creator (CREATOR_ONLY_ACCESS read)
94
+ _o.sent();
95
+ // =============================================
96
+ // (b) Scoped key is rejected on all general /v1 auth
97
+ // =============================================
98
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key rejected on /v1/test-authenticated", function () { return new sdk_1.Session({ host: host, apiKey: scoped_1.key }).test_authenticated(); },
99
+ // SDK parseError surfaces a raw 401 body as the string 'Unauthenticated'
100
+ { shouldError: true, onError: function (e) { return e === 'Unauthenticated' || (e === null || e === void 0 ? void 0 : e.statusCode) === 401 || /unauthenticated/i.test((e === null || e === void 0 ? void 0 : e.message) || ''); } })];
101
+ case 5:
102
+ // =============================================
103
+ // (b) Scoped key is rejected on all general /v1 auth
104
+ // =============================================
105
+ _o.sent();
106
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key rejected on GET /v1/endusers", function () { return axios_1.default.get("".concat(host, "/v1/endusers"), { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }, { shouldError: true, onError: function (e) { var _a; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401; } })];
107
+ case 6:
108
+ _o.sent();
109
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key rejected on cross-org targeting (x-tellescope-organization)", function () { return axios_1.default.get("".concat(host, "/v1/endusers"), {
110
+ headers: {
111
+ Authorization: "API_KEY ".concat(scoped_1.key),
112
+ 'x-tellescope-organization': sdk.userInfo.businessId,
113
+ },
114
+ }); }, { shouldError: true, onError: function (e) { var _a; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401; } })
115
+ // =============================================
116
+ // (c) Scoped key IS accepted by the form-ingestion webhook
117
+ // =============================================
118
+ ];
119
+ case 7:
120
+ _o.sent();
121
+ return [4 /*yield*/, axios_1.default.post(buildUrl('key-in-header'), bodyFor("scoped-1"), { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } })];
122
+ case 8:
123
+ headerResult = _o.sent();
124
+ (0, testing_1.assert)(headerResult.status === 200 && !!((_j = headerResult.data) === null || _j === void 0 ? void 0 : _j.formResponseId), "scoped key header auth failed: ".concat(headerResult.status, " ").concat(JSON.stringify(headerResult.data)), "scoped key authenticates the form-ingestion webhook via header");
125
+ if ((_k = headerResult.data) === null || _k === void 0 ? void 0 : _k.formResponseId)
126
+ formResponseIds.push(headerResult.data.formResponseId);
127
+ return [4 /*yield*/, axios_1.default.post(buildUrl(scoped_1.key), bodyFor("scoped-2"))];
128
+ case 9:
129
+ pathResult = _o.sent();
130
+ (0, testing_1.assert)(pathResult.status === 200 && !!((_l = pathResult.data) === null || _l === void 0 ? void 0 : _l.formResponseId), "scoped key path auth failed: ".concat(pathResult.status, " ").concat(JSON.stringify(pathResult.data)), "scoped key authenticates the form-ingestion webhook via path segment");
131
+ if ((_m = pathResult.data) === null || _m === void 0 ? void 0 : _m.formResponseId)
132
+ formResponseIds.push(pathResult.data.formResponseId);
133
+ scopedSession_1 = new sdk_1.Session({ host: host, apiKey: scoped_1.key });
134
+ return [4 /*yield*/, scopedSession_1.api.files.prepare_file_upload({
135
+ name: 'scoped-intake-file.txt', size: 12, type: 'text/plain',
136
+ })];
137
+ case 10:
138
+ uploadedFile_1 = (_o.sent()).file;
139
+ (0, testing_1.assert)(!!(uploadedFile_1 === null || uploadedFile_1 === void 0 ? void 0 : uploadedFile_1.id), "scoped key prepare_file_upload returned no file", "scoped key can call POST /prepare-file-upload");
140
+ if (uploadedFile_1 === null || uploadedFile_1 === void 0 ? void 0 : uploadedFile_1.id)
141
+ fileIds.push(uploadedFile_1.id);
142
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key can call POST /files/confirm-upload", function () { return scopedSession_1.api.files.confirm_file_upload({ id: uploadedFile_1.id }); }, { onResult: function () { return true; } })
143
+ // ...but is blocked from EVERY other endpoint in the files domain — proving the two allowed paths are the
144
+ // ONLY files access, and that the '/files/confirm-upload' allow-prefix does not open the '/files/*' namespace.
145
+ ];
146
+ case 11:
147
+ _o.sent();
148
+ blockedFileEndpoints = [
149
+ ['GET /v1/files (readMany)', function () { return axios_1.default.get("".concat(host, "/v1/files"), { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }],
150
+ ['GET /v1/file/:id (read one)', function () { return axios_1.default.get("".concat(host, "/v1/file/000000000000000000000000"), { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }],
151
+ ['DELETE /v1/file/:id (destructive)', function () { return axios_1.default.delete("".concat(host, "/v1/file/000000000000000000000000"), { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }],
152
+ ['POST /v1/files/send-fax (/files/* sibling)', function () { return axios_1.default.post("".concat(host, "/v1/files/send-fax"), {}, { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }],
153
+ ['POST /v1/files/ocr (/files/* sibling)', function () { return axios_1.default.post("".concat(host, "/v1/files/ocr"), {}, { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }],
154
+ ['POST /v1/files/push (/files/* sibling)', function () { return axios_1.default.post("".concat(host, "/v1/files/push"), {}, { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }],
155
+ ];
156
+ _i = 0, blockedFileEndpoints_1 = blockedFileEndpoints;
157
+ _o.label = 12;
158
+ case 12:
159
+ if (!(_i < blockedFileEndpoints_1.length)) return [3 /*break*/, 15];
160
+ _b = blockedFileEndpoints_1[_i], label = _b[0], call = _b[1];
161
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key blocked on ".concat(label), call, { shouldError: true, onError: function (e) { var _a, _b; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = e.response) === null || _b === void 0 ? void 0 : _b.status) === 403; } })];
162
+ case 13:
163
+ _o.sent();
164
+ _o.label = 14;
165
+ case 14:
166
+ _i++;
167
+ return [3 /*break*/, 12];
168
+ case 15: return [4 /*yield*/, sdk.api.role_based_access_permissions.createOne({
169
+ role: 'scoped-api-keys-test-role',
170
+ permissions: { api_keys: { create: 'All', read: 'All', update: 'All', delete: 'All' } },
171
+ })];
172
+ case 16:
173
+ apiKeysRole = _o.sent();
174
+ throwawayRoleId = apiKeysRole.id;
175
+ return [4 /*yield*/, sdk.api.users.getOne({ email: 'scoped.api.keys.user@tellescope.com' }).catch(function () { return null; })];
176
+ case 17:
177
+ _c = (_o.sent());
178
+ if (_c) return [3 /*break*/, 19];
179
+ return [4 /*yield*/, sdk.api.users.createOne({ email: 'scoped.api.keys.user@tellescope.com', notificationEmailsDisabled: true, verifiedEmail: true })];
180
+ case 18:
181
+ _c = (_o.sent());
182
+ _o.label = 19;
183
+ case 19:
184
+ throwawayUser = _c;
185
+ throwawayUserId = throwawayUser.id;
186
+ return [4 /*yield*/, sdk.api.users.updateOne(throwawayUser.id, { roles: [apiKeysRole.role] }, { replaceObjectFields: true })];
187
+ case 20:
188
+ _o.sent();
189
+ return [4 /*yield*/, (0, testing_1.wait)(undefined, 2000)]; // wait for the role change to propagate before authenticating
190
+ case 21:
191
+ _o.sent(); // wait for the role change to propagate before authenticating
192
+ _d = sdk_1.Session.bind;
193
+ _h = {
194
+ host: host
195
+ };
196
+ return [4 /*yield*/, sdk.api.users.generate_auth_token({ id: throwawayUser.id })];
197
+ case 22:
198
+ otherSdk_1 = new (_d.apply(sdk_1.Session, [void 0, (_h.authToken = (_o.sent()).authToken,
199
+ _h)]))();
200
+ return [4 /*yield*/, (0, testing_1.async_test)("non-admin cannot create a scoped key (401)", function () { return otherSdk_1.api.api_keys.createOne({ scopes: [types_models_1.FORM_INGESTION_API_KEY_SCOPE] }); }, { shouldError: true, onError: function (e) { return e === 'Unauthenticated' || (e === null || e === void 0 ? void 0 : e.statusCode) === 401 || /admin/i.test((e === null || e === void 0 ? void 0 : e.message) || ''); } })
201
+ // ...but CAN still create an unscoped key; an empty scopes list is rejected by validation (fail closed)
202
+ ];
203
+ case 23:
204
+ _o.sent();
205
+ return [4 /*yield*/, otherSdk_1.api.api_keys.createOne({})];
206
+ case 24:
207
+ nonAdminKey = _o.sent();
208
+ return [4 /*yield*/, (0, testing_1.async_test)("empty scopes list rejected by validation", function () { return otherSdk_1.api.api_keys.createOne({ scopes: [] }); }, { shouldError: true, onError: function (e) { return (e === null || e === void 0 ? void 0 : e.statusCode) === 400 || /empty|not valid|invalid/i.test((e === null || e === void 0 ? void 0 : e.message) || ''); } })
209
+ // creator-only cleanup for the throwaway user's key before the user is deleted
210
+ ];
211
+ case 25:
212
+ _o.sent();
213
+ // creator-only cleanup for the throwaway user's key before the user is deleted
214
+ return [4 /*yield*/, otherSdk_1.api.api_keys.deleteOne(nonAdminKey.id).catch(function () { })
215
+ // =============================================
216
+ // (e) Unscoped keys are unchanged (no regression)
217
+ // =============================================
218
+ ];
219
+ case 26:
220
+ // creator-only cleanup for the throwaway user's key before the user is deleted
221
+ _o.sent();
222
+ return [4 /*yield*/, sdk.api.api_keys.createOne({})];
223
+ case 27:
224
+ unscoped_1 = _o.sent();
225
+ unscopedKeyValue_1 = unscoped_1.key;
226
+ keyIds.push(unscoped_1.id);
227
+ return [4 /*yield*/, (0, testing_1.async_test)("unscoped key still authenticates general /v1", function () { return new sdk_1.Session({ host: host, apiKey: unscopedKeyValue_1 }).test_authenticated(); }, { onResult: function (r) { return !!r; } })
228
+ // Frozen pre-existing behavior: unscoped /v1-created keys store a utf8-encoded hashedKey, which the
229
+ // webhook's hex lookup never matches — only legacy plaintext keys and hex-stored scoped keys work there.
230
+ // (Legacy-key webhook auth is covered by formsort_header_auth.test.ts.)
231
+ ];
232
+ case 28:
233
+ _o.sent();
234
+ // Frozen pre-existing behavior: unscoped /v1-created keys store a utf8-encoded hashedKey, which the
235
+ // webhook's hex lookup never matches — only legacy plaintext keys and hex-stored scoped keys work there.
236
+ // (Legacy-key webhook auth is covered by formsort_header_auth.test.ts.)
237
+ return [4 /*yield*/, (0, testing_1.async_test)("unscoped /v1-created key still does NOT authenticate the webhook (frozen encoding quirk)", function () { return axios_1.default.post(buildUrl('key-in-header'), bodyFor("scoped-3"), { headers: { Authorization: "API_KEY ".concat(unscopedKeyValue_1) } }); }, { shouldError: true, onError: function (e) { var _a; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401; } })
238
+ // =============================================
239
+ // (f) Admin org-wide list includes scopes (and still never leaks secrets)
240
+ // =============================================
241
+ ];
242
+ case 29:
243
+ // Frozen pre-existing behavior: unscoped /v1-created keys store a utf8-encoded hashedKey, which the
244
+ // webhook's hex lookup never matches — only legacy plaintext keys and hex-stored scoped keys work there.
245
+ // (Legacy-key webhook auth is covered by formsort_header_auth.test.ts.)
246
+ _o.sent();
247
+ return [4 /*yield*/, sdk.api.api_keys.get_organization_api_keys()];
248
+ case 30:
249
+ apiKeys = (_o.sent()).apiKeys;
250
+ (0, testing_1.assert)(!!apiKeys.find(function (k) { return k.id === scoped_1.id && JSON.stringify(k.scopes) === JSON.stringify([types_models_1.FORM_INGESTION_API_KEY_SCOPE]); }), "org list did not report scopes on the scoped key", "get_organization_api_keys reports scopes on scoped keys");
251
+ (0, testing_1.assert)(!!apiKeys.find(function (k) { return k.id === unscoped_1.id && k.scopes === undefined; }), "org list reported scopes on an unscoped key", "get_organization_api_keys omits scopes on unscoped keys");
252
+ (0, testing_1.assert)(apiKeys.every(function (k) { return k.key === undefined && k.hashedKey === undefined; }), "org list leaked key material", "get_organization_api_keys still never returns key/hashedKey");
253
+ // =============================================
254
+ // (g) Legacy non-/v1 funnel (app.js requireLoginAndAccess → is_logged_in_API_key with NO requestPath).
255
+ // Proves scoped keys fail closed on every non-/v1 caller (also stands in for the Medplum webhook path),
256
+ // and that unscoped keys still authenticate the legacy funnel after this work.
257
+ // NOTE: the legacy middleware reads the key from ?apiKey= / body only (never the Authorization header).
258
+ // =============================================
259
+ return [4 /*yield*/, (0, testing_1.async_test)("unscoped key authenticates a legacy non-/v1 route", function () { return axios_1.default.get("".concat(host, "/API-keys-for-user?apiKey=").concat(encodeURIComponent(unscopedKeyValue_1))); }, { onResult: function (r) { return r.status === 200; } })];
260
+ case 31:
261
+ // =============================================
262
+ // (g) Legacy non-/v1 funnel (app.js requireLoginAndAccess → is_logged_in_API_key with NO requestPath).
263
+ // Proves scoped keys fail closed on every non-/v1 caller (also stands in for the Medplum webhook path),
264
+ // and that unscoped keys still authenticate the legacy funnel after this work.
265
+ // NOTE: the legacy middleware reads the key from ?apiKey= / body only (never the Authorization header).
266
+ // =============================================
267
+ _o.sent();
268
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key rejected on a legacy non-/v1 route (fail closed, no requestPath)", function () { return axios_1.default.get("".concat(host, "/API-keys-for-user?apiKey=").concat(encodeURIComponent(scoped_1.key))); }, { shouldError: true, onError: function (e) { var _a; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401; } })
269
+ // =============================================
270
+ // (h) Data-egress adjacency: the scope's allowed paths must NOT leak to the file DOWNLOAD endpoint.
271
+ // =============================================
272
+ ];
273
+ case 32:
274
+ _o.sent();
275
+ // =============================================
276
+ // (h) Data-egress adjacency: the scope's allowed paths must NOT leak to the file DOWNLOAD endpoint.
277
+ // =============================================
278
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key cannot call file_download_URL (no PHI egress)", function () { return axios_1.default.get("".concat(host, "/v1/file-download-URL?secureName=nonexistent"), { headers: { Authorization: "API_KEY ".concat(scoped_1.key) } }); }, { shouldError: true, onError: function (e) { var _a, _b; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = e.response) === null || _b === void 0 ? void 0 : _b.status) === 403; } })
279
+ // =============================================
280
+ // (i) Transport independence: the scope gate applies whether the key is in the header or the ?apiKey= query.
281
+ // =============================================
282
+ ];
283
+ case 33:
284
+ // =============================================
285
+ // (h) Data-egress adjacency: the scope's allowed paths must NOT leak to the file DOWNLOAD endpoint.
286
+ // =============================================
287
+ _o.sent();
288
+ // =============================================
289
+ // (i) Transport independence: the scope gate applies whether the key is in the header or the ?apiKey= query.
290
+ // =============================================
291
+ return [4 /*yield*/, (0, testing_1.async_test)("scoped key via ?apiKey= query param still rejected on a disallowed /v1 endpoint", function () { return axios_1.default.get("".concat(host, "/v1/endusers?apiKey=").concat(encodeURIComponent(scoped_1.key))); }, { shouldError: true, onError: function (e) { var _a, _b; return ((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = e.response) === null || _b === void 0 ? void 0 : _b.status) === 403; } })];
292
+ case 34:
293
+ // =============================================
294
+ // (i) Transport independence: the scope gate applies whether the key is in the header or the ?apiKey= query.
295
+ // =============================================
296
+ _o.sent();
297
+ return [4 /*yield*/, (0, testing_1.async_test)("unscoped key via ?apiKey= query param still authenticates /v1 (regression)", function () { return axios_1.default.get("".concat(host, "/v1/test-authenticated?apiKey=").concat(encodeURIComponent(unscopedKeyValue_1))); }, { onResult: function (r) { return r.status === 200; } })
298
+ // =============================================
299
+ // Validation: unknown scope values are rejected
300
+ // =============================================
301
+ ];
302
+ case 35:
303
+ _o.sent();
304
+ // =============================================
305
+ // Validation: unknown scope values are rejected
306
+ // =============================================
307
+ return [4 /*yield*/, (0, testing_1.async_test)("unknown scope value rejected by validation", function () { return sdk.api.api_keys.createOne({ scopes: ['not-a-real-scope'] }); }, { shouldError: true, onError: function (e) { return (e === null || e === void 0 ? void 0 : e.statusCode) === 400 || /must match|not valid|invalid/i.test((e === null || e === void 0 ? void 0 : e.message) || ''); } })];
308
+ case 36:
309
+ // =============================================
310
+ // Validation: unknown scope values are rejected
311
+ // =============================================
312
+ _o.sent();
313
+ return [3 /*break*/, 59];
314
+ case 37:
315
+ _e = 0, keyIds_1 = keyIds;
316
+ _o.label = 38;
317
+ case 38:
318
+ if (!(_e < keyIds_1.length)) return [3 /*break*/, 41];
319
+ id = keyIds_1[_e];
320
+ return [4 /*yield*/, sdk.api.api_keys.deleteOne(id).catch(function () { })];
321
+ case 39:
322
+ _o.sent();
323
+ _o.label = 40;
324
+ case 40:
325
+ _e++;
326
+ return [3 /*break*/, 38];
327
+ case 41:
328
+ _f = 0, formResponseIds_1 = formResponseIds;
329
+ _o.label = 42;
330
+ case 42:
331
+ if (!(_f < formResponseIds_1.length)) return [3 /*break*/, 45];
332
+ id = formResponseIds_1[_f];
333
+ return [4 /*yield*/, sdk.api.form_responses.deleteOne(id).catch(function () { })];
334
+ case 43:
335
+ _o.sent();
336
+ _o.label = 44;
337
+ case 44:
338
+ _f++;
339
+ return [3 /*break*/, 42];
340
+ case 45:
341
+ _g = 0, fileIds_1 = fileIds;
342
+ _o.label = 46;
343
+ case 46:
344
+ if (!(_g < fileIds_1.length)) return [3 /*break*/, 49];
345
+ id = fileIds_1[_g];
346
+ return [4 /*yield*/, sdk.api.files.deleteOne(id).catch(function () { })];
347
+ case 47:
348
+ _o.sent();
349
+ _o.label = 48;
350
+ case 48:
351
+ _g++;
352
+ return [3 /*break*/, 46];
353
+ case 49:
354
+ _o.trys.push([49, 52, , 53]);
355
+ return [4 /*yield*/, sdk.api.endusers.getOne({ email: TEST_EMAIL })];
356
+ case 50:
357
+ enduser = _o.sent();
358
+ return [4 /*yield*/, sdk.api.endusers.deleteOne(enduser.id)];
359
+ case 51:
360
+ _o.sent();
361
+ return [3 /*break*/, 53];
362
+ case 52:
363
+ err_1 = _o.sent();
364
+ return [3 /*break*/, 53];
365
+ case 53: return [4 /*yield*/, sdk.api.forms.deleteOne(form.id).catch(function () { })];
366
+ case 54:
367
+ _o.sent();
368
+ if (!throwawayUserId) return [3 /*break*/, 56];
369
+ return [4 /*yield*/, sdk.api.users.deleteOne(throwawayUserId).catch(function () { })];
370
+ case 55:
371
+ _o.sent();
372
+ _o.label = 56;
373
+ case 56:
374
+ if (!throwawayRoleId) return [3 /*break*/, 58];
375
+ return [4 /*yield*/, sdk.api.role_based_access_permissions.deleteOne(throwawayRoleId).catch(function () { })];
376
+ case 57:
377
+ _o.sent();
378
+ _o.label = 58;
379
+ case 58: return [7 /*endfinally*/];
380
+ case 59: return [2 /*return*/];
381
+ }
382
+ });
383
+ });
384
+ };
385
+ exports.scoped_api_keys_tests = scoped_api_keys_tests;
386
+ // Allow running this test file independently
387
+ if (require.main === module) {
388
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
389
+ var sdk_2 = new sdk_1.Session({ host: host });
390
+ var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
391
+ var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
392
+ return __generator(this, function (_a) {
393
+ switch (_a.label) {
394
+ case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
395
+ case 1:
396
+ _a.sent();
397
+ return [4 /*yield*/, (0, exports.scoped_api_keys_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
398
+ case 2:
399
+ _a.sent();
400
+ return [2 /*return*/];
401
+ }
402
+ });
403
+ }); };
404
+ runTests()
405
+ .then(function () {
406
+ console.log("✅ Scoped API keys test suite completed successfully");
407
+ process.exit(0);
408
+ })
409
+ .catch(function (error) {
410
+ console.error("❌ Scoped API keys test suite failed:", error);
411
+ process.exit(1);
412
+ });
413
+ }
414
+ //# sourceMappingURL=scoped_api_keys.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped_api_keys.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/scoped_api_keys.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/tests/tests.ts"],"names":[],"mappings":"AA60EA,eAAO,MAAM,kCAAkC,qBAgJ9C,CAAA;AAED,eAAO,MAAM,mCAAmC,qBA2K/C,CAAA;AAGD,eAAO,MAAM,oBAAoB,qBAoHhC,CAAA;AAED,eAAO,MAAM,+BAA+B,qBAsF3C,CAAA;AAID,eAAO,MAAM,0BAA0B,qBAqCtC,CAAA;AAu1FD,eAAO,MAAM,cAAc,qBAqC1B,CAAA;AAotBD,eAAO,MAAM,0BAA0B,qBAmFtC,CAAA;AAqED,eAAO,MAAM,eAAe,qBAmD3B,CAAA;AAED,eAAO,MAAM,oBAAoB,6BAsBhC,CAAA;AAED,eAAO,MAAM,oCAAoC,qBA4pBhD,CAAA;AAED,eAAO,MAAM,mCAAmC,qBAkE/C,CAAA;AAw7CD,eAAO,MAAM,yBAAyB,qBA0DrC,CAAA;AAED,eAAO,MAAM,kBAAkB,qBAmK9B,CAAA;AAED,eAAO,MAAM,sBAAsB,qBA0BlC,CAAA;AAGD,eAAO,MAAM,mBAAmB,qBAmC/B,CAAA;AAED,eAAO,MAAM,gCAAgC,mCA8C5C,CAAA;AAED,eAAO,MAAM,cAAc,qBAwb1B,CAAA;AAGD,eAAO,MAAM,oBAAoB,uBAuBhC,CAAA;AA4wBD,eAAO,MAAM,4BAA4B,qBAoExC,CAAA;AAED,eAAO,MAAM,+BAA+B,qBA4U3C,CAAA;AAED,eAAO,MAAM,gDAAgD,qBAwC5D,CAAA;AAED,eAAO,MAAM,qBAAqB,qBAwIjC,CAAA"}
1
+ {"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/tests/tests.ts"],"names":[],"mappings":"AA80EA,eAAO,MAAM,kCAAkC,qBAgJ9C,CAAA;AAED,eAAO,MAAM,mCAAmC,qBA2K/C,CAAA;AAGD,eAAO,MAAM,oBAAoB,qBAoHhC,CAAA;AAED,eAAO,MAAM,+BAA+B,qBAsF3C,CAAA;AAID,eAAO,MAAM,0BAA0B,qBAqCtC,CAAA;AAu1FD,eAAO,MAAM,cAAc,qBAqC1B,CAAA;AAotBD,eAAO,MAAM,0BAA0B,qBAmFtC,CAAA;AAqED,eAAO,MAAM,eAAe,qBAmD3B,CAAA;AAED,eAAO,MAAM,oBAAoB,6BAsBhC,CAAA;AAED,eAAO,MAAM,oCAAoC,qBA4pBhD,CAAA;AAED,eAAO,MAAM,mCAAmC,qBAkE/C,CAAA;AAw7CD,eAAO,MAAM,yBAAyB,qBA0DrC,CAAA;AAED,eAAO,MAAM,kBAAkB,qBAmK9B,CAAA;AAED,eAAO,MAAM,sBAAsB,qBA0BlC,CAAA;AAGD,eAAO,MAAM,mBAAmB,qBAmC/B,CAAA;AAED,eAAO,MAAM,gCAAgC,mCA8C5C,CAAA;AAED,eAAO,MAAM,cAAc,qBAwb1B,CAAA;AAGD,eAAO,MAAM,oBAAoB,uBAuBhC,CAAA;AA4wBD,eAAO,MAAM,4BAA4B,qBAoExC,CAAA;AAED,eAAO,MAAM,+BAA+B,qBA4U3C,CAAA;AAED,eAAO,MAAM,gDAAgD,qBAwC5D,CAAA;AAED,eAAO,MAAM,qBAAqB,qBAwIjC,CAAA"}