@proteinjs/user-server 1.7.0 → 1.8.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.
Files changed (102) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/generated/index.d.ts.map +1 -1
  3. package/dist/generated/index.js +9 -1
  4. package/dist/generated/index.js.map +1 -1
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/authentication/PasswordHasher.d.ts +45 -0
  10. package/dist/src/authentication/PasswordHasher.d.ts.map +1 -0
  11. package/dist/src/authentication/PasswordHasher.js +152 -0
  12. package/dist/src/authentication/PasswordHasher.js.map +1 -0
  13. package/dist/src/authentication/UserStatusTableWatcher.d.ts +19 -0
  14. package/dist/src/authentication/UserStatusTableWatcher.d.ts.map +1 -0
  15. package/dist/src/authentication/UserStatusTableWatcher.js +115 -0
  16. package/dist/src/authentication/UserStatusTableWatcher.js.map +1 -0
  17. package/dist/src/authentication/authenticate.d.ts.map +1 -1
  18. package/dist/src/authentication/authenticate.js +41 -13
  19. package/dist/src/authentication/authenticate.js.map +1 -1
  20. package/dist/src/authorization/userCache.d.ts.map +1 -1
  21. package/dist/src/authorization/userCache.js +10 -1
  22. package/dist/src/authorization/userCache.js.map +1 -1
  23. package/dist/src/emails/AccountDeletionEmailConfigs.d.ts +35 -0
  24. package/dist/src/emails/AccountDeletionEmailConfigs.d.ts.map +1 -0
  25. package/dist/src/emails/AccountDeletionEmailConfigs.js +36 -0
  26. package/dist/src/emails/AccountDeletionEmailConfigs.js.map +1 -0
  27. package/dist/src/emails/AccountDeletionEmails.d.ts +13 -0
  28. package/dist/src/emails/AccountDeletionEmails.d.ts.map +1 -0
  29. package/dist/src/emails/AccountDeletionEmails.js +98 -0
  30. package/dist/src/emails/AccountDeletionEmails.js.map +1 -0
  31. package/dist/src/routes/executePasswordReset.js +5 -3
  32. package/dist/src/routes/executePasswordReset.js.map +1 -1
  33. package/dist/src/routes/login.d.ts.map +1 -1
  34. package/dist/src/routes/login.js +26 -2
  35. package/dist/src/routes/login.js.map +1 -1
  36. package/dist/src/services/AccountDeletion.d.ts +52 -0
  37. package/dist/src/services/AccountDeletion.d.ts.map +1 -0
  38. package/dist/src/services/AccountDeletion.js +426 -0
  39. package/dist/src/services/AccountDeletion.js.map +1 -0
  40. package/dist/src/services/MachineCredentials.d.ts +21 -0
  41. package/dist/src/services/MachineCredentials.d.ts.map +1 -0
  42. package/dist/src/services/MachineCredentials.js +164 -0
  43. package/dist/src/services/MachineCredentials.js.map +1 -0
  44. package/dist/src/services/Roles.d.ts.map +1 -1
  45. package/dist/src/services/Roles.js +7 -0
  46. package/dist/src/services/Roles.js.map +1 -1
  47. package/dist/src/services/SetUserStatus.d.ts +18 -0
  48. package/dist/src/services/SetUserStatus.d.ts.map +1 -0
  49. package/dist/src/services/SetUserStatus.js +118 -0
  50. package/dist/src/services/SetUserStatus.js.map +1 -0
  51. package/dist/src/services/Signup.d.ts +2 -2
  52. package/dist/src/services/Signup.d.ts.map +1 -1
  53. package/dist/src/services/Signup.js +22 -17
  54. package/dist/src/services/Signup.js.map +1 -1
  55. package/dist/src/services/UpdateUserInfo.d.ts.map +1 -1
  56. package/dist/src/services/UpdateUserInfo.js +20 -17
  57. package/dist/src/services/UpdateUserInfo.js.map +1 -1
  58. package/dist/test/AccountDeletion.integration.test.d.ts +2 -0
  59. package/dist/test/AccountDeletion.integration.test.d.ts.map +1 -0
  60. package/dist/test/AccountDeletion.integration.test.js +710 -0
  61. package/dist/test/AccountDeletion.integration.test.js.map +1 -0
  62. package/dist/test/DevLogin.test.js +12 -11
  63. package/dist/test/DevLogin.test.js.map +1 -1
  64. package/dist/test/MachineAccounts.integration.test.d.ts +2 -0
  65. package/dist/test/MachineAccounts.integration.test.d.ts.map +1 -0
  66. package/dist/test/MachineAccounts.integration.test.js +597 -0
  67. package/dist/test/MachineAccounts.integration.test.js.map +1 -0
  68. package/dist/test/PasswordMigration.integration.test.d.ts +2 -0
  69. package/dist/test/PasswordMigration.integration.test.d.ts.map +1 -0
  70. package/dist/test/PasswordMigration.integration.test.js +332 -0
  71. package/dist/test/PasswordMigration.integration.test.js.map +1 -0
  72. package/dist/test/SetUserStatus.integration.test.d.ts +2 -0
  73. package/dist/test/SetUserStatus.integration.test.d.ts.map +1 -0
  74. package/dist/test/SetUserStatus.integration.test.js +266 -0
  75. package/dist/test/SetUserStatus.integration.test.js.map +1 -0
  76. package/dist/test/UserStatusGate.integration.test.d.ts +2 -0
  77. package/dist/test/UserStatusGate.integration.test.d.ts.map +1 -0
  78. package/dist/test/UserStatusGate.integration.test.js +162 -0
  79. package/dist/test/UserStatusGate.integration.test.js.map +1 -0
  80. package/generated/index.ts +9 -1
  81. package/index.ts +3 -0
  82. package/package.json +8 -6
  83. package/src/authentication/PasswordHasher.ts +87 -0
  84. package/src/authentication/UserStatusTableWatcher.ts +56 -0
  85. package/src/authentication/authenticate.ts +31 -6
  86. package/src/authorization/userCache.ts +9 -1
  87. package/src/emails/AccountDeletionEmailConfigs.ts +79 -0
  88. package/src/emails/AccountDeletionEmails.ts +39 -0
  89. package/src/routes/executePasswordReset.ts +2 -2
  90. package/src/routes/login.ts +23 -0
  91. package/src/services/AccountDeletion.ts +291 -0
  92. package/src/services/MachineCredentials.ts +94 -0
  93. package/src/services/Roles.ts +10 -0
  94. package/src/services/SetUserStatus.ts +56 -0
  95. package/src/services/Signup.ts +4 -4
  96. package/src/services/UpdateUserInfo.ts +4 -5
  97. package/test/AccountDeletion.integration.test.ts +391 -0
  98. package/test/DevLogin.test.ts +5 -4
  99. package/test/MachineAccounts.integration.test.ts +312 -0
  100. package/test/PasswordMigration.integration.test.ts +132 -0
  101. package/test/SetUserStatus.integration.test.ts +120 -0
  102. package/test/UserStatusGate.integration.test.ts +68 -0
