@forge/egress 2.1.1 → 2.2.0-next.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/CHANGELOG.md +6 -0
- package/out/egress/egress-filtering-service.d.ts +2 -1
- package/out/egress/egress-filtering-service.d.ts.map +1 -1
- package/out/egress/egress-filtering-service.js +14 -5
- package/out/egress/utils.d.ts +1 -0
- package/out/egress/utils.d.ts.map +1 -1
- package/out/egress/utils.js +9 -4
- package/package.json +1 -4
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,7 @@ export declare class EgressFilteringService {
|
|
|
6
6
|
private parseUrl;
|
|
7
7
|
containsWildCardEgress(): boolean;
|
|
8
8
|
isValidUrl(url: string): boolean;
|
|
9
|
-
private
|
|
9
|
+
private allowedDomainExact;
|
|
10
|
+
private allowedDomainPattern;
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=egress-filtering-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"egress-filtering-service.d.ts","sourceRoot":"","sources":["../../src/egress/egress-filtering-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"egress-filtering-service.d.ts","sourceRoot":"","sources":["../../src/egress/egress-filtering-service.ts"],"names":[],"mappings":"AAOA,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAE/B,SAAS,EAAE,MAAM,EAAE;IAc/B,OAAO,CAAC,QAAQ;IAIT,sBAAsB,IAAI,OAAO;IAKjC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,oBAAoB;CAK7B"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EgressFilteringService = void 0;
|
|
4
|
-
const minimatch_1 = require("minimatch");
|
|
5
4
|
const url_parser_1 = require("./url-parser");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
6
|
class EgressFilteringService {
|
|
7
7
|
constructor(allowList) {
|
|
8
8
|
this.URLs = allowList.filter((domainOrURL) => !domainOrURL.startsWith('*')).map((url) => this.parseUrl(url));
|
|
9
9
|
this.wildcardDomains = allowList
|
|
10
10
|
.filter((domainOrURL) => domainOrURL !== '*')
|
|
11
11
|
.map((url) => this.parseUrl(url))
|
|
12
|
-
.filter((url) => decodeURIComponent(url.hostname).startsWith('*'))
|
|
12
|
+
.filter((url) => decodeURIComponent(url.hostname).startsWith('*'))
|
|
13
|
+
.map((url) => ({
|
|
14
|
+
...url,
|
|
15
|
+
regex: (0, utils_1.globToRegex)(decodeURIComponent(url.hostname))
|
|
16
|
+
}));
|
|
13
17
|
this.allowsEverything = allowList.includes('*');
|
|
14
18
|
}
|
|
15
19
|
parseUrl(url) {
|
|
@@ -23,12 +27,17 @@ class EgressFilteringService {
|
|
|
23
27
|
return true;
|
|
24
28
|
}
|
|
25
29
|
const parsedUrl = this.parseUrl(url);
|
|
26
|
-
return this.
|
|
30
|
+
return this.allowedDomainExact(parsedUrl, this.URLs) || this.allowedDomainPattern(parsedUrl, this.wildcardDomains);
|
|
27
31
|
}
|
|
28
|
-
|
|
32
|
+
allowedDomainExact(domain, allowList) {
|
|
29
33
|
return allowList
|
|
30
34
|
.filter((allowed) => allowed.protocol === domain.protocol)
|
|
31
|
-
.some((url) =>
|
|
35
|
+
.some((url) => url.hostname === domain.hostname);
|
|
36
|
+
}
|
|
37
|
+
allowedDomainPattern(domain, allowList) {
|
|
38
|
+
return allowList
|
|
39
|
+
.filter((allowed) => allowed.protocol === domain.protocol)
|
|
40
|
+
.some((pattern) => pattern.regex.test(domain.hostname));
|
|
32
41
|
}
|
|
33
42
|
}
|
|
34
43
|
exports.EgressFilteringService = EgressFilteringService;
|
package/out/egress/utils.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/egress/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/egress/utils.ts"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED,QAAA,MAAM,qCAAqC,oBAAqB,MAAM,EAAE,KAAG,MAAM,MAAM,CA6BtF,CAAC;AAEF,oBAAY,UAAU;IACpB,gBAAgB,uBAAuB;IACvC,eAAe,sBAAsB;IACrC,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,UAAU,eAAe;IACzB,OAAO,YAAY;IACnB,MAAM,WAAW;CAClB;AAED,oBAAY,cAAc;IACxB,SAAS,cAAc;CACxB;AAED,oBAAY,iBAAiB,GAAG;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,oBAAY,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAEzG,UAAU,eAAe;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,eAAe,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,QAAA,MAAM,yBAAyB,UAAW;IACxC,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC9C,KAAG,2BAA2B,EA4B9B,CAAC;AAEF,OAAO,EAAE,qCAAqC,EAAE,yBAAyB,EAAE,CAAC"}
|
package/out/egress/utils.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getEgressesBasedOnToggles = exports.sortAndGroupEgressPermissionsByDomain = exports.EgressCategory = exports.EgressType = void 0;
|
|
4
|
-
const minimatch_1 = require("minimatch");
|
|
3
|
+
exports.getEgressesBasedOnToggles = exports.sortAndGroupEgressPermissionsByDomain = exports.EgressCategory = exports.EgressType = exports.globToRegex = void 0;
|
|
5
4
|
const url_parser_1 = require("./url-parser");
|
|
5
|
+
function globToRegex(pattern) {
|
|
6
|
+
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
7
|
+
const regexPattern = escaped.replace(/\*/g, '.*');
|
|
8
|
+
return new RegExp(`^${regexPattern}$`);
|
|
9
|
+
}
|
|
10
|
+
exports.globToRegex = globToRegex;
|
|
6
11
|
const sortAndGroupEgressPermissionsByDomain = (egressAddresses) => {
|
|
7
12
|
if ((egressAddresses === null || egressAddresses === void 0 ? void 0 : egressAddresses.length) === 0) {
|
|
8
13
|
return [];
|
|
@@ -15,14 +20,14 @@ const sortAndGroupEgressPermissionsByDomain = (egressAddresses) => {
|
|
|
15
20
|
const url = (0, url_parser_1.parseUrl)(itemWithProtocol);
|
|
16
21
|
if (url.hostname.startsWith('*')) {
|
|
17
22
|
domains.add(url.hostname.substring(2));
|
|
18
|
-
wildcardDomains.push(
|
|
23
|
+
wildcardDomains.push(globToRegex(url.hostname));
|
|
19
24
|
}
|
|
20
25
|
else {
|
|
21
26
|
domains.add(url.hostname);
|
|
22
27
|
}
|
|
23
28
|
});
|
|
24
29
|
return [...domains].sort().reduce((grouped, domain) => {
|
|
25
|
-
if (!wildcardDomains.some((
|
|
30
|
+
if (!wildcardDomains.some((pattern) => pattern.test(domain))) {
|
|
26
31
|
grouped.push(domain);
|
|
27
32
|
}
|
|
28
33
|
return grouped;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/egress",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0-next.0",
|
|
4
4
|
"description": "Helpers and utils for egress implementation in Forge apps",
|
|
5
5
|
"main": "out/index.js",
|
|
6
6
|
"author": "Atlassian",
|
|
@@ -16,9 +16,6 @@
|
|
|
16
16
|
"@types/jest": "^29.5.14",
|
|
17
17
|
"@types/node": "20.19.1"
|
|
18
18
|
},
|
|
19
|
-
"dependencies": {
|
|
20
|
-
"minimatch": "^9.0.5"
|
|
21
|
-
},
|
|
22
19
|
"publishConfig": {
|
|
23
20
|
"registry": "https://packages.atlassian.com/api/npm/npm-public/"
|
|
24
21
|
}
|