@esri/hub-common 11.4.1 → 11.5.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.
@@ -19,6 +19,7 @@ export * from "./getPortalBaseFromOrgUrl";
19
19
  export * from "./getGroupHomeUrl";
20
20
  export * from "./getUserHomeUrl";
21
21
  export * from "./get-campaign-url";
22
+ export * from "./is-safe-redirect-url";
22
23
  const MAP_OR_FEATURE_SERVER_URL_REGEX = /\/(map|feature)server/i;
23
24
  /**
24
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/urls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AAEnC,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEjE;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IACrD,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,YAAY,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC;AAC/D,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/urls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AAEvC,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEjE;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IACrD,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,YAAY,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC;AAC/D,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { __rest } from "tslib";
2
+ import { domainExists } from "../sites/domains/domain-exists";
3
+ const SAFE_REDIRECT_URL = new RegExp("^https?:\\/\\/([a-z0-9-]+\\.)*(arcgis|esri)\\.com");
4
+ const HTTP_PROTOCOL = new RegExp("^https?:$");
5
+ /**
6
+ * Determines if a given URL is safe to redirect to.
7
+ * All URLs to *.esri.com and *.arcgis.com are considered
8
+ * safe. Non esri/arcgis domains must have a domain record.
9
+ * @param options.url url A URL
10
+ * @param ...options An IHubRequestOptions object
11
+ * @returns a promise that resolves a boolean
12
+ */
13
+ export async function isSafeRedirectUrl(options) {
14
+ const { url } = options, hubRequestOptions = __rest(options, ["url"]);
15
+ let isSafe;
16
+ try {
17
+ isSafe = SAFE_REDIRECT_URL.test(url);
18
+ if (!isSafe) {
19
+ const { protocol, hostname } = new URL(url);
20
+ if (!HTTP_PROTOCOL.test(protocol)) {
21
+ throw new Error("invalid protocol");
22
+ }
23
+ isSafe = await domainExists(hostname, hubRequestOptions);
24
+ }
25
+ }
26
+ catch (e) {
27
+ isSafe = false;
28
+ }
29
+ return isSafe;
30
+ }
31
+ //# sourceMappingURL=is-safe-redirect-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-safe-redirect-url.js","sourceRoot":"","sources":["../../../src/urls/is-safe-redirect-url.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAG9D,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAClC,mDAAmD,CACpD,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;AAM9C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAkC;IAElC,MAAM,EAAE,GAAG,KAA2B,OAAO,EAA7B,iBAAiB,UAAK,OAAO,EAAvC,OAA6B,CAAU,CAAC;IAC9C,IAAI,MAAM,CAAC;IACX,IAAI;QACF,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;aACrC;YACD,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;SAC1D;KACF;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,GAAG,KAAK,CAAC;KAChB;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -23,6 +23,7 @@ tslib_1.__exportStar(require("./getPortalBaseFromOrgUrl"), exports);
23
23
  tslib_1.__exportStar(require("./getGroupHomeUrl"), exports);
24
24
  tslib_1.__exportStar(require("./getUserHomeUrl"), exports);
25
25
  tslib_1.__exportStar(require("./get-campaign-url"), exports);
26
+ tslib_1.__exportStar(require("./is-safe-redirect-url"), exports);
26
27
  const MAP_OR_FEATURE_SERVER_URL_REGEX = /\/(map|feature)server/i;
