@tellescope/sdk 1.255.18 → 1.256.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/lib/cjs/sdk.d.ts +7 -2
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +1 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.js +18 -8
- package/lib/cjs/tests/api_tests/auto_merge_form_submission.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/custom_dashboards.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/custom_dashboards.test.js +99 -8
- package/lib/cjs/tests/api_tests/custom_dashboards.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/default_summary_journey.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/default_summary_journey.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/file_download_unicode_names.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/file_download_unicode_names.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/file_download_unicode_names.test.js +278 -0
- package/lib/cjs/tests/api_tests/file_download_unicode_names.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/healthie_multi_integration.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/healthie_multi_integration.test.js +203 -72
- package/lib/cjs/tests/api_tests/healthie_multi_integration.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/openloop_webhooks.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/openloop_webhooks.test.js +212 -33
- package/lib/cjs/tests/api_tests/openloop_webhooks.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.js +85 -9
- package/lib/cjs/tests/api_tests/phone_calls_cold_transfer.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.js +102 -0
- package/lib/cjs/tests/api_tests/phone_calls_conference_hold.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/scoped_api_keys.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/scoped_api_keys.test.js +84 -81
- package/lib/cjs/tests/api_tests/scoped_api_keys.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.d.ts +2 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.js +242 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.d.ts +29 -0
- package/lib/cjs/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.js +443 -0
- package/lib/cjs/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.d.ts +35 -0
- package/lib/cjs/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.js +231 -0
- package/lib/cjs/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js +121 -78
- package/lib/cjs/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.js +1003 -0
- package/lib/cjs/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts +17 -0
- package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +215 -0
- package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +1200 -0
- package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.js +2330 -0
- package/lib/cjs/tests/api_tests/security/public_endpoint_auth_field_lock.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.js +204 -0
- package/lib/cjs/tests/api_tests/tickets_bulk_assign_care_team.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +489 -255
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/enduser.d.ts +0 -1
- package/lib/esm/enduser.d.ts.map +1 -1
- package/lib/esm/sdk.d.ts +9 -5
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +1 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/session.d.ts +0 -1
- package/lib/esm/session.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/auto_merge_form_submission.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/auto_merge_form_submission.test.js +18 -8
- package/lib/esm/tests/api_tests/auto_merge_form_submission.test.js.map +1 -1
- package/lib/esm/tests/api_tests/custom_dashboards.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/custom_dashboards.test.js +99 -8
- package/lib/esm/tests/api_tests/custom_dashboards.test.js.map +1 -1
- package/lib/esm/tests/api_tests/default_summary_journey.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/default_summary_journey.test.js.map +1 -0
- package/lib/esm/tests/api_tests/file_download_unicode_names.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/file_download_unicode_names.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/file_download_unicode_names.test.js +248 -0
- package/lib/esm/tests/api_tests/file_download_unicode_names.test.js.map +1 -0
- package/lib/esm/tests/api_tests/healthie_multi_integration.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/healthie_multi_integration.test.js +205 -74
- package/lib/esm/tests/api_tests/healthie_multi_integration.test.js.map +1 -1
- package/lib/esm/tests/api_tests/openloop_webhooks.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/openloop_webhooks.test.js +213 -34
- package/lib/esm/tests/api_tests/openloop_webhooks.test.js.map +1 -1
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.js +85 -9
- package/lib/esm/tests/api_tests/phone_calls_cold_transfer.test.js.map +1 -1
- package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.js +98 -0
- package/lib/esm/tests/api_tests/phone_calls_conference_hold.test.js.map +1 -0
- package/lib/esm/tests/api_tests/scoped_api_keys.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/scoped_api_keys.test.js +84 -81
- package/lib/esm/tests/api_tests/scoped_api_keys.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.d.ts +2 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.js +238 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.d.ts +29 -0
- package/lib/esm/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.js +436 -0
- package/lib/esm/tests/api_tests/security/F-0015-webhook-outbound-ssrf.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.d.ts +35 -0
- package/lib/esm/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.js +224 -0
- package/lib/esm/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js +121 -78
- package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.js +996 -0
- package/lib/esm/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts +17 -0
- package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +211 -0
- package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +1193 -0
- package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.js +2323 -0
- package/lib/esm/tests/api_tests/security/public_endpoint_auth_field_lock.test.js.map +1 -0
- package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.js +200 -0
- package/lib/esm/tests/api_tests/tickets_bulk_assign_care_team.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +489 -255
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/sdk.ts +4 -0
- package/src/tests/api_tests/auto_merge_form_submission.test.ts +13 -4
- package/src/tests/api_tests/custom_dashboards.test.ts +92 -0
- package/src/tests/api_tests/file_download_unicode_names.test.ts +223 -0
- package/src/tests/api_tests/healthie_multi_integration.test.ts +103 -5
- package/src/tests/api_tests/openloop_webhooks.test.ts +138 -0
- package/src/tests/api_tests/phone_calls_cold_transfer.test.ts +54 -0
- package/src/tests/api_tests/phone_calls_conference_hold.test.ts +62 -0
- package/src/tests/api_tests/scoped_api_keys.test.ts +5 -0
- package/src/tests/api_tests/security/F-0013-sanitize-user-html-with-iframes.test.ts +215 -0
- package/src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts +38 -4
- package/src/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.ts +721 -0
- package/src/tests/api_tests/security/enduser-ai-summary-trust-gate.test.ts +125 -0
- package/src/tests/api_tests/security/formsort_webhook_auth_field_lock.test.ts +753 -0
- package/src/tests/api_tests/security/public_endpoint_auth_field_lock.test.ts +1707 -0
- package/src/tests/api_tests/tickets_bulk_assign_care_team.test.ts +132 -0
- package/src/tests/tests.ts +232 -2
- package/test_generated.pdf +0 -0
- package/.env +0 -13
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
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;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
require('source-map-support').install();
|
|
38
|
+
import http from "http";
|
|
39
|
+
import axios from "axios";
|
|
40
|
+
import { Session } from "../../../sdk";
|
|
41
|
+
import { async_test, log_header, } from "@tellescope/testing";
|
|
42
|
+
import { setup_tests } from "../../setup";
|
|
43
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
44
|
+
var LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1'];
|
|
45
|
+
/**
|
|
46
|
+
* 127.0.0.1 only means "the machine running this test" when the API is also local. Against staging or
|
|
47
|
+
* prod it is the API server itself — the sentinel below would never be contacted, every assertion
|
|
48
|
+
* here would pass for the wrong reason, and we would be probing a live environment. Fail loudly.
|
|
49
|
+
*/
|
|
50
|
+
var assert_local_api = function () {
|
|
51
|
+
var hostname = new URL(host).hostname;
|
|
52
|
+
if (!LOCAL_HOSTNAMES.includes(hostname)) {
|
|
53
|
+
throw new Error("F-0025 SSRF tests must run against a local API (got ".concat(host, "). ")
|
|
54
|
+
+ "127.0.0.1 would resolve to the API server rather than this machine, so the tests would be meaningless.");
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Regression tests for F-0025
|
|
59
|
+
* (security-audit/findings/F-0025-proxy-image-unauth-ssrf.md).
|
|
60
|
+
*
|
|
61
|
+
* GET /v1/proxy-image accepted an arbitrary ?url= and streamed the upstream response body straight
|
|
62
|
+
* back with Access-Control-Allow-Origin: *, with no authentication, no destination validation and no
|
|
63
|
+
* content-type restriction. That reaches http://169.254.169.254/ (EC2 instance credentials under
|
|
64
|
+
* IMDSv1), 127.0.0.1, and anything else inside the VPC.
|
|
65
|
+
*
|
|
66
|
+
* The endpoint's only legitimate job is to re-serve an image that ALREADY renders in the staff
|
|
67
|
+
* browser, with permissive CORS headers, so html2canvas can rasterize a form-response PDF without
|
|
68
|
+
* tainting the canvas (canvas.toDataURL() throws on a tainted canvas, and the form-response view sets
|
|
69
|
+
* crossOrigin="anonymous"). Anything reachable only from inside our network was therefore never a
|
|
70
|
+
* legitimate input — which is why refusing non-public destinations cannot regress the feature.
|
|
71
|
+
*
|
|
72
|
+
* Repro: stand up a local HTTP server that serves a JSON secret, point proxy-image at it with no
|
|
73
|
+
* credentials, and assert the secret does not come back.
|
|
74
|
+
* - red (unfixed): the sentinel body is streamed back to an unauthenticated caller
|
|
75
|
+
* - green (fixed): the request is refused and the sentinel server is never contacted
|
|
76
|
+
*
|
|
77
|
+
* Assertions are deliberately written as "4xx and nothing leaked" rather than pinning an exact status,
|
|
78
|
+
* because the fix both authenticates the endpoint and moves it to POST (the url moves into the body so
|
|
79
|
+
* presigned S3 URLs for patient attachments stop landing in access logs). Either 401 or 404/405 on the
|
|
80
|
+
* old GET shape is an acceptable outcome; streaming the body is not.
|
|
81
|
+
*
|
|
82
|
+
* The authenticated happy-path test lives with the Phase 2 endpoint change — it cannot exist here
|
|
83
|
+
* because the POST route does not yet exist, and a test that fails for "not implemented" would muddy
|
|
84
|
+
* the vulnerability proof.
|
|
85
|
+
*/
|
|
86
|
+
export var proxy_image_ssrf_tests = function (_a) {
|
|
87
|
+
var sdk = _a.sdk;
|
|
88
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
89
|
+
var SENTINEL, sentinelHits, sentinel, sentinelPort, sentinelURL_1, call_unauthenticated, call_authenticated_1;
|
|
90
|
+
return __generator(this, function (_b) {
|
|
91
|
+
switch (_b.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
log_header("F-0025: proxy-image unauthenticated SSRF");
|
|
94
|
+
assert_local_api();
|
|
95
|
+
SENTINEL = "f0025-sentinel-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2));
|
|
96
|
+
sentinelHits = 0;
|
|
97
|
+
sentinel = http.createServer(function (_, res) {
|
|
98
|
+
sentinelHits++;
|
|
99
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
100
|
+
res.end(JSON.stringify({ sentinel: SENTINEL, credentials: 'internal-only' }));
|
|
101
|
+
});
|
|
102
|
+
_b.label = 1;
|
|
103
|
+
case 1:
|
|
104
|
+
_b.trys.push([1, , 9, 10]);
|
|
105
|
+
return [4 /*yield*/, new Promise(function (resolve) { return sentinel.listen(0, '127.0.0.1', function () { return resolve(); }); })];
|
|
106
|
+
case 2:
|
|
107
|
+
_b.sent();
|
|
108
|
+
sentinelPort = sentinel.address().port;
|
|
109
|
+
sentinelURL_1 = "http://127.0.0.1:".concat(sentinelPort, "/latest/meta-data/iam/security-credentials/");
|
|
110
|
+
call_unauthenticated = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
111
|
+
var res, body;
|
|
112
|
+
var _a;
|
|
113
|
+
return __generator(this, function (_b) {
|
|
114
|
+
switch (_b.label) {
|
|
115
|
+
case 0:
|
|
116
|
+
sentinelHits = 0;
|
|
117
|
+
return [4 /*yield*/, axios.get("".concat(host, "/v1/proxy-image"), {
|
|
118
|
+
params: { url: sentinelURL_1 },
|
|
119
|
+
validateStatus: function () { return true; },
|
|
120
|
+
responseType: 'text',
|
|
121
|
+
transformResponse: [function (d) { return d; }],
|
|
122
|
+
timeout: 10000,
|
|
123
|
+
})];
|
|
124
|
+
case 1:
|
|
125
|
+
res = _b.sent();
|
|
126
|
+
body = typeof res.data === 'string' ? res.data : JSON.stringify((_a = res.data) !== null && _a !== void 0 ? _a : '');
|
|
127
|
+
return [2 /*return*/, { status: res.status, leaked: body.includes(SENTINEL), sentinelHits: sentinelHits }];
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}); };
|
|
131
|
+
// T1 — the core SSRF: an unauthenticated caller must not be able to read an internal resource.
|
|
132
|
+
return [4 /*yield*/, async_test('F-0025: proxy-image does not stream an internal non-image resource to an unauthenticated caller', call_unauthenticated, {
|
|
133
|
+
// Positive control: a numeric status proves we actually reached our API rather than failing to
|
|
134
|
+
// connect (a connection error would make "nothing leaked" true for the wrong reason).
|
|
135
|
+
onResult: function (r) { return (typeof r.status === 'number'
|
|
136
|
+
&& r.leaked === false
|
|
137
|
+
&& r.sentinelHits === 0); },
|
|
138
|
+
})
|
|
139
|
+
// T2 — the unauthenticated surface itself: the request must be refused outright, and the
|
|
140
|
+
// destination must never be contacted (no SSRF-as-a-side-effect even when the body is withheld).
|
|
141
|
+
];
|
|
142
|
+
case 3:
|
|
143
|
+
// T1 — the core SSRF: an unauthenticated caller must not be able to read an internal resource.
|
|
144
|
+
_b.sent();
|
|
145
|
+
// T2 — the unauthenticated surface itself: the request must be refused outright, and the
|
|
146
|
+
// destination must never be contacted (no SSRF-as-a-side-effect even when the body is withheld).
|
|
147
|
+
return [4 /*yield*/, async_test('F-0025: proxy-image refuses an unauthenticated request without contacting the destination', call_unauthenticated, { onResult: function (r) { return r.status >= 400 && r.status < 500 && r.sentinelHits === 0; } })
|
|
148
|
+
// Authenticating is not enough on its own — a staff session must not be able to reach an internal
|
|
149
|
+
// address either. These use the real session, and are deterministic (no external network).
|
|
150
|
+
];
|
|
151
|
+
case 4:
|
|
152
|
+
// T2 — the unauthenticated surface itself: the request must be refused outright, and the
|
|
153
|
+
// destination must never be contacted (no SSRF-as-a-side-effect even when the body is withheld).
|
|
154
|
+
_b.sent();
|
|
155
|
+
call_authenticated_1 = function (url) { return __awaiter(void 0, void 0, void 0, function () {
|
|
156
|
+
var res;
|
|
157
|
+
return __generator(this, function (_a) {
|
|
158
|
+
switch (_a.label) {
|
|
159
|
+
case 0:
|
|
160
|
+
sentinelHits = 0;
|
|
161
|
+
return [4 /*yield*/, axios.post("".concat(host, "/v1/proxy-image"), { url: url }, {
|
|
162
|
+
headers: { Authorization: "Bearer ".concat(sdk.authToken) },
|
|
163
|
+
validateStatus: function () { return true; },
|
|
164
|
+
timeout: 10000,
|
|
165
|
+
})];
|
|
166
|
+
case 1:
|
|
167
|
+
res = _a.sent();
|
|
168
|
+
return [2 /*return*/, { status: res.status, sentinelHits: sentinelHits }];
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}); };
|
|
172
|
+
return [4 /*yield*/, async_test('F-0025: proxy-image refuses a private destination even for an authenticated staff session', function () { return call_authenticated_1(sentinelURL_1); }, { onResult: function (r) { return r.status === 400 && r.sentinelHits === 0; } })];
|
|
173
|
+
case 5:
|
|
174
|
+
_b.sent();
|
|
175
|
+
return [4 /*yield*/, async_test('F-0025: proxy-image refuses cloud metadata for an authenticated staff session', function () { return call_authenticated_1('https://169.254.169.254/latest/meta-data/'); }, { onResult: function (r) { return r.status === 400; } })
|
|
176
|
+
// Scheme and port are pinned: only https on 443, which is all the PDF export ever needs.
|
|
177
|
+
];
|
|
178
|
+
case 6:
|
|
179
|
+
_b.sent();
|
|
180
|
+
// Scheme and port are pinned: only https on 443, which is all the PDF export ever needs.
|
|
181
|
+
return [4 /*yield*/, async_test('F-0025: proxy-image refuses a plain http destination', function () { return call_authenticated_1('http://example.com/logo.png'); }, { onResult: function (r) { return r.status === 400; } })];
|
|
182
|
+
case 7:
|
|
183
|
+
// Scheme and port are pinned: only https on 443, which is all the PDF export ever needs.
|
|
184
|
+
_b.sent();
|
|
185
|
+
return [4 /*yield*/, async_test('F-0025: proxy-image refuses a non-443 port', function () { return call_authenticated_1('https://example.com:8443/logo.png'); }, { onResult: function (r) { return r.status === 400; } })];
|
|
186
|
+
case 8:
|
|
187
|
+
_b.sent();
|
|
188
|
+
return [3 /*break*/, 10];
|
|
189
|
+
case 9:
|
|
190
|
+
sentinel.close();
|
|
191
|
+
return [7 /*endfinally*/];
|
|
192
|
+
case 10: return [2 /*return*/];
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
if (require.main === module) {
|
|
198
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
199
|
+
var sdk_1 = new Session({ host: host });
|
|
200
|
+
var sdkNonAdmin_1 = new Session({ host: host });
|
|
201
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
202
|
+
return __generator(this, function (_a) {
|
|
203
|
+
switch (_a.label) {
|
|
204
|
+
case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
|
|
205
|
+
case 1:
|
|
206
|
+
_a.sent();
|
|
207
|
+
return [4 /*yield*/, proxy_image_ssrf_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
208
|
+
case 2:
|
|
209
|
+
_a.sent();
|
|
210
|
+
return [2 /*return*/];
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}); };
|
|
214
|
+
runTests()
|
|
215
|
+
.then(function () {
|
|
216
|
+
console.log("✅ F-0025 proxy-image SSRF test suite completed successfully");
|
|
217
|
+
process.exit(0);
|
|
218
|
+
})
|
|
219
|
+
.catch(function (error) {
|
|
220
|
+
console.error("❌ F-0025 proxy-image SSRF test suite failed:", error);
|
|
221
|
+
process.exit(1);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=F-0025-proxy-image-unauth-ssrf.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"F-0025-proxy-image-unauth-ssrf.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0025-proxy-image-unauth-ssrf.test.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"F-0106-F-0110-enduser-write-restrictions.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"F-0106-F-0110-enduser-write-restrictions.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAA;AAsEtD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gCAAgC;SAA2B,OAAO;iBAAe,OAAO;mBAwIpG,CAAA"}
|
|
@@ -74,8 +74,15 @@ var restrictedEnduserUpdates = function (staffId, mongoId) {
|
|
|
74
74
|
});
|
|
75
75
|
};
|
|
76
76
|
// Every form_responses field marked enduserUpdatesDisabled in schema.ts.
|
|
77
|
-
|
|
77
|
+
// otherEnduserId must be a REAL enduser other than the one submitting the update: enduserId's
|
|
78
|
+
// foreign key is existence-checked, so a nonexistent id would be rejected as a bad dependency
|
|
79
|
+
// rather than by the write restriction under test.
|
|
80
|
+
var restrictedFormResponseUpdates = function (staffId, otherEnduserId) { return ({
|
|
78
81
|
markedAsSubmitted: true,
|
|
82
|
+
// repointing a response at another patient redirects the intake write in
|
|
83
|
+
// save_enduser_updates_for_form_response, which is how email/phone (authentication channels)
|
|
84
|
+
// reach an enduser record — see api_tests/security/public_endpoint_auth_field_lock.test.ts
|
|
85
|
+
enduserId: otherEnduserId,
|
|
79
86
|
submittedBy: staffId,
|
|
80
87
|
submittedAt: new Date("2024-01-01T00:00:00Z"),
|
|
81
88
|
submittedByIsPlaceholder: true,
|
|
@@ -113,112 +120,123 @@ var restrictedFormResponseUpdates = function (staffId) { return ({
|
|
|
113
120
|
export var enduser_write_restrictions_tests = function (_a) {
|
|
114
121
|
var sdk = _a.sdk;
|
|
115
122
|
return __awaiter(void 0, void 0, void 0, function () {
|
|
116
|
-
var enduserId, formId, formResponseId, enduserEmail, enduser_1, enduserSDK_1, form, formResponse_1, _loop_1, _i, _b, _c, field, value, _loop_2, _d, _e, _f, field, value, _g, _h, _j;
|
|
117
|
-
return __generator(this, function (
|
|
118
|
-
switch (
|
|
123
|
+
var enduserId, otherEnduserId, formId, formResponseId, enduserEmail, enduser_1, otherEnduser_1, enduserSDK_1, form, formResponse_1, _loop_1, _i, _b, _c, field, value, _loop_2, _d, _e, _f, field, value, _g, _h, _j, _k;
|
|
124
|
+
return __generator(this, function (_l) {
|
|
125
|
+
switch (_l.label) {
|
|
119
126
|
case 0:
|
|
120
127
|
log_header("F-0106/F-0110: enduser write restrictions (enduserUpdatesDisabled)");
|
|
121
|
-
|
|
128
|
+
_l.label = 1;
|
|
122
129
|
case 1:
|
|
123
|
-
|
|
130
|
+
_l.trys.push([1, , 24, 41]);
|
|
124
131
|
enduserEmail = "f0106-enduser-".concat(Date.now(), "@example.com");
|
|
125
132
|
return [4 /*yield*/, sdk.api.endusers.createOne({ email: enduserEmail, fname: 'F0106', lname: 'Restricted' })];
|
|
126
133
|
case 2:
|
|
127
|
-
enduser_1 =
|
|
134
|
+
enduser_1 = _l.sent();
|
|
128
135
|
enduserId = enduser_1.id;
|
|
129
|
-
return [4 /*yield*/, sdk.api.endusers.
|
|
136
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({
|
|
137
|
+
email: "f0106-other-".concat(Date.now(), "@example.com"), fname: 'F0106', lname: 'Other',
|
|
138
|
+
})];
|
|
130
139
|
case 3:
|
|
131
|
-
|
|
140
|
+
otherEnduser_1 = _l.sent();
|
|
141
|
+
otherEnduserId = otherEnduser_1.id;
|
|
142
|
+
return [4 /*yield*/, sdk.api.endusers.set_password({ id: enduser_1.id, password: ENDUSER_PASSWORD })];
|
|
143
|
+
case 4:
|
|
144
|
+
_l.sent();
|
|
132
145
|
enduserSDK_1 = new EnduserSession({ host: host, businessId: businessId });
|
|
133
146
|
return [4 /*yield*/, enduserSDK_1.authenticate(enduserEmail, ENDUSER_PASSWORD)];
|
|
134
|
-
case 4:
|
|
135
|
-
_k.sent();
|
|
136
|
-
return [4 /*yield*/, sdk.api.forms.createOne({ title: 'F-0106/F-0110 Write Restriction Test Form' })];
|
|
137
147
|
case 5:
|
|
138
|
-
|
|
148
|
+
_l.sent();
|
|
149
|
+
return [4 /*yield*/, sdk.api.forms.createOne({ title: 'F-0106/F-0110 Write Restriction Test Form' })];
|
|
150
|
+
case 6:
|
|
151
|
+
form = _l.sent();
|
|
139
152
|
formId = form.id;
|
|
140
153
|
return [4 /*yield*/, sdk.api.form_responses.prepare_form_response({
|
|
141
154
|
formId: form.id,
|
|
142
155
|
enduserId: enduser_1.id,
|
|
143
156
|
})];
|
|
144
|
-
case
|
|
145
|
-
formResponse_1 = (
|
|
157
|
+
case 7:
|
|
158
|
+
formResponse_1 = (_l.sent()).response;
|
|
146
159
|
formResponseId = formResponse_1.id;
|
|
147
160
|
_loop_1 = function (field, value) {
|
|
148
|
-
return __generator(this, function (
|
|
149
|
-
switch (
|
|
161
|
+
return __generator(this, function (_m) {
|
|
162
|
+
switch (_m.label) {
|
|
150
163
|
case 0: return [4 /*yield*/, async_test("F-0106: enduser cannot self-update endusers.".concat(field), function () {
|
|
151
164
|
var _a;
|
|
152
165
|
return enduserSDK_1.api.endusers.updateOne(enduser_1.id, (_a = {}, _a[field] = value, _a));
|
|
153
166
|
}, { shouldError: true, onError: function (e) { return e.message === "".concat(field, " cannot be updated by endusers"); } })];
|
|
154
167
|
case 1:
|
|
155
|
-
|
|
168
|
+
_m.sent();
|
|
156
169
|
return [2 /*return*/];
|
|
157
170
|
}
|
|
158
171
|
});
|
|
159
172
|
};
|
|
160
173
|
_i = 0, _b = Object.entries(restrictedEnduserUpdates(sdk.userInfo.id, enduser_1.id));
|
|
161
|
-
|
|
162
|
-
case
|
|
163
|
-
if (!(_i < _b.length)) return [3 /*break*/,
|
|
174
|
+
_l.label = 8;
|
|
175
|
+
case 8:
|
|
176
|
+
if (!(_i < _b.length)) return [3 /*break*/, 11];
|
|
164
177
|
_c = _b[_i], field = _c[0], value = _c[1];
|
|
165
178
|
return [5 /*yield**/, _loop_1(field, value)];
|
|
166
|
-
case 8:
|
|
167
|
-
_k.sent();
|
|
168
|
-
_k.label = 9;
|
|
169
179
|
case 9:
|
|
180
|
+
_l.sent();
|
|
181
|
+
_l.label = 10;
|
|
182
|
+
case 10:
|
|
170
183
|
_i++;
|
|
171
|
-
return [3 /*break*/,
|
|
172
|
-
case
|
|
184
|
+
return [3 /*break*/, 8];
|
|
185
|
+
case 11:
|
|
173
186
|
// F-0106 Variant A persistence check: the rejected assignedTo write must not
|
|
174
187
|
// have granted the staff read-filter match.
|
|
175
188
|
return [4 /*yield*/, async_test('F-0106: rejected assignedTo write did not persist', function () { return sdk.api.endusers.getOne(enduser_1.id); }, { onResult: function (e) { var _a, _b; return !((_a = e.assignedTo) === null || _a === void 0 ? void 0 : _a.length) && !((_b = e.tags) === null || _b === void 0 ? void 0 : _b.length) && e.externalId === undefined; } })
|
|
176
189
|
// ---- F-0110: enduser self-update of restricted form_responses fields must 400 ----
|
|
177
190
|
];
|
|
178
|
-
case
|
|
191
|
+
case 12:
|
|
179
192
|
// F-0106 Variant A persistence check: the rejected assignedTo write must not
|
|
180
193
|
// have granted the staff read-filter match.
|
|
181
|
-
|
|
194
|
+
_l.sent();
|
|
182
195
|
_loop_2 = function (field, value) {
|
|
183
|
-
return __generator(this, function (
|
|
184
|
-
switch (
|
|
196
|
+
return __generator(this, function (_o) {
|
|
197
|
+
switch (_o.label) {
|
|
185
198
|
case 0: return [4 /*yield*/, async_test("F-0110: enduser cannot self-update form_responses.".concat(field), function () {
|
|
186
199
|
var _a;
|
|
187
200
|
return enduserSDK_1.api.form_responses.updateOne(formResponse_1.id, (_a = {}, _a[field] = value, _a));
|
|
188
201
|
}, { shouldError: true, onError: function (e) { return e.message === "".concat(field, " cannot be updated by endusers"); } })];
|
|
189
202
|
case 1:
|
|
190
|
-
|
|
203
|
+
_o.sent();
|
|
191
204
|
return [2 /*return*/];
|
|
192
205
|
}
|
|
193
206
|
});
|
|
194
207
|
};
|
|
195
|
-
_d = 0, _e = Object.entries(restrictedFormResponseUpdates(sdk.userInfo.id));
|
|
196
|
-
|
|
197
|
-
case
|
|
198
|
-
if (!(_d < _e.length)) return [3 /*break*/,
|
|
208
|
+
_d = 0, _e = Object.entries(restrictedFormResponseUpdates(sdk.userInfo.id, otherEnduser_1.id));
|
|
209
|
+
_l.label = 13;
|
|
210
|
+
case 13:
|
|
211
|
+
if (!(_d < _e.length)) return [3 /*break*/, 16];
|
|
199
212
|
_f = _e[_d], field = _f[0], value = _f[1];
|
|
200
213
|
return [5 /*yield**/, _loop_2(field, value)];
|
|
201
|
-
case 13:
|
|
202
|
-
_k.sent();
|
|
203
|
-
_k.label = 14;
|
|
204
214
|
case 14:
|
|
215
|
+
_l.sent();
|
|
216
|
+
_l.label = 15;
|
|
217
|
+
case 15:
|
|
205
218
|
_d++;
|
|
206
|
-
return [3 /*break*/,
|
|
207
|
-
case
|
|
219
|
+
return [3 /*break*/, 13];
|
|
220
|
+
case 16: return [4 /*yield*/, async_test('F-0110: rejected writes did not persist (markedAsSubmitted, procedureCodes, submittedBy, enduserId)', function () { return sdk.api.form_responses.getOne(formResponse_1.id); }, { onResult: function (fr) {
|
|
221
|
+
var _a;
|
|
222
|
+
return (!fr.markedAsSubmitted && !((_a = fr.procedureCodes) === null || _a === void 0 ? void 0 : _a.length) && fr.submittedBy === undefined
|
|
223
|
+
// still points at its own patient: a successful repoint is what redirects the intake write
|
|
224
|
+
&& fr.enduserId === enduser_1.id);
|
|
225
|
+
} })
|
|
208
226
|
// ---- Positive controls: intended enduser self-updates still work ----
|
|
209
227
|
];
|
|
210
|
-
case
|
|
211
|
-
|
|
228
|
+
case 17:
|
|
229
|
+
_l.sent();
|
|
212
230
|
// ---- Positive controls: intended enduser self-updates still work ----
|
|
213
231
|
return [4 /*yield*/, async_test('enduser can still update own profile fields (fname/lname)', function () { return enduserSDK_1.api.endusers.updateOne(enduser_1.id, { fname: 'StillAllowed', lname: 'Patient' }); }, { onResult: function (e) { return e.fname === 'StillAllowed' && e.lname === 'Patient'; } })];
|
|
214
|
-
case
|
|
232
|
+
case 18:
|
|
215
233
|
// ---- Positive controls: intended enduser self-updates still work ----
|
|
216
|
-
|
|
234
|
+
_l.sent();
|
|
217
235
|
return [4 /*yield*/, async_test('enduser can still update own form_response (hideFromEnduserPortal — intended per schema)', function () { return enduserSDK_1.api.form_responses.updateOne(formResponse_1.id, { hideFromEnduserPortal: true }); }, { onResult: function (fr) { return fr.hideFromEnduserPortal === true; } })
|
|
218
236
|
// ---- Positive controls: staff sessions are unaffected by enduserUpdatesDisabled ----
|
|
219
237
|
];
|
|
220
|
-
case
|
|
221
|
-
|
|
238
|
+
case 19:
|
|
239
|
+
_l.sent();
|
|
222
240
|
// ---- Positive controls: staff sessions are unaffected by enduserUpdatesDisabled ----
|
|
223
241
|
return [4 /*yield*/, async_test('staff can still update restricted endusers fields (tags, assignedTo, externalId, note, source)', function () { return sdk.api.endusers.updateOne(enduser_1.id, {
|
|
224
242
|
tags: ['staff-set-tag'],
|
|
@@ -232,9 +250,9 @@ export var enduser_write_restrictions_tests = function (_a) {
|
|
|
232
250
|
&& !!((_b = e.assignedTo) === null || _b === void 0 ? void 0 : _b.includes(sdk.userInfo.id))
|
|
233
251
|
&& e.externalId === 'staff-set-external-id');
|
|
234
252
|
} })];
|
|
235
|
-
case
|
|
253
|
+
case 20:
|
|
236
254
|
// ---- Positive controls: staff sessions are unaffected by enduserUpdatesDisabled ----
|
|
237
|
-
|
|
255
|
+
_l.sent();
|
|
238
256
|
return [4 /*yield*/, async_test('staff can still update restricted form_responses fields (procedureCodes, diagnosisCodes, tags)', function () { return sdk.api.form_responses.updateOne(formResponse_1.id, {
|
|
239
257
|
procedureCodes: [{ code: 'G0019', units: 1 }],
|
|
240
258
|
diagnosisCodes: [{ code: 'Z71.3', description: 'Dietary counseling and surveillance' }],
|
|
@@ -244,48 +262,73 @@ export var enduser_write_restrictions_tests = function (_a) {
|
|
|
244
262
|
return (((_b = (_a = fr.procedureCodes) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.code) === 'G0019'
|
|
245
263
|
&& ((_d = (_c = fr.diagnosisCodes) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.code) === 'Z71.3'
|
|
246
264
|
&& !!((_e = fr.tags) === null || _e === void 0 ? void 0 : _e.includes('staff-set-tag')));
|
|
247
|
-
} })
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
265
|
+
} })
|
|
266
|
+
// enduserId is enduserUpdatesDisabled rather than updatesDisabled specifically so this keeps
|
|
267
|
+
// working: staff sometimes need to move a response to the correct profile to fix a mistake.
|
|
268
|
+
];
|
|
251
269
|
case 21:
|
|
252
|
-
|
|
253
|
-
|
|
270
|
+
_l.sent();
|
|
271
|
+
// enduserId is enduserUpdatesDisabled rather than updatesDisabled specifically so this keeps
|
|
272
|
+
// working: staff sometimes need to move a response to the correct profile to fix a mistake.
|
|
273
|
+
return [4 /*yield*/, async_test('staff can still repoint form_responses.enduserId to another patient', function () { return sdk.api.form_responses.updateOne(formResponse_1.id, { enduserId: otherEnduser_1.id }); }, { onResult: function (fr) { return fr.enduserId === otherEnduser_1.id; } })];
|
|
254
274
|
case 22:
|
|
255
|
-
|
|
256
|
-
|
|
275
|
+
// enduserId is enduserUpdatesDisabled rather than updatesDisabled specifically so this keeps
|
|
276
|
+
// working: staff sometimes need to move a response to the correct profile to fix a mistake.
|
|
277
|
+
_l.sent();
|
|
278
|
+
return [4 /*yield*/, async_test('staff can repoint form_responses.enduserId back', function () { return sdk.api.form_responses.updateOne(formResponse_1.id, { enduserId: enduser_1.id }); }, { onResult: function (fr) { return fr.enduserId === enduser_1.id; } })];
|
|
257
279
|
case 23:
|
|
258
|
-
|
|
259
|
-
return [3 /*break*/,
|
|
280
|
+
_l.sent();
|
|
281
|
+
return [3 /*break*/, 41];
|
|
260
282
|
case 24:
|
|
261
|
-
|
|
262
|
-
|
|
283
|
+
if (!formResponseId) return [3 /*break*/, 28];
|
|
284
|
+
_l.label = 25;
|
|
263
285
|
case 25:
|
|
264
|
-
|
|
265
|
-
|
|
286
|
+
_l.trys.push([25, 27, , 28]);
|
|
287
|
+
return [4 /*yield*/, sdk.api.form_responses.deleteOne(formResponseId)];
|
|
266
288
|
case 26:
|
|
267
|
-
|
|
268
|
-
return [
|
|
289
|
+
_l.sent();
|
|
290
|
+
return [3 /*break*/, 28];
|
|
269
291
|
case 27:
|
|
270
|
-
|
|
271
|
-
return [3 /*break*/,
|
|
292
|
+
_g = _l.sent();
|
|
293
|
+
return [3 /*break*/, 28];
|
|
272
294
|
case 28:
|
|
273
|
-
|
|
274
|
-
|
|
295
|
+
if (!formId) return [3 /*break*/, 32];
|
|
296
|
+
_l.label = 29;
|
|
275
297
|
case 29:
|
|
276
|
-
|
|
277
|
-
|
|
298
|
+
_l.trys.push([29, 31, , 32]);
|
|
299
|
+
return [4 /*yield*/, sdk.api.forms.deleteOne(formId)];
|
|
278
300
|
case 30:
|
|
279
|
-
|
|
280
|
-
return [
|
|
301
|
+
_l.sent();
|
|
302
|
+
return [3 /*break*/, 32];
|
|
281
303
|
case 31:
|
|
282
|
-
|
|
283
|
-
return [3 /*break*/,
|
|
304
|
+
_h = _l.sent();
|
|
305
|
+
return [3 /*break*/, 32];
|
|
284
306
|
case 32:
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
case 33:
|
|
288
|
-
|
|
307
|
+
if (!enduserId) return [3 /*break*/, 36];
|
|
308
|
+
_l.label = 33;
|
|
309
|
+
case 33:
|
|
310
|
+
_l.trys.push([33, 35, , 36]);
|
|
311
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(enduserId)];
|
|
312
|
+
case 34:
|
|
313
|
+
_l.sent();
|
|
314
|
+
return [3 /*break*/, 36];
|
|
315
|
+
case 35:
|
|
316
|
+
_j = _l.sent();
|
|
317
|
+
return [3 /*break*/, 36];
|
|
318
|
+
case 36:
|
|
319
|
+
if (!otherEnduserId) return [3 /*break*/, 40];
|
|
320
|
+
_l.label = 37;
|
|
321
|
+
case 37:
|
|
322
|
+
_l.trys.push([37, 39, , 40]);
|
|
323
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(otherEnduserId)];
|
|
324
|
+
case 38:
|
|
325
|
+
_l.sent();
|
|
326
|
+
return [3 /*break*/, 40];
|
|
327
|
+
case 39:
|
|
328
|
+
_k = _l.sent();
|
|
329
|
+
return [3 /*break*/, 40];
|
|
330
|
+
case 40: return [7 /*endfinally*/];
|
|
331
|
+
case 41: return [2 /*return*/];
|
|
289
332
|
}
|
|
290
333
|
});
|
|
291
334
|
});
|
package/lib/esm/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"F-0106-F-0110-enduser-write-restrictions.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,IAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAgC,CAAA;AACpE,IAAM,UAAU,GAAG,0BAA0B,CAAA;AAE7C,IAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAEhD,0EAA0E;AAC1E,sEAAsE;AACtE,4CAA4C;AAC5C,IAAM,wBAAwB,GAAG,UAAC,OAAe,EAAE,OAAe;;IAA0B,OAAA,CAAC;QAC3F,UAAU,EAAE,4BAA4B;QACxC,IAAI,EAAE,CAAC,oBAAoB,CAAC;QAC5B,UAAU,EAAE,CAAC,2BAA2B,CAAC;QACzC,UAAU,EAAE,CAAC,OAAO,CAAC;QACrB,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,0BAA0B,EAAE,CAAC;QAC/D,uBAAuB,EAAE,EAAE;QAC3B,QAAQ,YAAI,GAAC,OAAO,IAAG,OAAO,KAAE;QAChC,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE;QACtC,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,qBAAqB;QAC3B,SAAS,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE;QAChD,kBAAkB,EAAE,EAAE,QAAQ,EAAE,yBAAyB,EAAE;QAC3D,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC5B,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,IAAI;QAC1B,kBAAkB,EAAE,YAAY;QAChC,gBAAgB,EAAE,gBAAgB;QAClC,YAAY,EAAE,kBAAkB;QAChC,qBAAqB,EAAE,gBAAgB;QACvC,gBAAgB,EAAE,uBAAuB;QACzC,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AAzB0F,CAyB1F,CAAA;AAEF,yEAAyE;AACzE,IAAM,6BAA6B,GAAG,UAAC,OAAe,IAA0B,OAAA,CAAC;
|
|
1
|
+
{"version":3,"file":"F-0106-F-0110-enduser-write-restrictions.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0106-F-0110-enduser-write-restrictions.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,IAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAgC,CAAA;AACpE,IAAM,UAAU,GAAG,0BAA0B,CAAA;AAE7C,IAAM,gBAAgB,GAAG,uBAAuB,CAAA;AAEhD,0EAA0E;AAC1E,sEAAsE;AACtE,4CAA4C;AAC5C,IAAM,wBAAwB,GAAG,UAAC,OAAe,EAAE,OAAe;;IAA0B,OAAA,CAAC;QAC3F,UAAU,EAAE,4BAA4B;QACxC,IAAI,EAAE,CAAC,oBAAoB,CAAC;QAC5B,UAAU,EAAE,CAAC,2BAA2B,CAAC;QACzC,UAAU,EAAE,CAAC,OAAO,CAAC;QACrB,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,0BAA0B,EAAE,CAAC;QAC/D,uBAAuB,EAAE,EAAE;QAC3B,QAAQ,YAAI,GAAC,OAAO,IAAG,OAAO,KAAE;QAChC,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE;QACtC,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,qBAAqB;QAC3B,SAAS,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE;QAChD,kBAAkB,EAAE,EAAE,QAAQ,EAAE,yBAAyB,EAAE;QAC3D,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC5B,gBAAgB,EAAE,KAAK;QACvB,oBAAoB,EAAE,IAAI;QAC1B,kBAAkB,EAAE,YAAY;QAChC,gBAAgB,EAAE,gBAAgB;QAClC,YAAY,EAAE,kBAAkB;QAChC,qBAAqB,EAAE,gBAAgB;QACvC,gBAAgB,EAAE,uBAAuB;QACzC,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AAzB0F,CAyB1F,CAAA;AAEF,yEAAyE;AACzE,8FAA8F;AAC9F,8FAA8F;AAC9F,mDAAmD;AACnD,IAAM,6BAA6B,GAAG,UAAC,OAAe,EAAE,cAAsB,IAA0B,OAAA,CAAC;IACvG,iBAAiB,EAAE,IAAI;IACvB,yEAAyE;IACzE,6FAA6F;IAC7F,2FAA2F;IAC3F,SAAS,EAAE,cAAc;IACzB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;IAC7C,wBAAwB,EAAE,IAAI;IAC9B,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC7C,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;IAClF,gBAAgB,EAAE,sDAAsD;IACxE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACpF,cAAc,EAAE,IAAI;IACpB,QAAQ,EAAE,IAAI,IAAI,EAAE;IACpB,kBAAkB,EAAE,IAAI;IACxB,QAAQ,EAAE,IAAI,IAAI,EAAE;IACpB,IAAI,EAAE,CAAC,oBAAoB,CAAC;IAC5B,SAAS,EAAE,oBAAoB;IAC/B,SAAS,EAAE,2BAA2B;IACtC,OAAO,EAAE,uCAAuC;IAChD,UAAU,EAAE,GAAG;CAChB,CAAC,EAtBsG,CAsBtG,CAAA;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,IAAM,gCAAgC,GAAG,UAAO,EAAgD;QAA9C,GAAG,SAAA;;;;;;oBAC1D,UAAU,CAAC,oEAAoE,CAAC,CAAA;;;;oBASxE,YAAY,GAAG,wBAAiB,IAAI,CAAC,GAAG,EAAE,iBAAc,CAAA;oBAC9C,qBAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAA;;oBAAxG,YAAU,SAA8F;oBAC9G,SAAS,GAAG,SAAO,CAAC,EAAE,CAAA;oBAGD,qBAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;4BACpD,KAAK,EAAE,sBAAe,IAAI,CAAC,GAAG,EAAE,iBAAc,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;yBAC/E,CAAC,EAAA;;oBAFI,iBAAe,SAEnB;oBACF,cAAc,GAAG,cAAY,CAAC,EAAE,CAAA;oBAChC,qBAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,SAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,EAAA;;oBAAnF,SAAmF,CAAA;oBAE7E,eAAa,IAAI,cAAc,CAAC,EAAE,IAAI,MAAA,EAAE,UAAU,YAAA,EAAE,CAAC,CAAA;oBAC3D,qBAAM,YAAU,CAAC,YAAY,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAAA;;oBAA7D,SAA6D,CAAA;oBAEhD,qBAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC,EAAA;;oBAA5F,IAAI,GAAG,SAAqF;oBAClG,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;oBACmB,qBAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,qBAAqB,CAAC;4BACpF,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,SAAS,EAAE,SAAO,CAAC,EAAE;yBACtB,CAAC,EAAA;;oBAHM,iBAA2B,CAAA,SAGjC,CAAA,SAH4B;oBAI9B,cAAc,GAAG,cAAY,CAAC,EAAE,CAAA;wCAGpB,KAAK,EAAE,KAAK;;;wCACtB,qBAAM,UAAU,CACd,sDAA+C,KAAK,CAAE,EACtD;;wCAAM,OAAA,YAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAO,CAAC,EAAE,EAAE,CAAA,SAAE,GAAC,KAAK,IAAG,KAAK,IAAS,CAAA,CAAC;oCAAxE,CAAwE,EAC9E,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,KAAK,UAAG,KAAK,mCAAgC,EAAtD,CAAsD,EAAE,CAC5F,EAAA;;oCAJD,SAIC,CAAA;;;;;0BAL+F,EAArE,KAAA,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAO,CAAC,EAAE,CAAC,CAAC;;;yBAArE,CAAA,cAAqE,CAAA;oBAAvF,WAAc,EAAb,KAAK,QAAA,EAAE,KAAK,QAAA;kDAAZ,KAAK,EAAE,KAAK;;;;;oBAAK,IAAqE,CAAA;;;gBAQlG,6EAA6E;gBAC7E,4CAA4C;gBAC5C,qBAAM,UAAU,CACd,mDAAmD,EACnD,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAO,CAAC,EAAE,CAAC,EAAnC,CAAmC,EACzC,EAAE,QAAQ,EAAE,UAAA,CAAC,gBAAI,OAAA,CAAC,CAAA,MAAA,CAAC,CAAC,UAAU,0CAAE,MAAM,CAAA,IAAI,CAAC,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAE,MAAM,CAAA,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,CAAA,EAAA,EAAE,CAC1F;oBAED,qFAAqF;kBAFpF;;oBAND,6EAA6E;oBAC7E,4CAA4C;oBAC5C,SAIC,CAAA;wCAGW,KAAK,EAAE,KAAK;;;wCACtB,qBAAM,UAAU,CACd,4DAAqD,KAAK,CAAE,EAC5D;;wCAAM,OAAA,YAAU,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,cAAY,CAAC,EAAE,EAAE,CAAA,SAAE,GAAC,KAAK,IAAG,KAAK,IAAS,CAAA,CAAC;oCAAnF,CAAmF,EACzF,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,KAAK,UAAG,KAAK,mCAAgC,EAAtD,CAAsD,EAAE,CAC5F,EAAA;;oCAJD,SAIC,CAAA;;;;;0BALyG,EAA/E,KAAA,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAY,CAAC,EAAE,CAAC,CAAC;;;yBAA/E,CAAA,cAA+E,CAAA;oBAAjG,WAAc,EAAb,KAAK,QAAA,EAAE,KAAK,QAAA;kDAAZ,KAAK,EAAE,KAAK;;;;;oBAAK,IAA+E,CAAA;;yBAQ5G,qBAAM,UAAU,CACd,qGAAqG,EACrG,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,cAAY,CAAC,EAAE,CAAC,EAA9C,CAA8C,EACpD,EAAE,QAAQ,EAAE,UAAA,EAAE;;4BAAI,OAAA,CAChB,CAAC,EAAE,CAAC,iBAAiB,IAAI,CAAC,CAAA,MAAA,EAAE,CAAC,cAAc,0CAAE,MAAM,CAAA,IAAI,EAAE,CAAC,WAAW,KAAK,SAAS;gCACnF,2FAA2F;mCACxF,EAAE,CAAC,SAAS,KAAK,SAAO,CAAC,EAAE,CAC/B,CAAA;yBAAA,EAAE,CACJ;oBAED,wEAAwE;kBAFvE;;oBARD,SAQC,CAAA;oBAED,wEAAwE;oBACxE,qBAAM,UAAU,CACd,2DAA2D,EAC3D,cAAM,OAAA,YAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAA1F,CAA0F,EAChG,EAAE,QAAQ,EAAE,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,KAAK,KAAK,cAAc,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAnD,CAAmD,EAAE,CACvE,EAAA;;oBALD,wEAAwE;oBACxE,SAIC,CAAA;oBACD,qBAAM,UAAU,CACd,0FAA0F,EAC1F,cAAM,OAAA,YAAU,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,cAAY,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,EAAzF,CAAyF,EAC/F,EAAE,QAAQ,EAAE,UAAA,EAAE,IAAI,OAAA,EAAE,CAAC,qBAAqB,KAAK,IAAI,EAAjC,CAAiC,EAAE,CACtD;wBAED,uFAAuF;sBAFtF;;oBAJD,SAIC,CAAA;oBAED,uFAAuF;oBACvF,qBAAM,UAAU,CACd,gGAAgG,EAChG,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAO,CAAC,EAAE,EAAE;4BAC3C,IAAI,EAAE,CAAC,eAAe,CAAC;4BACvB,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;4BAC7B,UAAU,EAAE,uBAAuB;4BACnC,IAAI,EAAE,gBAAgB;4BACtB,MAAM,EAAE,kBAAkB;yBAC3B,CAAC,EANI,CAMJ,EACF,EAAE,QAAQ,EAAE,UAAA,CAAC;;gCAAI,OAAA,CACf,CAAC,CAAC,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAE,QAAQ,CAAC,eAAe,CAAC,CAAA;uCAChC,CAAC,CAAC,CAAA,MAAA,CAAC,CAAC,UAAU,0CAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;uCACzC,CAAC,CAAC,UAAU,KAAK,uBAAuB,CAC5C,CAAA;6BAAA,EAAE,CACJ,EAAA;;oBAfD,uFAAuF;oBACvF,SAcC,CAAA;oBACD,qBAAM,UAAU,CACd,gGAAgG,EAChG,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,cAAY,CAAC,EAAE,EAAE;4BACtD,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;4BAC7C,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;4BACvF,IAAI,EAAE,CAAC,eAAe,CAAC;yBACxB,CAAC,EAJI,CAIJ,EACF,EAAE,QAAQ,EAAE,UAAA,EAAE;;gCAAI,OAAA,CAChB,CAAA,MAAA,MAAA,EAAE,CAAC,cAAc,0CAAG,CAAC,CAAC,0CAAE,IAAI,MAAK,OAAO;uCACrC,CAAA,MAAA,MAAA,EAAE,CAAC,cAAc,0CAAG,CAAC,CAAC,0CAAE,IAAI,MAAK,OAAO;uCACxC,CAAC,CAAC,CAAA,MAAA,EAAE,CAAC,IAAI,0CAAE,QAAQ,CAAC,eAAe,CAAC,CAAA,CACxC,CAAA;6BAAA,EAAE,CACJ;wBAED,6FAA6F;wBAC7F,4FAA4F;sBAH3F;;oBAZD,SAYC,CAAA;oBAED,6FAA6F;oBAC7F,4FAA4F;oBAC5F,qBAAM,UAAU,CACd,qEAAqE,EACrE,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,cAAY,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,cAAY,CAAC,EAAE,EAAE,CAAC,EAAjF,CAAiF,EACvF,EAAE,QAAQ,EAAE,UAAA,EAAE,IAAI,OAAA,EAAE,CAAC,SAAS,KAAK,cAAY,CAAC,EAAE,EAAhC,CAAgC,EAAE,CACrD,EAAA;;oBAND,6FAA6F;oBAC7F,4FAA4F;oBAC5F,SAIC,CAAA;oBACD,qBAAM,UAAU,CACd,iDAAiD,EACjD,cAAM,OAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,cAAY,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,SAAO,CAAC,EAAE,EAAE,CAAC,EAA5E,CAA4E,EAClF,EAAE,QAAQ,EAAE,UAAA,EAAE,IAAI,OAAA,EAAE,CAAC,SAAS,KAAK,SAAO,CAAC,EAAE,EAA3B,CAA2B,EAAE,CAChD,EAAA;;oBAJD,SAIC,CAAA;;;yBAEG,cAAc,EAAd,yBAAc;;;;oBACV,qBAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,SAAS,CAAC,cAAc,CAAC,EAAA;;oBAAtD,SAAsD,CAAA;;;;;;yBAE1D,MAAM,EAAN,yBAAM;;;;oBACF,qBAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAA;;oBAArC,SAAqC,CAAA;;;;;;yBAEzC,SAAS,EAAT,yBAAS;;;;oBACL,qBAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAA;;oBAA3C,SAA2C,CAAA;;;;;;yBAE/C,cAAc,EAAd,yBAAc;;;;oBACV,qBAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,EAAA;;oBAAhD,SAAgD,CAAA;;;;;;;;;;CAG3D,CAAA;AAED,6CAA6C;AAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;IAC3B,OAAO,CAAC,GAAG,CAAC,sCAAqB,IAAI,CAAE,CAAC,CAAA;IACxC,IAAM,KAAG,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,MAAA,EAAE,CAAC,CAAA;IACjC,IAAM,aAAW,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,MAAA,EAAE,CAAC,CAAA;IAEzC,IAAM,QAAQ,GAAG;;;wBACf,qBAAM,WAAW,CAAC,KAAG,EAAE,aAAW,CAAC,EAAA;;oBAAnC,SAAmC,CAAA;oBACnC,qBAAM,gCAAgC,CAAC,EAAE,GAAG,OAAA,EAAE,WAAW,eAAA,EAAE,CAAC,EAAA;;oBAA5D,SAA4D,CAAA;;;;SAC7D,CAAA;IAED,QAAQ,EAAE;SACP,IAAI,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC;SACD,KAAK,CAAC,UAAC,KAAK;QACX,OAAO,CAAC,KAAK,CAAC,8DAA8D,EAAE,KAAK,CAAC,CAAA;QACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;CACL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"F-0166-allowed-paths-wildcard-bypass.test.d.ts","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0166-allowed-paths-wildcard-bypass.test.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAA;AAkEtD,eAAO,MAAM,+BAA+B;SAA2B,OAAO;iBAAe,OAAO;mBAqnBnG,CAAA"}
|