@proteinjs/user-server 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/generated/index.js +1 -1
- package/dist/generated/index.js.map +1 -1
- package/dist/src/routes/devLogin.d.ts +10 -0
- package/dist/src/routes/devLogin.d.ts.map +1 -1
- package/dist/src/routes/devLogin.js +28 -9
- package/dist/src/routes/devLogin.js.map +1 -1
- package/dist/src/services/Roles.d.ts +20 -1
- package/dist/src/services/Roles.d.ts.map +1 -1
- package/dist/src/services/Roles.js +79 -3
- package/dist/src/services/Roles.js.map +1 -1
- package/dist/test/DevLogin.test.js +13 -41
- package/dist/test/DevLogin.test.js.map +1 -1
- package/dist/test/DevLoginBootstrapAdmin.test.d.ts +2 -0
- package/dist/test/DevLoginBootstrapAdmin.test.d.ts.map +1 -0
- package/dist/test/DevLoginBootstrapAdmin.test.js +384 -0
- package/dist/test/DevLoginBootstrapAdmin.test.js.map +1 -0
- package/dist/test/devLoginHarness.d.ts +16 -0
- package/dist/test/devLoginHarness.d.ts.map +1 -0
- package/dist/test/devLoginHarness.js +79 -0
- package/dist/test/devLoginHarness.js.map +1 -0
- package/generated/index.ts +1 -1
- package/package.json +2 -2
- package/src/routes/devLogin.ts +17 -0
- package/src/services/Roles.ts +49 -4
- package/test/DevLogin.test.ts +5 -36
- package/test/DevLoginBootstrapAdmin.test.ts +175 -0
- package/test/devLoginHarness.ts +39 -0
|
@@ -0,0 +1,384 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var db_1 = require("@proteinjs/db");
|
|
40
|
+
var user_1 = require("@proteinjs/user");
|
|
41
|
+
var devLoginHarness_1 = require("./devLoginHarness");
|
|
42
|
+
var UserServerTestEnvironment_1 = require("./UserServerTestEnvironment");
|
|
43
|
+
var testEnv = new UserServerTestEnvironment_1.UserServerTestEnvironment();
|
|
44
|
+
/**
|
|
45
|
+
* `DEV_BOOTSTRAP_ADMIN_EMAIL` — the first-admin door INSIDE `/dev/login` (n3xa plans/DEV_ESTATES.md
|
|
46
|
+
* D3, founder-ruled 2026-09-04). A dev estate on a fresh real database has no privileged account
|
|
47
|
+
* to grant from, and the no-raw-DB rule forbids the emulator-era seed scripts there — so the ONE
|
|
48
|
+
* sanctioned account door mints break-glass, once:
|
|
49
|
+
* - behind the door's existing two gates (DEVELOPMENT AND DEV_AUTO_LOGIN_EMAIL): closed = 404 as
|
|
50
|
+
* before, and the variable changes nothing;
|
|
51
|
+
* - only while NO account carries 'admin' (the same membership test the app's admin checks make);
|
|
52
|
+
* - only for the request whose resolved address equals the variable exactly (case-normalized
|
|
53
|
+
* the way every account email is);
|
|
54
|
+
* - once, audited like any grant (a role_grant_event row; actor = the account itself — the door
|
|
55
|
+
* acts for nobody else); a later call finds an admin and grants nothing.
|
|
56
|
+
* Outcomes are asserted on the rows (roles, audit), never on calls.
|
|
57
|
+
*/
|
|
58
|
+
var ENV_EMAIL = 'dev@test.local';
|
|
59
|
+
var BOOTSTRAP_EMAIL = 'owner@test.local';
|
|
60
|
+
var userRow = function (email) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
61
|
+
switch (_a.label) {
|
|
62
|
+
case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { email: email })];
|
|
63
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
64
|
+
}
|
|
65
|
+
}); }); };
|
|
66
|
+
var auditRows = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
67
|
+
switch (_a.label) {
|
|
68
|
+
case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(user_1.tables.RoleGrantEvent, {})];
|
|
69
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
70
|
+
}
|
|
71
|
+
}); }); };
|
|
72
|
+
var adminRows = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
73
|
+
switch (_a.label) {
|
|
74
|
+
case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(user_1.tables.User, {})];
|
|
75
|
+
case 1: return [2 /*return*/, (_a.sent()).filter(function (user) { var _a; return ((_a = user.roles) !== null && _a !== void 0 ? _a : []).includes('admin'); })];
|
|
76
|
+
}
|
|
77
|
+
}); }); };
|
|
78
|
+
describe('devLogin — the DEV_BOOTSTRAP_ADMIN_EMAIL first-admin door', function () {
|
|
79
|
+
var originalEnv = {
|
|
80
|
+
DEVELOPMENT: process.env.DEVELOPMENT,
|
|
81
|
+
DEV_AUTO_LOGIN_EMAIL: process.env.DEV_AUTO_LOGIN_EMAIL,
|
|
82
|
+
DEV_BOOTSTRAP_ADMIN_EMAIL: process.env.DEV_BOOTSTRAP_ADMIN_EMAIL,
|
|
83
|
+
};
|
|
84
|
+
beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
85
|
+
return __generator(this, function (_a) {
|
|
86
|
+
switch (_a.label) {
|
|
87
|
+
case 0: return [4 /*yield*/, testEnv.beforeAll()];
|
|
88
|
+
case 1:
|
|
89
|
+
_a.sent();
|
|
90
|
+
return [2 /*return*/];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}); });
|
|
94
|
+
afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
95
|
+
return __generator(this, function (_a) {
|
|
96
|
+
switch (_a.label) {
|
|
97
|
+
case 0: return [4 /*yield*/, testEnv.afterAll()];
|
|
98
|
+
case 1:
|
|
99
|
+
_a.sent();
|
|
100
|
+
return [2 /*return*/];
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}); });
|
|
104
|
+
beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
105
|
+
var db;
|
|
106
|
+
return __generator(this, function (_a) {
|
|
107
|
+
switch (_a.label) {
|
|
108
|
+
case 0:
|
|
109
|
+
process.env.DEVELOPMENT = 'true';
|
|
110
|
+
process.env.DEV_AUTO_LOGIN_EMAIL = ENV_EMAIL;
|
|
111
|
+
process.env.DEV_BOOTSTRAP_ADMIN_EMAIL = BOOTSTRAP_EMAIL;
|
|
112
|
+
db = (0, db_1.getDbAsSystem)();
|
|
113
|
+
return [4 /*yield*/, db.delete(user_1.tables.RoleGrantEvent, {})];
|
|
114
|
+
case 1:
|
|
115
|
+
_a.sent();
|
|
116
|
+
return [4 /*yield*/, db.delete(user_1.tables.User, {})];
|
|
117
|
+
case 2:
|
|
118
|
+
_a.sent();
|
|
119
|
+
return [2 /*return*/];
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}); });
|
|
123
|
+
afterEach(function () {
|
|
124
|
+
for (var _i = 0, _a = Object.entries(originalEnv); _i < _a.length; _i++) {
|
|
125
|
+
var _b = _a[_i], key = _b[0], value = _b[1];
|
|
126
|
+
if (value === undefined) {
|
|
127
|
+
delete process.env[key];
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
process.env[key] = value;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
it('a fresh database + the matching address: the account is created carrying admin, audited once, and logged in', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
135
|
+
var _a, outcome, owner, events, _b;
|
|
136
|
+
return __generator(this, function (_c) {
|
|
137
|
+
switch (_c.label) {
|
|
138
|
+
case 0:
|
|
139
|
+
_a = expect;
|
|
140
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
141
|
+
case 1:
|
|
142
|
+
_a.apply(void 0, [_c.sent()]).toBeUndefined();
|
|
143
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
144
|
+
case 2:
|
|
145
|
+
outcome = _c.sent();
|
|
146
|
+
expect(outcome.loggedInAs).toBe(BOOTSTRAP_EMAIL);
|
|
147
|
+
expect(outcome.sessionSaved).toBe(true);
|
|
148
|
+
expect(outcome.redirect).toBe('/');
|
|
149
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
150
|
+
case 3:
|
|
151
|
+
owner = _c.sent();
|
|
152
|
+
expect(owner.roles).toEqual(['admin']);
|
|
153
|
+
return [4 /*yield*/, auditRows()];
|
|
154
|
+
case 4:
|
|
155
|
+
events = _c.sent();
|
|
156
|
+
expect(events).toHaveLength(1);
|
|
157
|
+
expect(events[0]).toMatchObject({ actor: owner.id, target: owner.id, role: 'admin', action: 'grant' });
|
|
158
|
+
_b = expect;
|
|
159
|
+
return [4 /*yield*/, adminRows()];
|
|
160
|
+
case 5:
|
|
161
|
+
_b.apply(void 0, [_c.sent()]).toHaveLength(1);
|
|
162
|
+
return [2 /*return*/];
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}); });
|
|
166
|
+
it('a second call for the same address changes nothing: still exactly one admin, one grant', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
167
|
+
var outcome, _a, _b, _c;
|
|
168
|
+
return __generator(this, function (_d) {
|
|
169
|
+
switch (_d.label) {
|
|
170
|
+
case 0: return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
171
|
+
case 1:
|
|
172
|
+
_d.sent();
|
|
173
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
174
|
+
case 2:
|
|
175
|
+
outcome = _d.sent();
|
|
176
|
+
expect(outcome.loggedInAs).toBe(BOOTSTRAP_EMAIL);
|
|
177
|
+
_a = expect;
|
|
178
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
179
|
+
case 3:
|
|
180
|
+
_a.apply(void 0, [(_d.sent()).roles]).toEqual(['admin']);
|
|
181
|
+
_b = expect;
|
|
182
|
+
return [4 /*yield*/, auditRows()];
|
|
183
|
+
case 4:
|
|
184
|
+
_b.apply(void 0, [_d.sent()]).toHaveLength(1);
|
|
185
|
+
_c = expect;
|
|
186
|
+
return [4 /*yield*/, adminRows()];
|
|
187
|
+
case 5:
|
|
188
|
+
_c.apply(void 0, [_d.sent()]).toHaveLength(1);
|
|
189
|
+
return [2 /*return*/];
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}); });
|
|
193
|
+
it('an existing role-less account at the matching address is granted admin on its next login — the door serves created and loaded accounts alike', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
194
|
+
var outcome, _a, _b;
|
|
195
|
+
return __generator(this, function (_c) {
|
|
196
|
+
switch (_c.label) {
|
|
197
|
+
case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Owner', email: BOOTSTRAP_EMAIL })];
|
|
198
|
+
case 1:
|
|
199
|
+
_c.sent();
|
|
200
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
201
|
+
case 2:
|
|
202
|
+
outcome = _c.sent();
|
|
203
|
+
expect(outcome.loggedInAs).toBe(BOOTSTRAP_EMAIL);
|
|
204
|
+
_a = expect;
|
|
205
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
206
|
+
case 3:
|
|
207
|
+
_a.apply(void 0, [(_c.sent()).roles]).toEqual(['admin']);
|
|
208
|
+
_b = expect;
|
|
209
|
+
return [4 /*yield*/, auditRows()];
|
|
210
|
+
case 4:
|
|
211
|
+
_b.apply(void 0, [_c.sent()]).toHaveLength(1);
|
|
212
|
+
return [2 /*return*/];
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}); });
|
|
216
|
+
it('the default path is a request for DEV_AUTO_LOGIN_EMAIL: when that IS the bootstrap address, the default account carries admin', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
217
|
+
var outcome, _a, _b;
|
|
218
|
+
return __generator(this, function (_c) {
|
|
219
|
+
switch (_c.label) {
|
|
220
|
+
case 0:
|
|
221
|
+
process.env.DEV_BOOTSTRAP_ADMIN_EMAIL = ENV_EMAIL;
|
|
222
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)()];
|
|
223
|
+
case 1:
|
|
224
|
+
outcome = _c.sent();
|
|
225
|
+
expect(outcome.loggedInAs).toBe(ENV_EMAIL);
|
|
226
|
+
_a = expect;
|
|
227
|
+
return [4 /*yield*/, userRow(ENV_EMAIL)];
|
|
228
|
+
case 2:
|
|
229
|
+
_a.apply(void 0, [(_c.sent()).roles]).toEqual(['admin']);
|
|
230
|
+
_b = expect;
|
|
231
|
+
return [4 /*yield*/, auditRows()];
|
|
232
|
+
case 3:
|
|
233
|
+
_b.apply(void 0, [_c.sent()]).toHaveLength(1);
|
|
234
|
+
return [2 /*return*/];
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}); });
|
|
238
|
+
it('the match is case-normalized like every account email — never a second account for a differently-cased address', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
239
|
+
var _a, _b;
|
|
240
|
+
return __generator(this, function (_c) {
|
|
241
|
+
switch (_c.label) {
|
|
242
|
+
case 0:
|
|
243
|
+
process.env.DEV_BOOTSTRAP_ADMIN_EMAIL = 'Owner@Test.local';
|
|
244
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: 'owner@test.local' })];
|
|
245
|
+
case 1:
|
|
246
|
+
_c.sent();
|
|
247
|
+
_a = expect;
|
|
248
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
249
|
+
case 2:
|
|
250
|
+
_a.apply(void 0, [(_c.sent()).roles]).toEqual(['admin']);
|
|
251
|
+
_b = expect;
|
|
252
|
+
return [4 /*yield*/, adminRows()];
|
|
253
|
+
case 3:
|
|
254
|
+
_b.apply(void 0, [_c.sent()]).toHaveLength(1);
|
|
255
|
+
return [2 /*return*/];
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}); });
|
|
259
|
+
it('an admin already exists: the matching address gets an ordinary account — no grant, no audit row', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
260
|
+
var outcome, _a, _b, _c;
|
|
261
|
+
return __generator(this, function (_d) {
|
|
262
|
+
switch (_d.label) {
|
|
263
|
+
case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Standing admin', email: 'standing-admin@test.local', roles: ['admin'] })];
|
|
264
|
+
case 1:
|
|
265
|
+
_d.sent();
|
|
266
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
267
|
+
case 2:
|
|
268
|
+
outcome = _d.sent();
|
|
269
|
+
expect(outcome.loggedInAs).toBe(BOOTSTRAP_EMAIL);
|
|
270
|
+
_a = expect;
|
|
271
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
272
|
+
case 3:
|
|
273
|
+
_a.apply(void 0, [(_d.sent()).roles]).toEqual([]);
|
|
274
|
+
_b = expect;
|
|
275
|
+
return [4 /*yield*/, auditRows()];
|
|
276
|
+
case 4:
|
|
277
|
+
_b.apply(void 0, [_d.sent()]).toHaveLength(0);
|
|
278
|
+
_c = expect;
|
|
279
|
+
return [4 /*yield*/, adminRows()];
|
|
280
|
+
case 5:
|
|
281
|
+
_c.apply(void 0, [(_d.sent()).map(function (user) { return user.email; })]).toEqual(['standing-admin@test.local']);
|
|
282
|
+
return [2 /*return*/];
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}); });
|
|
286
|
+
it('a different same-domain address: an ordinary account, no grant — and the bootstrap address itself stays uncreated', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
287
|
+
var outcome, _a, _b, _c, _d;
|
|
288
|
+
return __generator(this, function (_e) {
|
|
289
|
+
switch (_e.label) {
|
|
290
|
+
case 0: return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: 'agent@test.local' })];
|
|
291
|
+
case 1:
|
|
292
|
+
outcome = _e.sent();
|
|
293
|
+
expect(outcome.loggedInAs).toBe('agent@test.local');
|
|
294
|
+
_a = expect;
|
|
295
|
+
return [4 /*yield*/, userRow('agent@test.local')];
|
|
296
|
+
case 2:
|
|
297
|
+
_a.apply(void 0, [(_e.sent()).roles]).toEqual([]);
|
|
298
|
+
_b = expect;
|
|
299
|
+
return [4 /*yield*/, auditRows()];
|
|
300
|
+
case 3:
|
|
301
|
+
_b.apply(void 0, [_e.sent()]).toHaveLength(0);
|
|
302
|
+
_c = expect;
|
|
303
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
304
|
+
case 4:
|
|
305
|
+
_c.apply(void 0, [_e.sent()]).toBeUndefined();
|
|
306
|
+
_d = expect;
|
|
307
|
+
return [4 /*yield*/, adminRows()];
|
|
308
|
+
case 5:
|
|
309
|
+
_d.apply(void 0, [_e.sent()]).toHaveLength(0);
|
|
310
|
+
return [2 /*return*/];
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}); });
|
|
314
|
+
it('the address must match exactly — a plus-suffixed variant is a different account and gets nothing', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
315
|
+
var outcome, _a, _b;
|
|
316
|
+
return __generator(this, function (_c) {
|
|
317
|
+
switch (_c.label) {
|
|
318
|
+
case 0: return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: 'owner+lane@test.local' })];
|
|
319
|
+
case 1:
|
|
320
|
+
outcome = _c.sent();
|
|
321
|
+
expect(outcome.loggedInAs).toBe('owner+lane@test.local');
|
|
322
|
+
_a = expect;
|
|
323
|
+
return [4 /*yield*/, userRow('owner+lane@test.local')];
|
|
324
|
+
case 2:
|
|
325
|
+
_a.apply(void 0, [(_c.sent()).roles]).toEqual([]);
|
|
326
|
+
_b = expect;
|
|
327
|
+
return [4 /*yield*/, auditRows()];
|
|
328
|
+
case 3:
|
|
329
|
+
_b.apply(void 0, [_c.sent()]).toHaveLength(0);
|
|
330
|
+
return [2 /*return*/];
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
}); });
|
|
334
|
+
it('with the variable unset the matching address is an ordinary account — the omission is the safety (test/prod never set it)', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
335
|
+
var _a, _b;
|
|
336
|
+
return __generator(this, function (_c) {
|
|
337
|
+
switch (_c.label) {
|
|
338
|
+
case 0:
|
|
339
|
+
delete process.env.DEV_BOOTSTRAP_ADMIN_EMAIL;
|
|
340
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
341
|
+
case 1:
|
|
342
|
+
_c.sent();
|
|
343
|
+
_a = expect;
|
|
344
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
345
|
+
case 2:
|
|
346
|
+
_a.apply(void 0, [(_c.sent()).roles]).toEqual([]);
|
|
347
|
+
_b = expect;
|
|
348
|
+
return [4 /*yield*/, auditRows()];
|
|
349
|
+
case 3:
|
|
350
|
+
_b.apply(void 0, [_c.sent()]).toHaveLength(0);
|
|
351
|
+
return [2 /*return*/];
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}); });
|
|
355
|
+
it.each([['DEVELOPMENT'], ['DEV_AUTO_LOGIN_EMAIL']])('gate closed (%s unset): 404 exactly as before — no session, no account, no admin; the variable changes nothing', function (gate) { return __awaiter(void 0, void 0, void 0, function () {
|
|
356
|
+
var outcome, _a, _b, _c;
|
|
357
|
+
return __generator(this, function (_d) {
|
|
358
|
+
switch (_d.label) {
|
|
359
|
+
case 0:
|
|
360
|
+
delete process.env[gate];
|
|
361
|
+
return [4 /*yield*/, (0, devLoginHarness_1.invokeDevLogin)({ email: BOOTSTRAP_EMAIL })];
|
|
362
|
+
case 1:
|
|
363
|
+
outcome = _d.sent();
|
|
364
|
+
expect(outcome.status).toBe(404);
|
|
365
|
+
expect(outcome.loggedInAs).toBeUndefined();
|
|
366
|
+
expect(outcome.sessionSaved).toBe(false);
|
|
367
|
+
_a = expect;
|
|
368
|
+
return [4 /*yield*/, userRow(BOOTSTRAP_EMAIL)];
|
|
369
|
+
case 2:
|
|
370
|
+
_a.apply(void 0, [_d.sent()]).toBeUndefined();
|
|
371
|
+
_b = expect;
|
|
372
|
+
return [4 /*yield*/, auditRows()];
|
|
373
|
+
case 3:
|
|
374
|
+
_b.apply(void 0, [_d.sent()]).toHaveLength(0);
|
|
375
|
+
_c = expect;
|
|
376
|
+
return [4 /*yield*/, adminRows()];
|
|
377
|
+
case 4:
|
|
378
|
+
_c.apply(void 0, [_d.sent()]).toHaveLength(0);
|
|
379
|
+
return [2 /*return*/];
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}); });
|
|
383
|
+
});
|
|
384
|
+
//# sourceMappingURL=DevLoginBootstrapAdmin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevLoginBootstrapAdmin.test.js","sourceRoot":"","sources":["../../test/DevLoginBootstrapAdmin.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** What one `GET /dev/login` did, seen from outside: the session it minted (or not) and the response it sent. */
|
|
2
|
+
export type DevLoginOutcome = {
|
|
3
|
+
loggedInAs?: string;
|
|
4
|
+
sessionRegenerated: boolean;
|
|
5
|
+
sessionSaved: boolean;
|
|
6
|
+
status?: number;
|
|
7
|
+
body?: unknown;
|
|
8
|
+
redirect?: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Drives the devLogin route once over the REAL passport login machinery (see
|
|
12
|
+
* passportSessionHarness): the full session-establishment contract (regenerate → login → save)
|
|
13
|
+
* is pinned by SignupRoute.test.ts — the dev-door suites assert the door INHERITS it.
|
|
14
|
+
*/
|
|
15
|
+
export declare const invokeDevLogin: (query?: Record<string, unknown>) => Promise<DevLoginOutcome>;
|
|
16
|
+
//# sourceMappingURL=devLoginHarness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devLoginHarness.d.ts","sourceRoot":"","sources":["../../test/devLoginHarness.ts"],"names":[],"mappings":"AAGA,iHAAiH;AACjH,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,WAAkB,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,QAAQ,eAAe,CAoB7F,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.invokeDevLogin = void 0;
|
|
40
|
+
var devLogin_1 = require("../src/routes/devLogin");
|
|
41
|
+
var passportSessionHarness_1 = require("./passportSessionHarness");
|
|
42
|
+
/**
|
|
43
|
+
* Drives the devLogin route once over the REAL passport login machinery (see
|
|
44
|
+
* passportSessionHarness): the full session-establishment contract (regenerate → login → save)
|
|
45
|
+
* is pinned by SignupRoute.test.ts — the dev-door suites assert the door INHERITS it.
|
|
46
|
+
*/
|
|
47
|
+
var invokeDevLogin = function (query) { return __awaiter(void 0, void 0, void 0, function () {
|
|
48
|
+
var _a, request, events, outcome, response;
|
|
49
|
+
var _b;
|
|
50
|
+
return __generator(this, function (_c) {
|
|
51
|
+
switch (_c.label) {
|
|
52
|
+
case 0: return [4 /*yield*/, (0, passportSessionHarness_1.createPassportRequest)({ query: query })];
|
|
53
|
+
case 1:
|
|
54
|
+
_a = _c.sent(), request = _a.request, events = _a.events;
|
|
55
|
+
outcome = { sessionRegenerated: false, sessionSaved: false };
|
|
56
|
+
response = {
|
|
57
|
+
status: function (code) {
|
|
58
|
+
outcome.status = code;
|
|
59
|
+
return this;
|
|
60
|
+
},
|
|
61
|
+
send: function (body) {
|
|
62
|
+
outcome.body = body;
|
|
63
|
+
},
|
|
64
|
+
redirect: function (path) {
|
|
65
|
+
outcome.redirect = path;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
return [4 /*yield*/, devLogin_1.devLogin.onRequest(request, response)];
|
|
69
|
+
case 2:
|
|
70
|
+
_c.sent();
|
|
71
|
+
outcome.loggedInAs = (_b = request.session.passport) === null || _b === void 0 ? void 0 : _b.user;
|
|
72
|
+
outcome.sessionRegenerated = events.includes('regenerate');
|
|
73
|
+
outcome.sessionSaved = events.includes('save');
|
|
74
|
+
return [2 /*return*/, outcome];
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}); };
|
|
78
|
+
exports.invokeDevLogin = invokeDevLogin;
|
|
79
|
+
//# sourceMappingURL=devLoginHarness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devLoginHarness.js","sourceRoot":"","sources":["../../test/devLoginHarness.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAkD;AAClD,mEAAiE;AAYjE;;;;GAIG;AACI,IAAM,cAAc,GAAG,UAAO,KAA+B;;;;;oBACtC,qBAAM,IAAA,8CAAqB,EAAC,EAAE,KAAK,OAAA,EAAE,CAAC,EAAA;;gBAA5D,KAAsB,SAAsC,EAA1D,OAAO,aAAA,EAAE,MAAM,YAAA;gBACjB,OAAO,GAAoB,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;gBAC9E,QAAQ,GAAG;oBACf,MAAM,YAAC,IAAY;wBACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;wBACtB,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,IAAI,YAAC,IAAc;wBACjB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;oBACtB,CAAC;oBACD,QAAQ,YAAC,IAAY;wBACnB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAC1B,CAAC;iBACF,CAAC;gBACF,qBAAM,mBAAQ,CAAC,SAAS,CAAC,OAAgB,EAAE,QAAiB,CAAC,EAAA;;gBAA7D,SAA6D,CAAC;gBAC9D,OAAO,CAAC,UAAU,GAAG,MAAA,OAAO,CAAC,OAAO,CAAC,QAAQ,0CAAE,IAAI,CAAC;gBACpD,OAAO,CAAC,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAC3D,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/C,sBAAO,OAAO,EAAC;;;KAChB,CAAC;AApBW,QAAA,cAAc,kBAoBzB"}
|