27
28
  /**
28
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/urls/index.ts"],"names":[],"mappings":";;;;AAAA,kCAAqC;AACrC,sDAA4B;AAC5B,qEAA2C;AAC3C,+DAAqC;AACrC,2DAAiC;AACjC,2DAAiC;AACjC,6DAAmC;AACnC,2DAAiC;AACjC,qEAA2C;AAC3C,0DAAgC;AAChC,wEAA8C;AAC9C,oEAA0C;AAC1C,8DAAoC;AACpC,6DAAmC;AACnC,8DAAoC;AACpC,wEAA8C;AAC9C,mEAAyC;AACzC,oEAA0C;AAC1C,4DAAkC;AAClC,2DAAiC;AACjC,6DAAmC;AAEnC,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEjE;;;;GAIG;AACU,QAAA,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IACrD,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACU,QAAA,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,YAAY,IAAI,GAAG,iBAAU,CAAC,YAAY,CAAC,UAAU,CAAC;AAC/D,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/urls/index.ts"],"names":[],"mappings":";;;;AAAA,kCAAqC;AACrC,sDAA4B;AAC5B,qEAA2C;AAC3C,+DAAqC;AACrC,2DAAiC;AACjC,2DAAiC;AACjC,6DAAmC;AACnC,2DAAiC;AACjC,qEAA2C;AAC3C,0DAAgC;AAChC,wEAA8C;AAC9C,oEAA0C;AAC1C,8DAAoC;AACpC,6DAAmC;AACnC,8DAAoC;AACpC,wEAA8C;AAC9C,mEAAyC;AACzC,oEAA0C;AAC1C,4DAAkC;AAClC,2DAAiC;AACjC,6DAAmC;AACnC,iEAAuC;AAEvC,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEjE;;;;GAIG;AACU,QAAA,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IACrD,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACU,QAAA,qBAAqB,GAAG,CAAC,GAAW,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,YAAY,IAAI,GAAG,iBAAU,CAAC,YAAY,CAAC,UAAU,CAAC;AAC/D,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isSafeRedirectUrl = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const domain_exists_1 = require("../sites/domains/domain-exists");
6
+ const SAFE_REDIRECT_URL = new RegExp("^https?:\\/\\/([a-z0-9-]+\\.)*(arcgis|esri)\\.com");
7
+ const HTTP_PROTOCOL = new RegExp("^https?:$");
8
+ /**
9
+ * Determines if a given URL is safe to redirect to.
10
+ * All URLs to *.esri.com and *.arcgis.com are considered
11
+ * safe. Non esri/arcgis domains must have a domain record.
12
+ * @param options.url url A URL
13
+ * @param ...options An IHubRequestOptions object
14
+ * @returns a promise that resolves a boolean
15
+ */
16
+ async function isSafeRedirectUrl(options) {
17
+ const { url } = options, hubRequestOptions = tslib_1.__rest(options, ["url"]);
18
+ let isSafe;
19
+ try {
20
+ isSafe = SAFE_REDIRECT_URL.test(url);
21
+ if (!isSafe) {
22
+ const { protocol, hostname } = new URL(url);
23
+ if (!HTTP_PROTOCOL.test(protocol)) {
24
+ throw new Error("invalid protocol");
25
+ }
26
+ isSafe = await domain_exists_1.domainExists(hostname, hubRequestOptions);
27
+ }
28
+ }
29
+ catch (e) {
30
+ isSafe = false;
31
+ }
32
+ return isSafe;
33
+ }
34
+ exports.isSafeRedirectUrl = isSafeRedirectUrl;
35
+ //# sourceMappingURL=is-safe-redirect-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-safe-redirect-url.js","sourceRoot":"","sources":["../../../src/urls/is-safe-redirect-url.ts"],"names":[],"mappings":";;;;AAAA,kEAA8D;AAG9D,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAClC,mDAAmD,CACpD,CAAC;AAEF,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC;AAM9C;;;;;;;GAOG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAAkC;IAElC,MAAM,EAAE,GAAG,KAA2B,OAAO,EAA7B,iBAAiB,kBAAK,OAAO,EAAvC,OAA6B,CAAU,CAAC;IAC9C,IAAI,MAAM,CAAC;IACX,IAAI;QACF,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;aACrC;YACD,MAAM,GAAG,MAAM,4BAAY,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;SAC1D;KACF;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,GAAG,KAAK,CAAC;KAChB;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAlBD,8CAkBC"}
@@ -18,6 +18,7 @@ export * from "./getPortalBaseFromOrgUrl";
18
18
  export * from "./getGroupHomeUrl";
19
19
  export * from "./getUserHomeUrl";
20
20
  export * from "./get-campaign-url";
21
+ export * from "./is-safe-redirect-url";
21
22
  /**
22
23
  *
23
24
  * @param url
@@ -0,0 +1,14 @@
1
+ import { IHubRequestOptions } from "../types";
2
+ interface IIsSafeRedirectUrlOptions extends IHubRequestOptions {
3
+ url: string;
4
+ }
5
+ /**
6
+ * Determines if a given URL is safe to redirect to.
7
+ * All URLs to *.esri.com and *.arcgis.com are considered
8
+ * safe. Non esri/arcgis domains must have a domain record.
9
+ * @param options.url url A URL
10
+ * @param ...options An IHubRequestOptions object
11
+ * @returns a promise that resolves a boolean
12
+ */
13
+ export declare function isSafeRedirectUrl(options: IIsSafeRedirectUrlOptions): Promise<boolean>;
14
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esri/hub-common",
3
- "version": "11.4.1",
3
+ "version": "11.5.0",
4
4
  "description": "Common TypeScript types and utility functions for @esri/hub.js.",
5
5
  "main": "dist/node/index.js",
6
6
  "module": "dist/esm/index.js",