@@ -0,0 +1,597 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ 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;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __importDefault = (this && this.__importDefault) || function (mod) {
54
+ return (mod && mod.__esModule) ? mod : { "default": mod };
55
+ };
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ var sha256_1 = __importDefault(require("crypto-js/sha256"));
58
+ var db_1 = require("@proteinjs/db");
59
+ var reflection_1 = require("@proteinjs/reflection");
60
+ // Deep import (test-only): ServiceAuth is the real RPC door but is not index-exported by
61
+ // @proteinjs/service — the door test below runs the actual gate rather than pinning metadata.
62
+ var ServiceAuth_1 = require("@proteinjs/service/dist/src/ServiceAuth");
63
+ var user_1 = require("@proteinjs/user");
64
+ var authenticate_1 = require("../src/authentication/authenticate");
65
+ var UserStatusTableWatcher_1 = require("../src/authentication/UserStatusTableWatcher");
66
+ var MachineCredentials_1 = require("../src/services/MachineCredentials");
67
+ var Roles_1 = require("../src/services/Roles");
68
+ var SetUserStatus_1 = require("../src/services/SetUserStatus");
69
+ var UserServerTestEnvironment_1 = require("./UserServerTestEnvironment");
70
+ var testEnv = new UserServerTestEnvironment_1.UserServerTestEnvironment();
71
+ /** The consumer-mapped role machine declarations grant (registered into the catalog below). */
72
+ var OpsRole = /** @class */ (function () {
73
+ function OpsRole() {
74
+ this.role = 'ops';
75
+ this.description = 'Operational machinery';
76
+ }
77
+ return OpsRole;
78
+ }());
79
+ var TestOpsMachineAccount = /** @class */ (function (_super) {
80
+ __extends(TestOpsMachineAccount, _super);
81
+ function TestOpsMachineAccount() {
82
+ var _this = _super !== null && _super.apply(this, arguments) || this;
83
+ _this.id = 'machine-test-ops';
84
+ _this.email = 'machine-ops@test.local';
85
+ _this.accountName = 'Test ops machine';
86
+ _this.roles = ['ops'];
87
+ _this.secretName = 'test-ops-secret';
88
+ return _this;
89
+ }
90
+ return TestOpsMachineAccount;
91
+ }(user_1.MachineAccount));
92
+ /**
93
+ * Reset `TableWatcherRunner`'s static watcher map so the NEXT Db construction recomputes it from
94
+ * the (just-changed) discovery seam. The class is internal to @proteinjs/db (its exports map
95
+ * blocks deep imports), so it's reached through a Db instance — the test-harness cast convention.
96
+ */
97
+ var resetTableWatcherMap = function () {
98
+ var runner = (0, db_1.getDbAsSystem)().tableWatcherRunner;
99
+ runner.constructor.tableWatcherMap = undefined;
100
+ };
101
+ /**
102
+ * Machine accounts as source records, at the user layer: declare-only on the REAL mixed user
103
+ * table, adopt-in-place by email (id + password survive — the old credential still logs in),
104
+ * removed-from-source auto-deactivation with session kill through the categorical
105
+ * UserStatusTableWatcher, the machine/human ledger split (Roles refuses machine targets),
106
+ * declaration validation, and credential minting (hash-only at rest, plaintext shown once).
107
+ */
108
+ describe('Machine accounts as source records', function () {
109
+ var objectCache = function () { return reflection_1.SourceRepository.get().objectCache; };
110
+ /** One boot of Db.init's source-record leg with these MachineAccount declarations. */
111
+ var boot = function (declarations) { return __awaiter(void 0, void 0, void 0, function () {
112
+ return __generator(this, function (_a) {
113
+ switch (_a.label) {
114
+ case 0:
115
+ objectCache()['@proteinjs/db/SourceRecordLoader'] = declarations;
116
+ return [4 /*yield*/, new db_1.SourceRecordSyncRunner().load()];
117
+ case 1:
118
+ _a.sent();
119
+ return [2 /*return*/];
120
+ }
121
+ });
122
+ }); };
123
+ var machineRow = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
124
+ switch (_a.label) {
125
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { email: 'machine-ops@test.local' })];
126
+ case 1: return [2 /*return*/, _a.sent()];
127
+ }
128
+ }); }); };
129
+ var insertSession = function (sessionId, userEmail) { return __awaiter(void 0, void 0, void 0, function () {
130
+ return __generator(this, function (_a) {
131
+ switch (_a.label) {
132
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().insert(user_1.tables.Session, {
133
+ sessionId: sessionId,
134
+ session: '{}',
135
+ expires: new Date(Date.now() + 60 * 60 * 1000),
136
+ userEmail: userEmail,
137
+ })];
138
+ case 1: return [2 /*return*/, _a.sent()];
139
+ }
140
+ });
141
+ }); };
142
+ var sessionEmails = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
143
+ switch (_a.label) {
144
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(user_1.tables.Session, {})];
145
+ case 1: return [2 /*return*/, (_a.sent()).map(function (session) { return session.userEmail; })];
146
+ }
147
+ }); }); };
148
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
149
+ return __generator(this, function (_a) {
150
+ switch (_a.label) {
151
+ case 0: return [4 /*yield*/, testEnv.beforeAll()];
152
+ case 1:
153
+ _a.sent();
154
+ reflection_1.SourceRepository.get().objectCache['@proteinjs/user-auth/AuthenticatedUserRepo'] = [new user_1.UserRepo()];
155
+ objectCache()['@proteinjs/user/RoleCatalogEntry'] = [new OpsRole()];
156
+ // Exactly the deactivation watcher observes this run, rebuilt from the seeded cache.
157
+ objectCache()['@proteinjs/db/TableWatcher'] = [new UserStatusTableWatcher_1.UserStatusTableWatcher()];
158
+ resetTableWatcherMap();
159
+ return [2 /*return*/];
160
+ }
161
+ });
162
+ }); }, 120000);
163
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
164
+ return __generator(this, function (_a) {
165
+ switch (_a.label) {
166
+ case 0:
167
+ delete objectCache()['@proteinjs/db/SourceRecordLoader'];
168
+ delete objectCache()['@proteinjs/db/TableWatcher'];
169
+ delete objectCache()['@proteinjs/user/RoleCatalogEntry'];
170
+ resetTableWatcherMap();
171
+ return [4 /*yield*/, testEnv.afterAll()];
172
+ case 1:
173
+ _a.sent();
174
+ return [2 /*return*/];
175
+ }
176
+ });
177
+ }); });
178
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
179
+ var db;
180
+ return __generator(this, function (_a) {
181
+ switch (_a.label) {
182
+ case 0:
183
+ db = (0, db_1.getDbAsSystem)();
184
+ return [4 /*yield*/, db.delete(user_1.tables.Session, {})];
185
+ case 1:
186
+ _a.sent();
187
+ return [4 /*yield*/, db.delete(user_1.tables.UserStatusEvent, {})];
188
+ case 2:
189
+ _a.sent();
190
+ return [4 /*yield*/, db.delete(user_1.tables.RoleGrantEvent, {})];
191
+ case 3:
192
+ _a.sent();
193
+ return [4 /*yield*/, db.delete(user_1.tables.User, {})];
194
+ case 4:
195
+ _a.sent();
196
+ return [2 /*return*/];
197
+ }
198
+ });
199
+ }); });
200
+ it('declare-only on the mixed user table: the declaration lands source-owned; human rows are untouched', function () { return __awaiter(void 0, void 0, void 0, function () {
201
+ var human, machine, humanAfter;
202
+ return __generator(this, function (_a) {
203
+ switch (_a.label) {
204
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'A human', email: 'human@test.local', roles: ['ops'] })];
205
+ case 1:
206
+ human = _a.sent();
207
+ return [4 /*yield*/, boot([new TestOpsMachineAccount()])];
208
+ case 2:
209
+ _a.sent();
210
+ return [4 /*yield*/, machineRow()];
211
+ case 3:
212
+ machine = _a.sent();
213
+ expect(machine).toMatchObject({
214
+ id: 'machine-test-ops',
215
+ name: 'Test ops machine',
216
+ roles: ['ops'],
217
+ emailVerified: true,
218
+ status: 'active',
219
+ isLoadedFromSource: true,
220
+ });
221
+ // No declarable password: the fresh row carries none, so authenticate's email+hash match
222
+ // can never admit it until a credential is minted.
223
+ expect(machine.password).toBeFalsy();
224
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { id: human.id })];
225
+ case 4:
226
+ humanAfter = _a.sent();
227
+ expect(humanAfter.isLoadedFromSource).toBeFalsy();
228
+ expect(humanAfter).toMatchObject({ name: 'A human', roles: ['ops'] });
229
+ return [2 /*return*/];
230
+ }
231
+ });
232
+ }); });
233
+ it('adopt-in-place by email: the hand-made row keeps its id and password; declared fields revert', function () { return __awaiter(void 0, void 0, void 0, function () {
234
+ var handMade, adopted, _a;
235
+ return __generator(this, function (_b) {
236
+ switch (_b.label) {
237
+ case 0: return [4 /*yield*/, testEnv.createUser({
238
+ name: 'Hand-made bridge',
239
+ email: 'machine-ops@test.local',
240
+ roles: ['ops', 'stale-role'],
241
+ })];
242
+ case 1:
243
+ handMade = _b.sent();
244
+ return [4 /*yield*/, boot([new TestOpsMachineAccount()])];
245
+ case 2:
246
+ _b.sent();
247
+ return [4 /*yield*/, machineRow()];
248
+ case 3:
249
+ adopted = _b.sent();
250
+ expect(adopted.id).toBe(handMade.id);
251
+ expect(adopted).toMatchObject({
252
+ name: 'Test ops machine',
253
+ roles: ['ops'],
254
+ status: 'active',
255
+ isLoadedFromSource: true,
256
+ });
257
+ // The credential survived adoption: the account still authenticates with its old password
258
+ // (createUser stores sha256('test')... it stores the raw string; assert equality instead).
259
+ expect(adopted.password).toBe(handMade.password);
260
+ _a = expect;
261
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(user_1.tables.User, { email: 'machine-ops@test.local' })];
262
+ case 4:
263
+ _a.apply(void 0, [(_b.sent()).length]).toBe(1);
264
+ return [2 /*return*/];
265
+ }
266
+ });
267
+ }); });
268
+ it('removed from source: deactivated (never deleted), sessions killed, login refused; re-declaring reactivates', function () { return __awaiter(void 0, void 0, void 0, function () {
269
+ var human, removed, _a, _b, _c, _d;
270
+ return __generator(this, function (_e) {
271
+ switch (_e.label) {
272
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'A human', email: 'human@test.local' })];
273
+ case 1:
274
+ human = _e.sent();
275
+ return [4 /*yield*/, boot([new TestOpsMachineAccount()])];
276
+ case 2:
277
+ _e.sent();
278
+ return [4 /*yield*/, insertSession('machine-session', 'machine-ops@test.local')];
279
+ case 3:
280
+ _e.sent();
281
+ return [4 /*yield*/, insertSession('human-session', human.email)];
282
+ case 4:
283
+ _e.sent();
284
+ return [4 /*yield*/, boot([])];
285
+ case 5:
286
+ _e.sent();
287
+ return [4 /*yield*/, machineRow()];
288
+ case 6:
289
+ removed = _e.sent();
290
+ expect(removed).toBeDefined();
291
+ expect(removed.status).toBe('deactivated');
292
+ // The categorical watcher killed the machine sessions; the human session is untouched.
293
+ _a = expect;
294
+ return [4 /*yield*/, sessionEmails()];
295
+ case 7:
296
+ // The categorical watcher killed the machine sessions; the human session is untouched.
297
+ _a.apply(void 0, [_e.sent()]).toEqual([human.email]);
298
+ // The one login door refuses a deactivated account even with matching credentials.
299
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().update(user_1.tables.User, { id: removed.id, password: (0, sha256_1.default)('bridge-pw').toString() })];
300
+ case 8:
301
+ // The one login door refuses a deactivated account even with matching credentials.
302
+ _e.sent();
303
+ _b = expect;
304
+ return [4 /*yield*/, (0, authenticate_1.authenticate)('machine-ops@test.local', 'bridge-pw')];
305
+ case 9:
306
+ _b.apply(void 0, [_e.sent()]).toBe('This account has been deactivated');
307
+ // Decommission is reversible in code: re-declaring reverts status via drift reversion.
308
+ return [4 /*yield*/, boot([new TestOpsMachineAccount()])];
309
+ case 10:
310
+ // Decommission is reversible in code: re-declaring reverts status via drift reversion.
311
+ _e.sent();
312
+ _c = expect;
313
+ return [4 /*yield*/, machineRow()];
314
+ case 11:
315
+ _c.apply(void 0, [(_e.sent()).status]).toBe('active');
316
+ _d = expect;
317
+ return [4 /*yield*/, (0, authenticate_1.authenticate)('machine-ops@test.local', 'bridge-pw')];
318
+ case 12:
319
+ _d.apply(void 0, [_e.sent()]).toBe(true);
320
+ return [2 /*return*/];
321
+ }
322
+ });
323
+ }); });
324
+ it("the staff toggle rides the same watcher: SetUserStatus deactivation kills the target's sessions", function () { return __awaiter(void 0, void 0, void 0, function () {
325
+ var admin, target, _a;
326
+ return __generator(this, function (_b) {
327
+ switch (_b.label) {
328
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Admin', email: 'admin@test.local', roles: ['admin'] })];
329
+ case 1:
330
+ admin = _b.sent();
331
+ return [4 /*yield*/, testEnv.createUser({ name: 'Target', email: 'target@test.local' })];
332
+ case 2:
333
+ target = _b.sent();
334
+ return [4 /*yield*/, insertSession('target-session', target.email)];
335
+ case 3:
336
+ _b.sent();
337
+ return [4 /*yield*/, insertSession('admin-session', admin.email)];
338
+ case 4:
339
+ _b.sent();
340
+ testEnv.actAs(admin);
341
+ return [4 /*yield*/, new SetUserStatus_1.SetUserStatus().setUserStatus(target.id, 'deactivated')];
342
+ case 5:
343
+ _b.sent();
344
+ _a = expect;
345
+ return [4 /*yield*/, sessionEmails()];
346
+ case 6:
347
+ _a.apply(void 0, [_b.sent()]).toEqual([admin.email]);
348
+ return [2 /*return*/];
349
+ }
350
+ });
351
+ }); });
352
+ it('the Roles service refuses machine-account targets (git is the machine audit); human grants still work', function () { return __awaiter(void 0, void 0, void 0, function () {
353
+ var admin, human, machine, _a, _b;
354
+ return __generator(this, function (_c) {
355
+ switch (_c.label) {
356
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Admin', email: 'admin@test.local', roles: ['admin'] })];
357
+ case 1:
358
+ admin = _c.sent();
359
+ return [4 /*yield*/, testEnv.createUser({ name: 'A human', email: 'human@test.local' })];
360
+ case 2:
361
+ human = _c.sent();
362
+ return [4 /*yield*/, boot([new TestOpsMachineAccount()])];
363
+ case 3:
364
+ _c.sent();
365
+ testEnv.actAs(admin);
366
+ return [4 /*yield*/, machineRow()];
367
+ case 4:
368
+ machine = _c.sent();
369
+ return [4 /*yield*/, expect(new Roles_1.Roles().grantRole(machine.id, 'ops')).rejects.toThrow(/machine account: its roles are declared in code/)];
370
+ case 5:
371
+ _c.sent();
372
+ return [4 /*yield*/, expect(new Roles_1.Roles().revokeRole(machine.id, 'ops')).rejects.toThrow(/machine account: its roles are declared in code/)];
373
+ case 6:
374
+ _c.sent();
375
+ // No machine rows in the human ledger.
376
+ _a = expect;
377
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(user_1.tables.RoleGrantEvent, { target: machine.id })];
378
+ case 7:
379
+ // No machine rows in the human ledger.
380
+ _a.apply(void 0, [_c.sent()]).toHaveLength(0);
381
+ return [4 /*yield*/, new Roles_1.Roles().grantRole(human.id, 'ops')];
382
+ case 8:
383
+ _c.sent();
384
+ _b = expect;
385
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { id: human.id })];
386
+ case 9:
387
+ _b.apply(void 0, [(_c.sent()).roles]).toEqual(['ops']);
388
+ return [2 /*return*/];
389
+ }
390
+ });
391
+ }); });
392
+ it('declaration validation fails boot loudly: non-lowercase email, unknown role, break-glass role', function () { return __awaiter(void 0, void 0, void 0, function () {
393
+ var UppercaseEmail, UnknownRole, BreakGlass;
394
+ return __generator(this, function (_a) {
395
+ switch (_a.label) {
396
+ case 0:
397
+ UppercaseEmail = /** @class */ (function (_super) {
398
+ __extends(UppercaseEmail, _super);
399
+ function UppercaseEmail() {
400
+ var _this = _super !== null && _super.apply(this, arguments) || this;
401
+ _this.email = 'Machine-Ops@test.local';
402
+ return _this;
403
+ }
404
+ return UppercaseEmail;
405
+ }(TestOpsMachineAccount));
406
+ return [4 /*yield*/, expect(boot([new UppercaseEmail()])).rejects.toThrow(/emails must be lowercase/)];
407
+ case 1:
408
+ _a.sent();
409
+ UnknownRole = /** @class */ (function (_super) {
410
+ __extends(UnknownRole, _super);
411
+ function UnknownRole() {
412
+ var _this = _super !== null && _super.apply(this, arguments) || this;
413
+ _this.roles = ['not-a-role'];
414
+ return _this;
415
+ }
416
+ return UnknownRole;
417
+ }(TestOpsMachineAccount));
418
+ return [4 /*yield*/, expect(boot([new UnknownRole()])).rejects.toThrow(/unknown role 'not-a-role'/)];
419
+ case 2:
420
+ _a.sent();
421
+ BreakGlass = /** @class */ (function (_super) {
422
+ __extends(BreakGlass, _super);
423
+ function BreakGlass() {
424
+ var _this = _super !== null && _super.apply(this, arguments) || this;
425
+ _this.roles = ['admin'];
426
+ return _this;
427
+ }
428
+ return BreakGlass;
429
+ }(TestOpsMachineAccount));
430
+ return [4 /*yield*/, expect(boot([new BreakGlass()])).rejects.toThrow(/break-glass role 'admin'/)];
431
+ case 3:
432
+ _a.sent();
433
+ return [2 /*return*/];
434
+ }
435
+ });
436
+ }); });
437
+ describe('credential minting', function () {
438
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
439
+ return __generator(this, function (_a) {
440
+ switch (_a.label) {
441
+ case 0: return [4 /*yield*/, boot([new TestOpsMachineAccount()])];
442
+ case 1:
443
+ _a.sent();
444
+ return [2 /*return*/];
445
+ }
446
+ });
447
+ }); });
448
+ it('mints a generated credential: hash-only at rest, sessions rotated, plaintext + paste note returned once', function () { return __awaiter(void 0, void 0, void 0, function () {
449
+ var minted, row, _a, _b;
450
+ return __generator(this, function (_c) {
451
+ switch (_c.label) {
452
+ case 0: return [4 /*yield*/, insertSession('old-credential-session', 'machine-ops@test.local')];
453
+ case 1:
454
+ _c.sent();
455
+ return [4 /*yield*/, new MachineCredentials_1.MachineCredentials().mintCredential('machine-ops@test.local')];
456
+ case 2:
457
+ minted = _c.sent();
458
+ expect(minted.email).toBe('machine-ops@test.local');
459
+ expect(minted.password).toMatch(/^[0-9a-f]{64}$/); // 256 bits, generated — never human-chosen
460
+ expect(minted.secretName).toBe('test-ops-secret');
461
+ expect(minted.note).toMatch(/test-ops-secret/);
462
+ expect(minted.note).toMatch(/restart/i);
463
+ return [4 /*yield*/, machineRow()];
464
+ case 3:
465
+ row = _c.sent();
466
+ expect(row.password).toBe((0, sha256_1.default)(minted.password).toString());
467
+ // The old credential's sessions died with the rotation...
468
+ _a = expect;
469
+ return [4 /*yield*/, sessionEmails()];
470
+ case 4:
471
+ // The old credential's sessions died with the rotation...
472
+ _a.apply(void 0, [_c.sent()]).toEqual([]);
473
+ // ...and the minted credential is immediately loggable.
474
+ _b = expect;
475
+ return [4 /*yield*/, (0, authenticate_1.authenticate)('machine-ops@test.local', minted.password)];
476
+ case 5:
477
+ // ...and the minted credential is immediately loggable.
478
+ _b.apply(void 0, [_c.sent()]).toBe(true);
479
+ return [2 /*return*/];
480
+ }
481
+ });
482
+ }); });
483
+ it('lists declared accounts with row state for the admin surface', function () { return __awaiter(void 0, void 0, void 0, function () {
484
+ var NotBooted, before, after;
485
+ return __generator(this, function (_a) {
486
+ switch (_a.label) {
487
+ case 0:
488
+ NotBooted = /** @class */ (function (_super) {
489
+ __extends(NotBooted, _super);
490
+ function NotBooted() {
491
+ var _this = _super !== null && _super.apply(this, arguments) || this;
492
+ _this.id = 'machine-not-booted';
493
+ _this.email = 'machine-not-booted@test.local';
494
+ _this.secretName = 'not-booted-secret';
495
+ return _this;
496
+ }
497
+ return NotBooted;
498
+ }(TestOpsMachineAccount));
499
+ objectCache()['@proteinjs/db/SourceRecordLoader'] = [new TestOpsMachineAccount(), new NotBooted()];
500
+ return [4 /*yield*/, new MachineCredentials_1.MachineCredentials().listMachineAccounts()];
501
+ case 1:
502
+ before = _a.sent();
503
+ expect(before).toEqual([
504
+ {
505
+ email: 'machine-ops@test.local',
506
+ accountName: 'Test ops machine',
507
+ roles: ['ops'],
508
+ secretName: 'test-ops-secret',
509
+ status: 'active',
510
+ hasCredential: false,
511
+ },
512
+ {
513
+ email: 'machine-not-booted@test.local',
514
+ accountName: 'Test ops machine',
515
+ roles: ['ops'],
516
+ secretName: 'not-booted-secret',
517
+ status: 'pending first boot',
518
+ hasCredential: false,
519
+ },
520
+ ]);
521
+ return [4 /*yield*/, new MachineCredentials_1.MachineCredentials().mintCredential('machine-ops@test.local')];
522
+ case 2:
523
+ _a.sent();
524
+ return [4 /*yield*/, new MachineCredentials_1.MachineCredentials().listMachineAccounts()];
525
+ case 3:
526
+ after = _a.sent();
527
+ expect(after[0]).toMatchObject({ email: 'machine-ops@test.local', hasCredential: true });
528
+ return [2 /*return*/];
529
+ }
530
+ });
531
+ }); });
532
+ it('refuses non-machine targets: undeclared emails and human accounts', function () { return __awaiter(void 0, void 0, void 0, function () {
533
+ return __generator(this, function (_a) {
534
+ switch (_a.label) {
535
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'A human', email: 'human@test.local' })];
536
+ case 1:
537
+ _a.sent();
538
+ return [4 /*yield*/, expect(new MachineCredentials_1.MachineCredentials().mintCredential('human@test.local')).rejects.toThrow(/No machine account is declared/)];
539
+ case 2:
540
+ _a.sent();
541
+ return [4 /*yield*/, expect(new MachineCredentials_1.MachineCredentials().mintCredential('nobody@test.local')).rejects.toThrow(/No machine account is declared/)];
542
+ case 3:
543
+ _a.sent();
544
+ return [2 /*return*/];
545
+ }
546
+ });
547
+ }); });
548
+ it('refuses a declared account whose row has not been loaded from source yet', function () { return __awaiter(void 0, void 0, void 0, function () {
549
+ var NotBooted;
550
+ return __generator(this, function (_a) {
551
+ switch (_a.label) {
552
+ case 0:
553
+ NotBooted = /** @class */ (function (_super) {
554
+ __extends(NotBooted, _super);
555
+ function NotBooted() {
556
+ var _this = _super !== null && _super.apply(this, arguments) || this;
557
+ _this.id = 'machine-not-booted';
558
+ _this.email = 'machine-not-booted@test.local';
559
+ return _this;
560
+ }
561
+ return NotBooted;
562
+ }(TestOpsMachineAccount));
563
+ // Declared (discoverable) but never booted: no source-owned row exists.
564
+ objectCache()['@proteinjs/db/SourceRecordLoader'] = [new TestOpsMachineAccount(), new NotBooted()];
565
+ return [4 /*yield*/, expect(new MachineCredentials_1.MachineCredentials().mintCredential('machine-not-booted@test.local')).rejects.toThrow(/has not been loaded from source yet/)];
566
+ case 1:
567
+ _a.sent();
568
+ return [2 /*return*/];
569
+ }
570
+ });
571
+ }); });
572
+ it("the door is the 'users' permission (admin passes as break-glass)", function () { return __awaiter(void 0, void 0, void 0, function () {
573
+ var admin, plain, canRun;
574
+ return __generator(this, function (_a) {
575
+ switch (_a.label) {
576
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Admin', email: 'admin@test.local', roles: ['admin'] })];
577
+ case 1:
578
+ admin = _a.sent();
579
+ return [4 /*yield*/, testEnv.createUser({ name: 'Plain', email: 'plain@test.local', roles: ['ops'] })];
580
+ case 2:
581
+ plain = _a.sent();
582
+ canRun = function () {
583
+ return ServiceAuth_1.ServiceAuth.canRunService(new MachineCredentials_1.MachineCredentials(), { name: 'mintCredential' }, [
584
+ 'machine-ops@test.local',
585
+ ]);
586
+ };
587
+ testEnv.actAs(plain);
588
+ expect(canRun()).toBe(false);
589
+ testEnv.actAs(admin);
590
+ expect(canRun()).toBe(true);
591
+ return [2 /*return*/];
592
+ }
593
+ });
594
+ }); });
595
+ });
596
+ });
597
+ //# sourceMappingURL=MachineAccounts.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MachineAccounts.integration.test.js","sourceRoot":"","sources":["../../test/MachineAccounts.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PasswordMigration.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PasswordMigration.integration.test.d.ts","sourceRoot":"","sources":["../../test/PasswordMigration.integration.test.ts"],"names":[],"mappings":""}