@spinajs/authn-orm 3.0.4 → 3.0.6
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/README.md +2 -2
- package/lib/cjs/audit/db-audit-sink.d.ts +3 -0
- package/lib/cjs/audit/db-audit-sink.d.ts.map +1 -1
- package/lib/cjs/audit/db-audit-sink.js +7 -1
- package/lib/cjs/audit/db-audit-sink.js.map +1 -1
- package/lib/cjs/audit/retention.d.ts +3 -0
- package/lib/cjs/audit/retention.d.ts.map +1 -1
- package/lib/cjs/audit/retention.js +4 -1
- package/lib/cjs/audit/retention.js.map +1 -1
- package/lib/cjs/cli/PurgeAudit.d.ts +3 -0
- package/lib/cjs/cli/PurgeAudit.d.ts.map +1 -1
- package/lib/cjs/cli/PurgeAudit.js +5 -0
- package/lib/cjs/cli/PurgeAudit.js.map +1 -1
- package/lib/cjs/links/db-link-store.d.ts +3 -0
- package/lib/cjs/links/db-link-store.d.ts.map +1 -1
- package/lib/cjs/links/db-link-store.js +7 -5
- package/lib/cjs/links/db-link-store.js.map +1 -1
- package/lib/cjs/mfa/db-mfa-store.d.ts +3 -0
- package/lib/cjs/mfa/db-mfa-store.d.ts.map +1 -1
- package/lib/cjs/mfa/db-mfa-store.js +7 -11
- package/lib/cjs/mfa/db-mfa-store.js.map +1 -1
- package/lib/cjs/nonces/nonce-store.d.ts +3 -0
- package/lib/cjs/nonces/nonce-store.d.ts.map +1 -1
- package/lib/cjs/nonces/nonce-store.js +7 -2
- package/lib/cjs/nonces/nonce-store.js.map +1 -1
- package/lib/cjs/secrets/db-secret-store.d.ts +3 -0
- package/lib/cjs/secrets/db-secret-store.d.ts.map +1 -1
- package/lib/cjs/secrets/db-secret-store.js +7 -3
- package/lib/cjs/secrets/db-secret-store.js.map +1 -1
- package/lib/cjs/throttle/db-throttle-store.d.ts +2 -0
- package/lib/cjs/throttle/db-throttle-store.d.ts.map +1 -1
- package/lib/cjs/throttle/db-throttle-store.js +2 -4
- package/lib/cjs/throttle/db-throttle-store.js.map +1 -1
- package/lib/cjs/throttle/db-throttle.d.ts +3 -0
- package/lib/cjs/throttle/db-throttle.d.ts.map +1 -1
- package/lib/cjs/throttle/db-throttle.js +5 -0
- package/lib/cjs/throttle/db-throttle.js.map +1 -1
- package/lib/mjs/audit/db-audit-sink.d.ts +3 -0
- package/lib/mjs/audit/db-audit-sink.d.ts.map +1 -1
- package/lib/mjs/audit/db-audit-sink.js +9 -3
- package/lib/mjs/audit/db-audit-sink.js.map +1 -1
- package/lib/mjs/audit/retention.d.ts +3 -0
- package/lib/mjs/audit/retention.d.ts.map +1 -1
- package/lib/mjs/audit/retention.js +6 -3
- package/lib/mjs/audit/retention.js.map +1 -1
- package/lib/mjs/cli/PurgeAudit.d.ts +3 -0
- package/lib/mjs/cli/PurgeAudit.d.ts.map +1 -1
- package/lib/mjs/cli/PurgeAudit.js +5 -0
- package/lib/mjs/cli/PurgeAudit.js.map +1 -1
- package/lib/mjs/links/db-link-store.d.ts +3 -0
- package/lib/mjs/links/db-link-store.d.ts.map +1 -1
- package/lib/mjs/links/db-link-store.js +9 -7
- package/lib/mjs/links/db-link-store.js.map +1 -1
- package/lib/mjs/mfa/db-mfa-store.d.ts +3 -0
- package/lib/mjs/mfa/db-mfa-store.d.ts.map +1 -1
- package/lib/mjs/mfa/db-mfa-store.js +9 -13
- package/lib/mjs/mfa/db-mfa-store.js.map +1 -1
- package/lib/mjs/nonces/nonce-store.d.ts +3 -0
- package/lib/mjs/nonces/nonce-store.d.ts.map +1 -1
- package/lib/mjs/nonces/nonce-store.js +9 -4
- package/lib/mjs/nonces/nonce-store.js.map +1 -1
- package/lib/mjs/secrets/db-secret-store.d.ts +3 -0
- package/lib/mjs/secrets/db-secret-store.d.ts.map +1 -1
- package/lib/mjs/secrets/db-secret-store.js +9 -5
- package/lib/mjs/secrets/db-secret-store.js.map +1 -1
- package/lib/mjs/throttle/db-throttle-store.d.ts +2 -0
- package/lib/mjs/throttle/db-throttle-store.d.ts.map +1 -1
- package/lib/mjs/throttle/db-throttle-store.js +3 -5
- package/lib/mjs/throttle/db-throttle-store.js.map +1 -1
- package/lib/mjs/throttle/db-throttle.d.ts +3 -0
- package/lib/mjs/throttle/db-throttle.d.ts.map +1 -1
- package/lib/mjs/throttle/db-throttle.js +5 -0
- package/lib/mjs/throttle/db-throttle.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +14 -14
package/README.md
CHANGED
|
@@ -39,8 +39,8 @@ The cipher and `identityKey` are also exported from the side-effect-free subpath
|
|
|
39
39
|
|
|
40
40
|
Every store reads and writes through the package's models (`AuthnIdentity`, `AuthnSecret`,
|
|
41
41
|
`AuthnNonce`, `AuthnMfa`, `AuthnRecoveryCode`, `AuthnThrottle`, `AuthnAudit`), which name the
|
|
42
|
-
table and the `default` connection. The stores take no driver:
|
|
43
|
-
|
|
42
|
+
table and the `default` connection. The stores take no driver: each injects the Orm, so resolving a store
|
|
43
|
+
resolves the Orm and binds the models, and a test boots an Orm whose `default` connection is the database under test.
|
|
44
44
|
The stores, `DbAuthnThrottle` and `DbMfaEnrolments` are `@PerChildInstance`: each container that
|
|
45
45
|
resolves one gets its own instance, and the throttle reads that container's configuration.
|
|
46
46
|
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { AuthnEventSink } from '@spinajs/authn/contracts';
|
|
2
2
|
import type { AuthnEvent } from '@spinajs/authn/contracts';
|
|
3
|
+
import { Orm } from '@spinajs/orm';
|
|
3
4
|
/**
|
|
4
5
|
* One `authn_audit` row per event (SR-11). Nothing in an event makes the write fail, so a sink never fails a call
|
|
5
6
|
* whose work is already done (D4 over D1): free text longer than its column is cut, and an identity or actor that
|
|
6
7
|
* does not fit its column leaves the column null and goes whole into `data` (`identityRef`, `actorRef`).
|
|
7
8
|
*/
|
|
8
9
|
export declare class DbAuthnAuditSink extends AuthnEventSink {
|
|
10
|
+
/** Never read: injecting it resolves the Orm, which binds the models, before the first query. */
|
|
11
|
+
protected Orm: Orm;
|
|
9
12
|
publish(e: AuthnEvent): Promise<void>;
|
|
10
13
|
}
|
|
11
14
|
//# sourceMappingURL=db-audit-sink.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-audit-sink.d.ts","sourceRoot":"","sources":["../../../src/audit/db-audit-sink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"db-audit-sink.d.ts","sourceRoot":"","sources":["../../../src/audit/db-audit-sink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,0BAA0B,CAAC;AAEtF,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAwBnC;;;;GAIG;AACH,qBAEa,gBAAiB,SAAQ,cAAc;IAClD,iGAAiG;IAEjG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBjD;CACF"}
|
|
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
8
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
12
|
exports.DbAuthnAuditSink = void 0;
|
|
10
13
|
const node_crypto_1 = require("node:crypto");
|
|
@@ -48,7 +51,6 @@ let DbAuthnAuditSink = class DbAuthnAuditSink extends contracts_1.AuthnEventSink
|
|
|
48
51
|
};
|
|
49
52
|
const data = e.data === undefined && Object.keys(extra).length === 0 ? undefined : { ...(e.data ?? {}), ...extra };
|
|
50
53
|
const at = (0, sql_js_1.instant)((0, sql_js_1.checkedMs)(e.at, 'DbAuthnAuditSink.publish: e.at'));
|
|
51
|
-
await (0, orm_1.ormReady)();
|
|
52
54
|
await AuthnAudit_js_1.AuthnAudit.insert((0, values_js_1.columnValues)({
|
|
53
55
|
id: (0, node_crypto_1.randomUUID)(),
|
|
54
56
|
at,
|
|
@@ -66,6 +68,10 @@ let DbAuthnAuditSink = class DbAuthnAuditSink extends contracts_1.AuthnEventSink
|
|
|
66
68
|
}
|
|
67
69
|
};
|
|
68
70
|
exports.DbAuthnAuditSink = DbAuthnAuditSink;
|
|
71
|
+
__decorate([
|
|
72
|
+
(0, di_1.Autoinject)(orm_1.Orm),
|
|
73
|
+
__metadata("design:type", orm_1.Orm)
|
|
74
|
+
], DbAuthnAuditSink.prototype, "Orm", void 0);
|
|
69
75
|
exports.DbAuthnAuditSink = DbAuthnAuditSink = __decorate([
|
|
70
76
|
(0, di_1.PerChildInstance)(),
|
|
71
77
|
(0, di_1.Injectable)(contracts_1.AuthnEventSink)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-audit-sink.js","sourceRoot":"","sources":["../../../src/audit/db-audit-sink.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-audit-sink.js","sourceRoot":"","sources":["../../../src/audit/db-audit-sink.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import '@spinajs/authn/register-schema';
|
|
2
2
|
import { AsyncService } from '@spinajs/di';
|
|
3
3
|
import { Log } from '@spinajs/log';
|
|
4
|
+
import { Orm } from '@spinajs/orm';
|
|
4
5
|
/**
|
|
5
6
|
* Deletes `authn_audit` rows older than `authn.audit.retentionDays`, in batches, on `purge` and, when
|
|
6
7
|
* `authn.audit.purgeInterval` (ms) is set, on a timer. Both keys are unset by default: audit rows are kept forever.
|
|
7
8
|
*/
|
|
8
9
|
export declare class AuthnAuditRetention extends AsyncService {
|
|
10
|
+
/** Never read: injecting it resolves the Orm, which binds `AuthnAudit`, before the first purge. */
|
|
11
|
+
protected Orm: Orm;
|
|
9
12
|
protected RetentionDays: number | null | undefined;
|
|
10
13
|
protected PurgeInterval: number | null | undefined;
|
|
11
14
|
protected Log: Log;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../../src/audit/retention.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../../src/audit/retention.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAA4C,MAAM,aAAa,CAAC;AAErF,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAQnC;;;GAGG;AACH,qBAEa,mBAAoB,SAAQ,YAAY;IACnD,mGAAmG;IAEnG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAGnD,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAGnD,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,OAAO,CAAS;IAExB,IAAW,OAAO,IAAI,OAAO,CAE5B;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAOpC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpC;IAED,0GAA0G;IAC7F,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB1D;YAEa,IAAI;CAkBnB"}
|
|
@@ -49,7 +49,6 @@ let AuthnAuditRetention = class AuthnAuditRetention extends di_1.AsyncService {
|
|
|
49
49
|
return 0;
|
|
50
50
|
}
|
|
51
51
|
const cutoff = (0, sql_js_1.instant)((0, sql_js_1.checkedMs)(now, 'AuthnAuditRetention.purge: now') - days * DAY_MS);
|
|
52
|
-
await (0, orm_1.ormReady)();
|
|
53
52
|
let removed = 0;
|
|
54
53
|
for (;;) {
|
|
55
54
|
// MSSQL pages with OFFSET ... FETCH, which needs an ORDER BY.
|
|
@@ -86,6 +85,10 @@ let AuthnAuditRetention = class AuthnAuditRetention extends di_1.AsyncService {
|
|
|
86
85
|
}
|
|
87
86
|
};
|
|
88
87
|
exports.AuthnAuditRetention = AuthnAuditRetention;
|
|
88
|
+
__decorate([
|
|
89
|
+
(0, di_1.Autoinject)(orm_1.Orm),
|
|
90
|
+
__metadata("design:type", orm_1.Orm)
|
|
91
|
+
], AuthnAuditRetention.prototype, "Orm", void 0);
|
|
89
92
|
__decorate([
|
|
90
93
|
(0, configuration_1.Config)('authn.audit.retentionDays'),
|
|
91
94
|
__metadata("design:type", Object)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../src/audit/retention.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../src/audit/retention.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { CliCommand } from '@spinajs/cli';
|
|
2
2
|
import { Log } from '@spinajs/log';
|
|
3
|
+
import { OrmMigrator } from '@spinajs/orm';
|
|
3
4
|
import { AuthnAuditRetention } from '../audit/retention.js';
|
|
4
5
|
/** Housekeeping for a scheduler (cron, worker); a no-op while `authn.audit.retentionDays` is unset. */
|
|
5
6
|
export declare class PurgeAudit extends CliCommand {
|
|
6
7
|
protected Log: Log;
|
|
8
|
+
/** The cli resolves only the command, so the command runs the `Migration.OnStartup` pass an app process runs before serving. */
|
|
9
|
+
protected Migrator: OrmMigrator;
|
|
7
10
|
protected Retention: AuthnAuditRetention;
|
|
8
11
|
execute(): Promise<void>;
|
|
9
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PurgeAudit.d.ts","sourceRoot":"","sources":["../../../src/cli/PurgeAudit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAW,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,uGAAuG;AACvG,qBACa,UAAW,SAAQ,UAAU;IAExC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"PurgeAudit.d.ts","sourceRoot":"","sources":["../../../src/cli/PurgeAudit.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAW,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,uGAAuG;AACvG,qBACa,UAAW,SAAQ,UAAU;IAExC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB,gIAAgI;IAEhI,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAGhC,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC;IAE5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAapC;CACF"}
|
|
@@ -13,6 +13,7 @@ exports.PurgeAudit = void 0;
|
|
|
13
13
|
const di_1 = require("@spinajs/di");
|
|
14
14
|
const cli_1 = require("@spinajs/cli");
|
|
15
15
|
const log_1 = require("@spinajs/log");
|
|
16
|
+
const orm_1 = require("@spinajs/orm");
|
|
16
17
|
const retention_js_1 = require("../audit/retention.js");
|
|
17
18
|
/** Housekeeping for a scheduler (cron, worker); a no-op while `authn.audit.retentionDays` is unset. */
|
|
18
19
|
let PurgeAudit = class PurgeAudit extends cli_1.CliCommand {
|
|
@@ -36,6 +37,10 @@ __decorate([
|
|
|
36
37
|
(0, log_1.Logger)('authn-orm'),
|
|
37
38
|
__metadata("design:type", log_1.Log)
|
|
38
39
|
], PurgeAudit.prototype, "Log", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, di_1.Autoinject)(orm_1.OrmMigrator),
|
|
42
|
+
__metadata("design:type", orm_1.OrmMigrator)
|
|
43
|
+
], PurgeAudit.prototype, "Migrator", void 0);
|
|
39
44
|
__decorate([
|
|
40
45
|
(0, di_1.Autoinject)(retention_js_1.AuthnAuditRetention),
|
|
41
46
|
__metadata("design:type", retention_js_1.AuthnAuditRetention)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PurgeAudit.js","sourceRoot":"","sources":["../../../src/cli/PurgeAudit.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAAmD;AACnD,sCAA2C;AAE3C,wDAA4D;AAE5D,uGAAuG;AAEhG,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,gBAAU;
|
|
1
|
+
{"version":3,"file":"PurgeAudit.js","sourceRoot":"","sources":["../../../src/cli/PurgeAudit.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAAmD;AACnD,sCAA2C;AAC3C,sCAA2C;AAE3C,wDAA4D;AAE5D,uGAAuG;AAEhG,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,gBAAU;IAWjC,KAAK,CAAC,OAAO;QAClB,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,8CAA8C,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,gCAAgC,CAAC,CAAC;YAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAA;;AAvBW;IADT,IAAA,YAAM,EAAC,WAAW,CAAC;8BACL,SAAG;uCAAC;AAIT;IADT,IAAA,eAAU,EAAC,iBAAW,CAAC;8BACJ,iBAAW;4CAAC;AAGtB;IADT,IAAA,eAAU,EAAC,kCAAmB,CAAC;8BACX,kCAAmB;6CAAC;qBAT9B,UAAU;IADtB,IAAA,aAAO,EAAC,mBAAmB,EAAE,yDAAyD,CAAC;GAC3E,UAAU,CAyBtB"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { IdentityLinkStore } from '@spinajs/authn/contracts';
|
|
2
2
|
import type { ExternalSubject, IdentityLink, IdentityRef } from '@spinajs/authn/contracts';
|
|
3
|
+
import { Orm } from '@spinajs/orm';
|
|
3
4
|
/** `authn_identity`: external subjects linked to identities (A19). Values longer than their columns throw (D1). */
|
|
4
5
|
export declare class DbIdentityLinkStore extends IdentityLinkStore {
|
|
6
|
+
/** Never read: injecting it resolves the Orm, which binds the models, before the first query. */
|
|
7
|
+
protected Orm: Orm;
|
|
5
8
|
find(provider: string, subject: string): Promise<IdentityLink | null>;
|
|
6
9
|
list(identity: IdentityRef): Promise<readonly IdentityLink[]>;
|
|
7
10
|
/** A duplicate (provider, subject) rejects with `ResourceDuplicated` (the unique index decides). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-link-store.d.ts","sourceRoot":"","sources":["../../../src/links/db-link-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"db-link-store.d.ts","sourceRoot":"","sources":["../../../src/links/db-link-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG3F,OAAO,EAAE,GAAG,EAAmB,MAAM,cAAc,CAAC;AAcpD,mHAAmH;AACnH,qBAEa,mBAAoB,SAAQ,iBAAiB;IACxD,iGAAiG;IAEjG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAMjF;IAEY,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAIzE;IAED,oGAAoG;IACvF,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAezF;IAEY,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAED,oEAAoE;IACvD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAE,IAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,CAItE;CACF"}
|
|
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
8
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
12
|
exports.DbIdentityLinkStore = void 0;
|
|
10
13
|
const node_crypto_1 = require("node:crypto");
|
|
@@ -25,7 +28,6 @@ function identityParts(ref) {
|
|
|
25
28
|
/** `authn_identity`: external subjects linked to identities (A19). Values longer than their columns throw (D1). */
|
|
26
29
|
let DbIdentityLinkStore = class DbIdentityLinkStore extends contracts_1.IdentityLinkStore {
|
|
27
30
|
async find(provider, subject) {
|
|
28
|
-
await (0, orm_1.ormReady)();
|
|
29
31
|
const rows = await AuthnIdentity_js_1.AuthnIdentity.query().columns(LINK_COLUMNS).where('provider', provider).where('subject', subject);
|
|
30
32
|
// MySQL and MSSQL default collations ignore case (and accents or trailing spaces): a subject differing only that
|
|
31
33
|
// way must not sign in as another account.
|
|
@@ -34,7 +36,6 @@ let DbIdentityLinkStore = class DbIdentityLinkStore extends contracts_1.Identity
|
|
|
34
36
|
}
|
|
35
37
|
async list(identity) {
|
|
36
38
|
const { type, id } = identityParts(identity);
|
|
37
|
-
await (0, orm_1.ormReady)();
|
|
38
39
|
const rows = await AuthnIdentity_js_1.AuthnIdentity.query().columns(LINK_COLUMNS).where('identity_type', type).where('identity_id', id).orderBy('linked_at');
|
|
39
40
|
return rows.filter((r) => r.identity_type === type && r.identity_id === id).map(toLink);
|
|
40
41
|
}
|
|
@@ -45,7 +46,6 @@ let DbIdentityLinkStore = class DbIdentityLinkStore extends contracts_1.Identity
|
|
|
45
46
|
const subject = (0, sql_js_1.checkedText)(external.subject, 255, 'DbIdentityLinkStore: subject');
|
|
46
47
|
const email = external.email === undefined || external.email === null ? undefined : (0, sql_js_1.checkedText)(external.email, 255, 'DbIdentityLinkStore: email', true);
|
|
47
48
|
const nowMs = (0, sql_js_1.checkedMs)(new Date(), 'DbIdentityLinkStore.link: the clock');
|
|
48
|
-
await (0, orm_1.ormReady)();
|
|
49
49
|
const linkId = (0, node_crypto_1.randomUUID)();
|
|
50
50
|
try {
|
|
51
51
|
await AuthnIdentity_js_1.AuthnIdentity.insert((0, values_js_1.columnValues)({ id: linkId, identity_type: type, identity_id: id, provider, subject, email: email ?? null, email_verified: external.emailVerified === true, attributes: null, linked_at: (0, sql_js_1.instant)(nowMs), last_used_at: null }));
|
|
@@ -58,18 +58,20 @@ let DbIdentityLinkStore = class DbIdentityLinkStore extends contracts_1.Identity
|
|
|
58
58
|
return { id: linkId, identity: { type, id }, provider, subject, ...(email !== undefined ? { email } : {}), linkedAt: new Date(nowMs) };
|
|
59
59
|
}
|
|
60
60
|
async unlink(id) {
|
|
61
|
-
await (0, orm_1.ormReady)();
|
|
62
61
|
await AuthnIdentity_js_1.AuthnIdentity.destroy().where('id', id);
|
|
63
62
|
}
|
|
64
63
|
/** Sets `last_used_at` (default now); true when the link exists. */
|
|
65
64
|
async touch(id, at = new Date()) {
|
|
66
65
|
const ms = (0, sql_js_1.checkedMs)(at, 'DbIdentityLinkStore.touch: at');
|
|
67
|
-
await (0, orm_1.ormReady)();
|
|
68
66
|
const { RowsAffected } = await AuthnIdentity_js_1.AuthnIdentity.update({ last_used_at: (0, sql_js_1.instant)(ms) }).where('id', id);
|
|
69
67
|
return RowsAffected === 1;
|
|
70
68
|
}
|
|
71
69
|
};
|
|
72
70
|
exports.DbIdentityLinkStore = DbIdentityLinkStore;
|
|
71
|
+
__decorate([
|
|
72
|
+
(0, di_1.Autoinject)(orm_1.Orm),
|
|
73
|
+
__metadata("design:type", orm_1.Orm)
|
|
74
|
+
], DbIdentityLinkStore.prototype, "Orm", void 0);
|
|
73
75
|
exports.DbIdentityLinkStore = DbIdentityLinkStore = __decorate([
|
|
74
76
|
(0, di_1.PerChildInstance)(),
|
|
75
77
|
(0, di_1.Injectable)(contracts_1.IdentityLinkStore)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-link-store.js","sourceRoot":"","sources":["../../../src/links/db-link-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-link-store.js","sourceRoot":"","sources":["../../../src/links/db-link-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IdentityRef } from '@spinajs/authn/contracts';
|
|
2
|
+
import { Orm } from '@spinajs/orm';
|
|
2
3
|
/** One MFA step of an identity as stored. */
|
|
3
4
|
export interface MfaRecord {
|
|
4
5
|
/** Cipher text exactly as `putPending` was given it; this store never encrypts or decrypts. */
|
|
@@ -18,6 +19,8 @@ export interface MfaRecord {
|
|
|
18
19
|
* parallel calls for one identity may leave both sets.
|
|
19
20
|
*/
|
|
20
21
|
export declare class DbMfaStore {
|
|
22
|
+
/** Never read: injecting it resolves the Orm, which binds the models, before the first query. */
|
|
23
|
+
protected Orm: Orm;
|
|
21
24
|
get(id: IdentityRef, step: string): Promise<MfaRecord | null>;
|
|
22
25
|
/**
|
|
23
26
|
* Stores the step unconfirmed, with no accepted time step and created now, replacing a pending one. A confirmed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-mfa-store.d.ts","sourceRoot":"","sources":["../../../src/mfa/db-mfa-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"db-mfa-store.d.ts","sourceRoot":"","sources":["../../../src/mfa/db-mfa-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,GAAG,EAAmB,MAAM,cAAc,CAAC;AAgBpD,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IAClC,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC1B;AAkBD;;;;;;;GAOG;AACH,qBAEa,UAAU;IACrB,iGAAiG;IAEjG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEN,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAazE;IAED;;;;OAIG;IACU,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoBzG;IAED;;;OAGG;IACU,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAE,IAAiB,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYvH;IAED,mIAAmI;IACtH,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASzF;IAEY,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhE;IAED,mDAAmD;IACtC,cAAc,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAI9D;IAED;;;OAGG;IACU,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAGnD;IAED,4GAA4G;IAC/F,oBAAoB,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7F;IAED,8EAA8E;IACjE,kBAAkB,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS9E;IAED,oBAAoB;IACP,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhE;IAEY,mBAAmB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;CACF"}
|
|
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
8
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
12
|
exports.DbMfaStore = void 0;
|
|
10
13
|
const node_crypto_1 = require("node:crypto");
|
|
@@ -47,7 +50,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
47
50
|
async get(id, step) {
|
|
48
51
|
const identity = (0, identity_js_1.identityKey)(id);
|
|
49
52
|
const name = stepName(step);
|
|
50
|
-
await (0, orm_1.ormReady)();
|
|
51
53
|
const rows = await AuthnMfa_js_1.AuthnMfa.query().columns(['identity', 'step', 'secret_enc', 'key_id', 'last_step', 'confirmed_at', 'created_at']).where('identity', identity).where('step', name);
|
|
52
54
|
const r = rows.find((x) => x.identity === identity && x.step === name);
|
|
53
55
|
if (!r)
|
|
@@ -71,7 +73,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
71
73
|
(0, sql_js_1.checkedText)(secretEnc, Number.MAX_SAFE_INTEGER, 'DbMfaStore: secretEnc');
|
|
72
74
|
(0, sql_js_1.checkedText)(keyId, 32, 'DbMfaStore: keyId');
|
|
73
75
|
const ms = (0, sql_js_1.checkedMs)(new Date(), 'DbMfaStore.putPending: the clock');
|
|
74
|
-
await (0, orm_1.ormReady)();
|
|
75
76
|
const fields = pending(secretEnc, keyId, (0, sql_js_1.instant)(ms));
|
|
76
77
|
for (let i = 0; i < MAX_TRIES; i++) {
|
|
77
78
|
try {
|
|
@@ -100,7 +101,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
100
101
|
const ms = (0, sql_js_1.checkedMs)(at, 'DbMfaStore.confirm: at');
|
|
101
102
|
if (expectedSecretEnc !== undefined)
|
|
102
103
|
(0, sql_js_1.checkedText)(expectedSecretEnc, Number.MAX_SAFE_INTEGER, 'DbMfaStore: expectedSecretEnc');
|
|
103
|
-
await (0, orm_1.ormReady)();
|
|
104
104
|
const q = AuthnMfa_js_1.AuthnMfa.update({ confirmed_at: (0, sql_js_1.instant)(ms) })
|
|
105
105
|
.where('identity', identity)
|
|
106
106
|
.where('step', name);
|
|
@@ -114,7 +114,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
114
114
|
const identity = (0, identity_js_1.identityKey)(id);
|
|
115
115
|
const name = stepName(step);
|
|
116
116
|
(0, util_1._check_arg)((0, util_1._is_number)((0, util_1._integer)(), (0, util_1._between)(0, Number.MAX_SAFE_INTEGER)))(timeStep, 'timeStep');
|
|
117
|
-
await (0, orm_1.ormReady)();
|
|
118
117
|
const older = function () {
|
|
119
118
|
this.whereNull('last_step');
|
|
120
119
|
this.orWhere('last_step', '<', timeStep);
|
|
@@ -124,13 +123,11 @@ let DbMfaStore = class DbMfaStore {
|
|
|
124
123
|
async remove(id, step) {
|
|
125
124
|
const identity = (0, identity_js_1.identityKey)(id);
|
|
126
125
|
const name = stepName(step);
|
|
127
|
-
await (0, orm_1.ormReady)();
|
|
128
126
|
await AuthnMfa_js_1.AuthnMfa.destroy().where('identity', identity).where('step', name);
|
|
129
127
|
}
|
|
130
128
|
/** The names of the identity's confirmed steps. */
|
|
131
129
|
async confirmedSteps(id) {
|
|
132
130
|
const identity = (0, identity_js_1.identityKey)(id);
|
|
133
|
-
await (0, orm_1.ormReady)();
|
|
134
131
|
const rows = await AuthnMfa_js_1.AuthnMfa.query().columns(['identity', 'step', 'confirmed_at']).where('identity', identity).whereNotNull('confirmed_at');
|
|
135
132
|
return rows.filter((r) => r.identity === identity && confirmed(r)).map((r) => r.step);
|
|
136
133
|
}
|
|
@@ -139,7 +136,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
139
136
|
* `totp` and `TOTP` into one under a case-blind collation (MySQL's default); one row per confirmed enrolment.
|
|
140
137
|
*/
|
|
141
138
|
async confirmedStepNames() {
|
|
142
|
-
await (0, orm_1.ormReady)();
|
|
143
139
|
const rows = await AuthnMfa_js_1.AuthnMfa.query().columns(['step', 'confirmed_at']).whereNotNull('confirmed_at');
|
|
144
140
|
return [...new Set(rows.filter(confirmed).map((r) => r.step))];
|
|
145
141
|
}
|
|
@@ -150,7 +146,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
150
146
|
const hashes = rawCodes.map((code) => (0, sql_js_1.sha256hex)((0, sql_js_1.checkedText)(code, Number.MAX_SAFE_INTEGER, 'DbMfaStore: a recovery code')));
|
|
151
147
|
if (new Set(hashes).size !== hashes.length)
|
|
152
148
|
throw new exceptions_1.InvalidArgument('DbMfaStore.replaceRecoveryCodes: the codes repeat');
|
|
153
|
-
await (0, orm_1.ormReady)();
|
|
154
149
|
await AuthnRecoveryCode_js_1.AuthnRecoveryCode.destroy().where('identity', identity);
|
|
155
150
|
if (hashes.length === 0)
|
|
156
151
|
return;
|
|
@@ -162,7 +157,6 @@ let DbMfaStore = class DbMfaStore {
|
|
|
162
157
|
if (!(0, util_1._try_check_arg)((0, util_1._is_string)((0, util_1._non_empty)(), (0, util_1._max_length)(RAW_MAX)))(raw, 'raw')[0])
|
|
163
158
|
return false;
|
|
164
159
|
const ms = (0, sql_js_1.checkedMs)(new Date(), 'DbMfaStore.redeemRecoveryCode: the clock');
|
|
165
|
-
await (0, orm_1.ormReady)();
|
|
166
160
|
const r = await AuthnRecoveryCode_js_1.AuthnRecoveryCode.update({ used_at: (0, sql_js_1.instant)(ms) })
|
|
167
161
|
.where('identity', identity)
|
|
168
162
|
.where('code_hash', (0, sql_js_1.sha256hex)(raw))
|
|
@@ -172,17 +166,19 @@ let DbMfaStore = class DbMfaStore {
|
|
|
172
166
|
/** Unused codes. */
|
|
173
167
|
async countRecoveryCodes(id) {
|
|
174
168
|
const identity = (0, identity_js_1.identityKey)(id);
|
|
175
|
-
await (0, orm_1.ormReady)();
|
|
176
169
|
const rows = await AuthnRecoveryCode_js_1.AuthnRecoveryCode.query().columns(['identity']).where('identity', identity).whereNull('used_at');
|
|
177
170
|
return rows.filter((r) => r.identity === identity).length;
|
|
178
171
|
}
|
|
179
172
|
async removeRecoveryCodes(id) {
|
|
180
173
|
const identity = (0, identity_js_1.identityKey)(id);
|
|
181
|
-
await (0, orm_1.ormReady)();
|
|
182
174
|
await AuthnRecoveryCode_js_1.AuthnRecoveryCode.destroy().where('identity', identity);
|
|
183
175
|
}
|
|
184
176
|
};
|
|
185
177
|
exports.DbMfaStore = DbMfaStore;
|
|
178
|
+
__decorate([
|
|
179
|
+
(0, di_1.Autoinject)(orm_1.Orm),
|
|
180
|
+
__metadata("design:type", orm_1.Orm)
|
|
181
|
+
], DbMfaStore.prototype, "Orm", void 0);
|
|
186
182
|
exports.DbMfaStore = DbMfaStore = __decorate([
|
|
187
183
|
(0, di_1.PerChildInstance)(),
|
|
188
184
|
(0, di_1.Injectable)()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-mfa-store.js","sourceRoot":"","sources":["../../../src/mfa/db-mfa-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-mfa-store.js","sourceRoot":"","sources":["../../../src/mfa/db-mfa-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { NonceStore } from '@spinajs/authn/contracts';
|
|
2
|
+
import { Orm } from '@spinajs/orm';
|
|
2
3
|
export { NonceStore } from '@spinajs/authn/contracts';
|
|
3
4
|
export { MemoryNonceStore } from '@spinajs/authn/nonces';
|
|
4
5
|
/** `authn_nonce`: the primary key makes a claim atomic across processes; an expired row is taken over with a conditional update. */
|
|
5
6
|
export declare class DbNonceStore extends NonceStore {
|
|
7
|
+
/** Never read: injecting it resolves the Orm, which binds the models, before the first query. */
|
|
8
|
+
protected Orm: Orm;
|
|
6
9
|
private readonly purgeDue;
|
|
7
10
|
claim(key: string, expiresAt: Date, now: Date): Promise<boolean>;
|
|
8
11
|
/** Deletes up to one batch of expired keys; returns how many went. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonce-store.d.ts","sourceRoot":"","sources":["../../../src/nonces/nonce-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"nonce-store.d.ts","sourceRoot":"","sources":["../../../src/nonces/nonce-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,GAAG,EAAiC,MAAM,cAAc,CAAC;AAKlE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAazD,oIAAoI;AACpI,qBAEa,YAAa,SAAQ,UAAU;IAC1C,iGAAiG;IAEjG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEzC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAsB5E;IAED,sEAAsE;IACzD,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1D;CACF"}
|
|
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
8
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
12
|
exports.DbNonceStore = exports.MemoryNonceStore = exports.NonceStore = void 0;
|
|
10
13
|
const contracts_1 = require("@spinajs/authn/contracts");
|
|
@@ -33,7 +36,6 @@ let DbNonceStore = class DbNonceStore extends contracts_1.NonceStore {
|
|
|
33
36
|
}
|
|
34
37
|
async claim(key, expiresAt, now) {
|
|
35
38
|
const { expiresMs, nowMs } = checkClaim(key, expiresAt, now, 'DbNonceStore');
|
|
36
|
-
await (0, orm_1.ormReady)();
|
|
37
39
|
if (this.purgeDue()) {
|
|
38
40
|
await this.purge(now);
|
|
39
41
|
}
|
|
@@ -60,7 +62,6 @@ let DbNonceStore = class DbNonceStore extends contracts_1.NonceStore {
|
|
|
60
62
|
/** Deletes up to one batch of expired keys; returns how many went. */
|
|
61
63
|
async purge(now = new Date()) {
|
|
62
64
|
const ms = (0, sql_js_1.checkedMs)(now, 'DbNonceStore.purge: now');
|
|
63
|
-
await (0, orm_1.ormReady)();
|
|
64
65
|
const t = (0, sql_js_1.instant)(ms);
|
|
65
66
|
// MSSQL pages with OFFSET … FETCH, which needs an ORDER BY.
|
|
66
67
|
const keys = (await AuthnNonce_js_1.AuthnNonce.query().columns(['k']).where('expires_at', '<=', t).orderBy('k').take(PURGE_BATCH)).map((r) => r.k);
|
|
@@ -70,6 +71,10 @@ let DbNonceStore = class DbNonceStore extends contracts_1.NonceStore {
|
|
|
70
71
|
}
|
|
71
72
|
};
|
|
72
73
|
exports.DbNonceStore = DbNonceStore;
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, di_1.Autoinject)(orm_1.Orm),
|
|
76
|
+
__metadata("design:type", orm_1.Orm)
|
|
77
|
+
], DbNonceStore.prototype, "Orm", void 0);
|
|
73
78
|
exports.DbNonceStore = DbNonceStore = __decorate([
|
|
74
79
|
(0, di_1.PerChildInstance)(),
|
|
75
80
|
(0, di_1.Injectable)(contracts_1.NonceStore)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonce-store.js","sourceRoot":"","sources":["../../../src/nonces/nonce-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nonce-store.js","sourceRoot":"","sources":["../../../src/nonces/nonce-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SecretStore } from '@spinajs/authn/contracts';
|
|
2
2
|
import type { IdentityRef } from '@spinajs/authn/contracts';
|
|
3
|
+
import { Orm } from '@spinajs/orm';
|
|
3
4
|
import type { DateTime } from 'luxon';
|
|
4
5
|
/**
|
|
5
6
|
* `authn_secret`: single-use secrets stored as the hex SHA-256 of the raw value only (SR-09). The raw secret is
|
|
@@ -9,6 +10,8 @@ import type { DateTime } from 'luxon';
|
|
|
9
10
|
* Two parallel `issue` calls for one identity and purpose may both leave a live row: each deletes, then inserts.
|
|
10
11
|
*/
|
|
11
12
|
export declare class DbSecretStore extends SecretStore {
|
|
13
|
+
/** Never read: injecting it resolves the Orm, which binds the models, before the first query. */
|
|
14
|
+
protected Orm: Orm;
|
|
12
15
|
private readonly purgeDue;
|
|
13
16
|
issue(identity: IdentityRef, purpose: string, ttlSeconds: number, value?: string): Promise<string>;
|
|
14
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-secret-store.d.ts","sourceRoot":"","sources":["../../../src/secrets/db-secret-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"db-secret-store.d.ts","sourceRoot":"","sources":["../../../src/secrets/db-secret-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,GAAG,EAAgB,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAatC;;;;;;GAMG;AACH,qBAEa,aAAc,SAAQ,WAAW;IAC5C,iGAAiG;IAEjG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEzC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY9G;IAED;;;OAGG;IACU,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAezF;IAED,gFAAgF;IACnE,KAAK,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1D;IAED,mEAAmE;IACnE,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnF;YAEa,eAAe;CAK9B"}
|
|
@@ -5,6 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
7
|
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
8
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
12
|
exports.DbSecretStore = void 0;
|
|
10
13
|
const node_crypto_1 = require("node:crypto");
|
|
@@ -40,7 +43,6 @@ let DbSecretStore = class DbSecretStore extends contracts_1.SecretStore {
|
|
|
40
43
|
if (value !== undefined)
|
|
41
44
|
(0, util_1._check_arg)((0, util_1._is_string)((0, util_1._non_empty)(), (0, util_1._max_length)(RAW_MAX)))(value, 'value');
|
|
42
45
|
const nowMs = (0, sql_js_1.checkedMs)(new Date(), 'DbSecretStore.issue: the clock');
|
|
43
|
-
await (0, orm_1.ormReady)();
|
|
44
46
|
await this.purgeNowAndThen(nowMs);
|
|
45
47
|
const raw = value ?? (0, node_crypto_1.randomBytes)(32).toString('base64url');
|
|
46
48
|
await AuthnSecret_js_1.AuthnSecret.destroy().where('identity', key).where('purpose', purpose);
|
|
@@ -57,7 +59,6 @@ let DbSecretStore = class DbSecretStore extends contracts_1.SecretStore {
|
|
|
57
59
|
if (!(0, util_1._try_check_arg)((0, util_1._is_string)((0, util_1._non_empty)(), (0, util_1._max_length)(RAW_MAX)))(raw, 'raw')[0])
|
|
58
60
|
return false;
|
|
59
61
|
const nowMs = (0, sql_js_1.checkedMs)(new Date(), 'DbSecretStore.redeem: the clock');
|
|
60
|
-
await (0, orm_1.ormReady)();
|
|
61
62
|
await this.purgeNowAndThen(nowMs);
|
|
62
63
|
const rows = await AuthnSecret_js_1.AuthnSecret.query().columns(['id', 'identity', 'purpose', 'expires_at']).where('secret_hash', (0, sql_js_1.sha256hex)(raw)).where('identity', key).where('purpose', purpose).whereNull('used_at');
|
|
63
64
|
// MySQL and MSSQL default collations ignore case: the binding to identity and purpose is checked exactly here.
|
|
@@ -71,7 +72,6 @@ let DbSecretStore = class DbSecretStore extends contracts_1.SecretStore {
|
|
|
71
72
|
/** Deletes up to one batch of spent and expired rows; returns how many went. */
|
|
72
73
|
async purge(now = new Date()) {
|
|
73
74
|
const ms = (0, sql_js_1.checkedMs)(now, 'DbSecretStore.purge: now');
|
|
74
|
-
await (0, orm_1.ormReady)();
|
|
75
75
|
const t = (0, sql_js_1.instant)(ms);
|
|
76
76
|
const done = function () {
|
|
77
77
|
this.whereNotNull('used_at');
|
|
@@ -94,6 +94,10 @@ let DbSecretStore = class DbSecretStore extends contracts_1.SecretStore {
|
|
|
94
94
|
}
|
|
95
95
|
};
|
|
96
96
|
exports.DbSecretStore = DbSecretStore;
|
|
97
|
+
__decorate([
|
|
98
|
+
(0, di_1.Autoinject)(orm_1.Orm),
|
|
99
|
+
__metadata("design:type", orm_1.Orm)
|
|
100
|
+
], DbSecretStore.prototype, "Orm", void 0);
|
|
97
101
|
exports.DbSecretStore = DbSecretStore = __decorate([
|
|
98
102
|
(0, di_1.PerChildInstance)(),
|
|
99
103
|
(0, di_1.Injectable)(contracts_1.SecretStore)
|