@webda/core 4.0.0-beta.3 → 4.0.0-beta.4
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/lib/application/application.d.ts +31 -0
- package/lib/application/application.d.ts.map +1 -1
- package/lib/application/application.js +55 -2
- package/lib/application/application.js.map +1 -1
- package/lib/application/deployment.d.ts +93 -0
- package/lib/application/deployment.d.ts.map +1 -0
- package/lib/application/deployment.js +99 -0
- package/lib/application/deployment.js.map +1 -0
- package/lib/application/unpackedapplication.d.ts.map +1 -1
- package/lib/application/unpackedapplication.js +9 -1
- package/lib/application/unpackedapplication.js.map +1 -1
- package/lib/bin/cli.d.ts +36 -1
- package/lib/bin/cli.d.ts.map +1 -1
- package/lib/bin/cli.js +108 -2
- package/lib/bin/cli.js.map +1 -1
- package/lib/contexts/execution.js +1 -1
- package/lib/contexts/execution.js.map +1 -1
- package/lib/contexts/operationcontext.d.ts +3 -0
- package/lib/contexts/operationcontext.d.ts.map +1 -1
- package/lib/contexts/operationcontext.js +6 -3
- package/lib/contexts/operationcontext.js.map +1 -1
- package/lib/core/core.js +1 -1
- package/lib/core/core.js.map +1 -1
- package/lib/core/hooks.d.ts +22 -0
- package/lib/core/hooks.d.ts.map +1 -1
- package/lib/core/hooks.js +24 -0
- package/lib/core/hooks.js.map +1 -1
- package/lib/deployers/deployer.d.ts +157 -0
- package/lib/deployers/deployer.d.ts.map +1 -0
- package/lib/deployers/deployer.js +81 -0
- package/lib/deployers/deployer.js.map +1 -0
- package/lib/deployers/git.d.ts +27 -0
- package/lib/deployers/git.d.ts.map +1 -0
- package/lib/deployers/git.js +66 -0
- package/lib/deployers/git.js.map +1 -0
- package/lib/deployers/packager.d.ts +85 -0
- package/lib/deployers/packager.d.ts.map +1 -0
- package/lib/deployers/packager.js +259 -0
- package/lib/deployers/packager.js.map +1 -0
- package/lib/index.d.ts +8 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +8 -3
- package/lib/index.js.map +1 -1
- package/lib/models/coremodel.model.d.ts.map +1 -1
- package/lib/models/coremodel.model.js.map +1 -1
- package/lib/models/decorator.d.ts +4 -0
- package/lib/models/decorator.d.ts.map +1 -1
- package/lib/models/decorator.js +4 -0
- package/lib/models/decorator.js.map +1 -1
- package/lib/models/deployment.d.ts +2 -21
- package/lib/models/deployment.d.ts.map +1 -1
- package/lib/models/encrypted.model.d.ts +46 -0
- package/lib/models/encrypted.model.d.ts.map +1 -0
- package/lib/models/encrypted.model.js +87 -0
- package/lib/models/encrypted.model.js.map +1 -0
- package/lib/models/ident.model.d.ts +103 -64
- package/lib/models/ident.model.d.ts.map +1 -1
- package/lib/models/ident.model.js +168 -76
- package/lib/models/ident.model.js.map +1 -1
- package/lib/models/ownermodel.model.d.ts.map +1 -1
- package/lib/models/ownermodel.model.js +2 -1
- package/lib/models/ownermodel.model.js.map +1 -1
- package/lib/models/password.model.d.ts +78 -0
- package/lib/models/password.model.d.ts.map +1 -0
- package/lib/models/password.model.js +171 -0
- package/lib/models/password.model.js.map +1 -0
- package/lib/models/refreshtoken.model.d.ts +30 -0
- package/lib/models/refreshtoken.model.d.ts.map +1 -0
- package/lib/models/refreshtoken.model.js +29 -0
- package/lib/models/refreshtoken.model.js.map +1 -0
- package/lib/models/registry.model.d.ts.map +1 -1
- package/lib/models/registry.model.js.map +1 -1
- package/lib/models/simpleuser.model.d.ts.map +1 -1
- package/lib/models/simpleuser.model.js +2 -1
- package/lib/models/simpleuser.model.js.map +1 -1
- package/lib/models/user.model.d.ts +23 -23
- package/lib/models/user.model.d.ts.map +1 -1
- package/lib/models/user.model.js +68 -29
- package/lib/models/user.model.js.map +1 -1
- package/lib/services/audit.model.d.ts.map +1 -1
- package/lib/services/audit.model.js +2 -1
- package/lib/services/audit.model.js.map +1 -1
- package/lib/services/domainservice.service.d.ts +39 -0
- package/lib/services/domainservice.service.d.ts.map +1 -1
- package/lib/services/domainservice.service.js +78 -2
- package/lib/services/domainservice.service.js.map +1 -1
- package/lib/services/iauthentication.d.ts +196 -3
- package/lib/services/iauthentication.d.ts.map +1 -1
- package/lib/services/servicecommands.d.ts.map +1 -1
- package/lib/services/servicecommands.js +17 -11
- package/lib/services/servicecommands.js.map +1 -1
- package/lib/services/token.service.d.ts +95 -0
- package/lib/services/token.service.d.ts.map +1 -0
- package/lib/services/token.service.js +182 -0
- package/lib/services/token.service.js.map +1 -0
- package/lib/session/manager.model.d.ts +16 -0
- package/lib/session/manager.model.d.ts.map +1 -1
- package/lib/session/manager.model.js +58 -1
- package/lib/session/manager.model.js.map +1 -1
- package/lib/session/session.d.ts +44 -1
- package/lib/session/session.d.ts.map +1 -1
- package/lib/session/session.js +51 -2
- package/lib/session/session.js.map +1 -1
- package/lib/stores/memory.service.d.ts.map +1 -1
- package/lib/stores/memory.service.js +4 -3
- package/lib/stores/memory.service.js.map +1 -1
- package/lib/templates/templates.d.ts +8 -0
- package/lib/templates/templates.d.ts.map +1 -1
- package/lib/templates/templates.js +10 -1
- package/lib/templates/templates.js.map +1 -1
- package/lib/test/behavior-fixture.model.d.ts +30 -0
- package/lib/test/behavior-fixture.model.d.ts.map +1 -0
- package/lib/test/behavior-fixture.model.js +63 -0
- package/lib/test/behavior-fixture.model.js.map +1 -0
- package/lib/test/legacyident.fixture.model.d.ts +98 -0
- package/lib/test/legacyident.fixture.model.d.ts.map +1 -0
- package/lib/test/legacyident.fixture.model.js +125 -0
- package/lib/test/legacyident.fixture.model.js.map +1 -0
- package/lib/test/objects.d.ts +2 -2
- package/lib/test/objects.d.ts.map +1 -1
- package/lib/test/objects.js +2 -2
- package/lib/test/objects.js.map +1 -1
- package/package.json +25 -8
- package/test/config-cached.json +2 -1
- package/test/config.json +3 -1
- package/test/my-cnf.json +1 -1
- package/webda.module.json +653 -375
- package/lib/services/authentication.service.d.ts +0 -442
- package/lib/services/authentication.service.d.ts.map +0 -1
- package/lib/services/authentication.service.js +0 -932
- package/lib/services/authentication.service.js.map +0 -1
- package/lib/services/oauth.d.ts +0 -250
- package/lib/services/oauth.d.ts.map +0 -1
- package/lib/services/oauth.js +0 -405
- package/lib/services/oauth.js.map +0 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as WebdaError from "../errors/errors.js";
|
|
2
|
+
import { Service } from "./service.js";
|
|
3
|
+
import { ServiceParameters } from "./serviceparameters.js";
|
|
4
|
+
import { MfaState, Session } from "../session/session.js";
|
|
5
|
+
/** Raised for unknown, expired, revoked or reused tokens (403 TOKEN_INVALID) */
|
|
6
|
+
export declare class TokenInvalid extends WebdaError.HttpError {
|
|
7
|
+
/** @param message - error message */
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
/** Tokens returned by a successful login or refresh */
|
|
11
|
+
export interface IssuedTokens {
|
|
12
|
+
accessToken: string;
|
|
13
|
+
refreshToken: string;
|
|
14
|
+
expiresIn: number;
|
|
15
|
+
}
|
|
16
|
+
/** Claims carried by an access token */
|
|
17
|
+
export interface AccessClaims {
|
|
18
|
+
sub: string;
|
|
19
|
+
ident: string;
|
|
20
|
+
provider?: string;
|
|
21
|
+
amr: string[];
|
|
22
|
+
roles?: string[];
|
|
23
|
+
fam: string;
|
|
24
|
+
mfa: MfaState;
|
|
25
|
+
/** When the session was authenticated (ms): checked against the user's last password change */
|
|
26
|
+
authAt?: number;
|
|
27
|
+
}
|
|
28
|
+
/** TokenService parameters */
|
|
29
|
+
export declare class TokenServiceParameters extends ServiceParameters {
|
|
30
|
+
/**
|
|
31
|
+
* Access token lifetime in seconds
|
|
32
|
+
* @default 900
|
|
33
|
+
*/
|
|
34
|
+
accessTtl: number;
|
|
35
|
+
/**
|
|
36
|
+
* Refresh token lifetime in seconds
|
|
37
|
+
* @default 2592000
|
|
38
|
+
*/
|
|
39
|
+
refreshTtl: number;
|
|
40
|
+
/**
|
|
41
|
+
* @param params - raw parameters
|
|
42
|
+
* @returns this
|
|
43
|
+
*/
|
|
44
|
+
load(params?: any): this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Issues access tokens (JWT) and rotating refresh tokens
|
|
48
|
+
* @WebdaModda TokenService
|
|
49
|
+
*/
|
|
50
|
+
export declare class TokenService<T extends TokenServiceParameters = TokenServiceParameters> extends Service<T> {
|
|
51
|
+
/**
|
|
52
|
+
* @param token - raw refresh token
|
|
53
|
+
* @returns SHA-256 hex
|
|
54
|
+
*/
|
|
55
|
+
protected hash(token: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Issue an access + refresh token pair for a logged session
|
|
58
|
+
*
|
|
59
|
+
* Roles are not persisted: refreshed access tokens carry no roles until they are re-derived.
|
|
60
|
+
* @param session - logged session (must not be anonymous nor pending MFA)
|
|
61
|
+
* @param family - existing family when rotating
|
|
62
|
+
* @returns the tokens
|
|
63
|
+
*/
|
|
64
|
+
issue(session: Session, family?: string): Promise<IssuedTokens>;
|
|
65
|
+
/**
|
|
66
|
+
* @param token - access token
|
|
67
|
+
* @returns claims, or undefined when invalid/expired
|
|
68
|
+
*/
|
|
69
|
+
verifyAccess(token: string): Promise<AccessClaims | undefined>;
|
|
70
|
+
/**
|
|
71
|
+
* Exchange a refresh token (rotation with reuse detection)
|
|
72
|
+
*
|
|
73
|
+
* The token is only ever looked up by its hash, so an access token or any
|
|
74
|
+
* arbitrary string simply does not match a stored record.
|
|
75
|
+
* @param refreshToken - raw refresh token
|
|
76
|
+
* @returns new tokens and the rebuilt session
|
|
77
|
+
*/
|
|
78
|
+
refresh(refreshToken: string): Promise<IssuedTokens & {
|
|
79
|
+
session: Session;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* @param err - error thrown by a conditional write
|
|
83
|
+
* @returns true if the error is a failed write condition
|
|
84
|
+
*/
|
|
85
|
+
protected isConditionFailure(err: any): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* @param family - family to revoke
|
|
88
|
+
*/
|
|
89
|
+
revokeFamily(family: string): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* @param userId - user whose tokens are revoked
|
|
92
|
+
*/
|
|
93
|
+
revokeUser(userId: string): Promise<void>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=token.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.service.d.ts","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAI1D,gFAAgF;AAChF,qBAAa,YAAa,SAAQ,UAAU,CAAC,SAAS;IACpD,qCAAqC;IACrC,YAAY,OAAO,GAAE,MAAwB,EAE5C;CACF;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC;IACd,+FAA+F;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,8BAA8B;AAC9B,qBAAa,sBAAuB,SAAQ,iBAAiB;IAC3D;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAK3B;CACF;AAED;;;GAGG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACrG;;;OAGG;IACH,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpC;IAED;;;;;;;OAOG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,MAA0B,GAAG,OAAO,CAAC,YAAY,CAAC,CAiCvF;IAED;;;OAGG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAMnE;IAED;;;;;;;OAOG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CA0ChF;IAED;;;OAGG;IACH,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAE9C;IAED;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhD;IAED;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9C;CACF"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { getUuid } from "@webda/utils";
|
|
3
|
+
import * as WebdaError from "../errors/errors.js";
|
|
4
|
+
import { Service } from "./service.js";
|
|
5
|
+
import { ServiceParameters } from "./serviceparameters.js";
|
|
6
|
+
import { useCrypto } from "./cryptoservice.service.js";
|
|
7
|
+
import { RefreshToken } from "../models/refreshtoken.model.js";
|
|
8
|
+
import { Session } from "../session/session.js";
|
|
9
|
+
const ACCESS_AUDIENCE = "webda-access";
|
|
10
|
+
/** Raised for unknown, expired, revoked or reused tokens (403 TOKEN_INVALID) */
|
|
11
|
+
export class TokenInvalid extends WebdaError.HttpError {
|
|
12
|
+
/** @param message - error message */
|
|
13
|
+
constructor(message = "Invalid token") {
|
|
14
|
+
super(message, 403);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** TokenService parameters */
|
|
18
|
+
export class TokenServiceParameters extends ServiceParameters {
|
|
19
|
+
/**
|
|
20
|
+
* Access token lifetime in seconds
|
|
21
|
+
* @default 900
|
|
22
|
+
*/
|
|
23
|
+
accessTtl;
|
|
24
|
+
/**
|
|
25
|
+
* Refresh token lifetime in seconds
|
|
26
|
+
* @default 2592000
|
|
27
|
+
*/
|
|
28
|
+
refreshTtl;
|
|
29
|
+
/**
|
|
30
|
+
* @param params - raw parameters
|
|
31
|
+
* @returns this
|
|
32
|
+
*/
|
|
33
|
+
load(params = {}) {
|
|
34
|
+
super.load(params);
|
|
35
|
+
this.accessTtl ??= 900;
|
|
36
|
+
this.refreshTtl ??= 2592000;
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Issues access tokens (JWT) and rotating refresh tokens
|
|
42
|
+
* @WebdaModda TokenService
|
|
43
|
+
*/
|
|
44
|
+
export class TokenService extends Service {
|
|
45
|
+
/**
|
|
46
|
+
* @param token - raw refresh token
|
|
47
|
+
* @returns SHA-256 hex
|
|
48
|
+
*/
|
|
49
|
+
hash(token) {
|
|
50
|
+
return createHash("sha256").update(token).digest("hex");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Issue an access + refresh token pair for a logged session
|
|
54
|
+
*
|
|
55
|
+
* Roles are not persisted: refreshed access tokens carry no roles until they are re-derived.
|
|
56
|
+
* @param session - logged session (must not be anonymous nor pending MFA)
|
|
57
|
+
* @param family - existing family when rotating
|
|
58
|
+
* @returns the tokens
|
|
59
|
+
*/
|
|
60
|
+
async issue(session, family = getUuid("base64")) {
|
|
61
|
+
if (!session.isLogged()) {
|
|
62
|
+
throw new TokenInvalid("Session is not fully authenticated");
|
|
63
|
+
}
|
|
64
|
+
const refreshToken = randomBytes(32).toString("base64url");
|
|
65
|
+
await RefreshToken.create({
|
|
66
|
+
hash: this.hash(refreshToken),
|
|
67
|
+
userId: session.userId,
|
|
68
|
+
identId: session.identUsed,
|
|
69
|
+
provider: session.provider,
|
|
70
|
+
amr: session.amr ?? [],
|
|
71
|
+
mfa: session.mfa ?? "none",
|
|
72
|
+
family,
|
|
73
|
+
expiresAt: Date.now() + this.parameters.refreshTtl * 1000
|
|
74
|
+
});
|
|
75
|
+
session.refreshFamily = family;
|
|
76
|
+
// A refreshed session is re-authenticated by its (unrevoked) refresh token
|
|
77
|
+
session.authAt ??= Date.now();
|
|
78
|
+
const claims = {
|
|
79
|
+
sub: session.userId,
|
|
80
|
+
ident: session.identUsed,
|
|
81
|
+
provider: session.provider,
|
|
82
|
+
amr: session.amr ?? [],
|
|
83
|
+
roles: session.roles,
|
|
84
|
+
fam: family,
|
|
85
|
+
mfa: session.mfa ?? "none",
|
|
86
|
+
authAt: session.authAt
|
|
87
|
+
};
|
|
88
|
+
const accessToken = await useCrypto().jwtSign(claims, {
|
|
89
|
+
audience: ACCESS_AUDIENCE,
|
|
90
|
+
expiresIn: this.parameters.accessTtl
|
|
91
|
+
});
|
|
92
|
+
return { accessToken, refreshToken, expiresIn: this.parameters.accessTtl };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @param token - access token
|
|
96
|
+
* @returns claims, or undefined when invalid/expired
|
|
97
|
+
*/
|
|
98
|
+
async verifyAccess(token) {
|
|
99
|
+
try {
|
|
100
|
+
return await useCrypto().jwtVerify(token, { audience: ACCESS_AUDIENCE });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Exchange a refresh token (rotation with reuse detection)
|
|
108
|
+
*
|
|
109
|
+
* The token is only ever looked up by its hash, so an access token or any
|
|
110
|
+
* arbitrary string simply does not match a stored record.
|
|
111
|
+
* @param refreshToken - raw refresh token
|
|
112
|
+
* @returns new tokens and the rebuilt session
|
|
113
|
+
*/
|
|
114
|
+
async refresh(refreshToken) {
|
|
115
|
+
if (typeof refreshToken !== "string" || !refreshToken) {
|
|
116
|
+
throw new TokenInvalid();
|
|
117
|
+
}
|
|
118
|
+
const ref = RefreshToken.ref({ hash: this.hash(refreshToken) });
|
|
119
|
+
if (!(await ref.exists())) {
|
|
120
|
+
throw new TokenInvalid();
|
|
121
|
+
}
|
|
122
|
+
const stored = await ref.get();
|
|
123
|
+
if (stored.revokedAt || stored.expiresAt < Date.now()) {
|
|
124
|
+
throw new TokenInvalid();
|
|
125
|
+
}
|
|
126
|
+
if (stored.rotatedAt) {
|
|
127
|
+
await this.revokeFamily(stored.family);
|
|
128
|
+
throw new TokenInvalid("Refresh token reused");
|
|
129
|
+
}
|
|
130
|
+
// Compare-and-set: only one caller can move rotatedAt from undefined to a value
|
|
131
|
+
try {
|
|
132
|
+
await ref.patch({ rotatedAt: Date.now() }, "rotatedAt", undefined);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
if (!this.isConditionFailure(err)) {
|
|
136
|
+
throw err;
|
|
137
|
+
}
|
|
138
|
+
// Lost the race: treat as reuse and kill the family
|
|
139
|
+
await this.revokeFamily(stored.family);
|
|
140
|
+
throw new TokenInvalid("Refresh token reused");
|
|
141
|
+
}
|
|
142
|
+
const session = new Session();
|
|
143
|
+
session.login(stored.userId, stored.identId, {
|
|
144
|
+
provider: stored.provider,
|
|
145
|
+
amr: stored.amr,
|
|
146
|
+
mfa: stored.mfa ?? "none"
|
|
147
|
+
});
|
|
148
|
+
const tokens = await this.issue(session, stored.family);
|
|
149
|
+
// A revocation may have run between our read and the issue: its scan would have missed the new record
|
|
150
|
+
for await (const _ of RefreshToken.iterate("family = ? AND revokedAt IS NOT NULL LIMIT 1", [stored.family])) {
|
|
151
|
+
await RefreshToken.ref({ hash: this.hash(tokens.refreshToken) }).patch({
|
|
152
|
+
revokedAt: Date.now()
|
|
153
|
+
});
|
|
154
|
+
throw new TokenInvalid("Refresh token revoked");
|
|
155
|
+
}
|
|
156
|
+
return { ...tokens, session };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* @param err - error thrown by a conditional write
|
|
160
|
+
* @returns true if the error is a failed write condition
|
|
161
|
+
*/
|
|
162
|
+
isConditionFailure(err) {
|
|
163
|
+
return /condition/i.test(`${err?.name} ${err?.message}`);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @param family - family to revoke
|
|
167
|
+
*/
|
|
168
|
+
async revokeFamily(family) {
|
|
169
|
+
for await (const token of RefreshToken.iterate("family = ? AND revokedAt IS NULL", [family])) {
|
|
170
|
+
await token.ref().patch({ revokedAt: Date.now() });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* @param userId - user whose tokens are revoked
|
|
175
|
+
*/
|
|
176
|
+
async revokeUser(userId) {
|
|
177
|
+
for await (const token of RefreshToken.iterate("userId = ? AND revokedAt IS NULL", [userId])) {
|
|
178
|
+
await token.ref().patch({ revokedAt: Date.now() });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=token.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.service.js","sourceRoot":"","sources":["../../src/services/token.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,22 @@ export declare abstract class SessionManager<T extends ServiceParameters = Servi
|
|
|
21
21
|
* @param session
|
|
22
22
|
*/
|
|
23
23
|
abstract save(context: Context, session: Session): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Build a stateless session from an access token (any transport)
|
|
26
|
+
* @param context - the context
|
|
27
|
+
* @param token - access token
|
|
28
|
+
* @returns the session, anonymous when the token is invalid
|
|
29
|
+
*/
|
|
30
|
+
loadFromToken(context: Context, token: string): Promise<Session>;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the user of an authenticated session changed their password after the session was authenticated
|
|
33
|
+
*
|
|
34
|
+
* Costs one user read (through the registered user resolver) per load of a session carrying `authAt`. A failing
|
|
35
|
+
* read counts as outdated: the session is then anonymous for that request.
|
|
36
|
+
* @param session - loaded session
|
|
37
|
+
* @returns true when the session must be treated as anonymous
|
|
38
|
+
*/
|
|
39
|
+
protected isOutdated(session: Session): Promise<boolean>;
|
|
24
40
|
}
|
|
25
41
|
/** Persistent session data stored in a model with a TTL */
|
|
26
42
|
export declare class SessionModel extends UuidModel {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.model.d.ts","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAU,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAgB,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.model.d.ts","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAU,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAgB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAgB,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E;;GAEG;AACH,8BAAsB,cAAc,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IACtG;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;;;OAKG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcrE;IAED;;;;;;;OAOG;IACH,UAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAY7D;CACF;AAED,2DAA2D;AAC3D,qBAAa,YAAa,SAAQ,SAAS;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb;;OAEG;IACH,YAAY,IAAI,EAAE,GAAG,EAIpB;CACF;AAED,sDAAsD;AACtD,qBAAa,uBAAwB,SAAQ,iBAAiB;IAC5D;;OAEG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAI3B;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAoB,CAC/B,CAAC,SAAS,uBAAuB,GAAG,uBAAuB,CAC3D,SAAQ,cAAc,CAAC,CAAC,CAAC;IAEzB,aAAa,EAAE,aAAa,CAAC;IAE7B,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnD;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB7C;IAED;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,iBAgC5C;CACF"}
|
|
@@ -38,11 +38,56 @@ import { isWebContext } from "../contexts/icontext.js";
|
|
|
38
38
|
import { getUuid } from "@webda/utils";
|
|
39
39
|
import { ServiceParameters } from "../services/serviceparameters.js";
|
|
40
40
|
import { Session } from "./session.js";
|
|
41
|
+
import { useService, useUserResolver } from "../core/hooks.js";
|
|
42
|
+
import { runAsSystem } from "../contexts/execution.js";
|
|
41
43
|
import { UuidModel } from "@webda/models";
|
|
42
44
|
/**
|
|
43
45
|
* Manage load and save of sessions
|
|
44
46
|
*/
|
|
45
47
|
export class SessionManager extends Service {
|
|
48
|
+
/**
|
|
49
|
+
* Build a stateless session from an access token (any transport)
|
|
50
|
+
* @param context - the context
|
|
51
|
+
* @param token - access token
|
|
52
|
+
* @returns the session, anonymous when the token is invalid
|
|
53
|
+
*/
|
|
54
|
+
async loadFromToken(context, token) {
|
|
55
|
+
const session = new Session();
|
|
56
|
+
session.stateless = true;
|
|
57
|
+
const claims = await useService("TokenService").verifyAccess(token);
|
|
58
|
+
if (claims) {
|
|
59
|
+
session.login(claims.sub, claims.ident, { provider: claims.provider, amr: claims.amr, mfa: claims.mfa });
|
|
60
|
+
session.roles = claims.roles;
|
|
61
|
+
session.refreshFamily = claims.fam;
|
|
62
|
+
session.authAt = claims.authAt;
|
|
63
|
+
if (await this.isOutdated(session)) {
|
|
64
|
+
session.logout();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return session;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Whether the user of an authenticated session changed their password after the session was authenticated
|
|
71
|
+
*
|
|
72
|
+
* Costs one user read (through the registered user resolver) per load of a session carrying `authAt`. A failing
|
|
73
|
+
* read counts as outdated: the session is then anonymous for that request.
|
|
74
|
+
* @param session - loaded session
|
|
75
|
+
* @returns true when the session must be treated as anonymous
|
|
76
|
+
*/
|
|
77
|
+
async isOutdated(session) {
|
|
78
|
+
if (session.userId === undefined || typeof session.authAt !== "number") {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const user = await runAsSystem(() => useUserResolver().resolve(session.userId));
|
|
83
|
+
const changedAt = user?.password?.changedAt;
|
|
84
|
+
return typeof changedAt === "number" && changedAt > session.authAt;
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
this.log("WARN", "Cannot check the session against the user password, session ignored", err?.message);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
46
91
|
}
|
|
47
92
|
/** Persistent session data stored in a model with a TTL */
|
|
48
93
|
export class SessionModel extends UuidModel {
|
|
@@ -107,6 +152,11 @@ let CookieSessionManager = (() => {
|
|
|
107
152
|
if (!isWebContext(context)) {
|
|
108
153
|
return new Session();
|
|
109
154
|
}
|
|
155
|
+
// A Bearer scheme is authoritative: an invalid token yields an anonymous session, never the cookie
|
|
156
|
+
const authorization = context.getHttpContext().getHeader("authorization");
|
|
157
|
+
if (typeof authorization === "string" && /^bearer(\s|$)/i.test(authorization)) {
|
|
158
|
+
return this.loadFromToken(context, authorization.substring(7).trim());
|
|
159
|
+
}
|
|
110
160
|
const session = new Session();
|
|
111
161
|
const cookie = await SecureCookie.load(this.parameters.cookie.name, session, context, this.parameters.jwt);
|
|
112
162
|
if (this.sessionModel) {
|
|
@@ -119,6 +169,10 @@ let CookieSessionManager = (() => {
|
|
|
119
169
|
else {
|
|
120
170
|
Object.assign(session, cookie);
|
|
121
171
|
}
|
|
172
|
+
// A password change ends the sessions authenticated before it
|
|
173
|
+
if (await this.isOutdated(session)) {
|
|
174
|
+
session.logout();
|
|
175
|
+
}
|
|
122
176
|
return session;
|
|
123
177
|
}
|
|
124
178
|
/**
|
|
@@ -128,9 +182,12 @@ let CookieSessionManager = (() => {
|
|
|
128
182
|
if (!isWebContext(context)) {
|
|
129
183
|
return;
|
|
130
184
|
}
|
|
185
|
+
if (session.stateless) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
131
188
|
// If store is found session info are stored in db
|
|
132
189
|
if (this.sessionModel) {
|
|
133
|
-
if (this.sessionModel.exists(session.uuid)) {
|
|
190
|
+
if (await this.sessionModel.exists(session.uuid)) {
|
|
134
191
|
await this.sessionModel.update({
|
|
135
192
|
uuid: session.uuid,
|
|
136
193
|
session,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.model.js","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAW,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAoC,SAAS,EAAE,MAAM,eAAe,CAAC;AAE5E;;GAEG;AACH,MAAM,OAAgB,cAAgE,SAAQ,OAAU;
|
|
1
|
+
{"version":3,"file":"manager.model.js","sourceRoot":"","sources":["../../src/session/manager.model.ts"],"names":[],"mappings":"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"}
|
package/lib/session/session.d.ts
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MFA progress of a session
|
|
3
|
+
*/
|
|
4
|
+
export type MfaState = "none" | "pending" | "verified";
|
|
5
|
+
/**
|
|
6
|
+
* Options for {@link Session.login}
|
|
7
|
+
*/
|
|
8
|
+
export interface LoginOptions {
|
|
9
|
+
provider?: string;
|
|
10
|
+
amr?: string[];
|
|
11
|
+
mfa?: MfaState;
|
|
12
|
+
}
|
|
1
13
|
/**
|
|
2
14
|
* Session
|
|
3
15
|
*/
|
|
@@ -19,12 +31,38 @@ export declare class Session {
|
|
|
19
31
|
* User current roles
|
|
20
32
|
*/
|
|
21
33
|
roles: string[];
|
|
34
|
+
/**
|
|
35
|
+
* Authentication provider used
|
|
36
|
+
*/
|
|
37
|
+
provider?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Authentication methods used
|
|
40
|
+
*/
|
|
41
|
+
amr?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* MFA state of the session
|
|
44
|
+
*/
|
|
45
|
+
mfa?: MfaState;
|
|
46
|
+
/**
|
|
47
|
+
* Refresh token family identifier
|
|
48
|
+
*/
|
|
49
|
+
refreshFamily?: string;
|
|
50
|
+
/**
|
|
51
|
+
* When the session was authenticated (ms timestamp, stamped by the Authentication service): a session older than
|
|
52
|
+
* the last password change of its user is loaded as anonymous
|
|
53
|
+
*/
|
|
54
|
+
authAt?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Session is stateless (not persisted in cookies)
|
|
57
|
+
*/
|
|
58
|
+
stateless?: boolean;
|
|
22
59
|
/**
|
|
23
60
|
* Login
|
|
24
61
|
* @param userId - the user identifier
|
|
25
62
|
* @param identUsed - the identity used
|
|
63
|
+
* @param options - login options including provider, amr, and mfa state
|
|
26
64
|
*/
|
|
27
|
-
login(userId: string, identUsed: string): void;
|
|
65
|
+
login(userId: string, identUsed: string, options?: LoginOptions): void;
|
|
28
66
|
/**
|
|
29
67
|
* Logout
|
|
30
68
|
*/
|
|
@@ -34,6 +72,11 @@ export declare class Session {
|
|
|
34
72
|
* @returns true if the condition is met
|
|
35
73
|
*/
|
|
36
74
|
isLogged(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* If session is pending MFA verification
|
|
77
|
+
* @returns true if the condition is met
|
|
78
|
+
*/
|
|
79
|
+
isPending(): boolean;
|
|
37
80
|
/**
|
|
38
81
|
* Session is dirty and requires save
|
|
39
82
|
* @returns true if the condition is met
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,OAAO;IAElB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAS;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,QAAQ,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,OAAO;IAElB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAS;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,GAAG,CAAC,EAAE,QAAQ,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IAEH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,QAMlE;IACD;;OAEG;IACH,MAAM,SASL;IAED;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAElB;IAED;;;OAGG;IACH,SAAS,IAAI,OAAO,CAEnB;IAED;;;OAGG;IACH,OAAO,IAAI,OAAO,CAEjB;IAED;;;OAGG;IACH,QAAQ,IAAI,IAAI,CAef;CACF;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO;IACzC;;OAEG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
|
package/lib/session/session.js
CHANGED
|
@@ -40,11 +40,16 @@ let Session = (() => {
|
|
|
40
40
|
let _changed_decorators;
|
|
41
41
|
let _changed_initializers = [];
|
|
42
42
|
let _changed_extraInitializers = [];
|
|
43
|
+
let _stateless_decorators;
|
|
44
|
+
let _stateless_initializers = [];
|
|
45
|
+
let _stateless_extraInitializers = [];
|
|
43
46
|
return class Session {
|
|
44
47
|
static {
|
|
45
48
|
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
46
49
|
_changed_decorators = [NotEnumerable];
|
|
50
|
+
_stateless_decorators = [NotEnumerable];
|
|
47
51
|
__esDecorate(null, null, _changed_decorators, { kind: "field", name: "changed", static: false, private: false, access: { has: obj => "changed" in obj, get: obj => obj.changed, set: (obj, value) => { obj.changed = value; } }, metadata: _metadata }, _changed_initializers, _changed_extraInitializers);
|
|
52
|
+
__esDecorate(null, null, _stateless_decorators, { kind: "field", name: "stateless", static: false, private: false, access: { has: obj => "stateless" in obj, get: obj => obj.stateless, set: (obj, value) => { obj.stateless = value; } }, metadata: _metadata }, _stateless_initializers, _stateless_extraInitializers);
|
|
48
53
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
49
54
|
}
|
|
50
55
|
changed = __runInitializers(this, _changed_initializers, false);
|
|
@@ -64,14 +69,43 @@ let Session = (() => {
|
|
|
64
69
|
* User current roles
|
|
65
70
|
*/
|
|
66
71
|
roles;
|
|
72
|
+
/**
|
|
73
|
+
* Authentication provider used
|
|
74
|
+
*/
|
|
75
|
+
provider;
|
|
76
|
+
/**
|
|
77
|
+
* Authentication methods used
|
|
78
|
+
*/
|
|
79
|
+
amr;
|
|
80
|
+
/**
|
|
81
|
+
* MFA state of the session
|
|
82
|
+
*/
|
|
83
|
+
mfa;
|
|
84
|
+
/**
|
|
85
|
+
* Refresh token family identifier
|
|
86
|
+
*/
|
|
87
|
+
refreshFamily;
|
|
88
|
+
/**
|
|
89
|
+
* When the session was authenticated (ms timestamp, stamped by the Authentication service): a session older than
|
|
90
|
+
* the last password change of its user is loaded as anonymous
|
|
91
|
+
*/
|
|
92
|
+
authAt;
|
|
93
|
+
/**
|
|
94
|
+
* Session is stateless (not persisted in cookies)
|
|
95
|
+
*/
|
|
96
|
+
stateless = __runInitializers(this, _stateless_initializers, void 0);
|
|
67
97
|
/**
|
|
68
98
|
* Login
|
|
69
99
|
* @param userId - the user identifier
|
|
70
100
|
* @param identUsed - the identity used
|
|
101
|
+
* @param options - login options including provider, amr, and mfa state
|
|
71
102
|
*/
|
|
72
|
-
login(userId, identUsed) {
|
|
103
|
+
login(userId, identUsed, options = {}) {
|
|
73
104
|
this.userId = userId;
|
|
74
105
|
this.identUsed = identUsed;
|
|
106
|
+
this.provider = options.provider;
|
|
107
|
+
this.amr = options.amr ?? [];
|
|
108
|
+
this.mfa = options.mfa ?? "none";
|
|
75
109
|
}
|
|
76
110
|
/**
|
|
77
111
|
* Logout
|
|
@@ -80,13 +114,25 @@ let Session = (() => {
|
|
|
80
114
|
delete this.userId;
|
|
81
115
|
delete this.identUsed;
|
|
82
116
|
delete this.roles;
|
|
117
|
+
delete this.provider;
|
|
118
|
+
delete this.amr;
|
|
119
|
+
delete this.mfa;
|
|
120
|
+
delete this.refreshFamily;
|
|
121
|
+
delete this.authAt;
|
|
83
122
|
}
|
|
84
123
|
/**
|
|
85
124
|
* If session is authenticated
|
|
86
125
|
* @returns true if the condition is met
|
|
87
126
|
*/
|
|
88
127
|
isLogged() {
|
|
89
|
-
return this.userId !== undefined;
|
|
128
|
+
return this.userId !== undefined && this.mfa !== "pending";
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* If session is pending MFA verification
|
|
132
|
+
* @returns true if the condition is met
|
|
133
|
+
*/
|
|
134
|
+
isPending() {
|
|
135
|
+
return this.userId !== undefined && this.mfa === "pending";
|
|
90
136
|
}
|
|
91
137
|
/**
|
|
92
138
|
* Session is dirty and requires save
|
|
@@ -115,6 +161,9 @@ let Session = (() => {
|
|
|
115
161
|
};
|
|
116
162
|
return new Proxy(this, proxyHandler);
|
|
117
163
|
}
|
|
164
|
+
constructor() {
|
|
165
|
+
__runInitializers(this, _stateless_extraInitializers);
|
|
166
|
+
}
|
|
118
167
|
};
|
|
119
168
|
})();
|
|
120
169
|
export { Session };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session/session.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAgB/C;;GAEG;IACU,OAAO;;;;;;;iBAAP,OAAO;;;mCACjB,aAAa;qCAiDb,aAAa;YAhDd,uKAAU,OAAO,6BAAP,OAAO,yFAAkB;YAiDnC,6KAAA,SAAS,6BAAT,SAAS,6FAAW;;;QAjDV,OAAO,kDAAY,KAAK,EAAC;QACnC;;WAEG;QACH,IAAI,uDAAS;QACb;;WAEG;QACH,MAAM,CAAU;QAChB;;WAEG;QACH,SAAS,CAAS;QAElB;;WAEG;QACH,KAAK,CAAW;QAEhB;;WAEG;QACH,QAAQ,CAAU;QAElB;;WAEG;QACH,GAAG,CAAY;QAEf;;WAEG;QACH,GAAG,CAAY;QAEf;;WAEG;QACH,aAAa,CAAU;QAEvB;;;WAGG;QACH,MAAM,CAAU;QAEhB;;WAEG;QAEH,SAAS,4DAAW;QAEpB;;;;;WAKG;QACH,KAAK,CAAC,MAAc,EAAE,SAAiB,EAAE,OAAO,GAAiB,EAAE;YACjE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;YACjC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;QACnC,CAAC;QACD;;WAEG;QACH,MAAM;YACJ,OAAO,IAAI,CAAC,MAAM,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC1B,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED;;;WAGG;QACH,QAAQ;YACN,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;QAC7D,CAAC;QAED;;;WAGG;QACH,SAAS;YACP,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC;QAC7D,CAAC;QAED;;;WAGG;QACH,OAAO;YACL,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED;;;WAGG;QACH,QAAQ;YACN,MAAM,YAAY,GAAG;gBACnB,GAAG,EAAE,CAAC,GAAS,EAAE,QAAgB,EAAE,KAAU,EAAE,EAAE;oBAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,GAAG,EAAE,CAAC,GAAS,EAAE,QAAgB,EAAE,EAAE;oBACnC,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACtC,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;oBAChD,CAAC;oBACD,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;aACF,CAAC;YACF,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACvC,CAAC;;;;;;SA3HU,OAAO;AA8HpB;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO;CAK1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.service.d.ts","sourceRoot":"","sources":["../../src/stores/memory.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIpG,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;QACb;;WAEG;QACH,GAAG,CAAC,EAAE,MAAM,CAAC;QACb;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAU3B;CACF;AA0FD,4DAA4D;AAC5D,cAAM,cAAe,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAI9B;CACF;AAED;;;;;GAKG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAChG;;OAEG;IACH,OAAO,EAAE,cAAc,CAAwB;IAC/C;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAC;IAC3B;;OAEG;IACH,kBAAkB,MAAQ;IAC1B;;OAEG;IACH,OAAO,CAAC,GAAG,CAAS;IAEpB;;;;;;;OAOG;IACG,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.service.d.ts","sourceRoot":"","sources":["../../src/stores/memory.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAqC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIpG,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ;;WAEG;QACH,IAAI,EAAE,MAAM,CAAC;QACb;;WAEG;QACH,GAAG,CAAC,EAAE,MAAM,CAAC;QACb;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF;;;;OAIG;IACH,IAAI,CAAC,MAAM,GAAE,GAAQ,GAAG,IAAI,CAU3B;CACF;AA0FD,4DAA4D;AAC5D,cAAM,cAAe,SAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAC9C,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAI9B;CACF;AAED;;;;;GAKG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAChG;;OAEG;IACH,OAAO,EAAE,cAAc,CAAwB;IAC/C;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAC;IAC3B;;OAEG;IACH,kBAAkB,MAAQ;IAC1B;;OAEG;IACH,OAAO,CAAC,GAAG,CAAS;IAEpB;;;;;;;OAOG;IACG,OAAO,kBAqCZ;IAED;;OAEG;IACG,IAAI,kBA8BT;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAe1B;IAED;;OAEG;IACH,cAAc,SAwBb;IAED;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1B;IAED;;;;OAIG;IAEH,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAQ3D;CACF"}
|
|
@@ -331,11 +331,12 @@ let MemoryStore = (() => {
|
|
|
331
331
|
*/
|
|
332
332
|
getRepository(model) {
|
|
333
333
|
// Use our own storage to allow persistence
|
|
334
|
-
const
|
|
335
|
-
const
|
|
334
|
+
const meta = useModelMetadata(model);
|
|
335
|
+
const pks = meta.PrimaryKey;
|
|
336
|
+
const inner = new MemoryRepository(model, pks, meta.PrimaryKeySeparator, this.storage);
|
|
336
337
|
// Wrap in EventRepository so typed CRUD events (Created/Updated/...) fire;
|
|
337
338
|
// consumers reach them via useRepository(model).on(...).
|
|
338
|
-
return new EventRepository(model, pks, inner);
|
|
339
|
+
return new EventRepository(model, pks, inner, meta.PrimaryKeySeparator);
|
|
339
340
|
}
|
|
340
341
|
};
|
|
341
342
|
})();
|