@tellescope/sdk 1.246.1 → 1.246.2
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/account_switcher.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/account_switcher.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/account_switcher.test.js +445 -0
- package/lib/cjs/tests/api_tests/account_switcher.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/calendar_events_bulk_update.test.d.ts +5 -0
- package/lib/cjs/tests/api_tests/calendar_events_bulk_update.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/calendar_events_bulk_update.test.js +483 -0
- package/lib/cjs/tests/api_tests/calendar_events_bulk_update.test.js.map +1 -0
- package/lib/cjs/tests/api_tests/email_utils.test.d.ts +2 -0
- package/lib/cjs/tests/api_tests/email_utils.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/email_utils.test.js +141 -0
- package/lib/cjs/tests/api_tests/email_utils.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +103 -87
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/tests/api_tests/account_switcher.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/account_switcher.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/account_switcher.test.js +438 -0
- package/lib/esm/tests/api_tests/account_switcher.test.js.map +1 -0
- package/lib/esm/tests/api_tests/calendar_events_bulk_update.test.d.ts +5 -0
- package/lib/esm/tests/api_tests/calendar_events_bulk_update.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/calendar_events_bulk_update.test.js +479 -0
- package/lib/esm/tests/api_tests/calendar_events_bulk_update.test.js.map +1 -0
- package/lib/esm/tests/api_tests/email_utils.test.d.ts +2 -0
- package/lib/esm/tests/api_tests/email_utils.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/email_utils.test.js +137 -0
- package/lib/esm/tests/api_tests/email_utils.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +103 -87
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/tests/tests.ts +24 -2
- package/test_generated.pdf +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account_switcher.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/account_switcher.test.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBnC,eAAO,MAAM,sBAAsB;SAAwC,OAAO;iBAAe,OAAO;mBAuXvG,CAAA"}
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.account_switcher_tests = void 0;
|
|
43
|
+
require('source-map-support').install();
|
|
44
|
+
var crypto_1 = __importDefault(require("crypto"));
|
|
45
|
+
var sdk_1 = require("../../sdk");
|
|
46
|
+
var testing_1 = require("@tellescope/testing");
|
|
47
|
+
var utilities_1 = require("@tellescope/utilities");
|
|
48
|
+
var setup_1 = require("../setup");
|
|
49
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
50
|
+
var TEST_EMAIL = process.env.TEST_EMAIL;
|
|
51
|
+
var TEST_PASSWORD = process.env.TEST_PASSWORD;
|
|
52
|
+
var NON_ADMIN_EMAIL = process.env.NON_ADMIN_EMAIL;
|
|
53
|
+
var NON_ADMIN_PASSWORD = process.env.NON_ADMIN_PASSWORD;
|
|
54
|
+
// matches the API key used in tests.ts for the secondary org
|
|
55
|
+
var SDK_OTHER_API_KEY = "ba745e25162bb95a795c5fa1af70df188d93c4d3aac9c48b34a5c8c9dd7b80f7";
|
|
56
|
+
var account_switcher_tests = function (_a) {
|
|
57
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
58
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
59
|
+
var sdkOther, adminBaseEmail, _b, adminLocal, adminDomain, naBaseEmail, _c, naLocal, naDomain, suffix, emailPlusA, emailPlusB, emailPlusLocked, emailPlusUppercase, emailPlusInjection, emailReadOnly, emailOtherBase, emailPrefixSwitcher, emailNonAdminPlus, emailUnverifTarget, emailCrossOrg, userPlusA, userPlusB, userPlusLocked, userPlusUppercase, userPlusInjection, userReadOnly, userOtherBase, userPrefixSwitcher, userNonAdminPlus, userCrossOrg, userUnverifTarget, restrictiveRole, linkedFromAdmin, linkedIds, sample, preSwitchTokenSession_1, switchResult, switchedSession_1, meAfterSwitch, newLinkedFromSwitched, newLinkedIds, xorgSwitch, xorgSession_1, xorgMe, downgradeSwitch, downgradedSession_1, noAuthSession_1, allLogs, logsArr, switchLog, beforeUnverif, afterUnverif, rateLimitTripped, lastError, i, e_1, msg, cleanup;
|
|
60
|
+
var _d, _e, _f, _g, _h, _j, _k;
|
|
61
|
+
return __generator(this, function (_l) {
|
|
62
|
+
switch (_l.label) {
|
|
63
|
+
case 0:
|
|
64
|
+
(0, testing_1.log_header)("Account Switcher Tests");
|
|
65
|
+
sdkOther = new sdk_1.Session({ host: host, apiKey: SDK_OTHER_API_KEY });
|
|
66
|
+
adminBaseEmail = (0, utilities_1.getBaseEmail)(sdk.userInfo.email);
|
|
67
|
+
_b = adminBaseEmail.split('@'), adminLocal = _b[0], adminDomain = _b[1];
|
|
68
|
+
naBaseEmail = (0, utilities_1.getBaseEmail)(sdkNonAdmin.userInfo.email);
|
|
69
|
+
_c = naBaseEmail.split('@'), naLocal = _c[0], naDomain = _c[1];
|
|
70
|
+
suffix = crypto_1.default.randomBytes(4).toString('hex');
|
|
71
|
+
emailPlusA = "".concat(adminLocal, "+acctsw_a_").concat(suffix, "@").concat(adminDomain);
|
|
72
|
+
emailPlusB = "".concat(adminLocal, "+acctsw_b_").concat(suffix, "@").concat(adminDomain);
|
|
73
|
+
emailPlusLocked = "".concat(adminLocal, "+acctsw_locked_").concat(suffix, "@").concat(adminDomain);
|
|
74
|
+
emailPlusUppercase = "".concat(adminLocal.toUpperCase(), "+AcctSwCaps_").concat(suffix, "@").concat(adminDomain);
|
|
75
|
+
emailPlusInjection = "".concat(adminLocal, "+acctsw.x.y_").concat(suffix, "@").concat(adminDomain);
|
|
76
|
+
emailReadOnly = "".concat(adminLocal, "+acctsw_ro_").concat(suffix, "@").concat(adminDomain);
|
|
77
|
+
emailOtherBase = "acctsw_unrelated_".concat(suffix, "@").concat(adminDomain);
|
|
78
|
+
emailPrefixSwitcher = "prefix".concat(adminLocal, "+acctsw_pfx_").concat(suffix, "@").concat(adminDomain);
|
|
79
|
+
emailNonAdminPlus = "".concat(naLocal, "+acctsw_na_").concat(suffix, "@").concat(naDomain);
|
|
80
|
+
emailUnverifTarget = "".concat(adminLocal, "+acctsw_unvrf_").concat(suffix, "@").concat(adminDomain);
|
|
81
|
+
emailCrossOrg = "".concat(adminLocal, "+acctsw_xorg_").concat(suffix, "@").concat(adminDomain);
|
|
82
|
+
_l.label = 1;
|
|
83
|
+
case 1:
|
|
84
|
+
_l.trys.push([1, , 56, 58]);
|
|
85
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailPlusA, fname: 'A', verifiedEmail: true })];
|
|
86
|
+
case 2:
|
|
87
|
+
// ------------------------------ Fixtures ------------------------------
|
|
88
|
+
userPlusA = _l.sent();
|
|
89
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailPlusB, fname: 'B', verifiedEmail: true })];
|
|
90
|
+
case 3:
|
|
91
|
+
userPlusB = _l.sent();
|
|
92
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailPlusUppercase, verifiedEmail: true })];
|
|
93
|
+
case 4:
|
|
94
|
+
userPlusUppercase = _l.sent();
|
|
95
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailPlusInjection, verifiedEmail: true })];
|
|
96
|
+
case 5:
|
|
97
|
+
userPlusInjection = _l.sent();
|
|
98
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailOtherBase, verifiedEmail: true })];
|
|
99
|
+
case 6:
|
|
100
|
+
userOtherBase = _l.sent();
|
|
101
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailPrefixSwitcher, verifiedEmail: true })];
|
|
102
|
+
case 7:
|
|
103
|
+
userPrefixSwitcher = _l.sent();
|
|
104
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailNonAdminPlus, verifiedEmail: true })
|
|
105
|
+
// Created with verifiedEmail: false so we can observe propagation from a verified source
|
|
106
|
+
];
|
|
107
|
+
case 8:
|
|
108
|
+
userNonAdminPlus = _l.sent();
|
|
109
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailUnverifTarget, verifiedEmail: false })
|
|
110
|
+
// Locked sibling (lockedOutUntil = 0 => indefinite lockout per types-models)
|
|
111
|
+
];
|
|
112
|
+
case 9:
|
|
113
|
+
// Created with verifiedEmail: false so we can observe propagation from a verified source
|
|
114
|
+
userUnverifTarget = _l.sent();
|
|
115
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailPlusLocked, verifiedEmail: true })];
|
|
116
|
+
case 10:
|
|
117
|
+
// Locked sibling (lockedOutUntil = 0 => indefinite lockout per types-models)
|
|
118
|
+
userPlusLocked = _l.sent();
|
|
119
|
+
return [4 /*yield*/, sdk.api.users.updateOne(userPlusLocked.id, { lockedOutUntil: 0 })
|
|
120
|
+
// Restrictive role + user assigned to that role (used to verify no privilege escalation)
|
|
121
|
+
];
|
|
122
|
+
case 11:
|
|
123
|
+
_l.sent();
|
|
124
|
+
return [4 /*yield*/, sdk.api.role_based_access_permissions.createOne({
|
|
125
|
+
role: "acctsw_restrictive_".concat(suffix),
|
|
126
|
+
permissions: {
|
|
127
|
+
users: { read: null, create: null, update: null, delete: null },
|
|
128
|
+
endusers: { read: null, create: null, update: null, delete: null },
|
|
129
|
+
},
|
|
130
|
+
})];
|
|
131
|
+
case 12:
|
|
132
|
+
// Restrictive role + user assigned to that role (used to verify no privilege escalation)
|
|
133
|
+
restrictiveRole = _l.sent();
|
|
134
|
+
return [4 /*yield*/, sdk.api.users.createOne({ email: emailReadOnly, verifiedEmail: true })];
|
|
135
|
+
case 13:
|
|
136
|
+
userReadOnly = _l.sent();
|
|
137
|
+
return [4 /*yield*/, sdk.api.users.updateOne(userReadOnly.id, { roles: [restrictiveRole.role] }, { replaceObjectFields: true })
|
|
138
|
+
// Cross-org sibling (different org via API key)
|
|
139
|
+
];
|
|
140
|
+
case 14:
|
|
141
|
+
_l.sent();
|
|
142
|
+
return [4 /*yield*/, sdkOther.api.users.createOne({ email: emailCrossOrg, verifiedEmail: true })];
|
|
143
|
+
case 15:
|
|
144
|
+
// Cross-org sibling (different org via API key)
|
|
145
|
+
userCrossOrg = _l.sent();
|
|
146
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)
|
|
147
|
+
// ====================== A. get_linked_accounts ======================
|
|
148
|
+
]; // small settle for created records
|
|
149
|
+
case 16:
|
|
150
|
+
_l.sent(); // small settle for created records
|
|
151
|
+
return [4 /*yield*/, sdk.api.users.get_linked_accounts()];
|
|
152
|
+
case 17:
|
|
153
|
+
linkedFromAdmin = _l.sent();
|
|
154
|
+
linkedIds = (linkedFromAdmin.linkedAccounts || []).map(function (a) { return a.id; });
|
|
155
|
+
(0, testing_1.assert)(linkedIds.includes(userPlusA.id), 'userPlusA missing from linked accounts', 'get_linked_accounts: includes plus sibling A');
|
|
156
|
+
(0, testing_1.assert)(linkedIds.includes(userPlusB.id), 'userPlusB missing from linked accounts', 'get_linked_accounts: includes plus sibling B');
|
|
157
|
+
(0, testing_1.assert)(linkedIds.includes(userPlusUppercase.id), 'uppercase plus variant missing from linked accounts', 'get_linked_accounts: case-insensitive base match');
|
|
158
|
+
(0, testing_1.assert)(linkedIds.includes(userPlusInjection.id), 'regex-special plus variant missing from linked accounts', 'get_linked_accounts: regex special chars do not break matching');
|
|
159
|
+
(0, testing_1.assert)(linkedIds.includes(userCrossOrg.id), 'cross-org sibling missing from linked accounts', 'get_linked_accounts: includes cross-org plus sibling');
|
|
160
|
+
(0, testing_1.assert)(!linkedIds.includes(sdk.userInfo.id), 'caller present in linked accounts', 'get_linked_accounts: excludes caller');
|
|
161
|
+
(0, testing_1.assert)(!linkedIds.includes(userOtherBase.id), 'unrelated-base user present in linked accounts', 'get_linked_accounts: excludes unrelated base email');
|
|
162
|
+
(0, testing_1.assert)(!linkedIds.includes(userPrefixSwitcher.id), 'prefix-extended user present in linked accounts (anchored regex broken?)', 'get_linked_accounts: anchored regex excludes prefix-extended local part');
|
|
163
|
+
(0, testing_1.assert)(!linkedIds.includes(userPlusLocked.id), 'locked user present in linked accounts', 'get_linked_accounts: excludes locked target');
|
|
164
|
+
sample = (linkedFromAdmin.linkedAccounts || []).find(function (a) { return a.id === userPlusB.id; });
|
|
165
|
+
(0, testing_1.assert)(!!sample
|
|
166
|
+
&& typeof sample.email === 'string'
|
|
167
|
+
&& typeof sample.orgName === 'string'
|
|
168
|
+
&& typeof sample.requiresMFA === 'boolean', 'linked account entry missing required fields', 'get_linked_accounts: entries have id, email, orgName, requiresMFA');
|
|
169
|
+
// noAccessPermissions: non-admin can call without 403
|
|
170
|
+
return [4 /*yield*/, (0, testing_1.async_test)('get_linked_accounts callable by non-admin (noAccessPermissions)', function () { return sdkNonAdmin.api.users.get_linked_accounts(); }, { onResult: function (r) { return Array.isArray(r.linkedAccounts); } })
|
|
171
|
+
// ====================== B. switch_account ======================
|
|
172
|
+
// 1. Same-org happy path: sdk (admin) → userPlusB
|
|
173
|
+
// Capture the source token in a separate Session BEFORE the switch so we can verify
|
|
174
|
+
// the original JWT is invalidated (Step 13) without losing access via `sdk` itself.
|
|
175
|
+
];
|
|
176
|
+
case 18:
|
|
177
|
+
// noAccessPermissions: non-admin can call without 403
|
|
178
|
+
_l.sent();
|
|
179
|
+
preSwitchTokenSession_1 = new sdk_1.Session({ host: host, authToken: sdk.authToken });
|
|
180
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: pre-switch source token is valid', function () { return preSwitchTokenSession_1.test_authenticated(); }, { expectedResult: 'Authenticated!' })];
|
|
181
|
+
case 19:
|
|
182
|
+
_l.sent();
|
|
183
|
+
return [4 /*yield*/, sdk.api.users.switch_account({ targetUserId: userPlusB.id })];
|
|
184
|
+
case 20:
|
|
185
|
+
switchResult = _l.sent();
|
|
186
|
+
(0, testing_1.assert)(!!switchResult.authToken, 'no authToken returned from switch_account', 'switch_account: returns authToken');
|
|
187
|
+
(0, testing_1.assert)(((_d = switchResult.user) === null || _d === void 0 ? void 0 : _d.id) === userPlusB.id, 'switch_account returned wrong user id', 'switch_account: returns target user record');
|
|
188
|
+
(0, testing_1.assert)((((_e = switchResult.user) === null || _e === void 0 ? void 0 : _e.email) || '').toLowerCase() === emailPlusB.toLowerCase(), 'switch_account returned wrong email', 'switch_account: returns target email');
|
|
189
|
+
// User model stores password hash in `hashedPass` (not `hashedPassword` — that's Enduser).
|
|
190
|
+
// Both are asserted as belt-and-suspenders in case field names drift.
|
|
191
|
+
(0, testing_1.assert)(!((_f = switchResult.user) === null || _f === void 0 ? void 0 : _f.hashedPass), "switch_account response leaked hashedPass: ".concat(JSON.stringify(switchResult.user.hashedPass)), 'switch_account: response redacts hashedPass');
|
|
192
|
+
(0, testing_1.assert)(!((_g = switchResult.user) === null || _g === void 0 ? void 0 : _g.hashedPassword), "switch_account response leaked hashedPassword: ".concat(JSON.stringify(switchResult.user.hashedPassword)), 'switch_account: response has no hashedPassword (defense-in-depth)');
|
|
193
|
+
switchedSession_1 = new sdk_1.Session({ host: host, authToken: switchResult.authToken });
|
|
194
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: new token authenticates', function () { return switchedSession_1.test_authenticated(); }, { expectedResult: 'Authenticated!' })];
|
|
195
|
+
case 21:
|
|
196
|
+
_l.sent();
|
|
197
|
+
return [4 /*yield*/, switchedSession_1.api.users.getOne(userPlusB.id)];
|
|
198
|
+
case 22:
|
|
199
|
+
meAfterSwitch = _l.sent();
|
|
200
|
+
(0, testing_1.assert)((meAfterSwitch.email || '').toLowerCase() === emailPlusB.toLowerCase(), 'switched session does not resolve to target user', 'switch_account: new session authenticates as target user');
|
|
201
|
+
return [4 /*yield*/, switchedSession_1.api.users.get_linked_accounts()];
|
|
202
|
+
case 23:
|
|
203
|
+
newLinkedFromSwitched = _l.sent();
|
|
204
|
+
newLinkedIds = (newLinkedFromSwitched.linkedAccounts || []).map(function (a) { return a.id; });
|
|
205
|
+
(0, testing_1.assert)(!newLinkedIds.includes(userPlusB.id), 'post-switch linked accounts include the new caller', 'post-switch get_linked_accounts: excludes new caller');
|
|
206
|
+
(0, testing_1.assert)(newLinkedIds.includes(userPlusA.id), 'post-switch linked accounts missing other sibling', 'post-switch get_linked_accounts: includes other plus siblings');
|
|
207
|
+
(0, testing_1.assert)(newLinkedIds.includes(sdk.userInfo.id), 'post-switch linked accounts missing original caller', 'post-switch get_linked_accounts: includes original caller');
|
|
208
|
+
// JWT invalidation (Step 13): the source token captured pre-switch must now be rejected.
|
|
209
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: source JWT invalidated after switch', function () { return preSwitchTokenSession_1.test_authenticated(); }, { shouldError: true, onError: function (e) { var _a; return /unauth|expired|invalid/i.test((e === null || e === void 0 ? void 0 : e.message) || ((_a = e === null || e === void 0 ? void 0 : e.toString) === null || _a === void 0 ? void 0 : _a.call(e)) || String(e)); } })
|
|
210
|
+
// Re-authenticate sdk so subsequent tests in this suite work (its prior token is now expired).
|
|
211
|
+
];
|
|
212
|
+
case 24:
|
|
213
|
+
// JWT invalidation (Step 13): the source token captured pre-switch must now be rejected.
|
|
214
|
+
_l.sent();
|
|
215
|
+
// Re-authenticate sdk so subsequent tests in this suite work (its prior token is now expired).
|
|
216
|
+
return [4 /*yield*/, sdk.authenticate(TEST_EMAIL, TEST_PASSWORD)
|
|
217
|
+
// 2. Cross-org happy path: sdk (admin) → userCrossOrg (in sdkOther's org)
|
|
218
|
+
];
|
|
219
|
+
case 25:
|
|
220
|
+
// Re-authenticate sdk so subsequent tests in this suite work (its prior token is now expired).
|
|
221
|
+
_l.sent();
|
|
222
|
+
return [4 /*yield*/, sdk.api.users.switch_account({ targetUserId: userCrossOrg.id })];
|
|
223
|
+
case 26:
|
|
224
|
+
xorgSwitch = _l.sent();
|
|
225
|
+
(0, testing_1.assert)(((_h = xorgSwitch.user) === null || _h === void 0 ? void 0 : _h.id) === userCrossOrg.id, 'cross-org switch returned wrong user', 'switch_account: cross-org switch returns target');
|
|
226
|
+
xorgSession_1 = new sdk_1.Session({ host: host, authToken: xorgSwitch.authToken });
|
|
227
|
+
return [4 /*yield*/, xorgSession_1.api.users.getOne(userCrossOrg.id)];
|
|
228
|
+
case 27:
|
|
229
|
+
xorgMe = _l.sent();
|
|
230
|
+
(0, testing_1.assert)((xorgMe.email || '').toLowerCase() === emailCrossOrg.toLowerCase(), 'cross-org session not scoped correctly', 'switch_account: cross-org session resolves to target user');
|
|
231
|
+
// Multi-tenant isolation: cross-org session must NOT see source-org users
|
|
232
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: cross-org session cannot see source-org user (tenant isolation)', function () { return xorgSession_1.api.users.getOne(sdk.userInfo.id); }, testing_1.handleAnyError)
|
|
233
|
+
// Re-auth sdk: previous switch invalidated its token (Step 13)
|
|
234
|
+
];
|
|
235
|
+
case 28:
|
|
236
|
+
// Multi-tenant isolation: cross-org session must NOT see source-org users
|
|
237
|
+
_l.sent();
|
|
238
|
+
// Re-auth sdk: previous switch invalidated its token (Step 13)
|
|
239
|
+
return [4 /*yield*/, sdk.authenticate(TEST_EMAIL, TEST_PASSWORD)
|
|
240
|
+
// 3. Permission scoping (no privilege escalation): sdk (admin) → userReadOnly,
|
|
241
|
+
// then attempt an admin-only operation with the new token. Must fail.
|
|
242
|
+
];
|
|
243
|
+
case 29:
|
|
244
|
+
// Re-auth sdk: previous switch invalidated its token (Step 13)
|
|
245
|
+
_l.sent();
|
|
246
|
+
return [4 /*yield*/, sdk.api.users.switch_account({ targetUserId: userReadOnly.id })];
|
|
247
|
+
case 30:
|
|
248
|
+
downgradeSwitch = _l.sent();
|
|
249
|
+
downgradedSession_1 = new sdk_1.Session({ host: host, authToken: downgradeSwitch.authToken });
|
|
250
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: downgraded session cannot perform admin op (no privilege escalation)', function () { return downgradedSession_1.api.users.updateOne(userPlusA.id, { roles: ['Admin'] }, { replaceObjectFields: true }); }, testing_1.handleAnyError)
|
|
251
|
+
// Re-auth sdk: previous switch invalidated its token (Step 13)
|
|
252
|
+
];
|
|
253
|
+
case 31:
|
|
254
|
+
_l.sent();
|
|
255
|
+
// Re-auth sdk: previous switch invalidated its token (Step 13)
|
|
256
|
+
return [4 /*yield*/, sdk.authenticate(TEST_EMAIL, TEST_PASSWORD)
|
|
257
|
+
// 3b. Self-switch attempt MUST be rejected (Step 12): no-op that wastes rate-limit budget
|
|
258
|
+
// and creates spurious audit logs.
|
|
259
|
+
];
|
|
260
|
+
case 32:
|
|
261
|
+
// Re-auth sdk: previous switch invalidated its token (Step 13)
|
|
262
|
+
_l.sent();
|
|
263
|
+
// 3b. Self-switch attempt MUST be rejected (Step 12): no-op that wastes rate-limit budget
|
|
264
|
+
// and creates spurious audit logs.
|
|
265
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: rejects self-switch', function () { return sdk.api.users.switch_account({ targetUserId: sdk.userInfo.id }); }, { shouldError: true, onError: function (e) { var _a; return /own account/i.test((e === null || e === void 0 ? void 0 : e.message) || ((_a = e === null || e === void 0 ? void 0 : e.toString) === null || _a === void 0 ? void 0 : _a.call(e)) || String(e)); } })
|
|
266
|
+
// 4. Cross-base attack: sdk (admin) → userOtherBase (different base) MUST be rejected.
|
|
267
|
+
];
|
|
268
|
+
case 33:
|
|
269
|
+
// 3b. Self-switch attempt MUST be rejected (Step 12): no-op that wastes rate-limit budget
|
|
270
|
+
// and creates spurious audit logs.
|
|
271
|
+
_l.sent();
|
|
272
|
+
// 4. Cross-base attack: sdk (admin) → userOtherBase (different base) MUST be rejected.
|
|
273
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: rejects cross-base target', function () { return sdk.api.users.switch_account({ targetUserId: userOtherBase.id }); }, testing_1.handleAnyError)];
|
|
274
|
+
case 34:
|
|
275
|
+
// 4. Cross-base attack: sdk (admin) → userOtherBase (different base) MUST be rejected.
|
|
276
|
+
_l.sent();
|
|
277
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: source session unaffected after rejected cross-base attempt', function () { return sdk.test_authenticated(); }, { expectedResult: 'Authenticated!' })
|
|
278
|
+
// 5. Locked target: must reject
|
|
279
|
+
];
|
|
280
|
+
case 35:
|
|
281
|
+
_l.sent();
|
|
282
|
+
// 5. Locked target: must reject
|
|
283
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: rejects locked target', function () { return sdk.api.users.switch_account({ targetUserId: userPlusLocked.id }); }, testing_1.handleAnyError)
|
|
284
|
+
// 6. Nonexistent target: must reject without leaking existence
|
|
285
|
+
];
|
|
286
|
+
case 36:
|
|
287
|
+
// 5. Locked target: must reject
|
|
288
|
+
_l.sent();
|
|
289
|
+
// 6. Nonexistent target: must reject without leaking existence
|
|
290
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: rejects nonexistent target', function () { return sdk.api.users.switch_account({ targetUserId: '000000000000000000000000' }); }, testing_1.handleAnyError)
|
|
291
|
+
// 7. Malformed targetUserId: validation error (does not reach handler / rate limit)
|
|
292
|
+
];
|
|
293
|
+
case 37:
|
|
294
|
+
// 6. Nonexistent target: must reject without leaking existence
|
|
295
|
+
_l.sent();
|
|
296
|
+
// 7. Malformed targetUserId: validation error (does not reach handler / rate limit)
|
|
297
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: rejects malformed targetUserId', function () { return sdk.api.users.switch_account({ targetUserId: 'not-an-objectid' }); }, testing_1.handleAnyError)
|
|
298
|
+
// 8. noAccessPermissions on switch: non-admin can switch to its own plus sibling
|
|
299
|
+
];
|
|
300
|
+
case 38:
|
|
301
|
+
// 7. Malformed targetUserId: validation error (does not reach handler / rate limit)
|
|
302
|
+
_l.sent();
|
|
303
|
+
// 8. noAccessPermissions on switch: non-admin can switch to its own plus sibling
|
|
304
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: callable by non-admin (noAccessPermissions)', function () { return sdkNonAdmin.api.users.switch_account({ targetUserId: userNonAdminPlus.id }); }, { onResult: function (r) { var _a; return ((_a = r.user) === null || _a === void 0 ? void 0 : _a.id) === userNonAdminPlus.id && !!r.authToken; } })
|
|
305
|
+
// Re-auth sdkNonAdmin: previous switch invalidated its token (Step 13)
|
|
306
|
+
];
|
|
307
|
+
case 39:
|
|
308
|
+
// 8. noAccessPermissions on switch: non-admin can switch to its own plus sibling
|
|
309
|
+
_l.sent();
|
|
310
|
+
// Re-auth sdkNonAdmin: previous switch invalidated its token (Step 13)
|
|
311
|
+
return [4 /*yield*/, sdkNonAdmin.authenticate(NON_ADMIN_EMAIL, NON_ADMIN_PASSWORD)
|
|
312
|
+
// 9. Unauthenticated request: must reject before reaching handler
|
|
313
|
+
];
|
|
314
|
+
case 40:
|
|
315
|
+
// Re-auth sdkNonAdmin: previous switch invalidated its token (Step 13)
|
|
316
|
+
_l.sent();
|
|
317
|
+
noAuthSession_1 = new sdk_1.Session({ host: host });
|
|
318
|
+
return [4 /*yield*/, (0, testing_1.async_test)('switch_account: rejects unauthenticated caller', function () { return noAuthSession_1.api.users.switch_account({ targetUserId: userPlusA.id }); }, testing_1.handleAnyError)
|
|
319
|
+
// 10. Audit log written for the same-org switch performed in step 1
|
|
320
|
+
];
|
|
321
|
+
case 41:
|
|
322
|
+
_l.sent();
|
|
323
|
+
// 10. Audit log written for the same-org switch performed in step 1
|
|
324
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 500)];
|
|
325
|
+
case 42:
|
|
326
|
+
// 10. Audit log written for the same-org switch performed in step 1
|
|
327
|
+
_l.sent();
|
|
328
|
+
return [4 /*yield*/, sdk.api.user_logs.getSome({ limit: 1000 })];
|
|
329
|
+
case 43:
|
|
330
|
+
allLogs = _l.sent();
|
|
331
|
+
logsArr = Array.isArray(allLogs) ? allLogs : ((allLogs === null || allLogs === void 0 ? void 0 : allLogs.user_logs) || []);
|
|
332
|
+
switchLog = logsArr.find(function (l) {
|
|
333
|
+
var _a, _b, _c;
|
|
334
|
+
return ((_a = l === null || l === void 0 ? void 0 : l.info) === null || _a === void 0 ? void 0 : _a.event) === 'account_switch'
|
|
335
|
+
&& ((_b = l === null || l === void 0 ? void 0 : l.info) === null || _b === void 0 ? void 0 : _b.targetUserId) === userPlusB.id
|
|
336
|
+
&& ((_c = l === null || l === void 0 ? void 0 : l.info) === null || _c === void 0 ? void 0 : _c.sourceUserId) === sdk.userInfo.id;
|
|
337
|
+
});
|
|
338
|
+
(0, testing_1.assert)(!!switchLog, 'no account_switch audit log found for sdk → userPlusB', 'switch_account: HIPAA audit log written');
|
|
339
|
+
if (switchLog) {
|
|
340
|
+
(0, testing_1.assert)(!!switchLog.info.sourceBusinessId && !!switchLog.info.targetBusinessId, 'audit log missing businessIds', 'switch_account: audit log captures both businessIds');
|
|
341
|
+
(0, testing_1.assert)((switchLog.info.targetEmail || '').toLowerCase() === emailPlusB.toLowerCase(), 'audit log targetEmail mismatch', 'switch_account: audit log captures targetEmail');
|
|
342
|
+
}
|
|
343
|
+
return [4 /*yield*/, sdk.api.users.getOne(userUnverifTarget.id)];
|
|
344
|
+
case 44:
|
|
345
|
+
beforeUnverif = _l.sent();
|
|
346
|
+
(0, testing_1.assert)(beforeUnverif.verifiedEmail !== true, "test fixture userUnverifTarget was unexpectedly already verified", 'verifiedEmail propagation fixture: target starts unverified');
|
|
347
|
+
return [4 /*yield*/, sdk.api.users.switch_account({ targetUserId: userUnverifTarget.id })];
|
|
348
|
+
case 45:
|
|
349
|
+
_l.sent();
|
|
350
|
+
return [4 /*yield*/, sdk.authenticate(TEST_EMAIL, TEST_PASSWORD)];
|
|
351
|
+
case 46:
|
|
352
|
+
_l.sent();
|
|
353
|
+
return [4 /*yield*/, sdk.api.users.getOne(userUnverifTarget.id)];
|
|
354
|
+
case 47:
|
|
355
|
+
afterUnverif = _l.sent();
|
|
356
|
+
(0, testing_1.assert)(afterUnverif.verifiedEmail === true, "target verifiedEmail did not propagate from verified source", 'switch_account: verified source propagates verifiedEmail to target');
|
|
357
|
+
rateLimitTripped = false;
|
|
358
|
+
lastError = null;
|
|
359
|
+
i = 0;
|
|
360
|
+
_l.label = 48;
|
|
361
|
+
case 48:
|
|
362
|
+
if (!(i < 15)) return [3 /*break*/, 54];
|
|
363
|
+
_l.label = 49;
|
|
364
|
+
case 49:
|
|
365
|
+
_l.trys.push([49, 52, , 53]);
|
|
366
|
+
return [4 /*yield*/, sdk.authenticate(TEST_EMAIL, TEST_PASSWORD)];
|
|
367
|
+
case 50:
|
|
368
|
+
_l.sent();
|
|
369
|
+
return [4 /*yield*/, sdk.api.users.switch_account({ targetUserId: userPlusA.id })];
|
|
370
|
+
case 51:
|
|
371
|
+
_l.sent();
|
|
372
|
+
return [3 /*break*/, 53];
|
|
373
|
+
case 52:
|
|
374
|
+
e_1 = _l.sent();
|
|
375
|
+
lastError = e_1;
|
|
376
|
+
msg = (e_1 === null || e_1 === void 0 ? void 0 : e_1.message) || ((_j = e_1 === null || e_1 === void 0 ? void 0 : e_1.toString) === null || _j === void 0 ? void 0 : _j.call(e_1)) || String(e_1);
|
|
377
|
+
if (/too many|rate/i.test(msg)) {
|
|
378
|
+
rateLimitTripped = true;
|
|
379
|
+
return [3 /*break*/, 54];
|
|
380
|
+
}
|
|
381
|
+
return [3 /*break*/, 53];
|
|
382
|
+
case 53:
|
|
383
|
+
i++;
|
|
384
|
+
return [3 /*break*/, 48];
|
|
385
|
+
case 54:
|
|
386
|
+
(0, testing_1.assert)(rateLimitTripped, "rate limit never tripped after 15 attempts (last error: ".concat((_k = lastError === null || lastError === void 0 ? void 0 : lastError.message) !== null && _k !== void 0 ? _k : 'none', ")"), 'switch_account: rate limit enforced');
|
|
387
|
+
// Best-effort re-auth so cleanup below can use sdk
|
|
388
|
+
return [4 /*yield*/, sdk.authenticate(TEST_EMAIL, TEST_PASSWORD).catch(function () { return null; })];
|
|
389
|
+
case 55:
|
|
390
|
+
// Best-effort re-auth so cleanup below can use sdk
|
|
391
|
+
_l.sent();
|
|
392
|
+
return [3 /*break*/, 58];
|
|
393
|
+
case 56:
|
|
394
|
+
cleanup = function (fn) { return fn().catch(function () { return null; }); };
|
|
395
|
+
return [4 /*yield*/, Promise.all([
|
|
396
|
+
userPlusA && cleanup(function () { return sdk.api.users.deleteOne(userPlusA.id); }),
|
|
397
|
+
userPlusB && cleanup(function () { return sdk.api.users.deleteOne(userPlusB.id); }),
|
|
398
|
+
userPlusLocked && cleanup(function () { return sdk.api.users.deleteOne(userPlusLocked.id); }),
|
|
399
|
+
userPlusUppercase && cleanup(function () { return sdk.api.users.deleteOne(userPlusUppercase.id); }),
|
|
400
|
+
userPlusInjection && cleanup(function () { return sdk.api.users.deleteOne(userPlusInjection.id); }),
|
|
401
|
+
userReadOnly && cleanup(function () { return sdk.api.users.deleteOne(userReadOnly.id); }),
|
|
402
|
+
userOtherBase && cleanup(function () { return sdk.api.users.deleteOne(userOtherBase.id); }),
|
|
403
|
+
userPrefixSwitcher && cleanup(function () { return sdk.api.users.deleteOne(userPrefixSwitcher.id); }),
|
|
404
|
+
userNonAdminPlus && cleanup(function () { return sdk.api.users.deleteOne(userNonAdminPlus.id); }),
|
|
405
|
+
userUnverifTarget && cleanup(function () { return sdk.api.users.deleteOne(userUnverifTarget.id); }),
|
|
406
|
+
userCrossOrg && cleanup(function () { return sdkOther.api.users.deleteOne(userCrossOrg.id); }),
|
|
407
|
+
restrictiveRole && cleanup(function () { return sdk.api.role_based_access_permissions.deleteOne(restrictiveRole.id); }),
|
|
408
|
+
])];
|
|
409
|
+
case 57:
|
|
410
|
+
_l.sent();
|
|
411
|
+
return [7 /*endfinally*/];
|
|
412
|
+
case 58: return [2 /*return*/];
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
};
|
|
417
|
+
exports.account_switcher_tests = account_switcher_tests;
|
|
418
|
+
if (require.main === module) {
|
|
419
|
+
console.log("\uD83C\uDF10 Using API URL: ".concat(host));
|
|
420
|
+
var sdk_2 = new sdk_1.Session({ host: host });
|
|
421
|
+
var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
|
|
422
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
423
|
+
return __generator(this, function (_a) {
|
|
424
|
+
switch (_a.label) {
|
|
425
|
+
case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
|
|
426
|
+
case 1:
|
|
427
|
+
_a.sent();
|
|
428
|
+
return [4 /*yield*/, (0, exports.account_switcher_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
429
|
+
case 2:
|
|
430
|
+
_a.sent();
|
|
431
|
+
return [2 /*return*/];
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
}); };
|
|
435
|
+
runTests()
|
|
436
|
+
.then(function () {
|
|
437
|
+
console.log("✅ Account switcher test suite completed successfully");
|
|
438
|
+
process.exit(0);
|
|
439
|
+
})
|
|
440
|
+
.catch(function (error) {
|
|
441
|
+
console.error("❌ Account switcher test suite failed:", error);
|
|
442
|
+
process.exit(1);
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=account_switcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account_switcher.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/account_switcher.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar_events_bulk_update.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/calendar_events_bulk_update.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,eAAO,MAAM,iCAAiC;SAA0B,OAAO;mBA8X9E,CAAA"}
|