@rapidrest/service-core 2.0.0 → 2.1.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/dist/lib/BackgroundServiceManager.js +51 -9
- package/dist/lib/BackgroundServiceManager.js.map +1 -1
- package/dist/lib/EventListenerManager.js +35 -2
- package/dist/lib/EventListenerManager.js.map +1 -1
- package/dist/lib/NetUtils.js +215 -21
- package/dist/lib/NetUtils.js.map +1 -1
- package/dist/lib/ObjectFactory.js +7 -2
- package/dist/lib/ObjectFactory.js.map +1 -1
- package/dist/lib/RateLimiter.js.map +1 -1
- package/dist/lib/Server.js +121 -80
- package/dist/lib/Server.js.map +1 -1
- package/dist/lib/auth/AuthMiddleware.js +160 -100
- package/dist/lib/auth/AuthMiddleware.js.map +1 -1
- package/dist/lib/auth/JWTStrategy.js +6 -2
- package/dist/lib/auth/JWTStrategy.js.map +1 -1
- package/dist/lib/database/ConnectionManager.js +47 -1
- package/dist/lib/database/ConnectionManager.js.map +1 -1
- package/dist/lib/database/DatabaseErrors.js +88 -0
- package/dist/lib/database/DatabaseErrors.js.map +1 -0
- package/dist/lib/database/MongoRepository.js +31 -3
- package/dist/lib/database/MongoRepository.js.map +1 -1
- package/dist/lib/database/MongoSchemaSync.js +7 -1
- package/dist/lib/database/MongoSchemaSync.js.map +1 -1
- package/dist/lib/database/TypeOrmSupport.js +11 -6
- package/dist/lib/database/TypeOrmSupport.js.map +1 -1
- package/dist/lib/database/index.js +1 -0
- package/dist/lib/database/index.js.map +1 -1
- package/dist/lib/decorators/PersistenceDecorators.js +23 -0
- package/dist/lib/decorators/PersistenceDecorators.js.map +1 -1
- package/dist/lib/decorators/RouteDecorators.js +4 -2
- package/dist/lib/decorators/RouteDecorators.js.map +1 -1
- package/dist/lib/http/bun/BunRouter.js +119 -9
- package/dist/lib/http/bun/BunRouter.js.map +1 -1
- package/dist/lib/http/index.js +1 -0
- package/dist/lib/http/index.js.map +1 -1
- package/dist/lib/http/session/sessionMiddleware.js +62 -14
- package/dist/lib/http/session/sessionMiddleware.js.map +1 -1
- package/dist/lib/http/types.js +10 -1
- package/dist/lib/http/types.js.map +1 -1
- package/dist/lib/http/uWS/Adapters.js +31 -13
- package/dist/lib/http/uWS/Adapters.js.map +1 -1
- package/dist/lib/http/uWS/Router.js +80 -16
- package/dist/lib/http/uWS/Router.js.map +1 -1
- package/dist/lib/http/uWS/WebSocket.js +4 -2
- package/dist/lib/http/uWS/WebSocket.js.map +1 -1
- package/dist/lib/models/ModelUtils.js +255 -81
- package/dist/lib/models/ModelUtils.js.map +1 -1
- package/dist/lib/models/RepoUtils.js +863 -266
- package/dist/lib/models/RepoUtils.js.map +1 -1
- package/dist/lib/routes/BaseAdminRoute.js +5 -4
- package/dist/lib/routes/BaseAdminRoute.js.map +1 -1
- package/dist/lib/routes/BasePushRoute.js +104 -40
- package/dist/lib/routes/BasePushRoute.js.map +1 -1
- package/dist/lib/routes/CRUDRoute.js +31 -17
- package/dist/lib/routes/CRUDRoute.js.map +1 -1
- package/dist/lib/routes/RouteUtils.js +120 -29
- package/dist/lib/routes/RouteUtils.js.map +1 -1
- package/dist/lib/security/ACLUtils.js +170 -34
- package/dist/lib/security/ACLUtils.js.map +1 -1
- package/dist/types/BackgroundServiceManager.d.ts +6 -0
- package/dist/types/EventListenerManager.d.ts +4 -0
- package/dist/types/NetUtils.d.ts +65 -6
- package/dist/types/RateLimiter.d.ts +4 -3
- package/dist/types/Server.d.ts +33 -2
- package/dist/types/auth/AuthMiddleware.d.ts +35 -4
- package/dist/types/database/ConnectionManager.d.ts +18 -0
- package/dist/types/database/DatabaseErrors.d.ts +26 -0
- package/dist/types/database/MongoRepository.d.ts +21 -2
- package/dist/types/database/index.d.ts +1 -0
- package/dist/types/decorators/PersistenceDecorators.d.ts +31 -0
- package/dist/types/decorators/RouteDecorators.d.ts +4 -2
- package/dist/types/http/bun/BunRouter.d.ts +23 -2
- package/dist/types/http/index.d.ts +2 -1
- package/dist/types/http/session/sessionMiddleware.d.ts +14 -4
- package/dist/types/http/types.d.ts +40 -0
- package/dist/types/http/uWS/Adapters.d.ts +10 -1
- package/dist/types/http/uWS/Router.d.ts +15 -2
- package/dist/types/models/ModelUtils.d.ts +96 -1
- package/dist/types/models/RepoUtils.d.ts +240 -4
- package/dist/types/routes/BasePushRoute.d.ts +5 -0
- package/dist/types/routes/CRUDRoute.d.ts +10 -0
- package/dist/types/routes/RouteUtils.d.ts +37 -1
- package/dist/types/security/ACLUtils.d.ts +68 -7
- package/package.json +1 -1
|
@@ -11,7 +11,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
// Copyright (C) 2020-2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
12
12
|
// SPDX-License-Identifier: MPL-2.0
|
|
13
13
|
///////////////////////////////////////////////////////////////////////////////
|
|
14
|
-
import { ObjectDecorators, UserUtils, sleep } from "@rapidrest/core";
|
|
14
|
+
import { ApiError, ObjectDecorators, UserUtils, sleep } from "@rapidrest/core";
|
|
15
|
+
import { ApiErrorMessages, ApiErrors } from "../ApiErrors.js";
|
|
15
16
|
import { AccessControlListSQL } from "./AccessControlListSQL.js";
|
|
16
17
|
import { AccessControlListMongo } from "./AccessControlListMongo.js";
|
|
17
18
|
import { ACLAction } from "./AccessControlList.js";
|
|
@@ -21,6 +22,7 @@ import { MongoConnection } from "../database/MongoConnection.js";
|
|
|
21
22
|
import { MongoRepository } from "../database/MongoRepository.js";
|
|
22
23
|
import { RedisCache } from "../database/RedisCache.js";
|
|
23
24
|
import { Transactional, transactionContext } from "../decorators/DatabaseDecorators.js";
|
|
25
|
+
import { isDuplicateKeyError } from "../database/DatabaseErrors.js";
|
|
24
26
|
const { Config, Init, Inject, Logger } = ObjectDecorators;
|
|
25
27
|
/**
|
|
26
28
|
* Common utility functions for working with `AccessControlList` objects and validating user permissions.
|
|
@@ -30,6 +32,11 @@ const { Config, Init, Inject, Logger } = ObjectDecorators;
|
|
|
30
32
|
export class ACLUtils {
|
|
31
33
|
constructor() {
|
|
32
34
|
this.enabled = true;
|
|
35
|
+
/**
|
|
36
|
+
* The uids of every code-defined (class, route and endpoint) ACL registered via `saveDefaultACL()` in this
|
|
37
|
+
* process, together with their `default_<uid>` counterparts. See `isReservedUid()`.
|
|
38
|
+
*/
|
|
39
|
+
this.reservedUids = new Set();
|
|
33
40
|
this.trustedRoles = ["admin"];
|
|
34
41
|
}
|
|
35
42
|
get repo() {
|
|
@@ -85,6 +92,39 @@ export class ACLUtils {
|
|
|
85
92
|
return "wildcard";
|
|
86
93
|
return "none";
|
|
87
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Determines whether `uid` names a code-defined ACL: any `default_<uid>` ACL, or a class/route/endpoint ACL (or
|
|
97
|
+
* its `default_` counterpart) registered through `saveDefaultACL()`. Such an ACL governs a whole model or route,
|
|
98
|
+
* so a record must never be created at, adopt, or remove it (see `RepoUtils.create()`/`delete()`/`truncate()`).
|
|
99
|
+
*
|
|
100
|
+
* @param uid The ACL uid to check.
|
|
101
|
+
*/
|
|
102
|
+
isReservedUid(uid) {
|
|
103
|
+
return typeof uid === "string" && (uid.startsWith("default_") || this.reservedUids.has(uid));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Determines whether `acl` is a code-defined ACL: its uid is reserved (see `isReservedUid()`), or it has the
|
|
107
|
+
* shape of the user-editable half of a default ACL (its parent is `default_<uid>`). The latter also catches one
|
|
108
|
+
* registered by a route or model that this process doesn't load.
|
|
109
|
+
*
|
|
110
|
+
* @param acl The ACL to check.
|
|
111
|
+
*/
|
|
112
|
+
isProtectedACL(acl) {
|
|
113
|
+
return !!acl && (this.isReservedUid(acl.uid) || acl.parentUid === `default_${acl.uid}`);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Drops the cached copies of the given ACLs, so the next permission check reads them from the database. Any code
|
|
117
|
+
* that writes ACL documents without going through `saveACL()`/`removeACL()` must call this (e.g. `RepoUtils`
|
|
118
|
+
* serving the ACL REST routes).
|
|
119
|
+
*
|
|
120
|
+
* @param uids The uids of the ACLs to invalidate.
|
|
121
|
+
*/
|
|
122
|
+
async invalidateACLs(uids) {
|
|
123
|
+
if (!this.cache || uids.length === 0) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
await this.cache.deleteMany(uids);
|
|
127
|
+
}
|
|
88
128
|
/**
|
|
89
129
|
* Validates that the user has permission to perform the request operation against the URL path for the
|
|
90
130
|
* provided request. If ACLUtils has not been initialized or the `acl` datasource has not been configured
|
|
@@ -172,8 +212,9 @@ export class ACLUtils {
|
|
|
172
212
|
* @param entityId The unique identifier of the ACL to retrieve.
|
|
173
213
|
* @param parentUids The list of already found parent UIDs. This is used to break circular dependencies.
|
|
174
214
|
* @param options Set `skipCache: true` to bypass the cache and always read the current database state —
|
|
175
|
-
* mirrors `RepoUtils`'s `RepoFindOptions.skipCache
|
|
176
|
-
* afterward
|
|
215
|
+
* mirrors `RepoUtils`'s `RepoFindOptions.skipCache` (applies to the whole parent chain). A database read is
|
|
216
|
+
* written back into the cache afterward. Set `skipParents: true` to not populate the parent chain at all, when
|
|
217
|
+
* only the ACL itself is needed.
|
|
177
218
|
*/
|
|
178
219
|
async findACL(entityId, parentUids = [], options) {
|
|
179
220
|
if (!this.enabled || !this.repo) {
|
|
@@ -182,8 +223,12 @@ export class ACLUtils {
|
|
|
182
223
|
// Retrieve the ACL from the cache if present. A cache hit must still fall through to the parent-chain
|
|
183
224
|
// population below (not return early) — a cached ACL was stored via its own plain, unpopulated `.parent`
|
|
184
225
|
// (see the cache write below), so skipping that step here would silently return an ACL with no parent
|
|
185
|
-
// chain, which `hasPermission()` needs to find inherited records.
|
|
226
|
+
// chain, which `hasPermission()` needs to find inherited records. A cached entry that isn't the requested
|
|
227
|
+
// ACL is ignored (defense in depth: the key space is shared with `RepoUtils`' cache of the ACL model).
|
|
186
228
|
let acl = options?.skipCache ? undefined : await this.cache?.load(entityId);
|
|
229
|
+
if (acl && acl.uid !== entityId) {
|
|
230
|
+
acl = undefined;
|
|
231
|
+
}
|
|
187
232
|
// If the acl wasn't found in the cache (or the cache was skipped) look in the database
|
|
188
233
|
if (!acl) {
|
|
189
234
|
if (this.repo instanceof MongoRepository) {
|
|
@@ -194,17 +239,19 @@ export class ACLUtils {
|
|
|
194
239
|
acl = await this.repo.findOne({ where: { uid: entityId } });
|
|
195
240
|
acl = acl ? new AccessControlListSQL(acl) : undefined;
|
|
196
241
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
this.cache
|
|
201
|
-
this.
|
|
202
|
-
|
|
203
|
-
|
|
242
|
+
// Store a copy in the cache for faster retrieval next time. Only after a database read: re-saving on
|
|
243
|
+
// every cache hit would keep renewing (and re-publishing to Redis) an entry that has since gone stale,
|
|
244
|
+
// for as long as someone keeps making requests against it.
|
|
245
|
+
if (acl && this.cache) {
|
|
246
|
+
this.cache.save(entityId, acl).catch((err) => {
|
|
247
|
+
this.logger?.warn(`ACLUtils: Cache save failed for ACL ${entityId}.`);
|
|
248
|
+
this.logger?.debug(err);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
204
251
|
}
|
|
205
252
|
// Retrieve the parent ACL and assign it if available. Don't populate parents we've
|
|
206
253
|
// already found to prevent a circular dependency.
|
|
207
|
-
if (acl && acl.parentUid && !parentUids.includes(acl.parentUid)) {
|
|
254
|
+
if (acl && acl.parentUid && !options?.skipParents && !parentUids.includes(acl.parentUid)) {
|
|
208
255
|
parentUids.push(acl.parentUid);
|
|
209
256
|
acl.parent = await this.findACL(acl.parentUid, parentUids, options);
|
|
210
257
|
}
|
|
@@ -226,26 +273,38 @@ export class ACLUtils {
|
|
|
226
273
|
* actually belongs to the same physical connection this repo does. Reusing it directly used to throw
|
|
227
274
|
* (Mongo) or silently target the wrong connection (SQL).
|
|
228
275
|
*
|
|
276
|
+
* Pass `unlessProtected: true` to leave a code-defined ACL (see `isProtectedACL()`) in place, resolving to
|
|
277
|
+
* `undefined` as if there had been nothing to remove. `RepoUtils` uses this when cleaning up after a record, so a
|
|
278
|
+
* record that shares a class/route ACL's uid can never delete that ACL.
|
|
279
|
+
*
|
|
229
280
|
* @param uid The unique identifier of the ACL to remove.
|
|
281
|
+
* @param options Set `unlessProtected: true` to never remove a code-defined ACL.
|
|
230
282
|
*/
|
|
231
|
-
async removeACL(uid) {
|
|
283
|
+
async removeACL(uid, options) {
|
|
232
284
|
if (!this.enabled) {
|
|
233
285
|
return undefined;
|
|
234
286
|
}
|
|
235
287
|
if (!this.repo) {
|
|
236
288
|
throw new Error("repo is not set.");
|
|
237
289
|
}
|
|
290
|
+
if (options?.unlessProtected && this.isReservedUid(uid)) {
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
238
293
|
const ctx = transactionContext.getStore();
|
|
239
294
|
let removed;
|
|
240
295
|
try {
|
|
241
296
|
if (this.repo instanceof MongoRepository) {
|
|
242
|
-
|
|
297
|
+
// The parent condition is part of the atomic delete itself, so a protected ACL is never removed.
|
|
298
|
+
const filter = options?.unlessProtected
|
|
299
|
+
? { uid, parentUid: { $ne: `default_${uid}` } }
|
|
300
|
+
: { uid };
|
|
301
|
+
const deleted = await this.repo.findOneAndDelete(filter, { session: ctx?.session });
|
|
243
302
|
removed = deleted ? new AccessControlListMongo(deleted) : undefined;
|
|
244
303
|
}
|
|
245
304
|
else {
|
|
246
305
|
const repo = ctx?.entityManager ? ctx.entityManager.getRepository(AccessControlListSQL) : this.repo;
|
|
247
306
|
const existing = await repo.findOne({ where: { uid } });
|
|
248
|
-
if (existing) {
|
|
307
|
+
if (existing && !(options?.unlessProtected && this.isProtectedACL(existing))) {
|
|
249
308
|
await repo.delete({ uid });
|
|
250
309
|
removed = new AccessControlListSQL(existing);
|
|
251
310
|
}
|
|
@@ -343,9 +402,15 @@ export class ACLUtils {
|
|
|
343
402
|
* need the entity-side write and this ACL save to stay consistent should register a compensating action
|
|
344
403
|
* via `registerRollbackHook()`.
|
|
345
404
|
*
|
|
405
|
+
* Pass `createOnly: true` to claim a brand new ACL: it is only ever inserted (at version `0`), never merged
|
|
406
|
+
* into or overwritten on top of an ACL that already exists at the same uid. If one already exists - including
|
|
407
|
+
* one a concurrent caller inserted first, caught by the ACL collection's unique key - an `IDENTIFIER_EXISTS`
|
|
408
|
+
* `ApiError` (400) is thrown instead. Used by `RepoUtils.create()` so that a create can never adopt (and grant
|
|
409
|
+
* its creator rights on) an ACL that belongs to some other record.
|
|
410
|
+
*
|
|
346
411
|
* @param acl The ACL to store.
|
|
347
412
|
* @param options Set `preserveVersion: true` to restore `acl` exactly as given (see above) instead of the
|
|
348
|
-
* normal optimistic-locking update semantics.
|
|
413
|
+
* normal optimistic-locking update semantics. Set `createOnly: true` to only ever insert a new ACL (see above).
|
|
349
414
|
* @return Returns the ACL that was stored in the database.
|
|
350
415
|
*/
|
|
351
416
|
async saveACL(acl, options) {
|
|
@@ -358,7 +423,10 @@ export class ACLUtils {
|
|
|
358
423
|
}
|
|
359
424
|
const ctx = transactionContext.getStore();
|
|
360
425
|
const preserveVersion = !!options?.preserveVersion;
|
|
361
|
-
if (
|
|
426
|
+
if (options?.createOnly) {
|
|
427
|
+
result = await this.insertNewACL(acl, ctx);
|
|
428
|
+
}
|
|
429
|
+
else if (this.repo instanceof MongoRepository) {
|
|
362
430
|
const mACL = new AccessControlListMongo(acl);
|
|
363
431
|
const existing = await this.repo.findOne({ uid: acl.uid }, {
|
|
364
432
|
session: ctx?.session,
|
|
@@ -423,6 +491,61 @@ export class ACLUtils {
|
|
|
423
491
|
}
|
|
424
492
|
return result;
|
|
425
493
|
}
|
|
494
|
+
/**
|
|
495
|
+
* Implements `saveACL()`'s `createOnly` mode: inserts `acl` as a brand new version `0` document, refusing with
|
|
496
|
+
* `IDENTIFIER_EXISTS` if an ACL already exists at its uid (checked up front, and again via the unique key if a
|
|
497
|
+
* concurrent insert wins the race in between).
|
|
498
|
+
*/
|
|
499
|
+
async insertNewACL(acl, ctx) {
|
|
500
|
+
const exists = () => new ApiError(ApiErrors.IDENTIFIER_EXISTS, 400, ApiErrorMessages.IDENTIFIER_EXISTS);
|
|
501
|
+
if (this.repo instanceof MongoRepository) {
|
|
502
|
+
const repo = this.repo;
|
|
503
|
+
if (await repo.findOne({ uid: acl.uid }, { session: ctx?.session })) {
|
|
504
|
+
throw exists();
|
|
505
|
+
}
|
|
506
|
+
const aclMongo = new AccessControlListMongo({
|
|
507
|
+
...acl,
|
|
508
|
+
_id: undefined,
|
|
509
|
+
dateModifed: new Date(),
|
|
510
|
+
version: 0,
|
|
511
|
+
});
|
|
512
|
+
try {
|
|
513
|
+
// `insertOnly` so this can never replace an existing document, whatever `_id` it carries.
|
|
514
|
+
return await repo.save(aclMongo, { session: ctx?.session, insertOnly: true });
|
|
515
|
+
}
|
|
516
|
+
catch (err) {
|
|
517
|
+
// (uid, version) is unique for ACL documents, so a concurrent claim of the same uid fails here.
|
|
518
|
+
if (isDuplicateKeyError(err)) {
|
|
519
|
+
throw exists();
|
|
520
|
+
}
|
|
521
|
+
throw err;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
const repo = ctx?.entityManager
|
|
525
|
+
? ctx.entityManager.getRepository(AccessControlListSQL)
|
|
526
|
+
: this.repo;
|
|
527
|
+
if (await repo.findOne({ where: { uid: acl.uid } })) {
|
|
528
|
+
throw exists();
|
|
529
|
+
}
|
|
530
|
+
const aclSQL = new AccessControlListSQL({
|
|
531
|
+
...acl,
|
|
532
|
+
dateModifed: new Date(),
|
|
533
|
+
version: 0,
|
|
534
|
+
});
|
|
535
|
+
try {
|
|
536
|
+
// `insert()` rather than `save()`: TypeORM's `save()` turns into an UPDATE when the row already exists.
|
|
537
|
+
await repo.insert(aclSQL);
|
|
538
|
+
}
|
|
539
|
+
catch (err) {
|
|
540
|
+
// `uid` is the primary key for ACL rows, so a concurrent claim of the same uid fails here. The failed
|
|
541
|
+
// statement may have poisoned the active transaction, so check for the winner outside of it.
|
|
542
|
+
if (await this.repo.findOne({ where: { uid: acl.uid } })) {
|
|
543
|
+
throw exists();
|
|
544
|
+
}
|
|
545
|
+
throw err;
|
|
546
|
+
}
|
|
547
|
+
return aclSQL;
|
|
548
|
+
}
|
|
426
549
|
/**
|
|
427
550
|
* Stores the given default access control list into the ACL database. A default ACL is a special type of ACL
|
|
428
551
|
* that is primarily defined and maintained within the code but allows for user-specific overrides. To accomplish
|
|
@@ -432,8 +555,15 @@ export class ACLUtils {
|
|
|
432
555
|
* overrides. As the `default_<uid>` record is always overwritten with the lastest version of the code, any
|
|
433
556
|
* user-defined changes made to it are lost on service restart.
|
|
434
557
|
*
|
|
435
|
-
*
|
|
436
|
-
*
|
|
558
|
+
* Both uids are reserved (see `isReservedUid()`), so no record can be created at, adopt or remove either ACL.
|
|
559
|
+
*
|
|
560
|
+
* Contract: when RBAC is enabled and `acl` is given, this either resolves to the user-editable ACL (whose `uid`
|
|
561
|
+
* is `acl.uid`) or throws; it never resolves to `null` then. A missing user-editable ACL (e.g. one deleted since
|
|
562
|
+
* the last start) is recreated, with no records, under `default_<uid>`. It resolves to `null` only when RBAC is
|
|
563
|
+
* disabled or no `acl` is given, and then stores nothing.
|
|
564
|
+
*
|
|
565
|
+
* @param acl The code-defined ACL to store.
|
|
566
|
+
* @returns The user-editable ACL, or `null` when RBAC is disabled or no ACL was given.
|
|
437
567
|
*/
|
|
438
568
|
async saveDefaultACL(acl) {
|
|
439
569
|
let result = null;
|
|
@@ -445,6 +575,8 @@ export class ACLUtils {
|
|
|
445
575
|
...acl,
|
|
446
576
|
uid: `default_${acl.uid}`,
|
|
447
577
|
};
|
|
578
|
+
this.reservedUids.add(acl.uid);
|
|
579
|
+
this.reservedUids.add(defaultAcl.uid);
|
|
448
580
|
// Attempt to update the default ACL record. If a version mismatch occurs we will try again.
|
|
449
581
|
const maxAttempts = 3;
|
|
450
582
|
let attempts = 0;
|
|
@@ -454,22 +586,25 @@ export class ACLUtils {
|
|
|
454
586
|
// and another named `<NAME>`. The `<NAME>` record stores the user-defined
|
|
455
587
|
// overrides that overlay the `default_<NAME>` document. The `default_<NAME>` is
|
|
456
588
|
// therefore always updated with whatever is provided as the `defaultAcl` argument.
|
|
457
|
-
|
|
589
|
+
// Read from the database, not the cache: these reads decide whether the ACLs must be (re)created.
|
|
590
|
+
const existing = await this.findACL(defaultAcl.uid, [], {
|
|
591
|
+
skipCache: true,
|
|
592
|
+
skipParents: true,
|
|
593
|
+
});
|
|
458
594
|
if (existing) {
|
|
459
595
|
// Copy over the new records from code
|
|
460
596
|
existing.records = defaultAcl.records;
|
|
461
597
|
defaultAcl = existing;
|
|
462
|
-
// The user-defined override record was already created on a previous run. Look it
|
|
463
|
-
// up so callers still receive a valid ACL to register routes against instead of `null`.
|
|
464
|
-
result = (await this.findACL(acl.uid)) ?? null;
|
|
465
598
|
}
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
599
|
+
// The user-defined override record normally exists from a previous run. When it's missing (never
|
|
600
|
+
// created, or deleted since) it is recreated: without it `checkRequestPerms()` has nothing to find,
|
|
601
|
+
// and a route registered against `null` would silently lose its permission checks.
|
|
602
|
+
result = (await this.findACL(acl.uid, [], { skipCache: true })) ?? null;
|
|
603
|
+
if (!result) {
|
|
604
|
+
result = await this.saveACL({ uid: acl.uid, parentUid: defaultAcl.uid, records: [] }, { createOnly: true });
|
|
605
|
+
}
|
|
606
|
+
else if (result.parentUid !== defaultAcl.uid) {
|
|
607
|
+
this.logger?.warn(`ACLUtils: ACL ${acl.uid} does not inherit from ${defaultAcl.uid} (parentUid=${result.parentUid}).`);
|
|
473
608
|
}
|
|
474
609
|
// Always save the ACL into the datasource
|
|
475
610
|
await this.saveACL(defaultAcl);
|
|
@@ -499,11 +634,12 @@ export class ACLUtils {
|
|
|
499
634
|
* would issue overlapping commands against one session, which drivers reject or misorder.
|
|
500
635
|
*
|
|
501
636
|
* @param uids The unique identifiers of the ACLs to remove.
|
|
637
|
+
* @param options Set `unlessProtected: true` to never remove a code-defined ACL (see `removeACL()`).
|
|
502
638
|
*/
|
|
503
|
-
async removeACLs(uids) {
|
|
639
|
+
async removeACLs(uids, options) {
|
|
504
640
|
const removed = [];
|
|
505
641
|
for (const uid of uids) {
|
|
506
|
-
const acl = await this.removeACL(uid);
|
|
642
|
+
const acl = await this.removeACL(uid, options);
|
|
507
643
|
if (acl) {
|
|
508
644
|
removed.push(acl);
|
|
509
645
|
}
|
|
@@ -640,7 +776,7 @@ __decorate([
|
|
|
640
776
|
__decorate([
|
|
641
777
|
Transactional("acl"),
|
|
642
778
|
__metadata("design:type", Function),
|
|
643
|
-
__metadata("design:paramtypes", [String]),
|
|
779
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
644
780
|
__metadata("design:returntype", Promise)
|
|
645
781
|
], ACLUtils.prototype, "removeACL", null);
|
|
646
782
|
__decorate([
|
|
@@ -652,7 +788,7 @@ __decorate([
|
|
|
652
788
|
__decorate([
|
|
653
789
|
Transactional("acl"),
|
|
654
790
|
__metadata("design:type", Function),
|
|
655
|
-
__metadata("design:paramtypes", [Array]),
|
|
791
|
+
__metadata("design:paramtypes", [Array, Object]),
|
|
656
792
|
__metadata("design:returntype", Promise)
|
|
657
793
|
], ACLUtils.prototype, "removeACLs", null);
|
|
658
794
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACLUtils.js","sourceRoot":"","sources":["../../../src/security/ACLUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ACLUtils.js","sourceRoot":"","sources":["../../../src/security/ACLUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,12 @@ export declare class BackgroundServiceManager {
|
|
|
54
54
|
* @param args The list of arguments to pass into the service constructor
|
|
55
55
|
*/
|
|
56
56
|
start(serviceName: string, clazz?: any, ...args: any): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Returns `true` if node-schedule accepts the given schedule, without scheduling anything.
|
|
59
|
+
*
|
|
60
|
+
* @param spec The cron string, date or recurrence rule to validate.
|
|
61
|
+
*/
|
|
62
|
+
private static isValidSchedule;
|
|
57
63
|
/**
|
|
58
64
|
* Stops all currently active background services that are owned by the manager.
|
|
59
65
|
*/
|
|
@@ -18,6 +18,10 @@ export declare class EventListenerManager {
|
|
|
18
18
|
private readonly redis;
|
|
19
19
|
constructor(objectFactory: ObjectFactory, redis: RedisClientType);
|
|
20
20
|
init(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Unsubscribes from all channels, closes this manager's own (duplicated) redis client and removes all
|
|
23
|
+
* registered handlers. Safe to call more than once.
|
|
24
|
+
*/
|
|
21
25
|
destroy(): Promise<void>;
|
|
22
26
|
/**
|
|
23
27
|
* Handler function for events that arrive from redis.
|
package/dist/types/NetUtils.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { HttpRequest as XRequest } from "./http/index.js";
|
|
2
|
+
/** The list of trusted proxies accepted by `NetUtils`: an array of entries, or one comma-separated string. */
|
|
3
|
+
export type TrustedProxies = readonly string[] | string;
|
|
2
4
|
/**
|
|
3
5
|
* Provides common utilities and functions for working with networking related problems.
|
|
4
6
|
*
|
|
5
7
|
* @author Jean-Philippe Steinmetz <rapidrests@gmail.com>
|
|
6
8
|
*/
|
|
7
9
|
export declare class NetUtils {
|
|
10
|
+
/** Compiled `trustedProxies` lists, keyed by their normalized, `|`-joined entries. */
|
|
11
|
+
private static readonly proxyListCache;
|
|
8
12
|
/**
|
|
9
13
|
* Performs DNS lookup of the IP address from a given url.
|
|
10
14
|
*
|
|
@@ -13,17 +17,72 @@ export declare class NetUtils {
|
|
|
13
17
|
* @returns A `string` containing the IP address if found, otherwise `undefined`.
|
|
14
18
|
*/
|
|
15
19
|
static lookupIPAddress(url: string, family?: number): Promise<string | undefined>;
|
|
20
|
+
/**
|
|
21
|
+
* Parses and canonicalizes a single IP address so that two spellings of the same address always compare
|
|
22
|
+
* equal. Accepts an optional port (`1.2.3.4:80`, `[::1]:80`), brackets and an IPv6 zone id, all of which are
|
|
23
|
+
* removed.
|
|
24
|
+
*
|
|
25
|
+
* - IPv4 addresses are returned unchanged (e.g. `10.0.0.1`).
|
|
26
|
+
* - IPv4-mapped IPv6 addresses are unmapped to plain IPv4, in either spelling: `::ffff:127.0.0.1` and uWS's
|
|
27
|
+
* fully expanded `0000:0000:0000:0000:0000:ffff:7f00:0001` both become `127.0.0.1`.
|
|
28
|
+
* - Other IPv6 addresses are returned in RFC 5952 form: lowercase, no leading zeros, and the longest run of
|
|
29
|
+
* two or more zero groups compressed to `::` (e.g. `2001:0DB8:0:0:0:0:0:1` becomes `2001:db8::1`).
|
|
30
|
+
*
|
|
31
|
+
* @param value The address to normalize.
|
|
32
|
+
* @returns The canonical address, or `undefined` if `value` is not a valid IPv4/IPv6 address.
|
|
33
|
+
*/
|
|
34
|
+
static normalizeIP(value: string | undefined | null): string | undefined;
|
|
35
|
+
/** Expands an already validated IPv6 address (no zone id) into its eight 16-bit groups. */
|
|
36
|
+
private static expandIPv6;
|
|
37
|
+
/** Formats eight 16-bit groups as an RFC 5952 IPv6 address. */
|
|
38
|
+
private static compressIPv6;
|
|
39
|
+
/**
|
|
40
|
+
* Compiles (and caches) a `trustedProxies` list into a `BlockList`. Each entry is a single IPv4/IPv6 address or a
|
|
41
|
+
* CIDR range (`10.0.0.0/8`, `fd00::/8`). Entries are normalized the same way as `normalizeIP()`. Invalid entries
|
|
42
|
+
* are ignored.
|
|
43
|
+
*/
|
|
44
|
+
private static compileTrustedProxies;
|
|
45
|
+
/**
|
|
46
|
+
* Returns `true` if `address` matches an entry of `trustedProxies`. Both sides are normalized first (see
|
|
47
|
+
* `normalizeIP()`), so e.g. `::ffff:10.0.0.1` matches a `10.0.0.1` entry, and CIDR range entries are supported.
|
|
48
|
+
*
|
|
49
|
+
* @param address The address to check.
|
|
50
|
+
* @param trustedProxies The trusted proxy addresses and/or CIDR ranges, as an array or a comma-separated string.
|
|
51
|
+
*/
|
|
52
|
+
static isTrustedProxy(address: string | undefined, trustedProxies?: TrustedProxies): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the IP address of the client that made the given request, in canonical form (see `normalizeIP()`).
|
|
55
|
+
* This is the address that should be used for rate limiting, audit logs and any other per-client keying.
|
|
56
|
+
*
|
|
57
|
+
* The result is determined as follows:
|
|
58
|
+
* 1. If the socket's remote address is not a valid IP, it is returned as-is (or `undefined` if empty) and no
|
|
59
|
+
* header is consulted.
|
|
60
|
+
* 2. If `trustedProxies` is empty or the remote address is not a trusted proxy, the remote address is returned.
|
|
61
|
+
* Forwarding headers are ignored, so an untrusted client cannot choose its own address.
|
|
62
|
+
* 3. Otherwise `X-Forwarded-For` is walked from right to left (every `X-Forwarded-For` value is taken into
|
|
63
|
+
* account). Addresses of trusted proxies are skipped and the first address that is not a trusted proxy is
|
|
64
|
+
* returned. If an entry is not a valid IP address, the walk stops and the last trusted hop is returned, since
|
|
65
|
+
* nothing left of it can be trusted. If every entry is a trusted proxy, the left-most entry is returned.
|
|
66
|
+
* 4. If there is no `X-Forwarded-For` header, a valid `X-Real-IP` header is returned, else the remote address.
|
|
67
|
+
*
|
|
68
|
+
* `X-Original-Forwarded-For` is never consulted.
|
|
69
|
+
*
|
|
70
|
+
* @param req The HTTP request to extract the client address from.
|
|
71
|
+
* @param trustedProxies The addresses and/or CIDR ranges of reverse proxies whose forwarding headers are
|
|
72
|
+
* trusted, as an array or a comma-separated string.
|
|
73
|
+
* @returns The client's canonical IP address, or `undefined` if the request has no remote address.
|
|
74
|
+
*/
|
|
75
|
+
static getClientIP(req: XRequest, trustedProxies?: TrustedProxies): string | undefined;
|
|
16
76
|
/**
|
|
17
77
|
* Extracts the IP address from a given url or HTTP request.
|
|
18
78
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* trusted-proxy list the headers are ignored and the socket address is returned directly,
|
|
22
|
-
* preventing clients from spoofing their IP in audit logs.
|
|
79
|
+
* For an HTTP request this is identical to `getClientIP()`: forwarding headers are only trusted when the
|
|
80
|
+
* direct connection's remote address is one of `trustedProxies`, and the result is normalized.
|
|
23
81
|
*
|
|
24
82
|
* @param urlOrRequest The url or HTTP request to extract the IP from.
|
|
25
|
-
* @param trustedProxies Optional list of proxy IP addresses whose forwarding headers should
|
|
83
|
+
* @param trustedProxies Optional list of proxy IP addresses and/or CIDR ranges whose forwarding headers should
|
|
84
|
+
* be trusted.
|
|
26
85
|
* @returns A `string` containing the IP address if found, otherwise `undefined`.
|
|
27
86
|
*/
|
|
28
|
-
static getIPAddress(urlOrRequest: string | XRequest, trustedProxies?:
|
|
87
|
+
static getIPAddress(urlOrRequest: string | XRequest, trustedProxies?: TrustedProxies): string | undefined;
|
|
29
88
|
}
|
|
@@ -28,9 +28,10 @@ export interface IPRateLimitConfig {
|
|
|
28
28
|
export interface RateLimitConfig {
|
|
29
29
|
/**
|
|
30
30
|
* The maximum number of attempts allowed within `windowSeconds` before being rejected. Default is `100`.
|
|
31
|
-
* Note that when driven by the `@RateLimit` decorator this counts attempts against the
|
|
32
|
-
* `<method
|
|
33
|
-
* route, not per-caller - the default is set well above the per-IP default below for that reason.
|
|
31
|
+
* Note that when driven by the `@RateLimit` decorator without `perUser`, this counts attempts against the
|
|
32
|
+
* identifier `<method>|<path>` (see `RouteUtils.checkRateLimiter()`), i.e. combined across *every* caller of that
|
|
33
|
+
* route, not per-caller - the default is set well above the per-IP default below for that reason. With
|
|
34
|
+
* `perUser` the identifier is scoped to the user's uid, or to the client IP for anonymous callers.
|
|
34
35
|
*/
|
|
35
36
|
maxAttempts?: number;
|
|
36
37
|
/** The length of the sliding window, in seconds, that `maxAttempts` applies to. Default is `60`. */
|
package/dist/types/Server.d.ts
CHANGED
|
@@ -7,8 +7,12 @@ import { BackgroundServiceManager } from "./BackgroundServiceManager.js";
|
|
|
7
7
|
import { RouteUtils } from "./routes/RouteUtils.js";
|
|
8
8
|
import { OpenApiSpec } from "./OpenApiSpec.js";
|
|
9
9
|
import { EventListenerManager } from "./EventListenerManager.js";
|
|
10
|
-
import type { IHttpRouter } from "./http/types.js";
|
|
10
|
+
import type { HttpRequest, HttpResponse, IHttpRouter, NextFunction } from "./http/types.js";
|
|
11
11
|
import { SessionManager } from "./http/session/SessionManager.js";
|
|
12
|
+
/** The metrics label used for every request that didn't match a registered application route. */
|
|
13
|
+
export declare const UNMATCHED_ROUTE_LABEL = "<unmatched>";
|
|
14
|
+
/** Default time `Server.stop()` waits for in-flight requests to finish, in milliseconds (`shutdown:drain_timeout`). */
|
|
15
|
+
export declare const DEFAULT_DRAIN_TIMEOUT_MS = 10000;
|
|
12
16
|
/**
|
|
13
17
|
* The configuration options to use when constructing a new Server instance.
|
|
14
18
|
*/
|
|
@@ -188,7 +192,34 @@ export declare class Server {
|
|
|
188
192
|
*/
|
|
189
193
|
start(): Promise<void>;
|
|
190
194
|
/**
|
|
191
|
-
*
|
|
195
|
+
* Serializes one error for a client response. An `ApiError` keeps its own fields (`code`, `status`, `message`,
|
|
196
|
+
* ...). Anything else, such as a raw database driver error carrying the failed SQL `query` and its `parameters`,
|
|
197
|
+
* is replaced by the generic internal error so none of its details reach the client. Stack traces are never
|
|
198
|
+
* included.
|
|
199
|
+
*
|
|
200
|
+
* @param err The error to serialize.
|
|
201
|
+
*/
|
|
202
|
+
protected serializeError(err: any): any;
|
|
203
|
+
/**
|
|
204
|
+
* The final error handling middleware. Logs the error and sends it to the client as JSON (see `serializeError()`).
|
|
205
|
+
*/
|
|
206
|
+
protected handleError(err: any, _req: HttpRequest, res: HttpResponse, next: NextFunction): void;
|
|
207
|
+
/**
|
|
208
|
+
* The final middleware of every request: records the request metrics and ends the response if nothing else did.
|
|
209
|
+
* Metrics are labeled with `req.routePattern` rather than the raw path, so their cardinality is bounded by the
|
|
210
|
+
* application's routes.
|
|
211
|
+
*/
|
|
212
|
+
protected recordRequestMetrics(req: HttpRequest, res: HttpResponse): void;
|
|
213
|
+
/**
|
|
214
|
+
* Stops the server gracefully:
|
|
215
|
+
*
|
|
216
|
+
* 1. Stops all background services.
|
|
217
|
+
* 2. Stops accepting new connections and waits up to `shutdown:drain_timeout` milliseconds (default 10000) for
|
|
218
|
+
* in-flight requests to finish, then closes the remaining keep-alive and WebSocket connections.
|
|
219
|
+
* 3. Destroys the event listener manager, closing its redis subscription.
|
|
220
|
+
* 4. Closes all database connections.
|
|
221
|
+
*
|
|
222
|
+
* The whole sequence is bounded by a 30 second watchdog.
|
|
192
223
|
*/
|
|
193
224
|
stop(): Promise<void>;
|
|
194
225
|
/**
|