@spinajs/authn-orm 3.0.3 → 3.0.5
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/index.d.ts +1 -0
- package/lib/cjs/audit/index.d.ts.map +1 -1
- package/lib/cjs/audit/index.js +3 -1
- package/lib/cjs/audit/index.js.map +1 -1
- package/lib/cjs/audit/retention.d.ts +24 -0
- package/lib/cjs/audit/retention.d.ts.map +1 -0
- package/lib/cjs/audit/retention.js +108 -0
- package/lib/cjs/audit/retention.js.map +1 -0
- package/lib/cjs/cli/PurgeAudit.d.ts +13 -0
- package/lib/cjs/cli/PurgeAudit.d.ts.map +1 -0
- package/lib/cjs/cli/PurgeAudit.js +51 -0
- package/lib/cjs/cli/PurgeAudit.js.map +1 -0
- package/lib/cjs/config/authn-orm.d.ts +9 -0
- package/lib/cjs/config/authn-orm.d.ts.map +1 -0
- package/lib/cjs/config/authn-orm.js +21 -0
- package/lib/cjs/config/authn-orm.js.map +1 -0
- package/lib/cjs/index.d.ts +1 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +1 -0
- package/lib/cjs/index.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-enrolment-marks.d.ts +16 -0
- package/lib/cjs/mfa/db-mfa-enrolment-marks.d.ts.map +1 -0
- package/lib/cjs/mfa/db-mfa-enrolment-marks.js +54 -0
- package/lib/cjs/mfa/db-mfa-enrolment-marks.js.map +1 -0
- 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/mfa/index.d.ts +1 -0
- package/lib/cjs/mfa/index.d.ts.map +1 -1
- package/lib/cjs/mfa/index.js +1 -0
- package/lib/cjs/mfa/index.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 +5 -2
- package/lib/cjs/secrets/db-secret-store.d.ts.map +1 -1
- package/lib/cjs/secrets/db-secret-store.js +12 -6
- package/lib/cjs/secrets/db-secret-store.js.map +1 -1
- package/lib/cjs/throttle/db-throttle-store.d.ts +10 -1
- package/lib/cjs/throttle/db-throttle-store.d.ts.map +1 -1
- package/lib/cjs/throttle/db-throttle-store.js +22 -14
- 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 +6 -1
- 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/index.d.ts +1 -0
- package/lib/mjs/audit/index.d.ts.map +1 -1
- package/lib/mjs/audit/index.js +1 -0
- package/lib/mjs/audit/index.js.map +1 -1
- package/lib/mjs/audit/retention.d.ts +24 -0
- package/lib/mjs/audit/retention.d.ts.map +1 -0
- package/lib/mjs/audit/retention.js +105 -0
- package/lib/mjs/audit/retention.js.map +1 -0
- package/lib/mjs/cli/PurgeAudit.d.ts +13 -0
- package/lib/mjs/cli/PurgeAudit.d.ts.map +1 -0
- package/lib/mjs/cli/PurgeAudit.js +48 -0
- package/lib/mjs/cli/PurgeAudit.js.map +1 -0
- package/lib/mjs/config/authn-orm.d.ts +9 -0
- package/lib/mjs/config/authn-orm.d.ts.map +1 -0
- package/lib/mjs/config/authn-orm.js +19 -0
- package/lib/mjs/config/authn-orm.js.map +1 -0
- package/lib/mjs/index.d.ts +1 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +1 -0
- package/lib/mjs/index.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-enrolment-marks.d.ts +16 -0
- package/lib/mjs/mfa/db-mfa-enrolment-marks.d.ts.map +1 -0
- package/lib/mjs/mfa/db-mfa-enrolment-marks.js +51 -0
- package/lib/mjs/mfa/db-mfa-enrolment-marks.js.map +1 -0
- 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/mfa/index.d.ts +1 -0
- package/lib/mjs/mfa/index.d.ts.map +1 -1
- package/lib/mjs/mfa/index.js +1 -0
- package/lib/mjs/mfa/index.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 +5 -2
- package/lib/mjs/secrets/db-secret-store.d.ts.map +1 -1
- package/lib/mjs/secrets/db-secret-store.js +14 -8
- package/lib/mjs/secrets/db-secret-store.js.map +1 -1
- package/lib/mjs/throttle/db-throttle-store.d.ts +10 -1
- package/lib/mjs/throttle/db-throttle-store.d.ts.map +1 -1
- package/lib/mjs/throttle/db-throttle-store.js +23 -15
- 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 +6 -1
- 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 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-throttle.js","sourceRoot":"","sources":["../../../src/throttle/db-throttle.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAAsD;AAEtD,wDAAyD;AACzD,4CAAyF;AAEzF,kEAAmE;AAEnE,0DAA+D;AAC/D,0CAAwC;AACxC,oCAA8F;AAC9F,oDAAuF;AACvF,sCAA2C;AAC3C,wCAA6D;AAG7D,8CAA8C;AAC9C,iEAAyD;AAGzD,kHAAkH;AAClH,IAAI,UAA8B,CAAC;AAOnC;;;;;;;;;;;;;;;;GAgBG;AAGI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,mCAAkB;
|
|
1
|
+
{"version":3,"file":"db-throttle.js","sourceRoot":"","sources":["../../../src/throttle/db-throttle.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
|
@@ -4,10 +4,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
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;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
7
10
|
import { randomUUID } from 'node:crypto';
|
|
8
11
|
import { AuthnEventSink } from '@spinajs/authn/contracts';
|
|
9
|
-
import { Injectable, PerChildInstance } from '@spinajs/di';
|
|
10
|
-
import {
|
|
12
|
+
import { Autoinject, Injectable, PerChildInstance } from '@spinajs/di';
|
|
13
|
+
import { Orm } from '@spinajs/orm';
|
|
11
14
|
import { identityKey } from '../identity.js';
|
|
12
15
|
import { AuthnAudit } from '../models/AuthnAudit.js';
|
|
13
16
|
import { checkedMs, cutText, instant } from '../support/sql.js';
|
|
@@ -45,7 +48,6 @@ let DbAuthnAuditSink = class DbAuthnAuditSink extends AuthnEventSink {
|
|
|
45
48
|
};
|
|
46
49
|
const data = e.data === undefined && Object.keys(extra).length === 0 ? undefined : { ...(e.data ?? {}), ...extra };
|
|
47
50
|
const at = instant(checkedMs(e.at, 'DbAuthnAuditSink.publish: e.at'));
|
|
48
|
-
await ormReady();
|
|
49
51
|
await AuthnAudit.insert(columnValues({
|
|
50
52
|
id: randomUUID(),
|
|
51
53
|
at,
|
|
@@ -62,6 +64,10 @@ let DbAuthnAuditSink = class DbAuthnAuditSink extends AuthnEventSink {
|
|
|
62
64
|
}));
|
|
63
65
|
}
|
|
64
66
|
};
|
|
67
|
+
__decorate([
|
|
68
|
+
Autoinject(Orm),
|
|
69
|
+
__metadata("design:type", Orm)
|
|
70
|
+
], DbAuthnAuditSink.prototype, "Orm", void 0);
|
|
65
71
|
DbAuthnAuditSink = __decorate([
|
|
66
72
|
PerChildInstance(),
|
|
67
73
|
Injectable(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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"}
|
package/lib/mjs/audit/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/lib/mjs/audit/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/audit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import '@spinajs/authn/register-schema';
|
|
2
|
+
import { AsyncService } from '@spinajs/di';
|
|
3
|
+
import { Log } from '@spinajs/log';
|
|
4
|
+
import { Orm } from '@spinajs/orm';
|
|
5
|
+
/**
|
|
6
|
+
* Deletes `authn_audit` rows older than `authn.audit.retentionDays`, in batches, on `purge` and, when
|
|
7
|
+
* `authn.audit.purgeInterval` (ms) is set, on a timer. Both keys are unset by default: audit rows are kept forever.
|
|
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;
|
|
12
|
+
protected RetentionDays: number | null | undefined;
|
|
13
|
+
protected PurgeInterval: number | null | undefined;
|
|
14
|
+
protected Log: Log;
|
|
15
|
+
private timer;
|
|
16
|
+
private running;
|
|
17
|
+
get Enabled(): boolean;
|
|
18
|
+
resolve(): Promise<void>;
|
|
19
|
+
dispose(): Promise<void>;
|
|
20
|
+
/** Deletes the rows older than the retention; returns how many went. 0 while `retentionDays` is unset. */
|
|
21
|
+
purge(now?: Date): Promise<number>;
|
|
22
|
+
private tick;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import '@spinajs/authn/register-schema';
|
|
11
|
+
import { AsyncService, Autoinject, Injectable, PerChildInstance } from '@spinajs/di';
|
|
12
|
+
import { Config } from '@spinajs/configuration';
|
|
13
|
+
import { Log, Logger } from '@spinajs/log';
|
|
14
|
+
import { Orm } from '@spinajs/orm';
|
|
15
|
+
import { AuthnAudit } from '../models/AuthnAudit.js';
|
|
16
|
+
import { checkedMs, instant } from '../support/sql.js';
|
|
17
|
+
const DAY_MS = 86_400_000;
|
|
18
|
+
const PURGE_BATCH = 500;
|
|
19
|
+
/**
|
|
20
|
+
* Deletes `authn_audit` rows older than `authn.audit.retentionDays`, in batches, on `purge` and, when
|
|
21
|
+
* `authn.audit.purgeInterval` (ms) is set, on a timer. Both keys are unset by default: audit rows are kept forever.
|
|
22
|
+
*/
|
|
23
|
+
let AuthnAuditRetention = class AuthnAuditRetention extends AsyncService {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
this.running = false;
|
|
27
|
+
}
|
|
28
|
+
get Enabled() {
|
|
29
|
+
return typeof this.RetentionDays === 'number' && this.RetentionDays > 0;
|
|
30
|
+
}
|
|
31
|
+
async resolve() {
|
|
32
|
+
if (!this.Enabled || !this.PurgeInterval || this.PurgeInterval < 1) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.timer = setInterval(() => void this.tick(), this.PurgeInterval);
|
|
36
|
+
this.timer.unref?.();
|
|
37
|
+
}
|
|
38
|
+
async dispose() {
|
|
39
|
+
clearInterval(this.timer);
|
|
40
|
+
this.timer = undefined;
|
|
41
|
+
}
|
|
42
|
+
/** Deletes the rows older than the retention; returns how many went. 0 while `retentionDays` is unset. */
|
|
43
|
+
async purge(now = new Date()) {
|
|
44
|
+
const days = this.RetentionDays;
|
|
45
|
+
if (typeof days !== 'number' || !(days > 0)) {
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
const cutoff = instant(checkedMs(now, 'AuthnAuditRetention.purge: now') - days * DAY_MS);
|
|
49
|
+
let removed = 0;
|
|
50
|
+
for (;;) {
|
|
51
|
+
// MSSQL pages with OFFSET ... FETCH, which needs an ORDER BY.
|
|
52
|
+
const ids = (await AuthnAudit.query().columns(['id']).where('at', '<', cutoff).orderBy('at').take(PURGE_BATCH)).map((r) => r.id);
|
|
53
|
+
if (ids.length === 0) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
const deleted = (await AuthnAudit.destroy().whereIn('id', ids).where('at', '<', cutoff)).RowsAffected;
|
|
57
|
+
removed += deleted;
|
|
58
|
+
if (ids.length < PURGE_BATCH || deleted === 0) {
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return removed;
|
|
63
|
+
}
|
|
64
|
+
async tick() {
|
|
65
|
+
if (this.running) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.running = true;
|
|
69
|
+
try {
|
|
70
|
+
const count = await this.purge();
|
|
71
|
+
if (count > 0) {
|
|
72
|
+
this.Log.info({ count }, 'Purged audit rows past retention, count: ${count}');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// An unhandled rejection here would end the process; the next tick retries.
|
|
77
|
+
this.Log.error(err, 'Audit retention purge failed');
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
this.running = false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
__decorate([
|
|
85
|
+
Autoinject(Orm),
|
|
86
|
+
__metadata("design:type", Orm)
|
|
87
|
+
], AuthnAuditRetention.prototype, "Orm", void 0);
|
|
88
|
+
__decorate([
|
|
89
|
+
Config('authn.audit.retentionDays'),
|
|
90
|
+
__metadata("design:type", Object)
|
|
91
|
+
], AuthnAuditRetention.prototype, "RetentionDays", void 0);
|
|
92
|
+
__decorate([
|
|
93
|
+
Config('authn.audit.purgeInterval'),
|
|
94
|
+
__metadata("design:type", Object)
|
|
95
|
+
], AuthnAuditRetention.prototype, "PurgeInterval", void 0);
|
|
96
|
+
__decorate([
|
|
97
|
+
Logger('authn-orm'),
|
|
98
|
+
__metadata("design:type", Log)
|
|
99
|
+
], AuthnAuditRetention.prototype, "Log", void 0);
|
|
100
|
+
AuthnAuditRetention = __decorate([
|
|
101
|
+
PerChildInstance(),
|
|
102
|
+
Injectable()
|
|
103
|
+
], AuthnAuditRetention);
|
|
104
|
+
export { AuthnAuditRetention };
|
|
105
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../src/audit/retention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CliCommand } from '@spinajs/cli';
|
|
2
|
+
import { Log } from '@spinajs/log';
|
|
3
|
+
import { OrmMigrator } from '@spinajs/orm';
|
|
4
|
+
import { AuthnAuditRetention } from '../audit/retention.js';
|
|
5
|
+
/** Housekeeping for a scheduler (cron, worker); a no-op while `authn.audit.retentionDays` is unset. */
|
|
6
|
+
export declare class PurgeAudit extends CliCommand {
|
|
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;
|
|
10
|
+
protected Retention: AuthnAuditRetention;
|
|
11
|
+
execute(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=PurgeAudit.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Autoinject } from '@spinajs/di';
|
|
11
|
+
import { CliCommand, Command } from '@spinajs/cli';
|
|
12
|
+
import { Log, Logger } from '@spinajs/log';
|
|
13
|
+
import { OrmMigrator } from '@spinajs/orm';
|
|
14
|
+
import { AuthnAuditRetention } from '../audit/retention.js';
|
|
15
|
+
/** Housekeeping for a scheduler (cron, worker); a no-op while `authn.audit.retentionDays` is unset. */
|
|
16
|
+
let PurgeAudit = class PurgeAudit extends CliCommand {
|
|
17
|
+
async execute() {
|
|
18
|
+
try {
|
|
19
|
+
if (!this.Retention.Enabled) {
|
|
20
|
+
this.Log.warn('authn.audit.retentionDays is not set, no audit rows were purged');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const count = await this.Retention.purge();
|
|
24
|
+
this.Log.success({ count }, 'Deleted ${count} audit row(s) past retention');
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
this.Log.error({ error: e }, 'Error while purging audit rows');
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
__decorate([
|
|
33
|
+
Logger('authn-orm'),
|
|
34
|
+
__metadata("design:type", Log)
|
|
35
|
+
], PurgeAudit.prototype, "Log", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
Autoinject(OrmMigrator),
|
|
38
|
+
__metadata("design:type", OrmMigrator)
|
|
39
|
+
], PurgeAudit.prototype, "Migrator", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
Autoinject(AuthnAuditRetention),
|
|
42
|
+
__metadata("design:type", AuthnAuditRetention)
|
|
43
|
+
], PurgeAudit.prototype, "Retention", void 0);
|
|
44
|
+
PurgeAudit = __decorate([
|
|
45
|
+
Command('authn:audit-purge', 'Deletes audit rows older than authn.audit.retentionDays')
|
|
46
|
+
], PurgeAudit);
|
|
47
|
+
export { PurgeAudit };
|
|
48
|
+
//# sourceMappingURL=PurgeAudit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PurgeAudit.js","sourceRoot":"","sources":["../../../src/cli/PurgeAudit.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,uGAAuG;AAEhG,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,UAAU;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,MAAM,CAAC,WAAW,CAAC;8BACL,GAAG;uCAAC;AAIT;IADT,UAAU,CAAC,WAAW,CAAC;8BACJ,WAAW;4CAAC;AAGtB;IADT,UAAU,CAAC,mBAAmB,CAAC;8BACX,mBAAmB;6CAAC;AAT9B,UAAU;IADtB,OAAO,CAAC,mBAAmB,EAAE,yDAAyD,CAAC;GAC3E,UAAU,CAyBtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authn-orm.d.ts","sourceRoot":"","sources":["../../../src/config/authn-orm.ts"],"names":[],"mappings":"AAYA,QAAA,MAAM,QAAQ;IACZ,MAAM;QACJ,IAAI;YAEF,GAAG;;;CAGR,CAAC;eAEa,QAAQ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { join, normalize, resolve } from 'path';
|
|
2
|
+
function dir(path) {
|
|
3
|
+
const inCommonJs = typeof module !== 'undefined';
|
|
4
|
+
return [
|
|
5
|
+
resolve(normalize(join(process.env.WORKSPACE_ROOT_PATH ?? process.cwd(), 'node_modules', '@spinajs', 'authn-orm', 'lib', inCommonJs ? 'cjs' : 'mjs', path))),
|
|
6
|
+
// one up if we run from app or build folder
|
|
7
|
+
resolve(normalize(join(process.env.WORKSPACE_ROOT_PATH ?? process.cwd(), '../', 'node_modules', '@spinajs', 'authn-orm', 'lib', inCommonJs ? 'cjs' : 'mjs', path))),
|
|
8
|
+
];
|
|
9
|
+
}
|
|
10
|
+
const authnOrm = {
|
|
11
|
+
system: {
|
|
12
|
+
dirs: {
|
|
13
|
+
// CLI commands are found by a filesystem scan, so without this entry `authn:audit-purge` is unreachable in a consuming app.
|
|
14
|
+
cli: [...dir('cli')],
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
export default authnOrm;
|
|
19
|
+
//# sourceMappingURL=authn-orm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authn-orm.js","sourceRoot":"","sources":["../../../src/config/authn-orm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;IACjD,OAAO;QACL,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAE5J,4CAA4C;QAC5C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KACpK,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAG;IACf,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,4HAA4H;YAC5H,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;SACrB;KACF;CACF,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/lib/mjs/index.d.ts
CHANGED
package/lib/mjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
package/lib/mjs/index.js
CHANGED
package/lib/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
|
|
@@ -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"}
|
|
@@ -4,11 +4,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
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;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
7
10
|
import { randomUUID } from 'node:crypto';
|
|
8
11
|
import { IdentityLinkStore } from '@spinajs/authn/contracts';
|
|
9
|
-
import { Injectable, PerChildInstance } from '@spinajs/di';
|
|
12
|
+
import { Autoinject, Injectable, PerChildInstance } from '@spinajs/di';
|
|
10
13
|
import { InvalidArgument, ResourceDuplicated } from '@spinajs/exceptions';
|
|
11
|
-
import {
|
|
14
|
+
import { Orm, UniqueViolation } from '@spinajs/orm';
|
|
12
15
|
import { AuthnIdentity } from '../models/AuthnIdentity.js';
|
|
13
16
|
import { checkedMs, checkedText, dateOf, instant } from '../support/sql.js';
|
|
14
17
|
import { columnValues } from '../support/values.js';
|
|
@@ -22,7 +25,6 @@ function identityParts(ref) {
|
|
|
22
25
|
/** `authn_identity`: external subjects linked to identities (A19). Values longer than their columns throw (D1). */
|
|
23
26
|
let DbIdentityLinkStore = class DbIdentityLinkStore extends IdentityLinkStore {
|
|
24
27
|
async find(provider, subject) {
|
|
25
|
-
await ormReady();
|
|
26
28
|
const rows = await AuthnIdentity.query().columns(LINK_COLUMNS).where('provider', provider).where('subject', subject);
|
|
27
29
|
// MySQL and MSSQL default collations ignore case (and accents or trailing spaces): a subject differing only that
|
|
28
30
|
// way must not sign in as another account.
|
|
@@ -31,7 +33,6 @@ let DbIdentityLinkStore = class DbIdentityLinkStore extends IdentityLinkStore {
|
|
|
31
33
|
}
|
|
32
34
|
async list(identity) {
|
|
33
35
|
const { type, id } = identityParts(identity);
|
|
34
|
-
await ormReady();
|
|
35
36
|
const rows = await AuthnIdentity.query().columns(LINK_COLUMNS).where('identity_type', type).where('identity_id', id).orderBy('linked_at');
|
|
36
37
|
return rows.filter((r) => r.identity_type === type && r.identity_id === id).map(toLink);
|
|
37
38
|
}
|
|
@@ -42,7 +43,6 @@ let DbIdentityLinkStore = class DbIdentityLinkStore extends IdentityLinkStore {
|
|
|
42
43
|
const subject = checkedText(external.subject, 255, 'DbIdentityLinkStore: subject');
|
|
43
44
|
const email = external.email === undefined || external.email === null ? undefined : checkedText(external.email, 255, 'DbIdentityLinkStore: email', true);
|
|
44
45
|
const nowMs = checkedMs(new Date(), 'DbIdentityLinkStore.link: the clock');
|
|
45
|
-
await ormReady();
|
|
46
46
|
const linkId = randomUUID();
|
|
47
47
|
try {
|
|
48
48
|
await AuthnIdentity.insert(columnValues({ id: linkId, identity_type: type, identity_id: id, provider, subject, email: email ?? null, email_verified: external.emailVerified === true, attributes: null, linked_at: instant(nowMs), last_used_at: null }));
|
|
@@ -55,17 +55,19 @@ let DbIdentityLinkStore = class DbIdentityLinkStore extends IdentityLinkStore {
|
|
|
55
55
|
return { id: linkId, identity: { type, id }, provider, subject, ...(email !== undefined ? { email } : {}), linkedAt: new Date(nowMs) };
|
|
56
56
|
}
|
|
57
57
|
async unlink(id) {
|
|
58
|
-
await ormReady();
|
|
59
58
|
await AuthnIdentity.destroy().where('id', id);
|
|
60
59
|
}
|
|
61
60
|
/** Sets `last_used_at` (default now); true when the link exists. */
|
|
62
61
|
async touch(id, at = new Date()) {
|
|
63
62
|
const ms = checkedMs(at, 'DbIdentityLinkStore.touch: at');
|
|
64
|
-
await ormReady();
|
|
65
63
|
const { RowsAffected } = await AuthnIdentity.update({ last_used_at: instant(ms) }).where('id', id);
|
|
66
64
|
return RowsAffected === 1;
|
|
67
65
|
}
|
|
68
66
|
};
|
|
67
|
+
__decorate([
|
|
68
|
+
Autoinject(Orm),
|
|
69
|
+
__metadata("design:type", Orm)
|
|
70
|
+
], DbIdentityLinkStore.prototype, "Orm", void 0);
|
|
69
71
|
DbIdentityLinkStore = __decorate([
|
|
70
72
|
PerChildInstance(),
|
|
71
73
|
Injectable(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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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IdentityRef } from '@spinajs/authn/contracts';
|
|
2
|
+
import { MfaEnrolmentMarks } from '@spinajs/authn/contracts';
|
|
3
|
+
import { DbMfaStore } from './db-mfa-store.js';
|
|
4
|
+
/** Enrolment marks of steps without a secret of their own, as confirmed `authn_mfa` rows. */
|
|
5
|
+
export declare class DbMfaEnrolmentMarks extends MfaEnrolmentMarks {
|
|
6
|
+
protected readonly db?: DbMfaStore | undefined;
|
|
7
|
+
protected DbMfaStore: DbMfaStore;
|
|
8
|
+
/** DI passes nothing and injects `DbMfaStore`. */
|
|
9
|
+
constructor(db?: DbMfaStore | undefined);
|
|
10
|
+
has(id: IdentityRef, step: string): Promise<boolean>;
|
|
11
|
+
/** True for exactly the call that confirmed the row; false when the identity is marked already. */
|
|
12
|
+
mark(id: IdentityRef, step: string): Promise<boolean>;
|
|
13
|
+
unmark(id: IdentityRef, step: string): Promise<void>;
|
|
14
|
+
private store;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=db-mfa-enrolment-marks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-mfa-enrolment-marks.d.ts","sourceRoot":"","sources":["../../../src/mfa/db-mfa-enrolment-marks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM/C,6FAA6F;AAC7F,qBAEa,mBAAoB,SAAQ,iBAAiB;IAK5C,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU;IAH9C,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IAEjC,kDAAkD;IAClD,YAA+B,EAAE,CAAC,EAAE,UAAU,YAAA,EAE7C;IAEY,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhE;IAED,mGAAmG;IACtF,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjE;IAEY,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;IAED,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { MfaEnrolmentMarks } from '@spinajs/authn/contracts';
|
|
11
|
+
import { Autoinject, Injectable, PerChildInstance } from '@spinajs/di';
|
|
12
|
+
import { DbMfaStore } from './db-mfa-store.js';
|
|
13
|
+
/** What the row holds in place of a secret: the store keeps cipher text, and a mark has nothing to hide. */
|
|
14
|
+
const MARK_SECRET = 'mark';
|
|
15
|
+
const MARK_KEY = 'none';
|
|
16
|
+
/** Enrolment marks of steps without a secret of their own, as confirmed `authn_mfa` rows. */
|
|
17
|
+
let DbMfaEnrolmentMarks = class DbMfaEnrolmentMarks extends MfaEnrolmentMarks {
|
|
18
|
+
/** DI passes nothing and injects `DbMfaStore`. */
|
|
19
|
+
constructor(db) {
|
|
20
|
+
super();
|
|
21
|
+
this.db = db;
|
|
22
|
+
}
|
|
23
|
+
async has(id, step) {
|
|
24
|
+
const row = await this.store().get(id, step);
|
|
25
|
+
return row !== null && row.confirmedAt !== null;
|
|
26
|
+
}
|
|
27
|
+
/** True for exactly the call that confirmed the row; false when the identity is marked already. */
|
|
28
|
+
async mark(id, step) {
|
|
29
|
+
const store = this.store();
|
|
30
|
+
if (!(await store.putPending(id, step, MARK_SECRET, MARK_KEY)))
|
|
31
|
+
return false;
|
|
32
|
+
return store.confirm(id, step, new Date(), MARK_SECRET);
|
|
33
|
+
}
|
|
34
|
+
async unmark(id, step) {
|
|
35
|
+
await this.store().remove(id, step);
|
|
36
|
+
}
|
|
37
|
+
store() {
|
|
38
|
+
return this.db ?? this.DbMfaStore;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
__decorate([
|
|
42
|
+
Autoinject(DbMfaStore),
|
|
43
|
+
__metadata("design:type", DbMfaStore)
|
|
44
|
+
], DbMfaEnrolmentMarks.prototype, "DbMfaStore", void 0);
|
|
45
|
+
DbMfaEnrolmentMarks = __decorate([
|
|
46
|
+
PerChildInstance(),
|
|
47
|
+
Injectable(MfaEnrolmentMarks),
|
|
48
|
+
__metadata("design:paramtypes", [DbMfaStore])
|
|
49
|
+
], DbMfaEnrolmentMarks);
|
|
50
|
+
export { DbMfaEnrolmentMarks };
|
|
51
|
+
//# sourceMappingURL=db-mfa-enrolment-marks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-mfa-enrolment-marks.js","sourceRoot":"","sources":["../../../src/mfa/db-mfa-enrolment-marks.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,4GAA4G;AAC5G,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB,6FAA6F;AAGtF,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,iBAAiB;IAIxD,kDAAkD;IAClD,YAA+B,EAAe;QAC5C,KAAK,EAAE,CAAC;kBADqB,EAAE;IAEjC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,EAAe,EAAE,IAAY;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC;IAClD,CAAC;IAED,mGAAmG;IAC5F,KAAK,CAAC,IAAI,CAAC,EAAe,EAAE,IAAY;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7E,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,EAAe,EAAE,IAAY;QAC/C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK;QACX,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;CACF,CAAA;AA1BW;IADT,UAAU,CAAC,UAAU,CAAC;8BACD,UAAU;uDAAC;AAFtB,mBAAmB;IAF/B,gBAAgB,EAAE;IAClB,UAAU,CAAC,iBAAiB,CAAC;qCAMQ,UAAU;GALnC,mBAAmB,CA4B/B"}
|
|
@@ -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"}
|