@webda/core 4.0.0-beta.3 → 4.0.0-beta.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/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/core/operations.d.ts.map +1 -1
- package/lib/core/operations.js +13 -11
- package/lib/core/operations.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 +10 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +10 -4
- package/lib/index.js.map +1 -1
- package/lib/models/aclmodel.d.ts +32 -5
- package/lib/models/aclmodel.d.ts.map +1 -1
- package/lib/models/aclmodel.js +34 -9
- package/lib/models/aclmodel.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 +25 -3
- package/lib/models/ownermodel.model.d.ts.map +1 -1
- package/lib/models/ownermodel.model.js +46 -10
- 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/permissions.d.ts +236 -0
- package/lib/models/permissions.d.ts.map +1 -0
- package/lib/models/permissions.js +495 -0
- package/lib/models/permissions.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/rolemodel.model.d.ts.map +1 -1
- package/lib/models/rolemodel.model.js +1 -2
- package/lib/models/rolemodel.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 +33 -21
- package/lib/models/user.model.d.ts.map +1 -1
- package/lib/models/user.model.js +81 -26
- package/lib/models/user.model.js.map +1 -1
- package/lib/rest/restoperationstransport.service.d.ts.map +1 -1
- package/lib/rest/restoperationstransport.service.js +7 -5
- package/lib/rest/restoperationstransport.service.js.map +1 -1
- package/lib/services/audit.model.d.ts +2 -2
- package/lib/services/audit.model.d.ts.map +1 -1
- package/lib/services/audit.model.js +16 -6
- package/lib/services/audit.model.js.map +1 -1
- package/lib/services/binary.service.d.ts +42 -4
- package/lib/services/binary.service.d.ts.map +1 -1
- package/lib/services/binary.service.js +33 -13
- package/lib/services/binary.service.js.map +1 -1
- package/lib/services/domainservice.service.d.ts +111 -1
- package/lib/services/domainservice.service.d.ts.map +1 -1
- package/lib/services/domainservice.service.js +303 -50
- 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 +32 -11
- package/test/config-cached.json +2 -1
- package/test/config.json +3 -1
- package/test/my-cnf.json +1 -1
- package/webda.module.json +656 -390
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ident.model.js","sourceRoot":"","sources":["../../src/models/ident.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ident.model.js","sourceRoot":"","sources":["../../src/models/ident.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,8 @@ import { IOperationContext } from "../contexts/icontext.js";
|
|
|
4
4
|
/**
|
|
5
5
|
* Abstract class to define an object with an owner
|
|
6
6
|
*
|
|
7
|
-
* The owner is the user that created the object
|
|
8
|
-
* The owner
|
|
7
|
+
* The owner is the user that created the object, set from the caller on create.
|
|
8
|
+
* The owner is never taken from client input.
|
|
9
9
|
*/
|
|
10
10
|
export declare abstract class AbstractOwnerModel<T extends User> extends UuidModel {
|
|
11
11
|
/**
|
|
@@ -23,6 +23,17 @@ export declare abstract class AbstractOwnerModel<T extends User> extends UuidMod
|
|
|
23
23
|
* @returns
|
|
24
24
|
*/
|
|
25
25
|
abstract getOwnerModel(): ModelClass<T>;
|
|
26
|
+
/**
|
|
27
|
+
* Attributes never taken from client input by the DomainService (REST, gRPC, MCP) or GraphQL
|
|
28
|
+
* @returns the attribute names
|
|
29
|
+
*/
|
|
30
|
+
static getProtectedAttributes(): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Called by the DomainService (and GraphQL) on a new object built from client input, before the
|
|
33
|
+
* `canAct(context, "create")` check and the save: the caller becomes the owner
|
|
34
|
+
* @param context - the caller context
|
|
35
|
+
*/
|
|
36
|
+
prepareCreate(context: IOperationContext): void;
|
|
26
37
|
/**
|
|
27
38
|
* Set object owner
|
|
28
39
|
* @param uuid - the unique identifier
|
|
@@ -43,7 +54,18 @@ export declare abstract class AbstractOwnerModel<T extends User> extends UuidMod
|
|
|
43
54
|
*/
|
|
44
55
|
canAct(context: IOperationContext, action: string): Promise<string | boolean>;
|
|
45
56
|
/**
|
|
46
|
-
*
|
|
57
|
+
* Whether an action is a binary read (a behavior action of Binary/Binaries): `avatar.download`, `photos.get`...
|
|
58
|
+
* @param action - the action name
|
|
59
|
+
* @returns true for the read actions of binary attributes
|
|
60
|
+
*/
|
|
61
|
+
static isBinaryRead(action: string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Return a query to filter OwnerModel: the objects of the caller and the public ones
|
|
64
|
+
*
|
|
65
|
+
* The user id is bound as an escaped WebdaQL value, it can never change the query structure.
|
|
66
|
+
*
|
|
67
|
+
* Subclasses inherit this filter even when they override `canAct` (it fails closed: it can only hide rows). A
|
|
68
|
+
* subclass whose `canAct` is more permissive overrides this method (returning `null` disables the store filter).
|
|
47
69
|
*
|
|
48
70
|
* @param context - the execution context
|
|
49
71
|
* @returns the result
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ownermodel.model.d.ts","sourceRoot":"","sources":["../../src/models/ownermodel.model.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"ownermodel.model.d.ts","sourceRoot":"","sources":["../../src/models/ownermodel.model.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D;;;;;GAKG;AACH,8BAAsB,kBAAkB,CAAC,CAAC,SAAS,IAAI,CAAE,SAAQ,SAAS;IACxE;;OAEG;IACH,IAAI,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAExB;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAU7D;IACD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,aAAa,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAExC;;;OAGG;IACH,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE,CAExC;IAED;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAQ9C;IAED;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAGtC;IAED;;;;;OAKG;IACH,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,CAEvB;IAED;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAWlF;IAED;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3C;IAED;;;;;;;;;;OAUG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CASjG;IAED,gFAAgF;IAChF,MAAM,IAAI,GAAG,CAQZ;CACF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,kBAAkB,CAAC,IAAI,CAAC;IACtD;;;OAGG;IACH,aAAa,IAAI,UAAU,CAAC,IAAI,CAAC,CAEhC;CACF"}
|
|
@@ -2,11 +2,12 @@ import { WEBDA_STORAGE } from "@webda/models";
|
|
|
2
2
|
//import { UuidModel } from "./uuid.js";
|
|
3
3
|
import { ModelLink, UuidModel } from "@webda/models";
|
|
4
4
|
import { User } from "./user.model.js";
|
|
5
|
+
import { bind } from "@webda/ql";
|
|
5
6
|
/**
|
|
6
7
|
* Abstract class to define an object with an owner
|
|
7
8
|
*
|
|
8
|
-
* The owner is the user that created the object
|
|
9
|
-
* The owner
|
|
9
|
+
* The owner is the user that created the object, set from the caller on create.
|
|
10
|
+
* The owner is never taken from client input.
|
|
10
11
|
*/
|
|
11
12
|
export class AbstractOwnerModel extends UuidModel {
|
|
12
13
|
/**
|
|
@@ -33,6 +34,28 @@ export class AbstractOwnerModel extends UuidModel {
|
|
|
33
34
|
* @default false
|
|
34
35
|
*/
|
|
35
36
|
public;
|
|
37
|
+
/**
|
|
38
|
+
* Attributes never taken from client input by the DomainService (REST, gRPC, MCP) or GraphQL
|
|
39
|
+
* @returns the attribute names
|
|
40
|
+
*/
|
|
41
|
+
static getProtectedAttributes() {
|
|
42
|
+
return ["_user"];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Called by the DomainService (and GraphQL) on a new object built from client input, before the
|
|
46
|
+
* `canAct(context, "create")` check and the save: the caller becomes the owner
|
|
47
|
+
* @param context - the caller context
|
|
48
|
+
*/
|
|
49
|
+
prepareCreate(context) {
|
|
50
|
+
const userId = context?.getCurrentUserId();
|
|
51
|
+
if (userId) {
|
|
52
|
+
this.setOwner(userId);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Never keep an owner the caller did not prove
|
|
56
|
+
this._user = undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
36
59
|
/**
|
|
37
60
|
* Set object owner
|
|
38
61
|
* @param uuid - the unique identifier
|
|
@@ -57,8 +80,8 @@ export class AbstractOwnerModel extends UuidModel {
|
|
|
57
80
|
* @returns the result
|
|
58
81
|
*/
|
|
59
82
|
async canAct(context, action) {
|
|
60
|
-
// Object is public
|
|
61
|
-
if (this.public && (action === "get" || action
|
|
83
|
+
// Object is public: readable, binaries included (`<attribute>.download`, `.downloadUrl`, `.get`, `.getUrl`)
|
|
84
|
+
if (this.public && (action === "get" || AbstractOwnerModel.isBinaryRead(action))) {
|
|
62
85
|
return true;
|
|
63
86
|
}
|
|
64
87
|
else if (!context.getCurrentUserId()) {
|
|
@@ -67,13 +90,24 @@ export class AbstractOwnerModel extends UuidModel {
|
|
|
67
90
|
else if (!this.getOwner() && action !== "create") {
|
|
68
91
|
return "Object does not have an owner";
|
|
69
92
|
}
|
|
70
|
-
|
|
71
|
-
//this.setOwner(Uuid.parse(ctx.getCurrentUserId(), this.getOwnerModel()));
|
|
72
|
-
}
|
|
93
|
+
// On create, the owner was set from the caller by prepareCreate: only the owner may create its objects
|
|
73
94
|
return context.getCurrentUserId() === this.getOwner()?.toString();
|
|
74
95
|
}
|
|
75
96
|
/**
|
|
76
|
-
*
|
|
97
|
+
* Whether an action is a binary read (a behavior action of Binary/Binaries): `avatar.download`, `photos.get`...
|
|
98
|
+
* @param action - the action name
|
|
99
|
+
* @returns true for the read actions of binary attributes
|
|
100
|
+
*/
|
|
101
|
+
static isBinaryRead(action) {
|
|
102
|
+
return /^[^.]+\.(download|downloadUrl|get|getUrl)$/.test(action);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Return a query to filter OwnerModel: the objects of the caller and the public ones
|
|
106
|
+
*
|
|
107
|
+
* The user id is bound as an escaped WebdaQL value, it can never change the query structure.
|
|
108
|
+
*
|
|
109
|
+
* Subclasses inherit this filter even when they override `canAct` (it fails closed: it can only hide rows). A
|
|
110
|
+
* subclass whose `canAct` is more permissive overrides this method (returning `null` disables the store filter).
|
|
77
111
|
*
|
|
78
112
|
* @param context - the execution context
|
|
79
113
|
* @returns the result
|
|
@@ -82,14 +116,16 @@ export class AbstractOwnerModel extends UuidModel {
|
|
|
82
116
|
if (!context) {
|
|
83
117
|
return null;
|
|
84
118
|
}
|
|
119
|
+
const userId = context.getCurrentUserId();
|
|
85
120
|
return {
|
|
86
|
-
query:
|
|
121
|
+
query: userId ? bind("_user = ? OR public = TRUE", [userId]) : "public = TRUE",
|
|
87
122
|
partial: false
|
|
88
123
|
};
|
|
89
124
|
}
|
|
90
125
|
/** Generated by @webda/content-mapper: include values held in WEBDA_STORAGE. */
|
|
91
126
|
toJSON() {
|
|
92
|
-
const
|
|
127
|
+
const parent = super.toJSON ? super.toJSON() : {};
|
|
128
|
+
const result = parent === this ? {} : parent;
|
|
93
129
|
for (const key of Object.keys(this)) {
|
|
94
130
|
result[key] = this[key];
|
|
95
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ownermodel.model.js","sourceRoot":"","sources":["../../src/models/ownermodel.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,wCAAwC;AACxC,OAAO,EAAmB,SAAS,EAAuB,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ownermodel.model.js","sourceRoot":"","sources":["../../src/models/ownermodel.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { WEBDA_STORAGE } from "@webda/models";
|
|
2
|
+
import * as WebdaError from "../errors/errors.js";
|
|
3
|
+
import type { User } from "./user.model.js";
|
|
4
|
+
/** Rule a candidate password must satisfy */
|
|
5
|
+
export interface PasswordPolicy {
|
|
6
|
+
/**
|
|
7
|
+
* @param password - candidate password
|
|
8
|
+
* @param user - user setting it, when known
|
|
9
|
+
* @returns true when acceptable
|
|
10
|
+
*/
|
|
11
|
+
validate(password: string, user?: User): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Replace the active password policy (undefined restores the default `.{8,}`)
|
|
15
|
+
* @param policy - the policy
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerPasswordPolicy(policy: PasswordPolicy | undefined): void;
|
|
18
|
+
/**
|
|
19
|
+
* Get the active password policy
|
|
20
|
+
* @returns the policy
|
|
21
|
+
*/
|
|
22
|
+
export declare function usePasswordPolicy(): PasswordPolicy;
|
|
23
|
+
/** Raised when a password does not satisfy the active policy (400 PASSWORD_POLICY) */
|
|
24
|
+
export declare class PasswordPolicyError extends WebdaError.HttpError {
|
|
25
|
+
/** @param message - error message */
|
|
26
|
+
constructor(message?: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Non-enumerable flag set on a User whose data carried a v3 top-level `__password` mapped onto `password` at
|
|
30
|
+
* hydration: its stored record still has the v3 layout until it is saved again (`webda auth migrate`)
|
|
31
|
+
*/
|
|
32
|
+
export declare const V3_PASSWORD_MAPPED: unique symbol;
|
|
33
|
+
/**
|
|
34
|
+
* Password credential of a user: bcrypt hash and change timestamp
|
|
35
|
+
* @WebdaBehavior Webda/Password
|
|
36
|
+
*/
|
|
37
|
+
export declare class Password {
|
|
38
|
+
[WEBDA_STORAGE]: Record<string, any>;
|
|
39
|
+
/** bcrypt hash, never output */
|
|
40
|
+
__hash?: string;
|
|
41
|
+
/** Last change, ms since epoch */
|
|
42
|
+
changedAt?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Owning user (set by behavior hydration)
|
|
45
|
+
* @returns the user or undefined when detached
|
|
46
|
+
*/
|
|
47
|
+
protected getUser(): User | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* @returns true when a password is set
|
|
50
|
+
*/
|
|
51
|
+
hasPassword(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Compare a candidate with the stored hash
|
|
54
|
+
* @param plain - candidate password
|
|
55
|
+
* @returns true when it matches
|
|
56
|
+
*/
|
|
57
|
+
verify(plain: string): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* Validate against the policy and store a new hash (does not save the user)
|
|
60
|
+
* @param plain - new password
|
|
61
|
+
*/
|
|
62
|
+
set(plain: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Store an existing hash (migration)
|
|
65
|
+
* @param hash - bcrypt hash
|
|
66
|
+
* @param changedAt - change timestamp
|
|
67
|
+
*/
|
|
68
|
+
setHash(hash: string, changedAt?: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* Change the password of the owning user
|
|
71
|
+
* @param current - current password
|
|
72
|
+
* @param next - new password
|
|
73
|
+
*/
|
|
74
|
+
change(current: string, next: string): Promise<void>;
|
|
75
|
+
get parent(): any;
|
|
76
|
+
toJSON(): Record<string, any>;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=password.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.model.d.ts","sourceRoot":"","sources":["../../src/models/password.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAKD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAE/E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED,sFAAsF;AACtF,qBAAa,mBAAoB,SAAQ,UAAU,CAAC,SAAS;IAC3D,qCAAqC;IACrC,YAAY,OAAO,GAAE,MAA6C,EAGjE;CACF;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,eAA6B,CAAC;AAE7D;;;GAGG;AACH,qBAAa,QAAQ;IACnB,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IAC1C,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,OAAO,IAAI,IAAI,GAAG,SAAS,CAEpC;IAED;;OAEG;IACH,WAAW,IAAI,OAAO,CAErB;IAED;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU5C;IAED;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtC;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAmB,GAAG,IAAI,CAG1D;IAED;;;;OAIG;IAEG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzD;IACD,IAAI,MAAM,QAAgD;IAC1D,MAAM,wBAcL;CACF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
2
|
+
var useValue = arguments.length > 2;
|
|
3
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
4
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
5
|
+
}
|
|
6
|
+
return useValue ? value : void 0;
|
|
7
|
+
};
|
|
8
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
9
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
10
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
11
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
12
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
13
|
+
var _, done = false;
|
|
14
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
15
|
+
var context = {};
|
|
16
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
17
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
18
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
19
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
20
|
+
if (kind === "accessor") {
|
|
21
|
+
if (result === void 0) continue;
|
|
22
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
23
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
24
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
25
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
26
|
+
}
|
|
27
|
+
else if (_ = accept(result)) {
|
|
28
|
+
if (kind === "field") initializers.unshift(_);
|
|
29
|
+
else descriptor[key] = _;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
33
|
+
done = true;
|
|
34
|
+
};
|
|
35
|
+
import { WEBDA_STORAGE } from "@webda/models";
|
|
36
|
+
import bcrypt from "bcryptjs";
|
|
37
|
+
import * as WebdaError from "../errors/errors.js";
|
|
38
|
+
import { Action } from "./decorator.js";
|
|
39
|
+
import { useDynamicService } from "../core/hooks.js";
|
|
40
|
+
const DEFAULT_POLICY = { validate: async (p) => /.{8,}/.test(p) };
|
|
41
|
+
let currentPolicy = DEFAULT_POLICY;
|
|
42
|
+
/**
|
|
43
|
+
* Replace the active password policy (undefined restores the default `.{8,}`)
|
|
44
|
+
* @param policy - the policy
|
|
45
|
+
*/
|
|
46
|
+
export function registerPasswordPolicy(policy) {
|
|
47
|
+
currentPolicy = policy ?? DEFAULT_POLICY;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the active password policy
|
|
51
|
+
* @returns the policy
|
|
52
|
+
*/
|
|
53
|
+
export function usePasswordPolicy() {
|
|
54
|
+
return currentPolicy;
|
|
55
|
+
}
|
|
56
|
+
/** Raised when a password does not satisfy the active policy (400 PASSWORD_POLICY) */
|
|
57
|
+
export class PasswordPolicyError extends WebdaError.HttpError {
|
|
58
|
+
/** @param message - error message */
|
|
59
|
+
constructor(message = "Password does not match the policy") {
|
|
60
|
+
super(message, 400);
|
|
61
|
+
this.code = "PASSWORD_POLICY";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Non-enumerable flag set on a User whose data carried a v3 top-level `__password` mapped onto `password` at
|
|
66
|
+
* hydration: its stored record still has the v3 layout until it is saved again (`webda auth migrate`)
|
|
67
|
+
*/
|
|
68
|
+
export const V3_PASSWORD_MAPPED = Symbol("v3PasswordMapped");
|
|
69
|
+
/**
|
|
70
|
+
* Password credential of a user: bcrypt hash and change timestamp
|
|
71
|
+
* @WebdaBehavior Webda/Password
|
|
72
|
+
*/
|
|
73
|
+
let Password = (() => {
|
|
74
|
+
let _instanceExtraInitializers = [];
|
|
75
|
+
let _change_decorators;
|
|
76
|
+
return class Password {
|
|
77
|
+
static {
|
|
78
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
79
|
+
_change_decorators = [Action({ rest: { method: "PUT" } })];
|
|
80
|
+
__esDecorate(this, null, _change_decorators, { kind: "method", name: "change", static: false, private: false, access: { has: obj => "change" in obj, get: obj => obj.change }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
81
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
82
|
+
}
|
|
83
|
+
[WEBDA_STORAGE] = (__runInitializers(this, _instanceExtraInitializers), {});
|
|
84
|
+
/** bcrypt hash, never output */
|
|
85
|
+
__hash;
|
|
86
|
+
/** Last change, ms since epoch */
|
|
87
|
+
changedAt;
|
|
88
|
+
/**
|
|
89
|
+
* Owning user (set by behavior hydration)
|
|
90
|
+
* @returns the user or undefined when detached
|
|
91
|
+
*/
|
|
92
|
+
getUser() {
|
|
93
|
+
return this.parent?.instance;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* @returns true when a password is set
|
|
97
|
+
*/
|
|
98
|
+
hasPassword() {
|
|
99
|
+
return typeof this.__hash === "string" && this.__hash.length > 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Compare a candidate with the stored hash
|
|
103
|
+
* @param plain - candidate password
|
|
104
|
+
* @returns true when it matches
|
|
105
|
+
*/
|
|
106
|
+
async verify(plain) {
|
|
107
|
+
if (!this.hasPassword() || typeof plain !== "string") {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
return await bcrypt.compare(plain, this.__hash);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Malformed stored hash
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validate against the policy and store a new hash (does not save the user)
|
|
120
|
+
* @param plain - new password
|
|
121
|
+
*/
|
|
122
|
+
async set(plain) {
|
|
123
|
+
if (typeof plain !== "string" || !(await usePasswordPolicy().validate(plain, this.getUser()))) {
|
|
124
|
+
throw new PasswordPolicyError();
|
|
125
|
+
}
|
|
126
|
+
this.__hash = await bcrypt.hash(plain, 10);
|
|
127
|
+
this.changedAt = Date.now();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Store an existing hash (migration)
|
|
131
|
+
* @param hash - bcrypt hash
|
|
132
|
+
* @param changedAt - change timestamp
|
|
133
|
+
*/
|
|
134
|
+
setHash(hash, changedAt = Date.now()) {
|
|
135
|
+
this.__hash = hash;
|
|
136
|
+
this.changedAt = changedAt;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Change the password of the owning user
|
|
140
|
+
* @param current - current password
|
|
141
|
+
* @param next - new password
|
|
142
|
+
*/
|
|
143
|
+
async change(current, next) {
|
|
144
|
+
if (!(await this.verify(current))) {
|
|
145
|
+
throw new WebdaError.Forbidden("Invalid password");
|
|
146
|
+
}
|
|
147
|
+
await this.set(next);
|
|
148
|
+
const user = this.getUser();
|
|
149
|
+
await user?.save();
|
|
150
|
+
await useDynamicService("TokenService")?.revokeUser?.(user?.getUUID());
|
|
151
|
+
}
|
|
152
|
+
get parent() { return this[WEBDA_STORAGE]["__parent__"]; }
|
|
153
|
+
toJSON() {
|
|
154
|
+
const result = {};
|
|
155
|
+
for (const key of Object.keys(this)) {
|
|
156
|
+
result[key] = this[key];
|
|
157
|
+
}
|
|
158
|
+
const storage = this[WEBDA_STORAGE];
|
|
159
|
+
if (storage) {
|
|
160
|
+
for (const key of Object.keys(storage)) {
|
|
161
|
+
if (key !== "__parent__") {
|
|
162
|
+
result[key] = storage[key];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
})();
|
|
170
|
+
export { Password };
|
|
171
|
+
//# sourceMappingURL=password.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.model.js","sourceRoot":"","sources":["../../src/models/password.model.ts"],"names":[],"mappings":"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"}
|