@tellescope/sdk 1.251.0 → 1.252.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/lib/cjs/tests/api_tests/calendar_canvas_coding_clear.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/calendar_canvas_coding_clear.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/calendar_canvas_coding_clear.test.js +139 -0
- package/lib/cjs/tests/api_tests/calendar_canvas_coding_clear.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.js +337 -0
- package/lib/cjs/tests/api_tests/calendar_event_webhook_template.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.js +287 -0
- package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/integrations_redacted.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/integrations_redacted.test.js +30 -20
- package/lib/cjs/tests/api_tests/integrations_redacted.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/push_forms_to_portal_group_completion.test.d.ts.map +1 -1
- package/lib/cjs/tests/api_tests/push_forms_to_portal_group_completion.test.js +234 -198
- package/lib/cjs/tests/api_tests/push_forms_to_portal_group_completion.test.js.map +1 -1
- package/lib/cjs/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.d.ts +28 -0
- package/lib/cjs/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.js +349 -0
- package/lib/cjs/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0005-ai-conversations-rbac.test.d.ts +28 -0
- package/lib/cjs/tests/api_tests/security/F-0005-ai-conversations-rbac.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0005-ai-conversations-rbac.test.js +247 -0
- package/lib/cjs/tests/api_tests/security/F-0005-ai-conversations-rbac.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0007-invite-user-enumeration.test.d.ts +29 -0
- package/lib/cjs/tests/api_tests/security/F-0007-invite-user-enumeration.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0007-invite-user-enumeration.test.js +278 -0
- package/lib/cjs/tests/api_tests/security/F-0007-invite-user-enumeration.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.d.ts +24 -0
- package/lib/cjs/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.js +201 -0
- package/lib/cjs/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html.test.d.ts +2 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html.test.js +148 -0
- package/lib/cjs/tests/api_tests/security/F-0013-sanitize-user-html.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0016-prototype-pollution.test.d.ts +2 -0
- package/lib/cjs/tests/api_tests/security/F-0016-prototype-pollution.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0016-prototype-pollution.test.js +88 -0
- package/lib/cjs/tests/api_tests/security/F-0016-prototype-pollution.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.d.ts +32 -0
- package/lib/cjs/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.js +237 -0
- package/lib/cjs/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0076-self-admin-role-assignment.test.d.ts +38 -0
- package/lib/cjs/tests/api_tests/security/F-0076-self-admin-role-assignment.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/security/F-0076-self-admin-role-assignment.test.js +222 -0
- package/lib/cjs/tests/api_tests/security/F-0076-self-admin-role-assignment.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/user_portal_settings.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/user_portal_settings.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/user_portal_settings.test.js +301 -0
- package/lib/cjs/tests/api_tests/user_portal_settings.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +198 -151
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/tests/api_tests/calendar_canvas_coding_clear.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/calendar_canvas_coding_clear.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/calendar_canvas_coding_clear.test.js +135 -0
- package/lib/esm/tests/api_tests/calendar_canvas_coding_clear.test.js.map +1 -0
- package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.js +333 -0
- package/lib/esm/tests/api_tests/calendar_event_webhook_template.test.js.map +1 -0
- package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js +280 -0
- package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -0
- package/lib/esm/tests/api_tests/integrations_redacted.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/integrations_redacted.test.js +30 -20
- package/lib/esm/tests/api_tests/integrations_redacted.test.js.map +1 -1
- package/lib/esm/tests/api_tests/push_forms_to_portal_group_completion.test.d.ts.map +1 -1
- package/lib/esm/tests/api_tests/push_forms_to_portal_group_completion.test.js +235 -199
- package/lib/esm/tests/api_tests/push_forms_to_portal_group_completion.test.js.map +1 -1
- package/lib/esm/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.d.ts +28 -0
- package/lib/esm/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.js +345 -0
- package/lib/esm/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.d.ts +28 -0
- package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.js +243 -0
- package/lib/esm/tests/api_tests/security/F-0005-ai-conversations-rbac.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0007-invite-user-enumeration.test.d.ts +29 -0
- package/lib/esm/tests/api_tests/security/F-0007-invite-user-enumeration.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0007-invite-user-enumeration.test.js +271 -0
- package/lib/esm/tests/api_tests/security/F-0007-invite-user-enumeration.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.d.ts +24 -0
- package/lib/esm/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.js +194 -0
- package/lib/esm/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html.test.d.ts +2 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html.test.js +144 -0
- package/lib/esm/tests/api_tests/security/F-0013-sanitize-user-html.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0016-prototype-pollution.test.d.ts +2 -0
- package/lib/esm/tests/api_tests/security/F-0016-prototype-pollution.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0016-prototype-pollution.test.js +84 -0
- package/lib/esm/tests/api_tests/security/F-0016-prototype-pollution.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.d.ts +32 -0
- package/lib/esm/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.js +233 -0
- package/lib/esm/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.js.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0076-self-admin-role-assignment.test.d.ts +38 -0
- package/lib/esm/tests/api_tests/security/F-0076-self-admin-role-assignment.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/security/F-0076-self-admin-role-assignment.test.js +218 -0
- package/lib/esm/tests/api_tests/security/F-0076-self-admin-role-assignment.test.js.map +1 -0
- package/lib/esm/tests/api_tests/user_portal_settings.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/user_portal_settings.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/user_portal_settings.test.js +297 -0
- package/lib/esm/tests/api_tests/user_portal_settings.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +198 -151
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/tests/api_tests/calendar_event_webhook_template.test.ts +204 -0
- package/src/tests/api_tests/enduser_login_rate_limits.test.ts +178 -0
- package/src/tests/api_tests/integrations_redacted.test.ts +8 -0
- package/src/tests/api_tests/push_forms_to_portal_group_completion.test.ts +113 -88
- package/src/tests/api_tests/security/F-0001-data-sync-redaction-bypass.test.ts +236 -0
- package/src/tests/api_tests/security/F-0005-ai-conversations-rbac.test.ts +154 -0
- package/src/tests/api_tests/security/F-0007-invite-user-enumeration.test.ts +198 -0
- package/src/tests/api_tests/security/F-0008-handle-incoming-communication-cross-tenant.test.ts +130 -0
- package/src/tests/api_tests/security/F-0013-sanitize-user-html.test.ts +109 -0
- package/src/tests/api_tests/security/F-0016-prototype-pollution.test.ts +50 -0
- package/src/tests/api_tests/security/F-0053-cascade-role-rename-cross-tenant.test.ts +161 -0
- package/src/tests/api_tests/security/F-0076-self-admin-role-assignment.test.ts +165 -0
- package/src/tests/api_tests/user_portal_settings.test.ts +217 -0
- package/src/tests/tests.ts +25 -2
- package/test_generated.pdf +0 -0
|
@@ -0,0 +1,218 @@
|
|
|
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 { Session } from "../../../sdk";
|
|
39
|
+
import { assert, log_header, wait, } from "@tellescope/testing";
|
|
40
|
+
import { setup_tests } from "../../setup";
|
|
41
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
42
|
+
/**
|
|
43
|
+
* Self-role privilege-escalation guard (relates to security-audit finding F-0076, which was
|
|
44
|
+
* investigated and closed as a FALSE POSITIVE — see that file for the full code trace).
|
|
45
|
+
*
|
|
46
|
+
* F-0076 hypothesized that a non-admin staff user could `PATCH /v1/users/{their-own-id}` with
|
|
47
|
+
* `{ roles: ['Admin'] }` and self-promote to Admin, because the FIRST `users` relationship
|
|
48
|
+
* constraint ("Only admin users can set the admin role",
|
|
49
|
+
* [schema.ts:3446](packages/public/schema/src/schema.ts#L3446)) has a self-exception
|
|
50
|
+
* (`if (_id === session.id) return`).
|
|
51
|
+
*
|
|
52
|
+
* That analysis missed the SECOND constraint, "Only admin users can update user roles"
|
|
53
|
+
* ([schema.ts:3486](packages/public/schema/src/schema.ts#L3486)), which has NO self-exception.
|
|
54
|
+
* Relationship constraints are AND-evaluated — `validateRelationshipConstraints`
|
|
55
|
+
* ([routing.ts:1240-1252](packages/private/api/api/modules/routing.ts#L1240)) loops the whole
|
|
56
|
+
* array and throws 400 on the FIRST evaluator that returns a string. So a non-admin self-update
|
|
57
|
+
* that includes `roles` passes constraint #1 (self-exception) but is rejected by constraint #2.
|
|
58
|
+
* The self-promotion is blocked.
|
|
59
|
+
*
|
|
60
|
+
* This test locks that boundary in place so a future refactor of the role constraints can't
|
|
61
|
+
* silently reintroduce the escalation. A dedicated throwaway non-admin user is used as the
|
|
62
|
+
* "attacker" (we never mutate the shared sdkNonAdmin's roles):
|
|
63
|
+
* 1. Admin creates a throwaway user and assigns it a non-admin role (`['Provider']`).
|
|
64
|
+
* 2. Authenticate AS that user via a freshly-minted auth token.
|
|
65
|
+
* 3. As the attacker, attempt four self-role mutations — ['Admin'], ['Provider','Admin'],
|
|
66
|
+
* an arbitrary role, and [] — and assert EACH is blocked. <-- the security assertions
|
|
67
|
+
* 4. Confirm (as admin) the attacker's roles are still ['Provider'] — nothing slipped through.
|
|
68
|
+
* 5. Positive control: admin CAN update the throwaway user's roles. <-- guards against an
|
|
69
|
+
* over-restrictive regression that would block legitimate admin role management.
|
|
70
|
+
*
|
|
71
|
+
* Expected on current (correct) code: all assertions pass. A regression that made the self-update
|
|
72
|
+
* path role-writable by non-admins would flip the step-3/step-4 assertions to red.
|
|
73
|
+
*/
|
|
74
|
+
export var self_admin_role_assignment_tests = function (_a) {
|
|
75
|
+
var sdk = _a.sdk;
|
|
76
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
77
|
+
var stamp, NON_ADMIN_ROLE, expect_blocked, attackerId, attacker, attackerBefore, sdkAttacker_1, _b, attackerAfter, afterAdminUpdate, _c;
|
|
78
|
+
var _d;
|
|
79
|
+
var _e;
|
|
80
|
+
return __generator(this, function (_f) {
|
|
81
|
+
switch (_f.label) {
|
|
82
|
+
case 0:
|
|
83
|
+
log_header("F-0076: self-admin role assignment privilege-escalation regression");
|
|
84
|
+
stamp = Date.now();
|
|
85
|
+
NON_ADMIN_ROLE = 'Provider';
|
|
86
|
+
expect_blocked = function (fn, description) { return __awaiter(void 0, void 0, void 0, function () {
|
|
87
|
+
var e_1;
|
|
88
|
+
return __generator(this, function (_a) {
|
|
89
|
+
switch (_a.label) {
|
|
90
|
+
case 0:
|
|
91
|
+
_a.trys.push([0, 2, , 3]);
|
|
92
|
+
return [4 /*yield*/, fn()];
|
|
93
|
+
case 1:
|
|
94
|
+
_a.sent();
|
|
95
|
+
assert(false, "".concat(description, " - SELF-ROLE ESCALATION SUCCEEDED (expected it to be blocked)"));
|
|
96
|
+
return [3 /*break*/, 3];
|
|
97
|
+
case 2:
|
|
98
|
+
e_1 = _a.sent();
|
|
99
|
+
// CRUD relationship-constraint failures surface as 400 { message, info } via SDK parseError.
|
|
100
|
+
assert((e_1 === null || e_1 === void 0 ? void 0 : e_1.code) === 400 || (e_1 === null || e_1 === void 0 ? void 0 : e_1.statusCode) === 400 || typeof (e_1 === null || e_1 === void 0 ? void 0 : e_1.message) === 'string', "".concat(description, " - expected a block error, got: ").concat(JSON.stringify(e_1)), description);
|
|
101
|
+
return [3 /*break*/, 3];
|
|
102
|
+
case 3: return [2 /*return*/];
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}); };
|
|
106
|
+
_f.label = 1;
|
|
107
|
+
case 1:
|
|
108
|
+
_f.trys.push([1, , 15, 20]);
|
|
109
|
+
return [4 /*yield*/, sdk.api.users.createOne({
|
|
110
|
+
email: "f0076-attacker-".concat(stamp, "@example.com"),
|
|
111
|
+
notificationEmailsDisabled: true,
|
|
112
|
+
verifiedEmail: true,
|
|
113
|
+
})];
|
|
114
|
+
case 2:
|
|
115
|
+
attacker = _f.sent();
|
|
116
|
+
attackerId = attacker.id;
|
|
117
|
+
return [4 /*yield*/, sdk.api.users.updateOne(attackerId, { roles: [NON_ADMIN_ROLE] }, { replaceObjectFields: true })];
|
|
118
|
+
case 3:
|
|
119
|
+
_f.sent();
|
|
120
|
+
return [4 /*yield*/, wait(undefined, 2000)
|
|
121
|
+
// Setup sanity: the attacker holds exactly the non-admin role and is NOT an admin.
|
|
122
|
+
]; // role change triggers a logout; let it propagate before minting a token
|
|
123
|
+
case 4:
|
|
124
|
+
_f.sent(); // role change triggers a logout; let it propagate before minting a token
|
|
125
|
+
return [4 /*yield*/, sdk.api.users.getOne(attackerId)];
|
|
126
|
+
case 5:
|
|
127
|
+
attackerBefore = _f.sent();
|
|
128
|
+
assert(JSON.stringify(attackerBefore.roles) === JSON.stringify([NON_ADMIN_ROLE]), "Setup failed: expected attacker to hold [".concat(NON_ADMIN_ROLE, "], got ").concat(JSON.stringify(attackerBefore.roles)), 'F-0076 setup: attacker holds a non-admin role');
|
|
129
|
+
_b = Session.bind;
|
|
130
|
+
_d = {
|
|
131
|
+
host: host
|
|
132
|
+
};
|
|
133
|
+
return [4 /*yield*/, sdk.api.users.generate_auth_token({ id: attackerId })];
|
|
134
|
+
case 6:
|
|
135
|
+
sdkAttacker_1 = new (_b.apply(Session, [void 0, (_d.authToken = (_f.sent()).authToken,
|
|
136
|
+
_d)]))();
|
|
137
|
+
return [4 /*yield*/, sdkAttacker_1.refresh_session()]; // populate userInfo from the freshly-minted token
|
|
138
|
+
case 7:
|
|
139
|
+
_f.sent(); // populate userInfo from the freshly-minted token
|
|
140
|
+
assert(sdkAttacker_1.userInfo.id === attackerId && !((_e = sdkAttacker_1.userInfo.roles) !== null && _e !== void 0 ? _e : []).includes('Admin'), "Setup failed: attacker session is not the expected non-admin user", 'F-0076 setup: authenticated as the non-admin attacker');
|
|
141
|
+
// 3. SECURITY ASSERTIONS — every self-role mutation by the non-admin must be blocked.
|
|
142
|
+
return [4 /*yield*/, expect_blocked(function () { return sdkAttacker_1.api.users.updateOne(attackerId, { roles: ['Admin'] }, { replaceObjectFields: true }); }, 'F-0076: non-admin self-update to [Admin] is blocked')];
|
|
143
|
+
case 8:
|
|
144
|
+
// 3. SECURITY ASSERTIONS — every self-role mutation by the non-admin must be blocked.
|
|
145
|
+
_f.sent();
|
|
146
|
+
return [4 /*yield*/, expect_blocked(function () { return sdkAttacker_1.api.users.updateOne(attackerId, { roles: [NON_ADMIN_ROLE, 'Admin'] }, { replaceObjectFields: true }); }, 'F-0076: non-admin self-update to [Provider, Admin] is blocked')];
|
|
147
|
+
case 9:
|
|
148
|
+
_f.sent();
|
|
149
|
+
return [4 /*yield*/, expect_blocked(function () { return sdkAttacker_1.api.users.updateOne(attackerId, { roles: ["Arbitrary_".concat(stamp)] }, { replaceObjectFields: true }); }, 'F-0076: non-admin self-update to an arbitrary role is blocked')];
|
|
150
|
+
case 10:
|
|
151
|
+
_f.sent();
|
|
152
|
+
return [4 /*yield*/, expect_blocked(function () { return sdkAttacker_1.api.users.updateOne(attackerId, { roles: [] }, { replaceObjectFields: true }); }, 'F-0076: non-admin self-update to [] (would grant defaults) is blocked')
|
|
153
|
+
// 4. STATE ASSERTION — nothing slipped through; roles are still the original non-admin role.
|
|
154
|
+
];
|
|
155
|
+
case 11:
|
|
156
|
+
_f.sent();
|
|
157
|
+
return [4 /*yield*/, sdk.api.users.getOne(attackerId)];
|
|
158
|
+
case 12:
|
|
159
|
+
attackerAfter = _f.sent();
|
|
160
|
+
assert(JSON.stringify(attackerAfter.roles) === JSON.stringify([NON_ADMIN_ROLE]), "ESCALATION LEAK: attacker roles changed to ".concat(JSON.stringify(attackerAfter.roles), " ")
|
|
161
|
+
+ "after self-update attempts. Expected [".concat(NON_ADMIN_ROLE, "]."), 'F-0076: attacker roles unchanged after all self-escalation attempts');
|
|
162
|
+
// 5. POSITIVE CONTROL — an Admin CAN update the user's roles (mechanism is not over-restricted).
|
|
163
|
+
return [4 /*yield*/, sdk.api.users.updateOne(attackerId, { roles: [NON_ADMIN_ROLE] }, { replaceObjectFields: true })];
|
|
164
|
+
case 13:
|
|
165
|
+
// 5. POSITIVE CONTROL — an Admin CAN update the user's roles (mechanism is not over-restricted).
|
|
166
|
+
_f.sent();
|
|
167
|
+
return [4 /*yield*/, sdk.api.users.getOne(attackerId)];
|
|
168
|
+
case 14:
|
|
169
|
+
afterAdminUpdate = _f.sent();
|
|
170
|
+
assert(JSON.stringify(afterAdminUpdate.roles) === JSON.stringify([NON_ADMIN_ROLE]), "Admin role update failed: roles are ".concat(JSON.stringify(afterAdminUpdate.roles), ", expected [").concat(NON_ADMIN_ROLE, "]"), 'F-0076: admin can manage user roles (positive control)');
|
|
171
|
+
return [3 /*break*/, 20];
|
|
172
|
+
case 15:
|
|
173
|
+
if (!attackerId) return [3 /*break*/, 19];
|
|
174
|
+
_f.label = 16;
|
|
175
|
+
case 16:
|
|
176
|
+
_f.trys.push([16, 18, , 19]);
|
|
177
|
+
return [4 /*yield*/, sdk.api.users.deleteOne(attackerId)];
|
|
178
|
+
case 17:
|
|
179
|
+
_f.sent();
|
|
180
|
+
return [3 /*break*/, 19];
|
|
181
|
+
case 18:
|
|
182
|
+
_c = _f.sent();
|
|
183
|
+
return [3 /*break*/, 19];
|
|
184
|
+
case 19: return [7 /*endfinally*/];
|
|
185
|
+
case 20: return [2 /*return*/];
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
// Allow running this test file independently
|
|
191
|
+
if (require.main === module) {
|
|
192
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
193
|
+
var sdk_1 = new Session({ host: host });
|
|
194
|
+
var sdkNonAdmin_1 = new Session({ host: host });
|
|
195
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
196
|
+
return __generator(this, function (_a) {
|
|
197
|
+
switch (_a.label) {
|
|
198
|
+
case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
|
|
199
|
+
case 1:
|
|
200
|
+
_a.sent();
|
|
201
|
+
return [4 /*yield*/, self_admin_role_assignment_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
202
|
+
case 2:
|
|
203
|
+
_a.sent();
|
|
204
|
+
return [2 /*return*/];
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}); };
|
|
208
|
+
runTests()
|
|
209
|
+
.then(function () {
|
|
210
|
+
console.log("✅ F-0076 self-admin role assignment test suite completed successfully");
|
|
211
|
+
process.exit(0);
|
|
212
|
+
})
|
|
213
|
+
.catch(function (error) {
|
|
214
|
+
console.error("❌ F-0076 self-admin role assignment test suite failed:", error);
|
|
215
|
+
process.exit(1);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=F-0076-self-admin-role-assignment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"F-0076-self-admin-role-assignment.test.js","sourceRoot":"","sources":["../../../../../src/tests/api_tests/security/F-0076-self-admin-role-assignment.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user_portal_settings.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/user_portal_settings.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;AAanD,eAAO,MAAM,0BAA0B;SAAuC,OAAO;iBAAe,OAAO;mBAmL1G,CAAA"}
|
|
@@ -0,0 +1,297 @@
|
|
|
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 { Session, EnduserSession } from "../../sdk";
|
|
39
|
+
import { async_test, handleAnyError, log_header, } from "@tellescope/testing";
|
|
40
|
+
import { setup_tests } from "../setup";
|
|
41
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
42
|
+
var businessId = '60398b1131a295e64f084ff6';
|
|
43
|
+
// Main test function that can be called independently
|
|
44
|
+
export var user_portal_settings_tests = function (_a) {
|
|
45
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
46
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
47
|
+
var testUser, testEnduserId, enduserSDK;
|
|
48
|
+
return __generator(this, function (_b) {
|
|
49
|
+
switch (_b.label) {
|
|
50
|
+
case 0:
|
|
51
|
+
log_header("User portalSettings Tests");
|
|
52
|
+
return [4 /*yield*/, sdk.api.users.createOne({
|
|
53
|
+
email: "portal_settings_test_".concat(Date.now(), "@test.tellescope.com"),
|
|
54
|
+
})
|
|
55
|
+
// throwaway enduser used to confirm enduser-visibility of portalSettings
|
|
56
|
+
];
|
|
57
|
+
case 1:
|
|
58
|
+
testUser = _b.sent();
|
|
59
|
+
_b.label = 2;
|
|
60
|
+
case 2:
|
|
61
|
+
_b.trys.push([2, , 13, 21]);
|
|
62
|
+
// ===== Valid: string values =====
|
|
63
|
+
return [4 /*yield*/, async_test('portalSettings - string values accepted', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
64
|
+
var updated;
|
|
65
|
+
var _a;
|
|
66
|
+
return __generator(this, function (_b) {
|
|
67
|
+
switch (_b.label) {
|
|
68
|
+
case 0: return [4 /*yield*/, sdk.api.users.updateOne(testUser.id, { portalSettings: { theme: 'dark' } }, { replaceObjectFields: true })];
|
|
69
|
+
case 1:
|
|
70
|
+
_b.sent();
|
|
71
|
+
return [4 /*yield*/, sdk.api.users.getOne(testUser.id)];
|
|
72
|
+
case 2:
|
|
73
|
+
updated = _b.sent();
|
|
74
|
+
return [2 /*return*/, (_a = updated.portalSettings) === null || _a === void 0 ? void 0 : _a.theme];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}); }, { onResult: function (r) { return r === 'dark'; } })
|
|
78
|
+
// ===== Valid: boolean values + round-trip as real booleans =====
|
|
79
|
+
];
|
|
80
|
+
case 3:
|
|
81
|
+
// ===== Valid: string values =====
|
|
82
|
+
_b.sent();
|
|
83
|
+
// ===== Valid: boolean values + round-trip as real booleans =====
|
|
84
|
+
return [4 /*yield*/, async_test('portalSettings - boolean values accepted and round-trip as booleans', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
85
|
+
var updated;
|
|
86
|
+
return __generator(this, function (_a) {
|
|
87
|
+
switch (_a.label) {
|
|
88
|
+
case 0: return [4 /*yield*/, sdk.api.users.updateOne(testUser.id, { portalSettings: { showNameInSecureMessaging: true, showAvatar: false } }, { replaceObjectFields: true })];
|
|
89
|
+
case 1:
|
|
90
|
+
_a.sent();
|
|
91
|
+
return [4 /*yield*/, sdk.api.users.getOne(testUser.id)];
|
|
92
|
+
case 2:
|
|
93
|
+
updated = _a.sent();
|
|
94
|
+
return [2 /*return*/, updated.portalSettings];
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}); }, {
|
|
98
|
+
onResult: function (r) {
|
|
99
|
+
return (r === null || r === void 0 ? void 0 : r.showNameInSecureMessaging) === true &&
|
|
100
|
+
(r === null || r === void 0 ? void 0 : r.showAvatar) === false &&
|
|
101
|
+
// assert real booleans, not coerced strings
|
|
102
|
+
typeof (r === null || r === void 0 ? void 0 : r.showNameInSecureMessaging) === 'boolean' &&
|
|
103
|
+
typeof (r === null || r === void 0 ? void 0 : r.showAvatar) === 'boolean';
|
|
104
|
+
},
|
|
105
|
+
})
|
|
106
|
+
// ===== Valid: mixed string + boolean values, strings stay strings =====
|
|
107
|
+
];
|
|
108
|
+
case 4:
|
|
109
|
+
// ===== Valid: boolean values + round-trip as real booleans =====
|
|
110
|
+
_b.sent();
|
|
111
|
+
// ===== Valid: mixed string + boolean values, strings stay strings =====
|
|
112
|
+
return [4 /*yield*/, async_test('portalSettings - mixed string and boolean values', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
113
|
+
var updated;
|
|
114
|
+
return __generator(this, function (_a) {
|
|
115
|
+
switch (_a.label) {
|
|
116
|
+
case 0: return [4 /*yield*/, sdk.api.users.updateOne(testUser.id, { portalSettings: { theme: 'light', showAvatar: true } }, { replaceObjectFields: true })];
|
|
117
|
+
case 1:
|
|
118
|
+
_a.sent();
|
|
119
|
+
return [4 /*yield*/, sdk.api.users.getOne(testUser.id)];
|
|
120
|
+
case 2:
|
|
121
|
+
updated = _a.sent();
|
|
122
|
+
return [2 /*return*/, updated.portalSettings];
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}); }, {
|
|
126
|
+
onResult: function (r) {
|
|
127
|
+
return (r === null || r === void 0 ? void 0 : r.theme) === 'light' &&
|
|
128
|
+
typeof (r === null || r === void 0 ? void 0 : r.theme) === 'string' &&
|
|
129
|
+
(r === null || r === void 0 ? void 0 : r.showAvatar) === true &&
|
|
130
|
+
typeof (r === null || r === void 0 ? void 0 : r.showAvatar) === 'boolean';
|
|
131
|
+
},
|
|
132
|
+
})
|
|
133
|
+
// ===== Valid: empty object (zero-iteration loop passes) =====
|
|
134
|
+
];
|
|
135
|
+
case 5:
|
|
136
|
+
// ===== Valid: mixed string + boolean values, strings stay strings =====
|
|
137
|
+
_b.sent();
|
|
138
|
+
// ===== Valid: empty object (zero-iteration loop passes) =====
|
|
139
|
+
return [4 /*yield*/, async_test('portalSettings - empty object accepted', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
140
|
+
var updated;
|
|
141
|
+
return __generator(this, function (_a) {
|
|
142
|
+
switch (_a.label) {
|
|
143
|
+
case 0: return [4 /*yield*/, sdk.api.users.updateOne(testUser.id, { portalSettings: {} }, { replaceObjectFields: true })];
|
|
144
|
+
case 1:
|
|
145
|
+
_a.sent();
|
|
146
|
+
return [4 /*yield*/, sdk.api.users.getOne(testUser.id)];
|
|
147
|
+
case 2:
|
|
148
|
+
updated = _a.sent();
|
|
149
|
+
return [2 /*return*/, updated.portalSettings];
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}); }, { onResult: function (r) { return !!r && typeof r === 'object' && Object.keys(r).length === 0; } })
|
|
153
|
+
// ===== Invalid: value string > 250 chars =====
|
|
154
|
+
];
|
|
155
|
+
case 6:
|
|
156
|
+
// ===== Valid: empty object (zero-iteration loop passes) =====
|
|
157
|
+
_b.sent();
|
|
158
|
+
// ===== Invalid: value string > 250 chars =====
|
|
159
|
+
return [4 /*yield*/, async_test('portalSettings - value string > 250 chars rejected', function () { return sdk.api.users.updateOne(testUser.id, { portalSettings: { tooLong: 'a'.repeat(251) } }, { replaceObjectFields: true }); }, handleAnyError)
|
|
160
|
+
// ===== Invalid: key > 250 chars =====
|
|
161
|
+
];
|
|
162
|
+
case 7:
|
|
163
|
+
// ===== Invalid: value string > 250 chars =====
|
|
164
|
+
_b.sent();
|
|
165
|
+
// ===== Invalid: key > 250 chars =====
|
|
166
|
+
return [4 /*yield*/, async_test('portalSettings - key > 250 chars rejected', function () {
|
|
167
|
+
var _a;
|
|
168
|
+
return sdk.api.users.updateOne(testUser.id, { portalSettings: (_a = {}, _a['a'.repeat(251)] = 'x', _a) }, { replaceObjectFields: true });
|
|
169
|
+
}, handleAnyError)
|
|
170
|
+
// ===== Invalid: nested object value (disallowed type) =====
|
|
171
|
+
];
|
|
172
|
+
case 8:
|
|
173
|
+
// ===== Invalid: key > 250 chars =====
|
|
174
|
+
_b.sent();
|
|
175
|
+
// ===== Invalid: nested object value (disallowed type) =====
|
|
176
|
+
return [4 /*yield*/, async_test('portalSettings - nested object value rejected', function () { return sdk.api.users.updateOne(testUser.id, { portalSettings: { k: { nested: 1 } } }, { replaceObjectFields: true }); }, handleAnyError)
|
|
177
|
+
// ===== Invalid: array value (disallowed type) =====
|
|
178
|
+
];
|
|
179
|
+
case 9:
|
|
180
|
+
// ===== Invalid: nested object value (disallowed type) =====
|
|
181
|
+
_b.sent();
|
|
182
|
+
// ===== Invalid: array value (disallowed type) =====
|
|
183
|
+
return [4 /*yield*/, async_test('portalSettings - array value rejected', function () { return sdk.api.users.updateOne(testUser.id, { portalSettings: { k: [1, 2] } }, { replaceObjectFields: true }); }, handleAnyError)
|
|
184
|
+
// ===== Number value (secondary): orValidator tries boolean then string;
|
|
185
|
+
// stringValidator250's escapeString throws on non-strings, so a number is
|
|
186
|
+
// rejected by both branches => API validation error. =====
|
|
187
|
+
];
|
|
188
|
+
case 10:
|
|
189
|
+
// ===== Invalid: array value (disallowed type) =====
|
|
190
|
+
_b.sent();
|
|
191
|
+
// ===== Number value (secondary): orValidator tries boolean then string;
|
|
192
|
+
// stringValidator250's escapeString throws on non-strings, so a number is
|
|
193
|
+
// rejected by both branches => API validation error. =====
|
|
194
|
+
return [4 /*yield*/, async_test('portalSettings - number value rejected', function () { return sdk.api.users.updateOne(testUser.id, { portalSettings: { k: 1 } }, { replaceObjectFields: true }); }, handleAnyError)
|
|
195
|
+
// ===== Enduser visibility: portalSettings readable by endusers, un-redacted =====
|
|
196
|
+
];
|
|
197
|
+
case 11:
|
|
198
|
+
// ===== Number value (secondary): orValidator tries boolean then string;
|
|
199
|
+
// stringValidator250's escapeString throws on non-strings, so a number is
|
|
200
|
+
// rejected by both branches => API validation error. =====
|
|
201
|
+
_b.sent();
|
|
202
|
+
// ===== Enduser visibility: portalSettings readable by endusers, un-redacted =====
|
|
203
|
+
return [4 /*yield*/, async_test('portalSettings - readable by enduser (un-redacted)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
204
|
+
var testEnduser, asEnduser;
|
|
205
|
+
return __generator(this, function (_a) {
|
|
206
|
+
switch (_a.label) {
|
|
207
|
+
case 0:
|
|
208
|
+
// set a known value on the throwaway user
|
|
209
|
+
return [4 /*yield*/, sdk.api.users.updateOne(testUser.id, { portalSettings: { showNameInSecureMessaging: true, theme: 'dark' } }, { replaceObjectFields: true })
|
|
210
|
+
// create + authenticate a throwaway enduser to read as a patient
|
|
211
|
+
];
|
|
212
|
+
case 1:
|
|
213
|
+
// set a known value on the throwaway user
|
|
214
|
+
_a.sent();
|
|
215
|
+
return [4 /*yield*/, sdk.api.endusers.createOne({
|
|
216
|
+
email: "portal_settings_enduser_".concat(Date.now(), "@test.tellescope.com"),
|
|
217
|
+
})];
|
|
218
|
+
case 2:
|
|
219
|
+
testEnduser = _a.sent();
|
|
220
|
+
testEnduserId = testEnduser.id;
|
|
221
|
+
return [4 /*yield*/, sdk.api.endusers.set_password({ id: testEnduser.id, password: 'TestPassword123!' })];
|
|
222
|
+
case 3:
|
|
223
|
+
_a.sent();
|
|
224
|
+
enduserSDK = new EnduserSession({ host: host, businessId: businessId });
|
|
225
|
+
return [4 /*yield*/, enduserSDK.authenticate(testEnduser.email, 'TestPassword123!')];
|
|
226
|
+
case 4:
|
|
227
|
+
_a.sent();
|
|
228
|
+
return [4 /*yield*/, enduserSDK.api.users.getOne(testUser.id)];
|
|
229
|
+
case 5:
|
|
230
|
+
asEnduser = _a.sent();
|
|
231
|
+
return [2 /*return*/, asEnduser.portalSettings];
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}); }, {
|
|
235
|
+
onResult: function (r) {
|
|
236
|
+
// field is present and un-redacted for endusers
|
|
237
|
+
return (r === null || r === void 0 ? void 0 : r.showNameInSecureMessaging) === true && (r === null || r === void 0 ? void 0 : r.theme) === 'dark';
|
|
238
|
+
},
|
|
239
|
+
})];
|
|
240
|
+
case 12:
|
|
241
|
+
// ===== Enduser visibility: portalSettings readable by endusers, un-redacted =====
|
|
242
|
+
_b.sent();
|
|
243
|
+
console.log("✅ All User portalSettings tests passed!");
|
|
244
|
+
return [3 /*break*/, 21];
|
|
245
|
+
case 13:
|
|
246
|
+
_b.trys.push([13, , 18, 20]);
|
|
247
|
+
if (!enduserSDK) return [3 /*break*/, 15];
|
|
248
|
+
return [4 /*yield*/, enduserSDK.api.endusers.logout().catch(function () { })];
|
|
249
|
+
case 14:
|
|
250
|
+
_b.sent();
|
|
251
|
+
_b.label = 15;
|
|
252
|
+
case 15:
|
|
253
|
+
if (!testEnduserId) return [3 /*break*/, 17];
|
|
254
|
+
return [4 /*yield*/, sdk.api.endusers.deleteOne(testEnduserId)];
|
|
255
|
+
case 16:
|
|
256
|
+
_b.sent();
|
|
257
|
+
_b.label = 17;
|
|
258
|
+
case 17: return [3 /*break*/, 20];
|
|
259
|
+
case 18: return [4 /*yield*/, sdk.api.users.deleteOne(testUser.id)];
|
|
260
|
+
case 19:
|
|
261
|
+
_b.sent();
|
|
262
|
+
return [7 /*endfinally*/];
|
|
263
|
+
case 20: return [7 /*endfinally*/];
|
|
264
|
+
case 21: return [2 /*return*/];
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
};
|
|
269
|
+
// Allow running this test file independently
|
|
270
|
+
if (require.main === module) {
|
|
271
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
272
|
+
var sdk_1 = new Session({ host: host });
|
|
273
|
+
var sdkNonAdmin_1 = new Session({ host: host });
|
|
274
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
275
|
+
return __generator(this, function (_a) {
|
|
276
|
+
switch (_a.label) {
|
|
277
|
+
case 0: return [4 /*yield*/, setup_tests(sdk_1, sdkNonAdmin_1)];
|
|
278
|
+
case 1:
|
|
279
|
+
_a.sent();
|
|
280
|
+
return [4 /*yield*/, user_portal_settings_tests({ sdk: sdk_1, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
281
|
+
case 2:
|
|
282
|
+
_a.sent();
|
|
283
|
+
return [2 /*return*/];
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}); };
|
|
287
|
+
runTests()
|
|
288
|
+
.then(function () {
|
|
289
|
+
console.log("✅ User portalSettings test suite completed successfully");
|
|
290
|
+
process.exit(0);
|
|
291
|
+
})
|
|
292
|
+
.catch(function (error) {
|
|
293
|
+
console.error("❌ User portalSettings test suite failed:", error);
|
|
294
|
+
process.exit(1);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=user_portal_settings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user_portal_settings.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/user_portal_settings.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":"
|
|
1
|
+
{"version":3,"file":"tests.d.ts","sourceRoot":"","sources":["../../../src/tests/tests.ts"],"names":[],"mappings":"AAgzEA,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;AA8vED,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,qBAylBhD,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,mCA2C5C,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"}
|