@tellescope/sdk 1.255.11 → 1.255.13
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 +4 -0
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +2 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/tests/api_tests/totp_mfa.test.d.ts +6 -0
- package/lib/cjs/tests/api_tests/totp_mfa.test.d.ts.map +1 -0
- package/lib/cjs/tests/api_tests/totp_mfa.test.js +518 -0
- package/lib/cjs/tests/api_tests/totp_mfa.test.js.map +1 -0
- package/lib/cjs/tests/tests.d.ts.map +1 -1
- package/lib/cjs/tests/tests.js +149 -145
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/esm/sdk.d.ts +4 -0
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +2 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/tests/api_tests/totp_mfa.test.d.ts +6 -0
- package/lib/esm/tests/api_tests/totp_mfa.test.d.ts.map +1 -0
- package/lib/esm/tests/api_tests/totp_mfa.test.js +511 -0
- package/lib/esm/tests/api_tests/totp_mfa.test.js.map +1 -0
- package/lib/esm/tests/tests.d.ts.map +1 -1
- package/lib/esm/tests/tests.js +149 -145
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/sdk.ts +8 -0
- package/src/tests/api_tests/totp_mfa.test.ts +385 -0
- package/src/tests/tests.ts +2 -0
- package/test_generated.pdf +0 -0
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
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;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.totp_mfa_tests = void 0;
|
|
54
|
+
require('source-map-support').install();
|
|
55
|
+
var crypto_1 = __importDefault(require("crypto"));
|
|
56
|
+
var sdk_1 = require("../../sdk");
|
|
57
|
+
var testing_1 = require("@tellescope/testing");
|
|
58
|
+
var setup_1 = require("../setup");
|
|
59
|
+
var host = process.env.API_URL || 'http://localhost:8080';
|
|
60
|
+
var decode_jwt = function (token) {
|
|
61
|
+
try {
|
|
62
|
+
var part = token.split('.')[1];
|
|
63
|
+
var json = Buffer.from(part.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8');
|
|
64
|
+
return JSON.parse(json);
|
|
65
|
+
}
|
|
66
|
+
catch (_a) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
// Client-side TOTP mirror (RFC 6238, HMAC-SHA1, 6 digits, 30s period) so the test can
|
|
71
|
+
// compute valid codes from the secret returned by begin_TOTP_configuration
|
|
72
|
+
var TOTP_PERIOD_MS = 30000;
|
|
73
|
+
var BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
74
|
+
var base32_decode = function (s) {
|
|
75
|
+
var bits = 0, value = 0;
|
|
76
|
+
var bytes = [];
|
|
77
|
+
for (var _i = 0, _a = s.toUpperCase().replace(/=+$/, ''); _i < _a.length; _i++) {
|
|
78
|
+
var char = _a[_i];
|
|
79
|
+
var index = BASE32_ALPHABET.indexOf(char);
|
|
80
|
+
if (index === -1)
|
|
81
|
+
throw new Error("Invalid base32 character");
|
|
82
|
+
value = (value << 5) | index;
|
|
83
|
+
bits += 5;
|
|
84
|
+
if (bits >= 8) {
|
|
85
|
+
bytes.push((value >>> (bits - 8)) & 255);
|
|
86
|
+
bits -= 8;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return Buffer.from(bytes);
|
|
90
|
+
};
|
|
91
|
+
var current_timestep = function () { return Math.floor(Date.now() / TOTP_PERIOD_MS); };
|
|
92
|
+
var compute_totp_code = function (secret, timestep) {
|
|
93
|
+
if (timestep === void 0) { timestep = current_timestep(); }
|
|
94
|
+
var counter = Buffer.alloc(8);
|
|
95
|
+
counter.writeBigUInt64BE(BigInt(timestep));
|
|
96
|
+
var hmac = crypto_1.default.createHmac('sha1', base32_decode(secret)).update(counter).digest();
|
|
97
|
+
var offset = hmac[hmac.length - 1] & 0xf;
|
|
98
|
+
var binary = (((hmac[offset] & 0x7f) << 24)
|
|
99
|
+
| ((hmac[offset + 1] & 0xff) << 16)
|
|
100
|
+
| ((hmac[offset + 2] & 0xff) << 8)
|
|
101
|
+
| (hmac[offset + 3] & 0xff));
|
|
102
|
+
return (binary % 1000000).toString().padStart(6, '0');
|
|
103
|
+
};
|
|
104
|
+
// a syntactically-valid 6-digit code guaranteed not to match the current/adjacent timesteps
|
|
105
|
+
var wrong_totp_code = function (secret) {
|
|
106
|
+
var step = current_timestep();
|
|
107
|
+
var valid = new Set([step - 1, step, step + 1].map(function (s) { return compute_totp_code(secret, s); }));
|
|
108
|
+
var candidate = (parseInt(compute_totp_code(secret, step)) + 1) % 1000000;
|
|
109
|
+
while (valid.has(candidate.toString().padStart(6, '0'))) {
|
|
110
|
+
candidate = (candidate + 1) % 1000000;
|
|
111
|
+
}
|
|
112
|
+
return candidate.toString().padStart(6, '0');
|
|
113
|
+
};
|
|
114
|
+
var totp_mfa_tests = function (_a) {
|
|
115
|
+
var sdk = _a.sdk, sdkNonAdmin = _a.sdkNonAdmin;
|
|
116
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
|
117
|
+
var NON_ADMIN_EMAIL, NON_ADMIN_PASSWORD, nonAdminId, businessId, totpSecret, lastVerifiedStep, wait_for_fresh_totp_step, set_allowed_mfa_methods, clear_allowed_mfa_methods, reset_mfa_state, otpauthURL_1, challengeSession_1, challengeCode_1, replaySession_1, saw429, i, e_1;
|
|
118
|
+
var _b;
|
|
119
|
+
return __generator(this, function (_c) {
|
|
120
|
+
switch (_c.label) {
|
|
121
|
+
case 0:
|
|
122
|
+
(0, testing_1.log_header)("TOTP MFA Tests");
|
|
123
|
+
NON_ADMIN_EMAIL = process.env.NON_ADMIN_EMAIL;
|
|
124
|
+
NON_ADMIN_PASSWORD = process.env.NON_ADMIN_PASSWORD;
|
|
125
|
+
if (!(NON_ADMIN_EMAIL && NON_ADMIN_PASSWORD)) {
|
|
126
|
+
throw new Error("NON_ADMIN_EMAIL and NON_ADMIN_PASSWORD must be set to run totp_mfa_tests");
|
|
127
|
+
}
|
|
128
|
+
nonAdminId = sdkNonAdmin.userInfo.id;
|
|
129
|
+
businessId = sdk.userInfo.businessId;
|
|
130
|
+
totpSecret = '';
|
|
131
|
+
lastVerifiedStep = 0;
|
|
132
|
+
wait_for_fresh_totp_step = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
133
|
+
return __generator(this, function (_a) {
|
|
134
|
+
switch (_a.label) {
|
|
135
|
+
case 0:
|
|
136
|
+
if (!(current_timestep() <= lastVerifiedStep)) return [3 /*break*/, 2];
|
|
137
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 1000)];
|
|
138
|
+
case 1:
|
|
139
|
+
_a.sent();
|
|
140
|
+
return [3 /*break*/, 0];
|
|
141
|
+
case 2: return [2 /*return*/];
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}); };
|
|
145
|
+
set_allowed_mfa_methods = function (methods) { return __awaiter(void 0, void 0, void 0, function () {
|
|
146
|
+
return __generator(this, function (_a) {
|
|
147
|
+
switch (_a.label) {
|
|
148
|
+
case 0: return [4 /*yield*/, sdk.api.users.updateOne(nonAdminId, { allowedMFAMethods: methods }, { replaceObjectFields: true })];
|
|
149
|
+
case 1:
|
|
150
|
+
_a.sent();
|
|
151
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
|
|
152
|
+
case 2:
|
|
153
|
+
_a.sent();
|
|
154
|
+
return [2 /*return*/];
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}); };
|
|
158
|
+
clear_allowed_mfa_methods = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
159
|
+
var u;
|
|
160
|
+
var _a;
|
|
161
|
+
return __generator(this, function (_b) {
|
|
162
|
+
switch (_b.label) {
|
|
163
|
+
case 0: return [4 /*yield*/, sdk.api.users.getOne(nonAdminId)];
|
|
164
|
+
case 1:
|
|
165
|
+
u = _b.sent();
|
|
166
|
+
if (!((_a = u.allowedMFAMethods) !== null && _a !== void 0 ? _a : []).length)
|
|
167
|
+
return [2 /*return*/];
|
|
168
|
+
return [4 /*yield*/, set_allowed_mfa_methods([])];
|
|
169
|
+
case 2:
|
|
170
|
+
_b.sent();
|
|
171
|
+
return [2 /*return*/];
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}); };
|
|
175
|
+
reset_mfa_state = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
176
|
+
var _a, _b, _c, authToken, user, _d;
|
|
177
|
+
return __generator(this, function (_e) {
|
|
178
|
+
switch (_e.label) {
|
|
179
|
+
case 0:
|
|
180
|
+
_e.trys.push([0, 2, , 3]);
|
|
181
|
+
return [4 /*yield*/, sdk.api.organizations.updateOne(businessId, { enforceMFA: false })];
|
|
182
|
+
case 1:
|
|
183
|
+
_e.sent();
|
|
184
|
+
return [3 /*break*/, 3];
|
|
185
|
+
case 2:
|
|
186
|
+
_a = _e.sent();
|
|
187
|
+
return [3 /*break*/, 3];
|
|
188
|
+
case 3: return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
|
|
189
|
+
case 4:
|
|
190
|
+
_e.sent();
|
|
191
|
+
_e.label = 5;
|
|
192
|
+
case 5:
|
|
193
|
+
_e.trys.push([5, 7, , 8]);
|
|
194
|
+
return [4 /*yield*/, clear_allowed_mfa_methods()];
|
|
195
|
+
case 6:
|
|
196
|
+
_e.sent();
|
|
197
|
+
return [3 /*break*/, 8];
|
|
198
|
+
case 7:
|
|
199
|
+
_b = _e.sent();
|
|
200
|
+
return [3 /*break*/, 8];
|
|
201
|
+
case 8:
|
|
202
|
+
_e.trys.push([8, 11, , 12]);
|
|
203
|
+
return [4 /*yield*/, sdkNonAdmin.api.users.configure_MFA({ disable: true })];
|
|
204
|
+
case 9:
|
|
205
|
+
_c = _e.sent(), authToken = _c.authToken, user = _c.user;
|
|
206
|
+
return [4 /*yield*/, sdkNonAdmin.handle_new_session(__assign(__assign({}, user), { authToken: authToken }))];
|
|
207
|
+
case 10:
|
|
208
|
+
_e.sent();
|
|
209
|
+
return [3 /*break*/, 12];
|
|
210
|
+
case 11:
|
|
211
|
+
_d = _e.sent();
|
|
212
|
+
return [3 /*break*/, 12];
|
|
213
|
+
case 12: return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
|
|
214
|
+
case 13:
|
|
215
|
+
_e.sent();
|
|
216
|
+
return [2 /*return*/];
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}); };
|
|
220
|
+
return [4 /*yield*/, reset_mfa_state()];
|
|
221
|
+
case 1:
|
|
222
|
+
_c.sent();
|
|
223
|
+
_c.label = 2;
|
|
224
|
+
case 2:
|
|
225
|
+
_c.trys.push([2, , 49, 51]);
|
|
226
|
+
// ============================================================
|
|
227
|
+
// A. Enrollment
|
|
228
|
+
// ============================================================
|
|
229
|
+
(0, testing_1.log_header)("A. TOTP Enrollment");
|
|
230
|
+
otpauthURL_1 = '';
|
|
231
|
+
return [4 /*yield*/, (0, testing_1.async_test)('A1. begin_TOTP_configuration returns otpauthURL + secret', function () { return sdkNonAdmin.api.users.begin_TOTP_configuration({}); }, { shouldError: false, onResult: function (r) {
|
|
232
|
+
totpSecret = r.secret;
|
|
233
|
+
otpauthURL_1 = r.otpauthURL;
|
|
234
|
+
return typeof r.secret === 'string' && r.secret.length >= 16 && /^[A-Z2-7]+$/.test(r.secret);
|
|
235
|
+
} })];
|
|
236
|
+
case 3:
|
|
237
|
+
_c.sent();
|
|
238
|
+
(0, testing_1.assert)(otpauthURL_1.includes(totpSecret), 'otpauthURL missing secret', 'A2. otpauthURL contains secret');
|
|
239
|
+
(0, testing_1.assert)(otpauthURL_1.startsWith('otpauth://totp/'), 'unexpected otpauth scheme', 'A3. otpauth scheme');
|
|
240
|
+
(0, testing_1.assert)(otpauthURL_1.includes('issuer=Tellescope'), 'otpauthURL missing issuer', 'A4. otpauthURL issuer');
|
|
241
|
+
return [4 /*yield*/, (0, testing_1.async_test)('A5. confirm with wrong code -> 401', function () { return sdkNonAdmin.api.users.confirm_TOTP_configuration({ code: wrong_totp_code(totpSecret) }); }, { shouldError: true, onError: function (e) { return e.statusCode === 401 || /invalid/i.test(e.message || ''); } })];
|
|
242
|
+
case 4:
|
|
243
|
+
_c.sent();
|
|
244
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 600)]; // confirm rate limit is 1/500ms
|
|
245
|
+
case 5:
|
|
246
|
+
_c.sent(); // confirm rate limit is 1/500ms
|
|
247
|
+
return [4 /*yield*/, (0, testing_1.async_test)('A6. confirm with correct code -> enabled, 10 recovery codes, requiresMFA false', function () { return sdkNonAdmin.api.users.confirm_TOTP_configuration({ code: compute_totp_code(totpSecret) }); }, { shouldError: false, onResult: function (r) {
|
|
248
|
+
var _a, _b, _c, _d;
|
|
249
|
+
if (r.authToken)
|
|
250
|
+
sdkNonAdmin.handle_new_session(__assign(__assign({}, r.user), { authToken: r.authToken }));
|
|
251
|
+
return (((_a = r.recoveryCodes) === null || _a === void 0 ? void 0 : _a.length) === 10
|
|
252
|
+
&& ((_c = (_b = r.user) === null || _b === void 0 ? void 0 : _b.mfa) === null || _c === void 0 ? void 0 : _c.authenticator) === true
|
|
253
|
+
&& ((_d = decode_jwt(r.authToken)) === null || _d === void 0 ? void 0 : _d.requiresMFA) === false);
|
|
254
|
+
} })];
|
|
255
|
+
case 6:
|
|
256
|
+
_c.sent();
|
|
257
|
+
lastVerifiedStep = current_timestep();
|
|
258
|
+
return [4 /*yield*/, (0, testing_1.async_test)('A7. user record has mfa.authenticator === true', function () { return sdk.api.users.getOne(nonAdminId); }, { shouldError: false, onResult: function (u) { var _a, _b; return ((_a = u.mfa) === null || _a === void 0 ? void 0 : _a.authenticator) === true && !((_b = u.mfa) === null || _b === void 0 ? void 0 : _b.email); } })];
|
|
259
|
+
case 7:
|
|
260
|
+
_c.sent();
|
|
261
|
+
return [4 /*yield*/, (0, testing_1.async_test)('A8. begin again while enrolled -> 400', function () { return sdkNonAdmin.api.users.begin_TOTP_configuration({}); }, { shouldError: true, onError: function (e) { return e.statusCode === 400 || /already configured/i.test(e.message || ''); } })
|
|
262
|
+
// ============================================================
|
|
263
|
+
// B. Login challenge + replay protection
|
|
264
|
+
// ============================================================
|
|
265
|
+
];
|
|
266
|
+
case 8:
|
|
267
|
+
_c.sent();
|
|
268
|
+
// ============================================================
|
|
269
|
+
// B. Login challenge + replay protection
|
|
270
|
+
// ============================================================
|
|
271
|
+
(0, testing_1.log_header)("B. TOTP Challenge + Replay");
|
|
272
|
+
challengeSession_1 = new sdk_1.Session({ host: host });
|
|
273
|
+
return [4 /*yield*/, challengeSession_1.authenticate(NON_ADMIN_EMAIL, NON_ADMIN_PASSWORD)];
|
|
274
|
+
case 9:
|
|
275
|
+
_c.sent();
|
|
276
|
+
(0, testing_1.assert)(!!challengeSession_1.userInfo.requiresMFA || ((_b = decode_jwt(challengeSession_1.authToken)) === null || _b === void 0 ? void 0 : _b.requiresMFA) === true, 'expected requiresMFA session after password login with TOTP enabled', 'B1. password login yields requiresMFA session');
|
|
277
|
+
return [4 /*yield*/, wait_for_fresh_totp_step()];
|
|
278
|
+
case 10:
|
|
279
|
+
_c.sent();
|
|
280
|
+
challengeCode_1 = compute_totp_code(totpSecret);
|
|
281
|
+
return [4 /*yield*/, (0, testing_1.async_test)('B2. submit_MFA_challenge with TOTP code -> full session', function () { return challengeSession_1.api.users.submit_MFA_challenge({ code: challengeCode_1 }); }, { shouldError: false, onResult: function (r) { var _a; return ((_a = decode_jwt(r.authToken)) === null || _a === void 0 ? void 0 : _a.requiresMFA) === false; } })];
|
|
282
|
+
case 11:
|
|
283
|
+
_c.sent();
|
|
284
|
+
lastVerifiedStep = current_timestep();
|
|
285
|
+
replaySession_1 = new sdk_1.Session({ host: host });
|
|
286
|
+
return [4 /*yield*/, replaySession_1.authenticate(NON_ADMIN_EMAIL, NON_ADMIN_PASSWORD)];
|
|
287
|
+
case 12:
|
|
288
|
+
_c.sent();
|
|
289
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 600)]; // submit rate limit is 1/500ms
|
|
290
|
+
case 13:
|
|
291
|
+
_c.sent(); // submit rate limit is 1/500ms
|
|
292
|
+
return [4 /*yield*/, (0, testing_1.async_test)('B3. replaying the same TOTP code -> 401', function () { return replaySession_1.api.users.submit_MFA_challenge({ code: challengeCode_1 }); }, { shouldError: true, onError: function (e) { return e.statusCode === 401 || /invalid/i.test(e.message || ''); } })
|
|
293
|
+
// ============================================================
|
|
294
|
+
// C. Recovery-code interplay with a second method
|
|
295
|
+
// ============================================================
|
|
296
|
+
];
|
|
297
|
+
case 14:
|
|
298
|
+
_c.sent();
|
|
299
|
+
// ============================================================
|
|
300
|
+
// C. Recovery-code interplay with a second method
|
|
301
|
+
// ============================================================
|
|
302
|
+
(0, testing_1.log_header)("C. Recovery-code interplay");
|
|
303
|
+
return [4 /*yield*/, (0, testing_1.async_test)('C1. enabling email MFA when TOTP already configured -> recoveryCodes []', function () { return sdkNonAdmin.api.users.configure_MFA({}); }, { shouldError: false, onResult: function (r) {
|
|
304
|
+
var _a, _b, _c, _d, _e;
|
|
305
|
+
if (r.authToken)
|
|
306
|
+
sdkNonAdmin.handle_new_session(__assign(__assign({}, r.user), { authToken: r.authToken }));
|
|
307
|
+
return ((_a = r.recoveryCodes) === null || _a === void 0 ? void 0 : _a.length) === 0 && ((_c = (_b = r.user) === null || _b === void 0 ? void 0 : _b.mfa) === null || _c === void 0 ? void 0 : _c.email) === true && ((_e = (_d = r.user) === null || _d === void 0 ? void 0 : _d.mfa) === null || _e === void 0 ? void 0 : _e.authenticator) === true;
|
|
308
|
+
} })
|
|
309
|
+
// ============================================================
|
|
310
|
+
// D. Method-scoped disable + enforceMFA last-method rule
|
|
311
|
+
// ============================================================
|
|
312
|
+
];
|
|
313
|
+
case 15:
|
|
314
|
+
_c.sent();
|
|
315
|
+
// ============================================================
|
|
316
|
+
// D. Method-scoped disable + enforceMFA last-method rule
|
|
317
|
+
// ============================================================
|
|
318
|
+
(0, testing_1.log_header)("D. Method-scoped disable");
|
|
319
|
+
return [4 /*yield*/, sdk.api.organizations.updateOne(businessId, { enforceMFA: true })];
|
|
320
|
+
case 16:
|
|
321
|
+
_c.sent();
|
|
322
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
|
|
323
|
+
case 17:
|
|
324
|
+
_c.sent();
|
|
325
|
+
return [4 /*yield*/, (0, testing_1.async_test)('D1. disable email (other method remains) succeeds under enforceMFA', function () { return sdkNonAdmin.api.users.configure_MFA({ disable: true, method: 'email' }); }, { shouldError: false, onResult: function (r) {
|
|
326
|
+
var _a, _b, _c, _d;
|
|
327
|
+
if (r.authToken)
|
|
328
|
+
sdkNonAdmin.handle_new_session(__assign(__assign({}, r.user), { authToken: r.authToken }));
|
|
329
|
+
return !((_b = (_a = r.user) === null || _a === void 0 ? void 0 : _a.mfa) === null || _b === void 0 ? void 0 : _b.email) && ((_d = (_c = r.user) === null || _c === void 0 ? void 0 : _c.mfa) === null || _d === void 0 ? void 0 : _d.authenticator) === true;
|
|
330
|
+
} })];
|
|
331
|
+
case 18:
|
|
332
|
+
_c.sent();
|
|
333
|
+
return [4 /*yield*/, (0, testing_1.async_test)('D2. disabling last method under enforceMFA -> 400', function () { return sdkNonAdmin.api.users.configure_MFA({ disable: true, method: 'authenticator' }); }, { shouldError: true, onError: function (e) { return e.statusCode === 400 || /at least one/i.test(e.message || ''); } })];
|
|
334
|
+
case 19:
|
|
335
|
+
_c.sent();
|
|
336
|
+
return [4 /*yield*/, sdk.api.organizations.updateOne(businessId, { enforceMFA: false })];
|
|
337
|
+
case 20:
|
|
338
|
+
_c.sent();
|
|
339
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
|
|
340
|
+
case 21:
|
|
341
|
+
_c.sent();
|
|
342
|
+
return [4 /*yield*/, (0, testing_1.async_test)('D3. disable authenticator (enforceMFA off) succeeds', function () { return sdkNonAdmin.api.users.configure_MFA({ disable: true, method: 'authenticator' }); }, { shouldError: false, onResult: function (r) {
|
|
343
|
+
var _a, _b, _c, _d;
|
|
344
|
+
if (r.authToken)
|
|
345
|
+
sdkNonAdmin.handle_new_session(__assign(__assign({}, r.user), { authToken: r.authToken }));
|
|
346
|
+
return !((_b = (_a = r.user) === null || _a === void 0 ? void 0 : _a.mfa) === null || _b === void 0 ? void 0 : _b.authenticator) && !((_d = (_c = r.user) === null || _c === void 0 ? void 0 : _c.mfa) === null || _d === void 0 ? void 0 : _d.email);
|
|
347
|
+
} })];
|
|
348
|
+
case 22:
|
|
349
|
+
_c.sent();
|
|
350
|
+
return [4 /*yield*/, (0, testing_1.async_test)('D4. user record mfa cleared', function () { return sdk.api.users.getOne(nonAdminId); }, { shouldError: false, onResult: function (u) { var _a, _b; return !((_a = u.mfa) === null || _a === void 0 ? void 0 : _a.authenticator) && !((_b = u.mfa) === null || _b === void 0 ? void 0 : _b.email); } })
|
|
351
|
+
// TOTP secret deleted with the method: a still-valid-looking code must no longer verify
|
|
352
|
+
];
|
|
353
|
+
case 23:
|
|
354
|
+
_c.sent();
|
|
355
|
+
// TOTP secret deleted with the method: a still-valid-looking code must no longer verify
|
|
356
|
+
return [4 /*yield*/, wait_for_fresh_totp_step()];
|
|
357
|
+
case 24:
|
|
358
|
+
// TOTP secret deleted with the method: a still-valid-looking code must no longer verify
|
|
359
|
+
_c.sent();
|
|
360
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 600)]; // submit rate limit is 1/500ms
|
|
361
|
+
case 25:
|
|
362
|
+
_c.sent(); // submit rate limit is 1/500ms
|
|
363
|
+
return [4 /*yield*/, (0, testing_1.async_test)('D5. TOTP submit after disable -> 401 (secret deleted)', function () { return sdkNonAdmin.api.users.submit_MFA_challenge({ code: compute_totp_code(totpSecret) }); }, { shouldError: true, onError: function (e) { return e.statusCode === 401 || /invalid/i.test(e.message || ''); } })
|
|
364
|
+
// ============================================================
|
|
365
|
+
// E. allowedMFAMethods restriction gating + grace
|
|
366
|
+
// ============================================================
|
|
367
|
+
];
|
|
368
|
+
case 26:
|
|
369
|
+
_c.sent();
|
|
370
|
+
// ============================================================
|
|
371
|
+
// E. allowedMFAMethods restriction gating + grace
|
|
372
|
+
// ============================================================
|
|
373
|
+
(0, testing_1.log_header)("E. allowedMFAMethods gating");
|
|
374
|
+
return [4 /*yield*/, set_allowed_mfa_methods(['authenticator'])];
|
|
375
|
+
case 27:
|
|
376
|
+
_c.sent();
|
|
377
|
+
return [4 /*yield*/, (0, testing_1.async_test)('E1. restricted to authenticator: enabling email MFA -> 403', function () { return sdkNonAdmin.api.users.configure_MFA({}); }, { shouldError: true, onError: function (e) { return e.statusCode === 403 || /not permitted/i.test(e.message || ''); } })];
|
|
378
|
+
case 28:
|
|
379
|
+
_c.sent();
|
|
380
|
+
return [4 /*yield*/, (0, testing_1.async_test)('E2. restricted to authenticator + email unconfigured: email challenge -> 403', function () { return sdkNonAdmin.api.users.generate_MFA_challenge({ method: 'email' }); }, { shouldError: true, onError: function (e) { return e.statusCode === 403 || /not permitted/i.test(e.message || ''); } })];
|
|
381
|
+
case 29:
|
|
382
|
+
_c.sent();
|
|
383
|
+
return [4 /*yield*/, set_allowed_mfa_methods(['email'])];
|
|
384
|
+
case 30:
|
|
385
|
+
_c.sent();
|
|
386
|
+
return [4 /*yield*/, (0, testing_1.async_test)('E3. restricted to email: begin_TOTP_configuration -> 403', function () { return sdkNonAdmin.api.users.begin_TOTP_configuration({}); }, { shouldError: true, onError: function (e) { return e.statusCode === 403 || /not permitted/i.test(e.message || ''); } })];
|
|
387
|
+
case 31:
|
|
388
|
+
_c.sent();
|
|
389
|
+
return [4 /*yield*/, (0, testing_1.async_test)('E4. restricted to email: enabling email MFA succeeds (first method -> 10 recovery codes)', function () { return sdkNonAdmin.api.users.configure_MFA({}); }, { shouldError: false, onResult: function (r) {
|
|
390
|
+
var _a, _b, _c;
|
|
391
|
+
if (r.authToken)
|
|
392
|
+
sdkNonAdmin.handle_new_session(__assign(__assign({}, r.user), { authToken: r.authToken }));
|
|
393
|
+
return ((_a = r.recoveryCodes) === null || _a === void 0 ? void 0 : _a.length) === 10 && ((_c = (_b = r.user) === null || _b === void 0 ? void 0 : _b.mfa) === null || _c === void 0 ? void 0 : _c.email) === true;
|
|
394
|
+
} })
|
|
395
|
+
// grace: email is configured, then the user is restricted to authenticator-only —
|
|
396
|
+
// the already-configured email method must keep working (no lockout)
|
|
397
|
+
];
|
|
398
|
+
case 32:
|
|
399
|
+
_c.sent();
|
|
400
|
+
// grace: email is configured, then the user is restricted to authenticator-only —
|
|
401
|
+
// the already-configured email method must keep working (no lockout)
|
|
402
|
+
return [4 /*yield*/, set_allowed_mfa_methods(['authenticator'])];
|
|
403
|
+
case 33:
|
|
404
|
+
// grace: email is configured, then the user is restricted to authenticator-only —
|
|
405
|
+
// the already-configured email method must keep working (no lockout)
|
|
406
|
+
_c.sent();
|
|
407
|
+
return [4 /*yield*/, (0, testing_1.async_test)('E5. grace: configured email challenge still works after restriction', function () { return sdkNonAdmin.api.users.generate_MFA_challenge({ method: 'email' }); }, { shouldError: false, onResult: function () { return true; } })
|
|
408
|
+
// cleanup E: clear restriction + disable email
|
|
409
|
+
];
|
|
410
|
+
case 34:
|
|
411
|
+
_c.sent();
|
|
412
|
+
// cleanup E: clear restriction + disable email
|
|
413
|
+
return [4 /*yield*/, clear_allowed_mfa_methods()];
|
|
414
|
+
case 35:
|
|
415
|
+
// cleanup E: clear restriction + disable email
|
|
416
|
+
_c.sent();
|
|
417
|
+
return [4 /*yield*/, (0, testing_1.async_test)('E6. cleanup: disable email', function () { return sdkNonAdmin.api.users.configure_MFA({ disable: true, method: 'email' }); }, { shouldError: false, onResult: function (r) {
|
|
418
|
+
if (r.authToken)
|
|
419
|
+
sdkNonAdmin.handle_new_session(__assign(__assign({}, r.user), { authToken: r.authToken }));
|
|
420
|
+
return true;
|
|
421
|
+
} })
|
|
422
|
+
// ============================================================
|
|
423
|
+
// F. allowedMFAMethods is admin-only
|
|
424
|
+
// ============================================================
|
|
425
|
+
];
|
|
426
|
+
case 36:
|
|
427
|
+
_c.sent();
|
|
428
|
+
// ============================================================
|
|
429
|
+
// F. allowedMFAMethods is admin-only
|
|
430
|
+
// ============================================================
|
|
431
|
+
(0, testing_1.log_header)("F. allowedMFAMethods admin gate");
|
|
432
|
+
return [4 /*yield*/, (0, testing_1.async_test)('F1. non-admin cannot update allowedMFAMethods', function () { return sdkNonAdmin.api.users.updateOne(nonAdminId, { allowedMFAMethods: ['email'] }, { replaceObjectFields: true }); }, { shouldError: true, onError: function (e) { return /admin/i.test(e.message || '') || e.statusCode === 400 || e.statusCode === 403; } })];
|
|
433
|
+
case 37:
|
|
434
|
+
_c.sent();
|
|
435
|
+
return [4 /*yield*/, (0, testing_1.async_test)('F2. admin can update allowedMFAMethods', function () { return sdk.api.users.updateOne(nonAdminId, { allowedMFAMethods: ['email'] }, { replaceObjectFields: true }); }, { shouldError: false, onResult: function () { return true; } })];
|
|
436
|
+
case 38:
|
|
437
|
+
_c.sent();
|
|
438
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 250)];
|
|
439
|
+
case 39:
|
|
440
|
+
_c.sent();
|
|
441
|
+
return [4 /*yield*/, (0, testing_1.async_test)('F3. allowedMFAMethods persisted', function () { return sdk.api.users.getOne(nonAdminId); }, { shouldError: false, onResult: function (u) { return JSON.stringify(u.allowedMFAMethods) === JSON.stringify(['email']); } })];
|
|
442
|
+
case 40:
|
|
443
|
+
_c.sent();
|
|
444
|
+
return [4 /*yield*/, clear_allowed_mfa_methods()
|
|
445
|
+
// ============================================================
|
|
446
|
+
// G. Brute-force rate limit (runs last: exhausts the 10/10min submit bucket)
|
|
447
|
+
// ============================================================
|
|
448
|
+
];
|
|
449
|
+
case 41:
|
|
450
|
+
_c.sent();
|
|
451
|
+
// ============================================================
|
|
452
|
+
// G. Brute-force rate limit (runs last: exhausts the 10/10min submit bucket)
|
|
453
|
+
// ============================================================
|
|
454
|
+
(0, testing_1.log_header)("G. Brute-force rate limit");
|
|
455
|
+
saw429 = false;
|
|
456
|
+
i = 0;
|
|
457
|
+
_c.label = 42;
|
|
458
|
+
case 42:
|
|
459
|
+
if (!(i < 12 && !saw429)) return [3 /*break*/, 48];
|
|
460
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 600)]; // stay under the 1/500ms bucket so only the 10/10min bucket trips
|
|
461
|
+
case 43:
|
|
462
|
+
_c.sent(); // stay under the 1/500ms bucket so only the 10/10min bucket trips
|
|
463
|
+
_c.label = 44;
|
|
464
|
+
case 44:
|
|
465
|
+
_c.trys.push([44, 46, , 47]);
|
|
466
|
+
return [4 /*yield*/, sdkNonAdmin.api.users.submit_MFA_challenge({ code: '123456' })];
|
|
467
|
+
case 45:
|
|
468
|
+
_c.sent();
|
|
469
|
+
return [3 /*break*/, 47];
|
|
470
|
+
case 46:
|
|
471
|
+
e_1 = _c.sent();
|
|
472
|
+
if (e_1.statusCode === 429 || /rate limit/i.test(e_1.message || ''))
|
|
473
|
+
saw429 = true;
|
|
474
|
+
return [3 /*break*/, 47];
|
|
475
|
+
case 47:
|
|
476
|
+
i++;
|
|
477
|
+
return [3 /*break*/, 42];
|
|
478
|
+
case 48:
|
|
479
|
+
(0, testing_1.assert)(saw429, 'expected 429 from repeated bad MFA submissions', 'G1. repeated bad codes hit 10/10min rate limit');
|
|
480
|
+
return [3 /*break*/, 51];
|
|
481
|
+
case 49: return [4 /*yield*/, reset_mfa_state()];
|
|
482
|
+
case 50:
|
|
483
|
+
_c.sent();
|
|
484
|
+
return [7 /*endfinally*/];
|
|
485
|
+
case 51: return [2 /*return*/];
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
};
|
|
490
|
+
exports.totp_mfa_tests = totp_mfa_tests;
|
|
491
|
+
// Allow running this test file independently
|
|
492
|
+
if (require.main === module) {
|
|
493
|
+
var sdk_2 = new sdk_1.Session({ host: host });
|
|
494
|
+
var sdkNonAdmin_1 = new sdk_1.Session({ host: host });
|
|
495
|
+
var runTests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
496
|
+
return __generator(this, function (_a) {
|
|
497
|
+
switch (_a.label) {
|
|
498
|
+
case 0: return [4 /*yield*/, (0, setup_1.setup_tests)(sdk_2, sdkNonAdmin_1)];
|
|
499
|
+
case 1:
|
|
500
|
+
_a.sent();
|
|
501
|
+
return [4 /*yield*/, (0, exports.totp_mfa_tests)({ sdk: sdk_2, sdkNonAdmin: sdkNonAdmin_1 })];
|
|
502
|
+
case 2:
|
|
503
|
+
_a.sent();
|
|
504
|
+
return [2 /*return*/];
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}); };
|
|
508
|
+
runTests()
|
|
509
|
+
.then(function () {
|
|
510
|
+
console.log("✅ TOTP MFA test suite completed successfully");
|
|
511
|
+
process.exit(0);
|
|
512
|
+
})
|
|
513
|
+
.catch(function (error) {
|
|
514
|
+
console.error("❌ TOTP MFA test suite failed:", error);
|
|
515
|
+
process.exit(1);
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=totp_mfa.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp_mfa.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/totp_mfa.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":"AAy0EA,eAAO,MAAM,kCAAkC,qBAgJ9C,CAAA;AAED,eAAO,MAAM,mCAAmC,qBA2K/C,CAAA;AAGD,eAAO,MAAM,oBAAoB,qBAoHhC,CAAA;AAED,eAAO,MAAM,+BAA+B,qBAsF3C,CAAA;AAID,eAAO,MAAM,0BAA0B,qBAqCtC,CAAA;AAu1FD,eAAO,MAAM,cAAc,qBAqC1B,CAAA;AAotBD,eAAO,MAAM,0BAA0B,qBAmFtC,CAAA;AAqED,eAAO,MAAM,eAAe,qBAmD3B,CAAA;AAED,eAAO,MAAM,oBAAoB,6BAsBhC,CAAA;AAED,eAAO,MAAM,oCAAoC,qBA4pBhD,CAAA;AAED,eAAO,MAAM,mCAAmC,qBAkE/C,CAAA;AAw7CD,eAAO,MAAM,yBAAyB,qBA0DrC,CAAA;AAED,eAAO,MAAM,kBAAkB,qBAmK9B,CAAA;AAED,eAAO,MAAM,sBAAsB,qBA0BlC,CAAA;AAGD,eAAO,MAAM,mBAAmB,qBAmC/B,CAAA;AAED,eAAO,MAAM,gCAAgC,mCA8C5C,CAAA;AAED,eAAO,MAAM,cAAc,qBAwb1B,CAAA;AAGD,eAAO,MAAM,oBAAoB,uBAuBhC,CAAA;AA4wBD,eAAO,MAAM,4BAA4B,qBAoExC,CAAA;AAED,eAAO,MAAM,+BAA+B,qBA4U3C,CAAA;AAED,eAAO,MAAM,gDAAgD,qBAwC5D,CAAA;AAED,eAAO,MAAM,qBAAqB,qBAwIjC,CAAA"}
|