@varius.io/framework 13.15.4 → 13.16.0
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/build/services/auth.d.ts.map +1 -1
- package/build/services/auth.js +13 -4
- package/build/services/auth.js.map +1 -1
- package/build/services/resources.d.ts +1 -0
- package/build/services/resources.d.ts.map +1 -1
- package/build/services/resources.js +18 -0
- package/build/services/resources.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAyD7B,qBAAa,SAAU,SAAQ,KAAK;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;gBAEP,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAQlE,MAAM;;;;CAGN;AAID,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,kDA+B9C;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,iBAoD3E;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,oBAW3E"}
|
package/build/services/auth.js
CHANGED
|
@@ -9,9 +9,16 @@ const assert = require("node:assert");
|
|
|
9
9
|
const axios_1 = require("axios");
|
|
10
10
|
const jose = require("jose");
|
|
11
11
|
const cache_1 = require("../utils/cache");
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
assert(
|
|
12
|
+
function getIssuer() {
|
|
13
|
+
const { ISS } = process.env;
|
|
14
|
+
assert(ISS, "missing ISS env var");
|
|
15
|
+
return ISS;
|
|
16
|
+
}
|
|
17
|
+
function getOidcApiBase() {
|
|
18
|
+
const { OIDC_API_BASE } = process.env;
|
|
19
|
+
assert(OIDC_API_BASE, "missing OIDC_API_BASE env var");
|
|
20
|
+
return OIDC_API_BASE;
|
|
21
|
+
}
|
|
15
22
|
const userPermsCache = new cache_1.MemoryCache(5 * 60 /* 5 mins */);
|
|
16
23
|
function scopeToPermission(scope) {
|
|
17
24
|
const m = scope.match(/^http:(read|\*):(.+)$/);
|
|
@@ -36,8 +43,9 @@ function checkPermission(method, path, perm) {
|
|
|
36
43
|
}
|
|
37
44
|
;
|
|
38
45
|
async function getPermissionsForUser(userId, tok) {
|
|
46
|
+
const oidcApiBase = getOidcApiBase();
|
|
39
47
|
return userPermsCache.memo(userId, async () => {
|
|
40
|
-
const permsRes = await axios_1.default.get(`${
|
|
48
|
+
const permsRes = await axios_1.default.get(`${oidcApiBase}/api/me/permissions`, {
|
|
41
49
|
headers: { authorization: `Bearer ${tok}` },
|
|
42
50
|
});
|
|
43
51
|
return permsRes.data;
|
|
@@ -58,6 +66,7 @@ class AuthError extends Error {
|
|
|
58
66
|
exports.AuthError = AuthError;
|
|
59
67
|
const jwksFetchers = new Map();
|
|
60
68
|
async function validateToken(tok) {
|
|
69
|
+
const ISS = getIssuer();
|
|
61
70
|
const dec = jose.decodeJwt(tok);
|
|
62
71
|
if (!dec)
|
|
63
72
|
return [401, "invalid_token", "The access token could not be decoded"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":";AAAA,2EAA2E;;;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/services/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export declare function copy(sourceBusinessId: string, sourceFileName: string, targetBusinessId: string, targetFileName: string): Promise<any>;
|
|
2
|
+
export declare function invalidateCache(accessToken: string, businessId: string, path: string, host?: string): Promise<any>;
|
|
2
3
|
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/services/resources.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/services/resources.ts"],"names":[],"mappings":"AAiBA,wBAAsB,IAAI,CACzB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,gBA4BtB;AAED,wBAAsB,eAAe,CACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,gBAuBb"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.copy = copy;
|
|
4
|
+
exports.invalidateCache = invalidateCache;
|
|
5
|
+
const axios_1 = require("axios");
|
|
4
6
|
const api_1 = require("./api");
|
|
5
7
|
const apiBase = process.env.RESOURCES_API_BASE;
|
|
6
8
|
const apiKey = process.env.RESOURCES_API_KEY;
|
|
9
|
+
const resAx = axios_1.default.create({ baseURL: apiBase });
|
|
7
10
|
function validate() {
|
|
8
11
|
if (!apiBase) {
|
|
9
12
|
throw Error("Environment variable 'RESOURCES_API_BASE' not defined");
|
|
@@ -34,4 +37,19 @@ async function copy(sourceBusinessId, sourceFileName, targetBusinessId, targetFi
|
|
|
34
37
|
}
|
|
35
38
|
return res.body;
|
|
36
39
|
}
|
|
40
|
+
async function invalidateCache(accessToken, businessId, path, host) {
|
|
41
|
+
validate();
|
|
42
|
+
const res = await resAx.post(`/b/${businessId}/invalidate-cache`, {
|
|
43
|
+
path,
|
|
44
|
+
host,
|
|
45
|
+
}, {
|
|
46
|
+
headers: {
|
|
47
|
+
Authorization: `Bearer ${accessToken}`,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
if (res.status !== 200) {
|
|
51
|
+
throw new Error(`Error in invalidating cache for business ${businessId} and path ${path}, res: ${JSON.stringify(res.data)}`);
|
|
52
|
+
}
|
|
53
|
+
return res.data;
|
|
54
|
+
}
|
|
37
55
|
//# sourceMappingURL=resources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/services/resources.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/services/resources.ts"],"names":[],"mappings":";;AAiBA,oBAgCC;AAED,0CA2BC;AA9ED,iCAA0B;AAC1B,+BAAiC;AAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAmB,CAAC;AAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAkB,CAAC;AAE9C,MAAM,KAAK,GAAG,eAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjD,SAAS,QAAQ;IAChB,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACrE,CAAC;AACF,CAAC;AAEM,KAAK,UAAU,IAAI,CACzB,gBAAwB,EACxB,cAAsB,EACtB,gBAAwB,EACxB,cAAsB;IAEtB,QAAQ,EAAE,CAAC;IACX,MAAM,OAAO,GAAG;QACf,gBAAgB;QAChB,cAAc;KACd,CAAC;IAEF,MAAM,OAAO,GAAG;QACf,OAAO;QACP,MAAM;QACN,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACR,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,MAAM;SACd;QACD,IAAI,EAAE,OAAO;KACb,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,IAAA,cAAQ,EAAC,MAAM,gBAAgB,cAAc,cAAc,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/F,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACd,yCAAyC,gBAAgB,iBAAiB,cAAc,UAAU,IAAI,CAAC,SAAS,CAC/G,OAAO,CACP,UAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACrC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC;AACjB,CAAC;AAEM,KAAK,UAAU,eAAe,CACpC,WAAmB,EACnB,UAAkB,EAClB,IAAY,EACZ,IAAa;IAEb,QAAQ,EAAE,CAAC;IACX,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAC3B,MAAM,UAAU,mBAAmB,EACnC;QACC,IAAI;QACJ,IAAI;KACJ,EACD;QACC,OAAO,EAAE;YACR,aAAa,EAAE,UAAU,WAAW,EAAE;SACtC;KACD,CACD,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACd,4CAA4C,UAAU,aAAa,IAAI,UAAU,IAAI,CAAC,SAAS,CAC9F,GAAG,CAAC,IAAI,CACR,EAAE,CACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC;AACjB,CAAC"}
|