@uptime.app/contracts 3.0.45 → 3.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/acl/acl-utils.d.ts +5 -7
- package/dist/cjs/acl/acl-utils.d.ts.map +1 -1
- package/dist/cjs/acl/acl-utils.js +12 -10
- package/dist/cjs/acl/acl-utils.js.map +1 -1
- package/dist/esm/acl/acl-utils.d.ts +5 -7
- package/dist/esm/acl/acl-utils.d.ts.map +1 -1
- package/dist/esm/acl/acl-utils.js +10 -8
- package/dist/esm/acl/acl-utils.js.map +1 -1
- package/package.json +2 -2
- package/src/acl/acl-utils.test.ts +272 -0
- package/src/acl/acl-utils.ts +15 -11
- package/src/hack-mapping/app-full-hack.test.ts +1 -0
- package/src/hack-mapping/app-restricted-hack.test.ts +1 -0
|
@@ -16,13 +16,11 @@ export interface BuildAclOptions {
|
|
|
16
16
|
}
|
|
17
17
|
export declare function parseAclEntry(entry: string): ParsedAclEntry | null;
|
|
18
18
|
export declare function getAclValuesByNamespace(acl: string[], namespace: string, options?: GetAclValuesOptions): string[];
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*/
|
|
25
|
-
export declare function getCatalogueIdsFromAcl(acl: string[], options?: GetAclValuesOptions): string[];
|
|
19
|
+
export declare function aclFor({ userId, organisationIds, catalogueIds }: {
|
|
20
|
+
userId: string;
|
|
21
|
+
organisationIds: string[];
|
|
22
|
+
catalogueIds: string[];
|
|
23
|
+
}): string[];
|
|
26
24
|
export declare class AclBuilder {
|
|
27
25
|
private included;
|
|
28
26
|
private excluded;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl-utils.d.ts","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgClE;AAED,wBAAgB,uBAAuB,CACnC,GAAG,EAAE,MAAM,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAClC,MAAM,EAAE,CAqBV;AAED
|
|
1
|
+
{"version":3,"file":"acl-utils.d.ts","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgClE;AAED,wBAAgB,uBAAuB,CACnC,GAAG,EAAE,MAAM,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAClC,MAAM,EAAE,CAqBV;AAED,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,YAetI;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,OAAO,GAAE,eAAoB;IAgBzC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAe3B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAO9C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAI/C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM,EAAE;CAMpB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AclBuilder = exports.
|
|
3
|
+
exports.AclBuilder = exports.aclFor = exports.getAclValuesByNamespace = exports.parseAclEntry = void 0;
|
|
4
4
|
function normalizeAclEntry(entry) {
|
|
5
5
|
return entry.trim();
|
|
6
6
|
}
|
|
@@ -54,16 +54,18 @@ function getAclValuesByNamespace(acl, namespace, options = {}) {
|
|
|
54
54
|
return dedupe ? Array.from(new Set(values)) : values;
|
|
55
55
|
}
|
|
56
56
|
exports.getAclValuesByNamespace = getAclValuesByNamespace;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
57
|
+
function aclFor({ userId, organisationIds, catalogueIds }) {
|
|
58
|
+
const builder = new AclBuilder({ includeUser: userId });
|
|
59
|
+
// everyone has access to the uptime catalogue
|
|
60
|
+
builder.allowCatalogue('uptime');
|
|
61
|
+
catalogueIds.forEach(catalogueId => builder.allowCatalogue(catalogueId));
|
|
62
|
+
// each b2b has a catalogue called b2b:<organisationId> so permit access to this
|
|
63
|
+
organisationIds.forEach(organisationId => builder.allowCatalogue(`b2b:${organisationId}`));
|
|
64
|
+
// previously we also had acl of b2b:<organisationId> that is still being used for collections
|
|
65
|
+
organisationIds.forEach(organisationId => builder.allowOrganisation(organisationId));
|
|
66
|
+
return builder.build();
|
|
65
67
|
}
|
|
66
|
-
exports.
|
|
68
|
+
exports.aclFor = aclFor;
|
|
67
69
|
class AclBuilder {
|
|
68
70
|
constructor(options = {}) {
|
|
69
71
|
this.included = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl-utils.js","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":";;;AAoBA,SAAS,iBAAiB,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO;YACH,GAAG;YACH,QAAQ;YACR,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI;SACd,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,GAAG;QACH,QAAQ;QACR,SAAS;QACT,KAAK;KACR,CAAC;AACN,CAAC;AAhCD,sCAgCC;AAED,SAAgB,uBAAuB,CACnC,GAAa,EACb,SAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IAEtC,MAAM,MAAM,GAAG,GAAG;SACb,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,KAAK,EAA2B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC1D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;SAC9C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC,EAAE;QACZ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC1B,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAzBD,0DAyBC;AAED
|
|
1
|
+
{"version":3,"file":"acl-utils.js","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,13 +16,11 @@ export interface BuildAclOptions {
|
|
|
16
16
|
}
|
|
17
17
|
export declare function parseAclEntry(entry: string): ParsedAclEntry | null;
|
|
18
18
|
export declare function getAclValuesByNamespace(acl: string[], namespace: string, options?: GetAclValuesOptions): string[];
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*/
|
|
25
|
-
export declare function getCatalogueIdsFromAcl(acl: string[], options?: GetAclValuesOptions): string[];
|
|
19
|
+
export declare function aclFor({ userId, organisationIds, catalogueIds }: {
|
|
20
|
+
userId: string;
|
|
21
|
+
organisationIds: string[];
|
|
22
|
+
catalogueIds: string[];
|
|
23
|
+
}): string[];
|
|
26
24
|
export declare class AclBuilder {
|
|
27
25
|
private included;
|
|
28
26
|
private excluded;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl-utils.d.ts","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgClE;AAED,wBAAgB,uBAAuB,CACnC,GAAG,EAAE,MAAM,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAClC,MAAM,EAAE,CAqBV;AAED
|
|
1
|
+
{"version":3,"file":"acl-utils.d.ts","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,KAAK,CAAC;AAE3D,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgClE;AAED,wBAAgB,uBAAuB,CACnC,GAAG,EAAE,MAAM,EAAE,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAClC,MAAM,EAAE,CAqBV;AAED,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,YAetI;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAqB;gBAEzB,OAAO,GAAE,eAAoB;IAgBzC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAe3B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKhC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAO9C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAI/C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC,KAAK,IAAI,MAAM,EAAE;CAMpB"}
|
|
@@ -49,14 +49,16 @@ export function getAclValuesByNamespace(acl, namespace, options = {}) {
|
|
|
49
49
|
.map(entry => entry.value);
|
|
50
50
|
return dedupe ? Array.from(new Set(values)) : values;
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
export function aclFor({ userId, organisationIds, catalogueIds }) {
|
|
53
|
+
const builder = new AclBuilder({ includeUser: userId });
|
|
54
|
+
// everyone has access to the uptime catalogue
|
|
55
|
+
builder.allowCatalogue('uptime');
|
|
56
|
+
catalogueIds.forEach(catalogueId => builder.allowCatalogue(catalogueId));
|
|
57
|
+
// each b2b has a catalogue called b2b:<organisationId> so permit access to this
|
|
58
|
+
organisationIds.forEach(organisationId => builder.allowCatalogue(`b2b:${organisationId}`));
|
|
59
|
+
// previously we also had acl of b2b:<organisationId> that is still being used for collections
|
|
60
|
+
organisationIds.forEach(organisationId => builder.allowOrganisation(organisationId));
|
|
61
|
+
return builder.build();
|
|
60
62
|
}
|
|
61
63
|
export class AclBuilder {
|
|
62
64
|
constructor(options = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acl-utils.js","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"AAoBA,SAAS,iBAAiB,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE3C,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO;YACH,GAAG;YACH,QAAQ;YACR,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI;SACd,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,GAAG;QACH,QAAQ;QACR,SAAS;QACT,KAAK;KACR,CAAC;AACN,CAAC;AAED,MAAM,UAAU,uBAAuB,CACnC,GAAa,EACb,SAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IAEtC,MAAM,MAAM,GAAG,GAAG;SACb,GAAG,CAAC,aAAa,CAAC;SAClB,MAAM,CAAC,CAAC,KAAK,EAA2B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC1D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC;SAC9C,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC,EAAE;QACZ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC1B,CAAC,CAAC;SACD,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"acl-utils.js","sourceRoot":"","sources":["../../../src/acl/acl-utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uptime.app/contracts",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.46",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"types": "./dist/esm/index.d.ts",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"typescript": "^5.4.3"
|
|
16
16
|
},
|
|
17
|
-
"gitHead": "
|
|
17
|
+
"gitHead": "3583e6948f32e425cbc0f82d5f13994d22aabe85"
|
|
18
18
|
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { parseAclEntry, getAclValuesByNamespace, aclFor, AclBuilder } from './acl-utils';
|
|
2
|
+
|
|
3
|
+
describe('parseAclEntry', () => {
|
|
4
|
+
|
|
5
|
+
test('returns null for empty string', () => {
|
|
6
|
+
expect(parseAclEntry('')).toBeNull();
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
test('returns null for whitespace-only string', () => {
|
|
10
|
+
expect(parseAclEntry(' ')).toBeNull();
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test('parses a simple namespace-only entry', () => {
|
|
14
|
+
expect(parseAclEntry('public')).toEqual({
|
|
15
|
+
raw: 'public',
|
|
16
|
+
excluded: false,
|
|
17
|
+
namespace: 'public',
|
|
18
|
+
value: null
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test('parses a namespace:value entry', () => {
|
|
23
|
+
expect(parseAclEntry('catalogue:uptime')).toEqual({
|
|
24
|
+
raw: 'catalogue:uptime',
|
|
25
|
+
excluded: false,
|
|
26
|
+
namespace: 'catalogue',
|
|
27
|
+
value: 'uptime'
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('parses an excluded namespace-only entry', () => {
|
|
32
|
+
expect(parseAclEntry('!public')).toEqual({
|
|
33
|
+
raw: '!public',
|
|
34
|
+
excluded: true,
|
|
35
|
+
namespace: 'public',
|
|
36
|
+
value: null
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('parses an excluded namespace:value entry', () => {
|
|
41
|
+
expect(parseAclEntry('!catalogue:uptime')).toEqual({
|
|
42
|
+
raw: '!catalogue:uptime',
|
|
43
|
+
excluded: true,
|
|
44
|
+
namespace: 'catalogue',
|
|
45
|
+
value: 'uptime'
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('trims leading and trailing whitespace', () => {
|
|
50
|
+
expect(parseAclEntry(' catalogue:uptime ')).toEqual({
|
|
51
|
+
raw: 'catalogue:uptime',
|
|
52
|
+
excluded: false,
|
|
53
|
+
namespace: 'catalogue',
|
|
54
|
+
value: 'uptime'
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('returns null when namespace is empty (entry starts with colon)', () => {
|
|
59
|
+
expect(parseAclEntry(':value')).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('preserves colons in value', () => {
|
|
63
|
+
expect(parseAclEntry('catalogue:b2b:org-123')).toEqual({
|
|
64
|
+
raw: 'catalogue:b2b:org-123',
|
|
65
|
+
excluded: false,
|
|
66
|
+
namespace: 'catalogue',
|
|
67
|
+
value: 'b2b:org-123'
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe('getAclValuesByNamespace', () => {
|
|
73
|
+
const acl = [
|
|
74
|
+
'public',
|
|
75
|
+
'catalogue:uptime',
|
|
76
|
+
'catalogue:premium',
|
|
77
|
+
'!catalogue:restricted',
|
|
78
|
+
'b2b:org-1',
|
|
79
|
+
'!b2b:org-2',
|
|
80
|
+
'user:user-123'
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
test('returns included values for a namespace by default', () => {
|
|
84
|
+
expect(getAclValuesByNamespace(acl, 'catalogue')).toEqual(['uptime', 'premium']);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('returns excluded values when mode is "excluded"', () => {
|
|
88
|
+
expect(getAclValuesByNamespace(acl, 'catalogue', { mode: 'excluded' })).toEqual(['restricted']);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('returns all values when mode is "all"', () => {
|
|
92
|
+
expect(getAclValuesByNamespace(acl, 'catalogue', { mode: 'all' })).toEqual(['uptime', 'premium', 'restricted']);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('returns empty array when namespace has no matches', () => {
|
|
96
|
+
expect(getAclValuesByNamespace(acl, 'subject')).toEqual([]);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('deduplicates values by default', () => {
|
|
100
|
+
const aclWithDupes = ['catalogue:uptime', 'catalogue:uptime', 'catalogue:premium'];
|
|
101
|
+
expect(getAclValuesByNamespace(aclWithDupes, 'catalogue')).toEqual(['uptime', 'premium']);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('preserves duplicates when dedupe is false', () => {
|
|
105
|
+
const aclWithDupes = ['catalogue:uptime', 'catalogue:uptime', 'catalogue:premium'];
|
|
106
|
+
expect(getAclValuesByNamespace(aclWithDupes, 'catalogue', { dedupe: false })).toEqual(['uptime', 'uptime', 'premium']);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('excludes namespace-only entries (no value)', () => {
|
|
110
|
+
expect(getAclValuesByNamespace(acl, 'public')).toEqual([]);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('returns empty array for empty acl', () => {
|
|
114
|
+
expect(getAclValuesByNamespace([], 'catalogue')).toEqual([]);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('skips invalid entries', () => {
|
|
118
|
+
const aclWithInvalid = ['', ' ', 'catalogue:uptime'];
|
|
119
|
+
expect(getAclValuesByNamespace(aclWithInvalid, 'catalogue')).toEqual(['uptime']);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('AclBuilder', () => {
|
|
124
|
+
test('includes "public" by default', () => {
|
|
125
|
+
const acl = new AclBuilder().build();
|
|
126
|
+
expect(acl).toContain('public');
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('excludes "public" when includePublic is false', () => {
|
|
130
|
+
const acl = new AclBuilder({ includePublic: false }).build();
|
|
131
|
+
expect(acl).not.toContain('public');
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test('includes user entry when includeUser is specified', () => {
|
|
135
|
+
const acl = new AclBuilder({ includeUser: 'user-123' }).build();
|
|
136
|
+
expect(acl).toContain('user:user-123');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('merges baseAcl entries', () => {
|
|
140
|
+
const acl = new AclBuilder({ baseAcl: ['catalogue:uptime', '!catalogue:restricted'] }).build();
|
|
141
|
+
expect(acl).toContain('catalogue:uptime');
|
|
142
|
+
expect(acl).toContain('!catalogue:restricted');
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe('allow', () => {
|
|
146
|
+
test('adds namespace:value entry', () => {
|
|
147
|
+
const acl = new AclBuilder({ includePublic: false }).allow('catalogue', 'uptime').build();
|
|
148
|
+
expect(acl).toContain('catalogue:uptime');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('adds namespace-only entry when no value provided', () => {
|
|
152
|
+
const acl = new AclBuilder({ includePublic: false }).allow('public').build();
|
|
153
|
+
expect(acl).toContain('public');
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test('removes entry from excluded when allowed', () => {
|
|
157
|
+
const acl = new AclBuilder({ includePublic: false })
|
|
158
|
+
.deny('catalogue', 'uptime')
|
|
159
|
+
.allow('catalogue', 'uptime')
|
|
160
|
+
.build();
|
|
161
|
+
expect(acl).toContain('catalogue:uptime');
|
|
162
|
+
expect(acl).not.toContain('!catalogue:uptime');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('deny', () => {
|
|
167
|
+
test('adds excluded namespace:value entry', () => {
|
|
168
|
+
const acl = new AclBuilder().deny('catalogue', 'restricted').build();
|
|
169
|
+
expect(acl).toContain('!catalogue:restricted');
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('removes entry from included when denied', () => {
|
|
173
|
+
const acl = new AclBuilder({ includePublic: false })
|
|
174
|
+
.allow('catalogue', 'uptime')
|
|
175
|
+
.deny('catalogue', 'uptime')
|
|
176
|
+
.build();
|
|
177
|
+
expect(acl).not.toContain('catalogue:uptime');
|
|
178
|
+
expect(acl).toContain('!catalogue:uptime');
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('allowCatalogue', () => {
|
|
183
|
+
test('adds catalogue:<id> entry', () => {
|
|
184
|
+
const acl = new AclBuilder().allowCatalogue('premium').build();
|
|
185
|
+
expect(acl).toContain('catalogue:premium');
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
describe('denyCatalogue', () => {
|
|
190
|
+
test('adds !catalogue:<id> entry', () => {
|
|
191
|
+
const acl = new AclBuilder().denyCatalogue('restricted').build();
|
|
192
|
+
expect(acl).toContain('!catalogue:restricted');
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe('allowOrganisation', () => {
|
|
197
|
+
test('adds b2b:<id> entry', () => {
|
|
198
|
+
const acl = new AclBuilder().allowOrganisation('org-1').build();
|
|
199
|
+
expect(acl).toContain('b2b:org-1');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe('denySubject', () => {
|
|
204
|
+
test('adds !subject:<value> entry', () => {
|
|
205
|
+
const acl = new AclBuilder().denySubject('some-topic').build();
|
|
206
|
+
expect(acl).toContain('!subject:some-topic');
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
describe('addRaw', () => {
|
|
211
|
+
test('adds an included raw entry', () => {
|
|
212
|
+
const acl = new AclBuilder({ includePublic: false }).addRaw('catalogue:uptime').build();
|
|
213
|
+
expect(acl).toContain('catalogue:uptime');
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
test('adds an excluded raw entry', () => {
|
|
217
|
+
const acl = new AclBuilder({ includePublic: false }).addRaw('!catalogue:restricted').build();
|
|
218
|
+
expect(acl).toContain('!catalogue:restricted');
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('ignores invalid raw entries', () => {
|
|
222
|
+
const acl = new AclBuilder({ includePublic: false }).addRaw('').build();
|
|
223
|
+
expect(acl).toEqual([]);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
describe('addMany', () => {
|
|
228
|
+
test('adds multiple entries at once', () => {
|
|
229
|
+
const acl = new AclBuilder({ includePublic: false })
|
|
230
|
+
.addMany(['catalogue:uptime', 'b2b:org-1', '!catalogue:restricted'])
|
|
231
|
+
.build();
|
|
232
|
+
expect(acl).toContain('catalogue:uptime');
|
|
233
|
+
expect(acl).toContain('b2b:org-1');
|
|
234
|
+
expect(acl).toContain('!catalogue:restricted');
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe('aclFor', () => {
|
|
240
|
+
test('includes user entry', () => {
|
|
241
|
+
const acl = aclFor({ userId: 'user-abc', organisationIds: [], catalogueIds: [] });
|
|
242
|
+
expect(acl).toContain('user:user-abc');
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test('always includes catalogue:uptime', () => {
|
|
246
|
+
const acl = aclFor({ userId: 'user-abc', organisationIds: [], catalogueIds: [] });
|
|
247
|
+
expect(acl).toContain('catalogue:uptime');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test('includes provided catalogue ids', () => {
|
|
251
|
+
const acl = aclFor({ userId: 'user-abc', organisationIds: [], catalogueIds: ['premium', 'free'] });
|
|
252
|
+
expect(acl).toContain('catalogue:premium');
|
|
253
|
+
expect(acl).toContain('catalogue:free');
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test('includes b2b catalogue entry for each organisation', () => {
|
|
257
|
+
const acl = aclFor({ userId: 'user-abc', organisationIds: ['org-1', 'org-2'], catalogueIds: [] });
|
|
258
|
+
expect(acl).toContain('catalogue:b2b:org-1');
|
|
259
|
+
expect(acl).toContain('catalogue:b2b:org-2');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('includes b2b namespace entry for each organisation', () => {
|
|
263
|
+
const acl = aclFor({ userId: 'user-abc', organisationIds: ['org-1', 'org-2'], catalogueIds: [] });
|
|
264
|
+
expect(acl).toContain('b2b:org-1');
|
|
265
|
+
expect(acl).toContain('b2b:org-2');
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test('includes public by default', () => {
|
|
269
|
+
const acl = aclFor({ userId: 'user-abc', organisationIds: [], catalogueIds: [] });
|
|
270
|
+
expect(acl).toContain('public');
|
|
271
|
+
});
|
|
272
|
+
});
|
package/src/acl/acl-utils.ts
CHANGED
|
@@ -83,17 +83,21 @@ export function getAclValuesByNamespace(
|
|
|
83
83
|
return dedupe ? Array.from(new Set(values)) : values;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
86
|
+
export function aclFor({ userId, organisationIds, catalogueIds }: { userId: string; organisationIds: string[]; catalogueIds: string[] }) {
|
|
87
|
+
const builder = new AclBuilder({ includeUser: userId });
|
|
88
|
+
|
|
89
|
+
// everyone has access to the uptime catalogue
|
|
90
|
+
builder.allowCatalogue('uptime');
|
|
91
|
+
|
|
92
|
+
catalogueIds.forEach(catalogueId => builder.allowCatalogue(catalogueId));
|
|
93
|
+
|
|
94
|
+
// each b2b has a catalogue called b2b:<organisationId> so permit access to this
|
|
95
|
+
organisationIds.forEach(organisationId => builder.allowCatalogue(`b2b:${organisationId}`));
|
|
96
|
+
|
|
97
|
+
// previously we also had acl of b2b:<organisationId> that is still being used for collections
|
|
98
|
+
organisationIds.forEach(organisationId => builder.allowOrganisation(organisationId));
|
|
99
|
+
|
|
100
|
+
return builder.build();
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
export class AclBuilder {
|
|
@@ -4,6 +4,7 @@ import EXPECTED_APP_FULL_HACK from './test-data/expected-app-full-hack.json';
|
|
|
4
4
|
import { mapToAppFullHack } from './app-full-hack';
|
|
5
5
|
|
|
6
6
|
describe('converting an EnrichedHack to an AppFullHack', () => {
|
|
7
|
+
|
|
7
8
|
test('it returns the expected fields', () => {
|
|
8
9
|
const fullHackData = ENRICHED_HACK as any as EnrichedHack;
|
|
9
10
|
const fullHack = mapToAppFullHack(fullHackData);
|
|
@@ -3,6 +3,7 @@ import ENRICHED_HACK from './test-data/enriched-hack.json';
|
|
|
3
3
|
import EXPECTED_APP_RESTRICTED_HACK from './test-data/expected-app-restricted-hack.json';
|
|
4
4
|
import { mapToAppRestrictedHack } from './app-restricted-hack';
|
|
5
5
|
describe('converting an EnrichedHack to an AppRestrictedHack', () => {
|
|
6
|
+
|
|
6
7
|
test('it returns the expected fields', () => {
|
|
7
8
|
const enrichedHackData = ENRICHED_HACK as any as EnrichedHack;
|
|
8
9
|
const restrictedHack = mapToAppRestrictedHack(enrichedHackData);
|