@webex/webex-core 3.12.0-llmrefactor.6 → 3.12.0-llmrefactor.7
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/lib/batcher.js +1 -1
- package/dist/lib/credentials/credentials.js +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/services/service-catalog.js +80 -31
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/services.js +1 -1
- package/dist/lib/services-v2/service-catalog.js +7 -1
- package/dist/lib/services-v2/service-catalog.js.map +1 -1
- package/dist/lib/services-v2/services-v2.js +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +2 -2
- package/package.json +3 -3
- package/src/lib/services/service-catalog.js +81 -29
- package/src/lib/services-v2/service-catalog.ts +10 -2
- package/test/unit/spec/services/service-catalog.js +85 -1
- package/test/unit/spec/services-v2/service-catalog.ts +10 -0
package/dist/lib/batcher.js
CHANGED
|
@@ -302,7 +302,7 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
302
302
|
fingerprintResponse: function fingerprintResponse(item) {
|
|
303
303
|
throw new Error('fingerprintResponse() must be implemented');
|
|
304
304
|
},
|
|
305
|
-
version: "3.12.0-llmrefactor.
|
|
305
|
+
version: "3.12.0-llmrefactor.7"
|
|
306
306
|
});
|
|
307
307
|
var _default2 = exports.default = Batcher;
|
|
308
308
|
//# sourceMappingURL=batcher.js.map
|
|
@@ -655,7 +655,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
655
655
|
this.refresh();
|
|
656
656
|
}
|
|
657
657
|
},
|
|
658
|
-
version: "3.12.0-llmrefactor.
|
|
658
|
+
version: "3.12.0-llmrefactor.7"
|
|
659
659
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "getUserToken", [_dec, _dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "getUserToken"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "invalidate", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "invalidate"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec5, _dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), _obj));
|
|
660
660
|
var _default = exports.default = Credentials;
|
|
661
661
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -532,7 +532,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
532
532
|
return res.body;
|
|
533
533
|
});
|
|
534
534
|
},
|
|
535
|
-
version: "3.12.0-llmrefactor.
|
|
535
|
+
version: "3.12.0-llmrefactor.7"
|
|
536
536
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "downscope", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "downscope"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "revoke", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "revoke"), _obj), _obj));
|
|
537
537
|
var _default = exports.default = Token;
|
|
538
538
|
//# sourceMappingURL=token.js.map
|
|
@@ -16,10 +16,13 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
16
16
|
});
|
|
17
17
|
exports.default = void 0;
|
|
18
18
|
exports.matchesCatalogUrl = matchesCatalogUrl;
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
exports.matchesParsedCatalogUrl = matchesParsedCatalogUrl;
|
|
20
|
+
exports.parseCatalogUrl = parseCatalogUrl;
|
|
21
21
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
22
22
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
|
23
|
+
var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
|
|
24
|
+
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
25
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
23
26
|
var _url = _interopRequireDefault(require("url"));
|
|
24
27
|
var _ampersandState = _interopRequireDefault(require("ampersand-state"));
|
|
25
28
|
var _lodash = require("lodash");
|
|
@@ -30,6 +33,72 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
30
33
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
31
34
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
32
35
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
36
|
+
// Catalog base URLs are a small, stable set, so their parsed origin/path is
|
|
37
|
+
// memoized to avoid repeated `new URL()` work when scanning the catalog on the
|
|
38
|
+
// request hot path.
|
|
39
|
+
var catalogUrlCache = new _map.default();
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Parse a catalog URL into the origin and normalized path used for matching,
|
|
43
|
+
* memoizing the result. Returns null when the URL is unparsable.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} catalogUrlString - The catalog URL to parse
|
|
46
|
+
* @returns {{origin: string, path: string} | null} - Parsed catalog URL, or null
|
|
47
|
+
*/
|
|
48
|
+
function parseCatalogUrl(catalogUrlString) {
|
|
49
|
+
if (catalogUrlCache.has(catalogUrlString)) {
|
|
50
|
+
return catalogUrlCache.get(catalogUrlString);
|
|
51
|
+
}
|
|
52
|
+
var parsed = null;
|
|
53
|
+
try {
|
|
54
|
+
var catalogUrl = new URL(catalogUrlString);
|
|
55
|
+
|
|
56
|
+
// Normalize paths by removing trailing slashes (except root "/")
|
|
57
|
+
parsed = {
|
|
58
|
+
origin: catalogUrl.origin,
|
|
59
|
+
path: catalogUrl.pathname.replace(/\/$/, '') || '/'
|
|
60
|
+
};
|
|
61
|
+
} catch (_unused) {
|
|
62
|
+
parsed = null;
|
|
63
|
+
}
|
|
64
|
+
catalogUrlCache.set(catalogUrlString, parsed);
|
|
65
|
+
return parsed;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check if an already-parsed candidate URL matches a parsed catalog URL with
|
|
70
|
+
* proper origin validation. Allocates nothing, so it is safe to call in a tight
|
|
71
|
+
* loop over the whole catalog.
|
|
72
|
+
*
|
|
73
|
+
* @param {URL} candidateUrl - The parsed candidate URL to validate
|
|
74
|
+
* @param {{origin: string, path: string} | null} parsedCatalogUrl - The parsed catalog URL
|
|
75
|
+
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
76
|
+
*/
|
|
77
|
+
function matchesParsedCatalogUrl(candidateUrl, parsedCatalogUrl) {
|
|
78
|
+
if (!candidateUrl || !parsedCatalogUrl) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Origins must match exactly (scheme + host + port)
|
|
83
|
+
if (candidateUrl.origin !== parsedCatalogUrl.origin) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
var catalogPath = parsedCatalogUrl.path;
|
|
87
|
+
if (catalogPath === '/') {
|
|
88
|
+
// Root path matches everything under this origin
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
var candidatePath = candidateUrl.pathname;
|
|
92
|
+
if (candidatePath.startsWith(catalogPath)) {
|
|
93
|
+
// Ensure we're at a path boundary, not mid-segment
|
|
94
|
+
// e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
|
|
95
|
+
// nextChar is undefined for exact match, '/' for valid extension
|
|
96
|
+
var nextChar = candidatePath[catalogPath.length];
|
|
97
|
+
return nextChar === '/' || nextChar === undefined;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
33
102
|
/**
|
|
34
103
|
* Check if a candidate URL matches a catalog URL with proper origin validation.
|
|
35
104
|
* This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
|
|
@@ -39,33 +108,13 @@ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length)
|
|
|
39
108
|
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
40
109
|
*/
|
|
41
110
|
function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
|
|
111
|
+
var candidateUrl;
|
|
42
112
|
try {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// Origins must match exactly (scheme + host + port)
|
|
47
|
-
if (candidateUrl.origin !== catalogUrl.origin) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Normalize paths by removing trailing slashes (except root "/")
|
|
52
|
-
var catalogPath = catalogUrl.pathname.replace(/\/$/, '') || '/';
|
|
53
|
-
var candidatePath = candidateUrl.pathname;
|
|
54
|
-
if (catalogPath === '/') {
|
|
55
|
-
// Root path matches everything under this origin
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
if (candidatePath.startsWith(catalogPath)) {
|
|
59
|
-
// Ensure we're at a path boundary, not mid-segment
|
|
60
|
-
// e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
|
|
61
|
-
// nextChar is undefined for exact match, '/' for valid extension
|
|
62
|
-
var nextChar = candidatePath[catalogPath.length];
|
|
63
|
-
return nextChar === '/' || nextChar === undefined;
|
|
64
|
-
}
|
|
65
|
-
return false;
|
|
66
|
-
} catch (_unused) {
|
|
113
|
+
candidateUrl = new URL(candidateUrlString);
|
|
114
|
+
} catch (_unused2) {
|
|
67
115
|
return false;
|
|
68
116
|
}
|
|
117
|
+
return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));
|
|
69
118
|
}
|
|
70
119
|
|
|
71
120
|
/* eslint-disable no-underscore-dangle */
|
|
@@ -296,15 +345,15 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
296
345
|
var serviceUrls = [].concat((0, _toConsumableArray2.default)(this.serviceGroups.discovery), (0, _toConsumableArray2.default)(this.serviceGroups.preauth), (0, _toConsumableArray2.default)(this.serviceGroups.signin), (0, _toConsumableArray2.default)(this.serviceGroups.postauth), (0, _toConsumableArray2.default)(this.serviceGroups.override));
|
|
297
346
|
|
|
298
347
|
// Invalid URLs cannot match any service
|
|
348
|
+
var candidateUrl;
|
|
299
349
|
try {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
} catch (_unused2) {
|
|
350
|
+
candidateUrl = new URL(url);
|
|
351
|
+
} catch (_unused3) {
|
|
303
352
|
return undefined;
|
|
304
353
|
}
|
|
305
354
|
return serviceUrls.find(function (serviceUrl) {
|
|
306
355
|
// Check if the URL matches the default URL with proper origin validation
|
|
307
|
-
if (
|
|
356
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {
|
|
308
357
|
return true;
|
|
309
358
|
}
|
|
310
359
|
|
|
@@ -316,7 +365,7 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
316
365
|
var host = _step4.value;
|
|
317
366
|
var alternateUrl = new URL(serviceUrl.defaultUrl);
|
|
318
367
|
alternateUrl.host = host.host;
|
|
319
|
-
if (
|
|
368
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(alternateUrl.toString()))) {
|
|
320
369
|
return true;
|
|
321
370
|
}
|
|
322
371
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_url","_interopRequireDefault","require","_ampersandState","_lodash","_serviceUrl","_domains","ownKeys","e","r","t","_Object$keys3","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","matchesCatalogUrl","candidateUrlString","catalogUrlString","candidateUrl","URL","catalogUrl","origin","catalogPath","pathname","replace","candidatePath","startsWith","nextChar","undefined","_unused","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","allowedDomains","_getUrl","serviceGroup","serviceUrls","concat","_toConsumableArray2","find","serviceUrl","_listServiceUrls","_loadServiceUrls","services","_this","existingService","service","_unloadServiceUrls","_this2","splice","indexOf","clean","findClusterId","url","incomingUrlObj","Url","parse","serviceUrlObj","_i","_Object$keys","_keys","key","_iterator","_step","defaultUrl","_iterator2","hosts","_step2","host","hostname","id","err","_iterator3","_step3","homeCluster","findServiceFromClusterId","_ref","clusterId","_ref$priorityHost","priorityHost","identifiedServiceUrl","get","findServiceUrlFromUrl","_unused2","_iterator4","_step4","alternateUrl","findAllowedDomain","matchAllowedDomain","getAllowedDomains","list","output","markFailedUrl","noPriorityHosts","_this3","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceUrls","serviceHostmap","_this4","currentServiceUrls","unusedUrls","every","item","serviceObj","ServiceUrl","trigger","waitForCatalog","timeout","_this5","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.js"],"sourcesContent":["import Url from 'url';\n\nimport AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceUrl from './service-url';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\n\n/**\n * Check if a candidate URL matches a catalog URL with proper origin validation.\n * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example\n *\n * @param {string} candidateUrlString - The URL to validate\n * @param {string} catalogUrlString - The catalog URL to compare against\n * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path\n */\nexport function matchesCatalogUrl(candidateUrlString, catalogUrlString) {\n try {\n const candidateUrl = new URL(candidateUrlString);\n const catalogUrl = new URL(catalogUrlString);\n\n // Origins must match exactly (scheme + host + port)\n if (candidateUrl.origin !== catalogUrl.origin) {\n return false;\n }\n\n // Normalize paths by removing trailing slashes (except root \"/\")\n const catalogPath = catalogUrl.pathname.replace(/\\/$/, '') || '/';\n const candidatePath = candidateUrl.pathname;\n\n if (catalogPath === '/') {\n // Root path matches everything under this origin\n return true;\n }\n\n if (candidatePath.startsWith(catalogPath)) {\n // Ensure we're at a path boundary, not mid-segment\n // e.g., /api/v1 should match /api/v1/foo but not /api/v1extra\n // nextChar is undefined for exact match, '/' for valid extension\n const nextChar = candidatePath[catalogPath.length];\n\n return nextChar === '/' || nextChar === undefined;\n }\n\n return false;\n } catch {\n return false;\n }\n}\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Search the service url array to locate a `ServiceUrl`\n * class object based on its name.\n * @param {string} name\n * @param {string} [serviceGroup]\n * @returns {ServiceUrl}\n */\n _getUrl(name, serviceGroup) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceUrls.find((serviceUrl) => serviceUrl.name === name);\n },\n\n /**\n * @private\n * Generate an array of `ServiceUrl`s that is organized from highest auth\n * level to lowest auth level.\n * @returns {Array<ServiceUrl>} - array of `ServiceUrl`s\n */\n _listServiceUrls() {\n return [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n },\n\n /**\n * @private\n * Safely load one or more `ServiceUrl`s into this `Services` instance.\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _loadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n\n return this;\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceUrl`s into this `Services` instance\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _unloadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n\n return this;\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean() {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string} - ClusterId of a given url\n */\n findClusterId(url) {\n const incomingUrlObj = Url.parse(url);\n let serviceUrlObj;\n\n for (const key of Object.keys(this.serviceGroups)) {\n for (const service of this.serviceGroups[key]) {\n serviceUrlObj = Url.parse(service.defaultUrl);\n\n for (const host of service.hosts) {\n if (incomingUrlObj.hostname === host.host && host.id) {\n return host.id;\n }\n }\n\n if (serviceUrlObj.hostname === incomingUrlObj.hostname && service.hosts.length > 0) {\n // no exact match, so try to grab the first home cluster\n for (const host of service.hosts) {\n if (host.homeCluster) {\n return host.id;\n }\n }\n\n // no match found still, so return the first entry\n return service.hosts[0].id;\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId. Currently, this method will return either a service name, or a\n * service url depending on the `value` parameter. If the `value` parameter\n * is set to `name`, it will return a service name to be utilized within the\n * Services plugin methods.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost = true] - returns priority host url if true\n * @param {string} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId({clusterId, priorityHost = true, serviceGroup} = {}) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n const identifiedServiceUrl = serviceUrls.find((serviceUrl) =>\n serviceUrl.hosts.find((host) => host.id === clusterId)\n );\n\n if (identifiedServiceUrl) {\n return {\n name: identifiedServiceUrl.name,\n url: identifiedServiceUrl.get(priorityHost, clusterId),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {serviceUrl} - ServiceUrl assocated with provided url\n */\n findServiceUrlFromUrl(url) {\n const serviceUrls = [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n // Invalid URLs cannot match any service\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n } catch {\n return undefined;\n }\n\n return serviceUrls.find((serviceUrl) => {\n // Check if the URL matches the default URL with proper origin validation\n if (matchesCatalogUrl(url, serviceUrl.defaultUrl)) {\n return true;\n }\n\n // Check alternate URLs (built by swapping host with alternate hosts)\n for (const host of serviceUrl.hosts) {\n const alternateUrl = new URL(serviceUrl.defaultUrl);\n alternateUrl.host = host.host;\n\n if (matchesCatalogUrl(url, alternateUrl.toString())) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url) {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} name\n * @param {boolean} priorityHost\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(name, priorityHost, serviceGroup) {\n const serviceUrl = this._getUrl(name, serviceGroup);\n\n return serviceUrl ? serviceUrl.get(priorityHost) : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains() {\n return [...this.allowedDomains];\n },\n\n /**\n * Creates an object where the keys are the service names\n * and the values are the service urls.\n * @param {boolean} priorityHost - use the highest priority if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const output = {};\n\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n if (serviceUrls) {\n serviceUrls.forEach((serviceUrl) => {\n output[serviceUrl.name] = serviceUrl.get(priorityHost);\n });\n }\n\n return output;\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceUrl` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceUrls` host array,\n * or the `ServiceUrls` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @param {boolean} noPriorityHosts\n * @returns {string}\n */\n markFailedUrl(url, noPriorityHosts) {\n const serviceUrl = this._getUrl(\n Object.keys(this.list()).find((key) => this._getUrl(key).failHost(url))\n );\n\n if (!serviceUrl) {\n return undefined;\n }\n\n return noPriorityHosts ? serviceUrl.get(false) : serviceUrl.get(true);\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains) {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains) {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceUrl`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {string} serviceGroup\n * @param {object} serviceHostmap\n * @returns {Services}\n */\n updateServiceUrls(serviceGroup, serviceHostmap) {\n const currentServiceUrls = this.serviceGroups[serviceGroup];\n\n const unusedUrls = currentServiceUrls.filter((serviceUrl) =>\n serviceHostmap.every((item) => item.name !== serviceUrl.name)\n );\n\n this._unloadServiceUrls(serviceGroup, unusedUrls);\n\n serviceHostmap.forEach((serviceObj) => {\n const service = this._getUrl(serviceObj.name, serviceGroup);\n\n if (service) {\n service.defaultUrl = serviceObj.defaultUrl;\n service.hosts = serviceObj.hosts || [];\n } else {\n this._loadServiceUrls(serviceGroup, [\n new ServiceUrl({\n ...serviceObj,\n }),\n ]);\n }\n });\n\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n\n return this;\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n return new Promise((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n/* eslint-enable no-underscore-dangle */\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_url","_interopRequireDefault","require","_ampersandState","_lodash","_serviceUrl","_domains","ownKeys","e","r","t","_Object$keys3","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","catalogUrlCache","_map","parseCatalogUrl","catalogUrlString","has","get","parsed","catalogUrl","URL","origin","path","pathname","replace","_unused","set","matchesParsedCatalogUrl","candidateUrl","parsedCatalogUrl","catalogPath","candidatePath","startsWith","nextChar","undefined","matchesCatalogUrl","candidateUrlString","_unused2","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","allowedDomains","_getUrl","serviceGroup","serviceUrls","concat","_toConsumableArray2","find","serviceUrl","_listServiceUrls","_loadServiceUrls","services","_this","existingService","service","_unloadServiceUrls","_this2","splice","indexOf","clean","findClusterId","url","incomingUrlObj","Url","parse","serviceUrlObj","_i","_Object$keys","_keys","key","_iterator","_step","defaultUrl","_iterator2","hosts","_step2","host","hostname","id","err","_iterator3","_step3","homeCluster","findServiceFromClusterId","_ref","clusterId","_ref$priorityHost","priorityHost","identifiedServiceUrl","findServiceUrlFromUrl","_unused3","_iterator4","_step4","alternateUrl","findAllowedDomain","matchAllowedDomain","getAllowedDomains","list","output","markFailedUrl","noPriorityHosts","_this3","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceUrls","serviceHostmap","_this4","currentServiceUrls","unusedUrls","every","item","serviceObj","ServiceUrl","trigger","waitForCatalog","timeout","_this5","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.js"],"sourcesContent":["import Url from 'url';\n\nimport AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceUrl from './service-url';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\n\n// Catalog base URLs are a small, stable set, so their parsed origin/path is\n// memoized to avoid repeated `new URL()` work when scanning the catalog on the\n// request hot path.\nconst catalogUrlCache = new Map();\n\n/**\n * Parse a catalog URL into the origin and normalized path used for matching,\n * memoizing the result. Returns null when the URL is unparsable.\n *\n * @param {string} catalogUrlString - The catalog URL to parse\n * @returns {{origin: string, path: string} | null} - Parsed catalog URL, or null\n */\nexport function parseCatalogUrl(catalogUrlString) {\n if (catalogUrlCache.has(catalogUrlString)) {\n return catalogUrlCache.get(catalogUrlString);\n }\n\n let parsed = null;\n\n try {\n const catalogUrl = new URL(catalogUrlString);\n\n // Normalize paths by removing trailing slashes (except root \"/\")\n parsed = {origin: catalogUrl.origin, path: catalogUrl.pathname.replace(/\\/$/, '') || '/'};\n } catch {\n parsed = null;\n }\n\n catalogUrlCache.set(catalogUrlString, parsed);\n\n return parsed;\n}\n\n/**\n * Check if an already-parsed candidate URL matches a parsed catalog URL with\n * proper origin validation. Allocates nothing, so it is safe to call in a tight\n * loop over the whole catalog.\n *\n * @param {URL} candidateUrl - The parsed candidate URL to validate\n * @param {{origin: string, path: string} | null} parsedCatalogUrl - The parsed catalog URL\n * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path\n */\nexport function matchesParsedCatalogUrl(candidateUrl, parsedCatalogUrl) {\n if (!candidateUrl || !parsedCatalogUrl) {\n return false;\n }\n\n // Origins must match exactly (scheme + host + port)\n if (candidateUrl.origin !== parsedCatalogUrl.origin) {\n return false;\n }\n\n const catalogPath = parsedCatalogUrl.path;\n\n if (catalogPath === '/') {\n // Root path matches everything under this origin\n return true;\n }\n\n const candidatePath = candidateUrl.pathname;\n\n if (candidatePath.startsWith(catalogPath)) {\n // Ensure we're at a path boundary, not mid-segment\n // e.g., /api/v1 should match /api/v1/foo but not /api/v1extra\n // nextChar is undefined for exact match, '/' for valid extension\n const nextChar = candidatePath[catalogPath.length];\n\n return nextChar === '/' || nextChar === undefined;\n }\n\n return false;\n}\n\n/**\n * Check if a candidate URL matches a catalog URL with proper origin validation.\n * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example\n *\n * @param {string} candidateUrlString - The URL to validate\n * @param {string} catalogUrlString - The catalog URL to compare against\n * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path\n */\nexport function matchesCatalogUrl(candidateUrlString, catalogUrlString) {\n let candidateUrl;\n\n try {\n candidateUrl = new URL(candidateUrlString);\n } catch {\n return false;\n }\n\n return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));\n}\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Search the service url array to locate a `ServiceUrl`\n * class object based on its name.\n * @param {string} name\n * @param {string} [serviceGroup]\n * @returns {ServiceUrl}\n */\n _getUrl(name, serviceGroup) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceUrls.find((serviceUrl) => serviceUrl.name === name);\n },\n\n /**\n * @private\n * Generate an array of `ServiceUrl`s that is organized from highest auth\n * level to lowest auth level.\n * @returns {Array<ServiceUrl>} - array of `ServiceUrl`s\n */\n _listServiceUrls() {\n return [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n },\n\n /**\n * @private\n * Safely load one or more `ServiceUrl`s into this `Services` instance.\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _loadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n\n return this;\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceUrl`s into this `Services` instance\n * @param {string} serviceGroup\n * @param {Array<ServiceUrl>} services\n * @returns {Services}\n */\n _unloadServiceUrls(serviceGroup, services) {\n // declare namespaces outside of loop\n let existingService;\n\n services.forEach((service) => {\n existingService = this._getUrl(service.name, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n\n return this;\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean() {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string} - ClusterId of a given url\n */\n findClusterId(url) {\n const incomingUrlObj = Url.parse(url);\n let serviceUrlObj;\n\n for (const key of Object.keys(this.serviceGroups)) {\n for (const service of this.serviceGroups[key]) {\n serviceUrlObj = Url.parse(service.defaultUrl);\n\n for (const host of service.hosts) {\n if (incomingUrlObj.hostname === host.host && host.id) {\n return host.id;\n }\n }\n\n if (serviceUrlObj.hostname === incomingUrlObj.hostname && service.hosts.length > 0) {\n // no exact match, so try to grab the first home cluster\n for (const host of service.hosts) {\n if (host.homeCluster) {\n return host.id;\n }\n }\n\n // no match found still, so return the first entry\n return service.hosts[0].id;\n }\n }\n }\n\n return undefined;\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId. Currently, this method will return either a service name, or a\n * service url depending on the `value` parameter. If the `value` parameter\n * is set to `name`, it will return a service name to be utilized within the\n * Services plugin methods.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost = true] - returns priority host url if true\n * @param {string} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId({clusterId, priorityHost = true, serviceGroup} = {}) {\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n const identifiedServiceUrl = serviceUrls.find((serviceUrl) =>\n serviceUrl.hosts.find((host) => host.id === clusterId)\n );\n\n if (identifiedServiceUrl) {\n return {\n name: identifiedServiceUrl.name,\n url: identifiedServiceUrl.get(priorityHost, clusterId),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {serviceUrl} - ServiceUrl assocated with provided url\n */\n findServiceUrlFromUrl(url) {\n const serviceUrls = [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n // Invalid URLs cannot match any service\n let candidateUrl;\n\n try {\n candidateUrl = new URL(url);\n } catch {\n return undefined;\n }\n\n return serviceUrls.find((serviceUrl) => {\n // Check if the URL matches the default URL with proper origin validation\n if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {\n return true;\n }\n\n // Check alternate URLs (built by swapping host with alternate hosts)\n for (const host of serviceUrl.hosts) {\n const alternateUrl = new URL(serviceUrl.defaultUrl);\n alternateUrl.host = host.host;\n\n if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(alternateUrl.toString()))) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url) {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name.\n * @param {string} name\n * @param {boolean} priorityHost\n * @param {string} serviceGroup\n * @returns {string}\n */\n get(name, priorityHost, serviceGroup) {\n const serviceUrl = this._getUrl(name, serviceGroup);\n\n return serviceUrl ? serviceUrl.get(priorityHost) : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains() {\n return [...this.allowedDomains];\n },\n\n /**\n * Creates an object where the keys are the service names\n * and the values are the service urls.\n * @param {boolean} priorityHost - use the highest priority if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const output = {};\n\n const serviceUrls =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.discovery,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.override,\n ];\n\n if (serviceUrls) {\n serviceUrls.forEach((serviceUrl) => {\n output[serviceUrl.name] = serviceUrl.get(priorityHost);\n });\n }\n\n return output;\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceUrl` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceUrls` host array,\n * or the `ServiceUrls` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @param {boolean} noPriorityHosts\n * @returns {string}\n */\n markFailedUrl(url, noPriorityHosts) {\n const serviceUrl = this._getUrl(\n Object.keys(this.list()).find((key) => this._getUrl(key).failHost(url))\n );\n\n if (!serviceUrl) {\n return undefined;\n }\n\n return noPriorityHosts ? serviceUrl.get(false) : serviceUrl.get(true);\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains) {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains) {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceUrl`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {string} serviceGroup\n * @param {object} serviceHostmap\n * @returns {Services}\n */\n updateServiceUrls(serviceGroup, serviceHostmap) {\n const currentServiceUrls = this.serviceGroups[serviceGroup];\n\n const unusedUrls = currentServiceUrls.filter((serviceUrl) =>\n serviceHostmap.every((item) => item.name !== serviceUrl.name)\n );\n\n this._unloadServiceUrls(serviceGroup, unusedUrls);\n\n serviceHostmap.forEach((serviceObj) => {\n const service = this._getUrl(serviceObj.name, serviceGroup);\n\n if (service) {\n service.defaultUrl = serviceObj.defaultUrl;\n service.hosts = serviceObj.hosts || [];\n } else {\n this._loadServiceUrls(serviceGroup, [\n new ServiceUrl({\n ...serviceObj,\n }),\n ]);\n }\n });\n\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n\n return this;\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n return new Promise((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n/* eslint-enable no-underscore-dangle */\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1641,7 +1641,7 @@ var Services = _webexPlugin.default.extend({
|
|
|
1641
1641
|
}, _callee6);
|
|
1642
1642
|
})));
|
|
1643
1643
|
},
|
|
1644
|
-
version: "3.12.0-llmrefactor.
|
|
1644
|
+
version: "3.12.0-llmrefactor.7"
|
|
1645
1645
|
});
|
|
1646
1646
|
/* eslint-enable no-underscore-dangle */
|
|
1647
1647
|
var _default = exports.default = Services;
|
|
@@ -196,6 +196,12 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
196
196
|
*/
|
|
197
197
|
findServiceDetailFromUrl: function findServiceDetailFromUrl(url) {
|
|
198
198
|
var serviceDetails = this._getAllServiceDetails();
|
|
199
|
+
var candidateUrl;
|
|
200
|
+
try {
|
|
201
|
+
candidateUrl = new URL(url);
|
|
202
|
+
} catch (_unused2) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
199
205
|
return serviceDetails.find(function (_ref3) {
|
|
200
206
|
var serviceUrls = _ref3.serviceUrls;
|
|
201
207
|
var _iterator = _createForOfIteratorHelper(serviceUrls),
|
|
@@ -203,7 +209,7 @@ var ServiceCatalog = _ampersandState.default.extend({
|
|
|
203
209
|
try {
|
|
204
210
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
205
211
|
var serviceUrl = _step.value;
|
|
206
|
-
if ((0, _serviceCatalog.
|
|
212
|
+
if ((0, _serviceCatalog.matchesParsedCatalogUrl)(candidateUrl, (0, _serviceCatalog.parseCatalogUrl)(serviceUrl.baseUrl))) {
|
|
207
213
|
return true;
|
|
208
214
|
}
|
|
209
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_domains","_serviceCatalog","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","timestamp","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","_ref3","_iterator","_step","serviceUrl","matchesCatalogUrl","baseUrl","err","findAllowedDomain","matchAllowedDomain","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","_serviceObj$serviceUr","sort","b","priority","ServiceDetail","trigger","waitForCatalog","timeout","_this4","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceDetail from './service-detail';\nimport {IServiceDetail, ServiceGroup} from './types';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\nimport {matchesCatalogUrl} from '../services/service-catalog';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n timestamp: ['string', false, ''],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails?.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (matchesCatalogUrl(url, serviceUrl.baseUrl)) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @param {timestamp<string>} timestamp of the catalog\n * @returns {void}\n */\n updateServiceGroups(\n serviceGroup: ServiceGroup,\n serviceDetails: Array<IServiceDetail>,\n timestamp?: string\n ) {\n const currentServiceDetails = this.serviceGroups[serviceGroup];\n\n const unusedServicesDetails = currentServiceDetails?.filter((serviceDetail) =>\n serviceDetails?.every(({id}) => id !== serviceDetail.id)\n );\n\n this._unloadServiceDetails(serviceGroup, unusedServicesDetails);\n\n serviceDetails?.forEach((serviceObj) => {\n const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);\n serviceObj?.serviceUrls?.sort((a, b) => {\n if (a.priority < 0 && b.priority < 0) return 0;\n if (a.priority < 0) return 1;\n if (b.priority < 0) return -1;\n\n return a.priority - b.priority;\n });\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\n this.timestamp = timestamp;\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {ServiceGroup} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: ServiceGroup, timeout?: number): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n\nexport default ServiceCatalog;\n"],"mappings":";;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAH,sBAAA,CAAAC,OAAA;AAEA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AAA8D,SAAAK,2BAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,yBAAAC,OAAA,IAAAH,CAAA,CAAAI,gBAAA,KAAAJ,CAAA,qBAAAE,CAAA,QAAAG,cAAA,CAAAL,CAAA,MAAAE,CAAA,GAAAI,2BAAA,CAAAN,CAAA,MAAAC,CAAA,IAAAD,CAAA,uBAAAA,CAAA,CAAAO,MAAA,IAAAL,CAAA,KAAAF,CAAA,GAAAE,CAAA,OAAAM,EAAA,MAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,WAAAH,EAAA,IAAAR,CAAA,CAAAO,MAAA,KAAAK,IAAA,WAAAA,IAAA,MAAAC,KAAA,EAAAb,CAAA,CAAAQ,EAAA,UAAAP,CAAA,WAAAA,EAAAD,CAAA,UAAAA,CAAA,KAAAc,CAAA,EAAAL,CAAA,gBAAAM,SAAA,iJAAAC,CAAA,EAAAC,CAAA,OAAAC,CAAA,gBAAAR,CAAA,WAAAA,EAAA,IAAAR,CAAA,GAAAA,CAAA,CAAAiB,IAAA,CAAAnB,CAAA,MAAAW,CAAA,WAAAA,EAAA,QAAAX,CAAA,GAAAE,CAAA,CAAAkB,IAAA,WAAAH,CAAA,GAAAjB,CAAA,CAAAY,IAAA,EAAAZ,CAAA,KAAAC,CAAA,WAAAA,EAAAD,CAAA,IAAAkB,CAAA,OAAAF,CAAA,GAAAhB,CAAA,KAAAc,CAAA,WAAAA,EAAA,UAAAG,CAAA,YAAAf,CAAA,CAAAmB,MAAA,IAAAnB,CAAA,CAAAmB,MAAA,oBAAAH,CAAA,QAAAF,CAAA;AAAA,SAAAV,4BAAAN,CAAA,EAAAiB,CAAA,QAAAjB,CAAA,2BAAAA,CAAA,SAAAsB,iBAAA,CAAAtB,CAAA,EAAAiB,CAAA,OAAAf,CAAA,MAAAqB,QAAA,CAAAJ,IAAA,CAAAnB,CAAA,EAAAwB,KAAA,6BAAAtB,CAAA,IAAAF,CAAA,CAAAyB,WAAA,KAAAvB,CAAA,GAAAF,CAAA,CAAAyB,WAAA,CAAAC,IAAA,aAAAxB,CAAA,cAAAA,CAAA,GAAAyB,WAAA,CAAA3B,CAAA,oBAAAE,CAAA,+CAAA0B,IAAA,CAAA1B,CAAA,IAAAoB,iBAAA,CAAAtB,CAAA,EAAAiB,CAAA;AAAA,SAAAK,kBAAAtB,CAAA,EAAAiB,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAjB,CAAA,CAAAO,MAAA,MAAAU,CAAA,GAAAjB,CAAA,CAAAO,MAAA,YAAAN,CAAA,MAAAU,CAAA,GAAAkB,KAAA,CAAAZ,CAAA,GAAAhB,CAAA,GAAAgB,CAAA,EAAAhB,CAAA,IAAAU,CAAA,CAAAV,CAAA,IAAAD,CAAA,CAAAC,CAAA,UAAAU,CAAA;AAE9D;AACA;AACA;AACA,IAAMmB,cAAc,GAAGC,uBAAQ,CAACC,MAAM,CAAC;EACrCC,SAAS,EAAE,gBAAgB;EAE3BC,KAAK,EAAE;IACLC,aAAa,EAAE,CACb,QAAQ,EACR,IAAI,EACJ;MAAA,OAAO;QACLC,SAAS,EAAE,EAAE;QACbC,QAAQ,EAAE,EAAE;QACZC,OAAO,EAAE,EAAE;QACXC,QAAQ,EAAE,EAAE;QACZC,MAAM,EAAE;MACV,CAAC;IAAA,CAAC,CACH;IACDC,MAAM,EAAE,CACN,QAAQ,EACR,IAAI,EACJ;MAAA,OAAO;QACLL,SAAS,EAAE;UACTM,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDN,QAAQ,EAAE;UACRK,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDL,OAAO,EAAE;UACPI,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDJ,QAAQ,EAAE;UACRG,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd,CAAC;QACDH,MAAM,EAAE;UACNE,KAAK,EAAE,KAAK;UACZC,UAAU,EAAE;QACd;MACF,CAAC;IAAA,CAAC,CACH;IACDC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAClCC,SAAS,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;IAChCC,cAAc,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE;MAAA,OAAM,EAAE;IAAA;EAC3C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEC,qBAAqB,WAArBA,qBAAqBA,CAACC,YAA2B,EAAyB;IACxE,IAAMC,cAAc,GAClB,OAAOD,YAAY,KAAK,QAAQ,GAC5B,IAAI,CAACb,aAAa,CAACa,YAAY,CAAC,IAAI,EAAE,MAAAE,MAAA,KAAAC,mBAAA,CAAAC,OAAA,EAEjC,IAAI,CAACjB,aAAa,CAACE,QAAQ,OAAAc,mBAAA,CAAAC,OAAA,EAC3B,IAAI,CAACjB,aAAa,CAACI,QAAQ,OAAAY,mBAAA,CAAAC,OAAA,EAC3B,IAAI,CAACjB,aAAa,CAACK,MAAM,OAAAW,mBAAA,CAAAC,OAAA,EACzB,IAAI,CAACjB,aAAa,CAACG,OAAO,OAAAa,mBAAA,CAAAC,OAAA,EAC1B,IAAI,CAACjB,aAAa,CAACC,SAAS,EAChC;IAEP,OAAOa,cAAc;EACvB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEI,iBAAiB,WAAjBA,iBAAiBA,CAACC,SAAiB,EAAEN,YAA2B,EAA8B;IAC5F,IAAMC,cAAc,GAAG,IAAI,CAACF,qBAAqB,CAACC,YAAY,CAAC;IAE/D,OAAOC,cAAc,CAACM,IAAI,CAAC,UAACC,aAA6B;MAAA,OAAKA,aAAa,CAACC,EAAE,KAAKH,SAAS;IAAA,EAAC;EAC/F,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEI,mBAAmB,WAAnBA,mBAAmBA,CAACV,YAA0B,EAAEC,cAAqC,EAAQ;IAAA,IAAAU,KAAA;IAC3F;IACA,IAAIC,eAA2C;IAE/CX,cAAc,CAACY,OAAO,CAAC,UAACC,OAAO,EAAK;MAClCF,eAAe,GAAGD,KAAI,CAACN,iBAAiB,CAACS,OAAO,CAACL,EAAE,EAAET,YAAY,CAAC;MAElE,IAAI,CAACY,eAAe,EAAE;QACpBD,KAAI,CAACxB,aAAa,CAACa,YAAY,CAAC,CAACe,IAAI,CAACD,OAAO,CAAC;MAChD;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEE,qBAAqB,WAArBA,qBAAqBA,CAAChB,YAA0B,EAAEC,cAAqC,EAAQ;IAAA,IAAAgB,MAAA;IAC7F;IACA,IAAIL,eAA2C;IAE/CX,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEY,OAAO,CAAC,UAACC,OAAO,EAAK;MACnCF,eAAe,GAAGK,MAAI,CAACZ,iBAAiB,CAACS,OAAO,CAACL,EAAE,EAAET,YAAY,CAAC;MAElE,IAAIY,eAAe,EAAE;QACnBK,MAAI,CAAC9B,aAAa,CAACa,YAAY,CAAC,CAACkB,MAAM,CACrCD,MAAI,CAAC9B,aAAa,CAACa,YAAY,CAAC,CAACmB,OAAO,CAACP,eAAe,CAAC,EACzD,CACF,CAAC;MACH;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;EACEQ,KAAK,WAALA,KAAKA,CAAA,EAAS;IACZ,IAAI,CAACjC,aAAa,CAACG,OAAO,CAAC/B,MAAM,GAAG,CAAC;IACrC,IAAI,CAAC4B,aAAa,CAACK,MAAM,CAACjC,MAAM,GAAG,CAAC;IACpC,IAAI,CAAC4B,aAAa,CAACI,QAAQ,CAAChC,MAAM,GAAG,CAAC;IACtC,IAAI,CAACkC,MAAM,CAACH,OAAO,GAAG;MAACI,KAAK,EAAE;IAAK,CAAC;IACpC,IAAI,CAACD,MAAM,CAACD,MAAM,GAAG;MAACE,KAAK,EAAE;IAAK,CAAC;IACnC,IAAI,CAACD,MAAM,CAACF,QAAQ,GAAG;MAACG,KAAK,EAAE;IAAK,CAAC;EACvC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACE2B,aAAa,WAAbA,aAAaA,CAACC,GAAW,EAAsB;IAC7C,IAAI;MAAA,IAAAC,qBAAA;MACF,IAAMC,cAAc,GAAG,IAAIC,GAAG,CAACH,GAAG,CAAC;MACnC,IAAMI,iBAAiB,GAAG,IAAI,CAAC3B,qBAAqB,CAAC,CAAC;MAEtD,QAAAwB,qBAAA,GAAOG,iBAAiB,CAACnB,IAAI,CAAC,UAACC,aAA6B;QAAA,OAC1DA,aAAa,CAACmB,WAAW,CAACpB,IAAI,CAAC,UAAAqB,IAAA;UAAA,IAAEC,IAAI,GAAAD,IAAA,CAAJC,IAAI;UAAA,OAAMA,IAAI,KAAKL,cAAc,CAACK,IAAI;QAAA,EAAC;MAAA,CAC1E,CAAC,cAAAN,qBAAA,uBAFMA,qBAAA,CAEJd,EAAE;IACP,CAAC,CAAC,OAAAqB,OAAA,EAAM;MACN;MACA,OAAOC,SAAS;IAClB;EACF,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,wBAAwB,WAAxBA,wBAAwBA,CAAA,EAEmB;IAAA,IAAAC,KAAA,GAAAC,SAAA,CAAA3E,MAAA,QAAA2E,SAAA,QAAAH,SAAA,GAAAG,SAAA,MADb,CAAC,CAAC;MAA7B5B,SAAS,GAAA2B,KAAA,CAAT3B,SAAS;MAAEN,YAAY,GAAAiC,KAAA,CAAZjC,YAAY;IAExB,IAAMC,cAAc,GAAG,IAAI,CAACI,iBAAiB,CAACC,SAAS,EAAEN,YAAY,CAAC;IAEtE,IAAIC,cAAc,EAAE;MAClB,OAAO;QACLvB,IAAI,EAAEuB,cAAc,CAACkC,WAAW;QAChCb,GAAG,EAAErB,cAAc,CAACmC,GAAG,CAAC;MAC1B,CAAC;IACH;IAEA,OAAOL,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,wBAAwB,WAAxBA,wBAAwBA,CAACf,GAAW,EAA8B;IAChE,IAAMrB,cAAc,GAAG,IAAI,CAACF,qBAAqB,CAAC,CAAC;IAEnD,OAAOE,cAAc,CAACM,IAAI,CAAC,UAAA+B,KAAA,EAAmB;MAAA,IAAjBX,WAAW,GAAAW,KAAA,CAAXX,WAAW;MAAA,IAAAY,SAAA,GAAAxF,0BAAA,CACb4E,WAAW;QAAAa,KAAA;MAAA;QAApC,KAAAD,SAAA,CAAA7E,CAAA,MAAA8E,KAAA,GAAAD,SAAA,CAAA5E,CAAA,IAAAC,IAAA,GAAsC;UAAA,IAA3B6E,UAAU,GAAAD,KAAA,CAAA3E,KAAA;UACnB,IAAI,IAAA6E,iCAAiB,EAACpB,GAAG,EAAEmB,UAAU,CAACE,OAAO,CAAC,EAAE;YAC9C,OAAO,IAAI;UACb;QACF;MAAC,SAAAC,GAAA;QAAAL,SAAA,CAAAtF,CAAA,CAAA2F,GAAA;MAAA;QAAAL,SAAA,CAAAzE,CAAA;MAAA;MAED,OAAO,KAAK;IACd,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACE+E,iBAAiB,WAAjBA,iBAAiBA,CAACvB,GAAW,EAAU;IACrC,OAAO,IAAAwB,2BAAkB,EAACxB,GAAG,EAAE,IAAI,CAACxB,cAAc,CAAC;EACrD,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEsC,GAAG,WAAHA,GAAGA,CAAC9B,SAAiB,EAAEN,YAA2B,EAAsB;IACtE,IAAMQ,aAAa,GAAG,IAAI,CAACH,iBAAiB,CAACC,SAAS,EAAEN,YAAY,CAAC;IAErE,OAAOQ,aAAa,GAAGA,aAAa,CAAC4B,GAAG,CAAC,CAAC,GAAGL,SAAS;EACxD,CAAC;EAED;AACF;AACA;AACA;AACA;EACEgB,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAkB;IACjC,WAAA5C,mBAAA,CAAAC,OAAA,EAAW,IAAI,CAACN,cAAc;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEkD,oBAAoB,WAApBA,oBAAoBA,CAAC1B,GAAW,EAAsB;IACpD,IAAMrB,cAAc,GAAG,IAAI,CAACF,qBAAqB,CAAC,CAAC;IAEnD,IAAMkD,2BAA2B,GAAGhD,cAAc,CAACM,IAAI,CAAC,UAACC,aAA6B;MAAA,OACpFA,aAAa,CAAC0C,QAAQ,CAAC5B,GAAG,CAAC;IAAA,CAC7B,CAAC;;IAED;IACA,IAAI,CAAC2B,2BAA2B,EAAE;MAChC,OAAOlB,SAAS;IAClB;IAEA,OAAOkB,2BAA2B,CAACb,GAAG,CAAC,CAAC;EAC1C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEe,iBAAiB,WAAjBA,iBAAiBA,CAACrD,cAA6B,EAAQ;IACrD,IAAI,CAACA,cAAc,GAAG,IAAAsD,gCAAuB,EAACtD,cAAc,CAAC;EAC/D,CAAC;EAED;AACF;AACA;AACA;AACA;EACEuD,iBAAiB,WAAjBA,iBAAiBA,CAACC,iBAAgC,EAAQ;IACxD,IAAI,CAACxD,cAAc,GAAG,IAAAyD,aAAK,EAAC,IAAI,CAACzD,cAAc,EAAE,IAAAsD,gCAAuB,EAACE,iBAAiB,CAAC,CAAC;EAC9F,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,mBAAmB,WAAnBA,mBAAmBA,CACjBxD,YAA0B,EAC1BC,cAAqC,EACrCJ,SAAkB,EAClB;IAAA,IAAA4D,MAAA;IACA,IAAMC,qBAAqB,GAAG,IAAI,CAACvE,aAAa,CAACa,YAAY,CAAC;IAE9D,IAAM2D,qBAAqB,GAAGD,qBAAqB,aAArBA,qBAAqB,uBAArBA,qBAAqB,CAAEE,MAAM,CAAC,UAACpD,aAAa;MAAA,OACxEP,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAE4D,KAAK,CAAC,UAAAC,KAAA;QAAA,IAAErD,EAAE,GAAAqD,KAAA,CAAFrD,EAAE;QAAA,OAAMA,EAAE,KAAKD,aAAa,CAACC,EAAE;MAAA,EAAC;IAAA,CAC1D,CAAC;IAED,IAAI,CAACO,qBAAqB,CAAChB,YAAY,EAAE2D,qBAAqB,CAAC;IAE/D1D,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEY,OAAO,CAAC,UAACkD,UAAU,EAAK;MAAA,IAAAC,qBAAA;MACtC,IAAMxD,aAAa,GAAGiD,MAAI,CAACpD,iBAAiB,CAAC0D,UAAU,CAACtD,EAAE,EAAET,YAAY,CAAC;MACzE+D,UAAU,aAAVA,UAAU,wBAAAC,qBAAA,GAAVD,UAAU,CAAEpC,WAAW,cAAAqC,qBAAA,uBAAvBA,qBAAA,CAAyBC,IAAI,CAAC,UAAChG,CAAC,EAAEiG,CAAC,EAAK;QACtC,IAAIjG,CAAC,CAACkG,QAAQ,GAAG,CAAC,IAAID,CAAC,CAACC,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC;QAC9C,IAAIlG,CAAC,CAACkG,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC;QAC5B,IAAID,CAAC,CAACC,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAE7B,OAAOlG,CAAC,CAACkG,QAAQ,GAAGD,CAAC,CAACC,QAAQ;MAChC,CAAC,CAAC;MACF,IAAI3D,aAAa,EAAE;QACjBA,aAAa,CAACmB,WAAW,GAAGoC,UAAU,CAACpC,WAAW,IAAI,EAAE;MAC1D,CAAC,MAAM;QACL8B,MAAI,CAAC/C,mBAAmB,CAACV,YAAY,EAAE,CAAC,IAAIoE,sBAAa,CAACL,UAAU,CAAC,CAAC,CAAC;MACzE;IACF,CAAC,CAAC;IAEF,IAAI,CAAClE,SAAS,GAAGA,SAAS;IAC1B,IAAI,CAACJ,MAAM,CAACO,YAAY,CAAC,CAACN,KAAK,GAAG,IAAI;IACtC,IAAI,CAAC2E,OAAO,CAACrE,YAAY,CAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEsE,cAAc,WAAdA,cAAcA,CAACtE,YAA0B,EAAEuE,OAAgB,EAAiB;IAAA,IAAAC,MAAA;IAC1E,OAAO,IAAAC,QAAA,CAAArE,OAAA,CAAkB,UAACsE,OAAO,EAAEC,MAAM,EAAK;MAC5C,IAAIH,MAAI,CAAC/E,MAAM,CAACO,YAAY,CAAC,CAACN,KAAK,EAAE;QACnCgF,OAAO,CAAC,CAAC;MACX;MAEA,IAAME,gBAAgB,GAAG,OAAOL,OAAO,KAAK,QAAQ,IAAIA,OAAO,IAAI,CAAC,GAAGA,OAAO,GAAG,EAAE;MAEnF,IAAMM,YAAY,GAAGC,UAAU,CAC7B;QAAA,OACEH,MAAM,CACJ,IAAII,KAAK,iDAAA7E,MAAA,CACyCF,YAAY,0BAC9D,CACF,CAAC;MAAA,GACH4E,gBAAgB,GAAG,IACrB,CAAC;MAEDJ,MAAI,CAACQ,IAAI,CAAChF,YAAY,EAAE,YAAM;QAC5BiF,YAAY,CAACJ,YAAY,CAAC;QAC1BH,OAAO,CAAC,CAAC;MACX,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;AACF,CAAC,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAA/E,OAAA,GAEYtB,cAAc","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_ampersandState","_interopRequireDefault","require","_lodash","_serviceDetail","_domains","_serviceCatalog","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ServiceCatalog","AmpState","extend","namespace","props","serviceGroups","discovery","override","preauth","postauth","signin","status","ready","collecting","isReady","timestamp","allowedDomains","_getAllServiceDetails","serviceGroup","serviceDetails","concat","_toConsumableArray2","default","_getServiceDetail","clusterId","find","serviceDetail","id","_loadServiceDetails","_this","existingService","forEach","service","push","_unloadServiceDetails","_this2","splice","indexOf","clean","findClusterId","url","_allServiceDetails$fi","incomingUrlObj","URL","allServiceDetails","serviceUrls","_ref","host","_unused","undefined","findServiceFromClusterId","_ref2","arguments","serviceName","get","findServiceDetailFromUrl","candidateUrl","_unused2","_ref3","_iterator","_step","serviceUrl","matchesParsedCatalogUrl","parseCatalogUrl","baseUrl","err","findAllowedDomain","matchAllowedDomain","getAllowedDomains","markFailedServiceUrl","serviceDetailWithFailedHost","failHost","setAllowedDomains","normalizeAllowedDomains","addAllowedDomains","newAllowedDomains","union","updateServiceGroups","_this3","currentServiceDetails","unusedServicesDetails","filter","every","_ref4","serviceObj","_serviceObj$serviceUr","sort","b","priority","ServiceDetail","trigger","waitForCatalog","timeout","_this4","_promise","resolve","reject","validatedTimeout","timeoutTimer","setTimeout","Error","once","clearTimeout","_default","exports"],"sources":["service-catalog.ts"],"sourcesContent":["import AmpState from 'ampersand-state';\n\nimport {union} from 'lodash';\nimport ServiceDetail from './service-detail';\nimport {IServiceDetail, ServiceGroup} from './types';\nimport {matchAllowedDomain, normalizeAllowedDomains} from '../domains';\nimport {matchesParsedCatalogUrl, parseCatalogUrl} from '../services/service-catalog';\n\n/**\n * @class\n */\nconst ServiceCatalog = AmpState.extend({\n namespace: 'ServiceCatalog',\n\n props: {\n serviceGroups: [\n 'object',\n true,\n () => ({\n discovery: [],\n override: [],\n preauth: [],\n postauth: [],\n signin: [],\n }),\n ],\n status: [\n 'object',\n true,\n () => ({\n discovery: {\n ready: false,\n collecting: false,\n },\n override: {\n ready: false,\n collecting: false,\n },\n preauth: {\n ready: false,\n collecting: false,\n },\n postauth: {\n ready: false,\n collecting: false,\n },\n signin: {\n ready: false,\n collecting: false,\n },\n }),\n ],\n isReady: ['boolean', false, false],\n timestamp: ['string', false, ''],\n allowedDomains: ['array', false, () => []],\n },\n\n /**\n * @private\n * Get all service details for a given service group or return all details if no group is specified.\n * @param {ServiceGroup} serviceGroup - The name of the service group to retrieve details for.\n * @returns {Array<IServiceDetail>} - An array of service details.\n */\n _getAllServiceDetails(serviceGroup?: ServiceGroup): Array<IServiceDetail> {\n const serviceDetails =\n typeof serviceGroup === 'string'\n ? this.serviceGroups[serviceGroup] || []\n : [\n ...this.serviceGroups.override,\n ...this.serviceGroups.postauth,\n ...this.serviceGroups.signin,\n ...this.serviceGroups.preauth,\n ...this.serviceGroups.discovery,\n ];\n\n return serviceDetails;\n },\n\n /**\n * @private\n * Search the service details array to locate a `ServiceDetails`\n * class object based on its id.\n * @param {string} clusterId\n * @param {ServiceGroup} [serviceGroup]\n * @returns {IServiceDetail}\n */\n _getServiceDetail(clusterId: string, serviceGroup?: ServiceGroup): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails(serviceGroup);\n\n return serviceDetails.find((serviceDetail: IServiceDetail) => serviceDetail.id === clusterId);\n },\n\n /**\n * @private\n * Safely load one or more `ServiceDetail`s into this `ServiceCatalog` instance.\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _loadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (!existingService) {\n this.serviceGroups[serviceGroup].push(service);\n }\n });\n },\n\n /**\n * @private\n * Safely unload one or more `ServiceDetail`s into this `Services` instance\n * @param {ServiceGroup} serviceGroup\n * @param {Array<ServiceDetail>} serviceDetails\n * @returns {void}\n */\n _unloadServiceDetails(serviceGroup: ServiceGroup, serviceDetails: Array<IServiceDetail>): void {\n // declare namespaces outside of loop\n let existingService: IServiceDetail | undefined;\n\n serviceDetails?.forEach((service) => {\n existingService = this._getServiceDetail(service.id, serviceGroup);\n\n if (existingService) {\n this.serviceGroups[serviceGroup].splice(\n this.serviceGroups[serviceGroup].indexOf(existingService),\n 1\n );\n }\n });\n },\n\n /**\n * Clear all collected catalog data and reset catalog status.\n *\n * @returns {void}\n */\n clean(): void {\n this.serviceGroups.preauth.length = 0;\n this.serviceGroups.signin.length = 0;\n this.serviceGroups.postauth.length = 0;\n this.status.preauth = {ready: false};\n this.status.signin = {ready: false};\n this.status.postauth = {ready: false};\n },\n\n /**\n * Search over all service groups to find a cluster id based\n * on a given url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {string | undefined} - ClusterId of a given url\n */\n findClusterId(url: string): string | undefined {\n try {\n const incomingUrlObj = new URL(url);\n const allServiceDetails = this._getAllServiceDetails();\n\n return allServiceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.serviceUrls.find(({host}) => host === incomingUrlObj.host)\n )?.id;\n } catch {\n // If the URL is invalid or can't be found, return undefined\n return undefined;\n }\n },\n\n /**\n * Search over all service groups and return a service value from a provided\n * clusterId.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {ServiceGroup} [params.serviceGroup] - specify service group\n * @returns {object} service\n * @returns {string} service.name\n * @returns {string} service.url\n */\n findServiceFromClusterId(\n {clusterId, serviceGroup} = {} as {clusterId: string; serviceGroup?: ServiceGroup}\n ): {name: string; url: string} | undefined {\n const serviceDetails = this._getServiceDetail(clusterId, serviceGroup);\n\n if (serviceDetails) {\n return {\n name: serviceDetails.serviceName,\n url: serviceDetails.get(),\n };\n }\n\n return undefined;\n },\n\n /**\n * Find a service based on the provided url.\n * @param {string} url - Must be parsable by `Url`\n * @returns {IServiceDetail} - ServiceDetail assocated with provided url\n */\n findServiceDetailFromUrl(url: string): IServiceDetail | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n let candidateUrl: URL;\n\n try {\n candidateUrl = new URL(url);\n } catch {\n return undefined;\n }\n\n return serviceDetails.find(({serviceUrls}) => {\n for (const serviceUrl of serviceUrls) {\n if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.baseUrl))) {\n return true;\n }\n }\n\n return false;\n });\n },\n\n /**\n * Finds an allowed domain that matches a specific url. The url's hostname\n * must be the allowed domain itself or a subdomain of it.\n *\n * @param {string} url - The url to match the allowed domains against.\n * @returns {string} - The matching allowed domain.\n */\n findAllowedDomain(url: string): string {\n return matchAllowedDomain(url, this.allowedDomains);\n },\n\n /**\n * Get a service url from the current services list by name. Return undefined\n * if the service is not found.\n * @param {string} clusterId\n * @param {ServiceGroup} serviceGroup\n * @returns {string | undefined}\n */\n get(clusterId: string, serviceGroup?: ServiceGroup): string | undefined {\n const serviceDetail = this._getServiceDetail(clusterId, serviceGroup);\n\n return serviceDetail ? serviceDetail.get() : undefined;\n },\n\n /**\n * Get the current allowed domains list.\n *\n * @returns {Array<string>} - the current allowed domains list.\n */\n getAllowedDomains(): Array<string> {\n return [...this.allowedDomains];\n },\n\n /**\n * Mark a priority host service url as failed.\n * This will mark the host associated with the\n * `ServiceDetail` to be removed from the its\n * respective host array, and then return the next\n * viable host from the `ServiceDetail` host array,\n * or the `ServiceDetail` default url if no other priority\n * hosts are available, or if `noPriorityHosts` is set to\n * `true`.\n * @param {string} url\n * @returns {string}\n */\n markFailedServiceUrl(url: string): string | undefined {\n const serviceDetails = this._getAllServiceDetails();\n\n const serviceDetailWithFailedHost = serviceDetails.find((serviceDetail: IServiceDetail) =>\n serviceDetail.failHost(url)\n );\n\n // if we couldn't find the url we wanted to fail, return undefined\n if (!serviceDetailWithFailedHost) {\n return undefined;\n }\n\n return serviceDetailWithFailedHost.get();\n },\n\n /**\n * Set the allowed domains for the catalog.\n *\n * @param {Array<string>} allowedDomains - allowed domains to be assigned.\n * @returns {void}\n */\n setAllowedDomains(allowedDomains: Array<string>): void {\n this.allowedDomains = normalizeAllowedDomains(allowedDomains);\n },\n\n /**\n *\n * @param {Array<string>} newAllowedDomains - new allowed domains to add to existing set of allowed domains\n * @returns {void}\n */\n addAllowedDomains(newAllowedDomains: Array<string>): void {\n this.allowedDomains = union(this.allowedDomains, normalizeAllowedDomains(newAllowedDomains));\n },\n\n /**\n * Update the current list of `ServiceDetail`s against a provided\n * service hostmap.\n * @emits ServiceCatalog#preauthorized\n * @emits ServiceCatalog#postauthorized\n * @param {ServiceGroup} serviceGroup\n * @param {Array<IServiceDetail>} serviceDetails\n * @param {timestamp<string>} timestamp of the catalog\n * @returns {void}\n */\n updateServiceGroups(\n serviceGroup: ServiceGroup,\n serviceDetails: Array<IServiceDetail>,\n timestamp?: string\n ) {\n const currentServiceDetails = this.serviceGroups[serviceGroup];\n\n const unusedServicesDetails = currentServiceDetails?.filter((serviceDetail) =>\n serviceDetails?.every(({id}) => id !== serviceDetail.id)\n );\n\n this._unloadServiceDetails(serviceGroup, unusedServicesDetails);\n\n serviceDetails?.forEach((serviceObj) => {\n const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);\n serviceObj?.serviceUrls?.sort((a, b) => {\n if (a.priority < 0 && b.priority < 0) return 0;\n if (a.priority < 0) return 1;\n if (b.priority < 0) return -1;\n\n return a.priority - b.priority;\n });\n if (serviceDetail) {\n serviceDetail.serviceUrls = serviceObj.serviceUrls || [];\n } else {\n this._loadServiceDetails(serviceGroup, [new ServiceDetail(serviceObj)]);\n }\n });\n\n this.timestamp = timestamp;\n this.status[serviceGroup].ready = true;\n this.trigger(serviceGroup);\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject after a timeout of 60 seconds.\n * @param {ServiceGroup} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup: ServiceGroup, timeout?: number): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n if (this.status[serviceGroup].ready) {\n resolve();\n }\n\n const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;\n\n const timeoutTimer = setTimeout(\n () =>\n reject(\n new Error(\n `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`\n )\n ),\n validatedTimeout * 1000\n );\n\n this.once(serviceGroup, () => {\n clearTimeout(timeoutTimer);\n resolve();\n });\n });\n },\n});\n\nexport default ServiceCatalog;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1577,7 +1577,7 @@ var Services = _webexPlugin.default.extend({
|
|
|
1577
1577
|
}, _callee5);
|
|
1578
1578
|
})));
|
|
1579
1579
|
},
|
|
1580
|
-
version: "3.12.0-llmrefactor.
|
|
1580
|
+
version: "3.12.0-llmrefactor.7"
|
|
1581
1581
|
});
|
|
1582
1582
|
/* eslint-enable no-underscore-dangle */
|
|
1583
1583
|
var _default = exports.default = Services;
|
package/dist/plugins/logger.js
CHANGED
|
@@ -57,7 +57,7 @@ var Logger = _webexPlugin.default.extend({
|
|
|
57
57
|
info: wrapConsoleMethod('info'),
|
|
58
58
|
debug: wrapConsoleMethod('debug'),
|
|
59
59
|
trace: wrapConsoleMethod('trace'),
|
|
60
|
-
version: "3.12.0-llmrefactor.
|
|
60
|
+
version: "3.12.0-llmrefactor.7"
|
|
61
61
|
});
|
|
62
62
|
(0, _webexCore.registerPlugin)('logger', Logger);
|
|
63
63
|
var _default = exports.default = Logger;
|
package/dist/webex-core.js
CHANGED
|
@@ -98,7 +98,7 @@ var MAX_FILE_SIZE_IN_MB = 2048;
|
|
|
98
98
|
* @class
|
|
99
99
|
*/
|
|
100
100
|
var WebexCore = _ampersandState.default.extend((_obj = {
|
|
101
|
-
version: "3.12.0-llmrefactor.
|
|
101
|
+
version: "3.12.0-llmrefactor.7",
|
|
102
102
|
children: {
|
|
103
103
|
internal: _webexInternalCore.default
|
|
104
104
|
},
|
|
@@ -642,7 +642,7 @@ var WebexCore = _ampersandState.default.extend((_obj = {
|
|
|
642
642
|
});
|
|
643
643
|
}
|
|
644
644
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj), _obj));
|
|
645
|
-
WebexCore.version = "3.12.0-llmrefactor.
|
|
645
|
+
WebexCore.version = "3.12.0-llmrefactor.7";
|
|
646
646
|
(0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
|
|
647
647
|
(0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
|
|
648
648
|
var _default = exports.default = WebexCore;
|
package/package.json
CHANGED
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"@sinonjs/fake-timers": "^6.0.1",
|
|
34
34
|
"@webex/babel-config-legacy": "0.0.0",
|
|
35
35
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
36
|
-
"@webex/internal-plugin-device": "3.12.0-llmrefactor.
|
|
36
|
+
"@webex/internal-plugin-device": "3.12.0-llmrefactor.7",
|
|
37
37
|
"@webex/jest-config-legacy": "0.0.0",
|
|
38
38
|
"@webex/legacy-tools": "0.0.0",
|
|
39
|
-
"@webex/plugin-logger": "3.12.0-llmrefactor.
|
|
39
|
+
"@webex/plugin-logger": "3.12.0-llmrefactor.7",
|
|
40
40
|
"@webex/test-helper-chai": "3.12.0-llmrefactor.2",
|
|
41
41
|
"@webex/test-helper-make-local-url": "3.12.0-llmrefactor.2",
|
|
42
42
|
"@webex/test-helper-mocha": "3.12.0-llmrefactor.2",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"test:style": "eslint ./src/**/*.*",
|
|
74
74
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
75
75
|
},
|
|
76
|
-
"version": "3.12.0-llmrefactor.
|
|
76
|
+
"version": "3.12.0-llmrefactor.7"
|
|
77
77
|
}
|
|
@@ -6,46 +6,97 @@ import {union} from 'lodash';
|
|
|
6
6
|
import ServiceUrl from './service-url';
|
|
7
7
|
import {matchAllowedDomain, normalizeAllowedDomains} from '../domains';
|
|
8
8
|
|
|
9
|
+
// Catalog base URLs are a small, stable set, so their parsed origin/path is
|
|
10
|
+
// memoized to avoid repeated `new URL()` work when scanning the catalog on the
|
|
11
|
+
// request hot path.
|
|
12
|
+
const catalogUrlCache = new Map();
|
|
13
|
+
|
|
9
14
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
15
|
+
* Parse a catalog URL into the origin and normalized path used for matching,
|
|
16
|
+
* memoizing the result. Returns null when the URL is unparsable.
|
|
12
17
|
*
|
|
13
|
-
* @param {string}
|
|
14
|
-
* @
|
|
15
|
-
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
18
|
+
* @param {string} catalogUrlString - The catalog URL to parse
|
|
19
|
+
* @returns {{origin: string, path: string} | null} - Parsed catalog URL, or null
|
|
16
20
|
*/
|
|
17
|
-
export function
|
|
21
|
+
export function parseCatalogUrl(catalogUrlString) {
|
|
22
|
+
if (catalogUrlCache.has(catalogUrlString)) {
|
|
23
|
+
return catalogUrlCache.get(catalogUrlString);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let parsed = null;
|
|
27
|
+
|
|
18
28
|
try {
|
|
19
|
-
const candidateUrl = new URL(candidateUrlString);
|
|
20
29
|
const catalogUrl = new URL(catalogUrlString);
|
|
21
30
|
|
|
22
|
-
// Origins must match exactly (scheme + host + port)
|
|
23
|
-
if (candidateUrl.origin !== catalogUrl.origin) {
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
31
|
// Normalize paths by removing trailing slashes (except root "/")
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
parsed = {origin: catalogUrl.origin, path: catalogUrl.pathname.replace(/\/$/, '') || '/'};
|
|
33
|
+
} catch {
|
|
34
|
+
parsed = null;
|
|
35
|
+
}
|
|
30
36
|
|
|
31
|
-
|
|
32
|
-
// Root path matches everything under this origin
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
37
|
+
catalogUrlCache.set(catalogUrlString, parsed);
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
|
|
39
|
-
// nextChar is undefined for exact match, '/' for valid extension
|
|
40
|
-
const nextChar = candidatePath[catalogPath.length];
|
|
39
|
+
return parsed;
|
|
40
|
+
}
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Check if an already-parsed candidate URL matches a parsed catalog URL with
|
|
44
|
+
* proper origin validation. Allocates nothing, so it is safe to call in a tight
|
|
45
|
+
* loop over the whole catalog.
|
|
46
|
+
*
|
|
47
|
+
* @param {URL} candidateUrl - The parsed candidate URL to validate
|
|
48
|
+
* @param {{origin: string, path: string} | null} parsedCatalogUrl - The parsed catalog URL
|
|
49
|
+
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
50
|
+
*/
|
|
51
|
+
export function matchesParsedCatalogUrl(candidateUrl, parsedCatalogUrl) {
|
|
52
|
+
if (!candidateUrl || !parsedCatalogUrl) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
44
55
|
|
|
56
|
+
// Origins must match exactly (scheme + host + port)
|
|
57
|
+
if (candidateUrl.origin !== parsedCatalogUrl.origin) {
|
|
45
58
|
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const catalogPath = parsedCatalogUrl.path;
|
|
62
|
+
|
|
63
|
+
if (catalogPath === '/') {
|
|
64
|
+
// Root path matches everything under this origin
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const candidatePath = candidateUrl.pathname;
|
|
69
|
+
|
|
70
|
+
if (candidatePath.startsWith(catalogPath)) {
|
|
71
|
+
// Ensure we're at a path boundary, not mid-segment
|
|
72
|
+
// e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
|
|
73
|
+
// nextChar is undefined for exact match, '/' for valid extension
|
|
74
|
+
const nextChar = candidatePath[catalogPath.length];
|
|
75
|
+
|
|
76
|
+
return nextChar === '/' || nextChar === undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Check if a candidate URL matches a catalog URL with proper origin validation.
|
|
84
|
+
* This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
|
|
85
|
+
*
|
|
86
|
+
* @param {string} candidateUrlString - The URL to validate
|
|
87
|
+
* @param {string} catalogUrlString - The catalog URL to compare against
|
|
88
|
+
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
89
|
+
*/
|
|
90
|
+
export function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
|
|
91
|
+
let candidateUrl;
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
candidateUrl = new URL(candidateUrlString);
|
|
46
95
|
} catch {
|
|
47
96
|
return false;
|
|
48
97
|
}
|
|
98
|
+
|
|
99
|
+
return matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(catalogUrlString));
|
|
49
100
|
}
|
|
50
101
|
|
|
51
102
|
/* eslint-disable no-underscore-dangle */
|
|
@@ -289,16 +340,17 @@ const ServiceCatalog = AmpState.extend({
|
|
|
289
340
|
];
|
|
290
341
|
|
|
291
342
|
// Invalid URLs cannot match any service
|
|
343
|
+
let candidateUrl;
|
|
344
|
+
|
|
292
345
|
try {
|
|
293
|
-
|
|
294
|
-
new URL(url);
|
|
346
|
+
candidateUrl = new URL(url);
|
|
295
347
|
} catch {
|
|
296
348
|
return undefined;
|
|
297
349
|
}
|
|
298
350
|
|
|
299
351
|
return serviceUrls.find((serviceUrl) => {
|
|
300
352
|
// Check if the URL matches the default URL with proper origin validation
|
|
301
|
-
if (
|
|
353
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.defaultUrl))) {
|
|
302
354
|
return true;
|
|
303
355
|
}
|
|
304
356
|
|
|
@@ -307,7 +359,7 @@ const ServiceCatalog = AmpState.extend({
|
|
|
307
359
|
const alternateUrl = new URL(serviceUrl.defaultUrl);
|
|
308
360
|
alternateUrl.host = host.host;
|
|
309
361
|
|
|
310
|
-
if (
|
|
362
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(alternateUrl.toString()))) {
|
|
311
363
|
return true;
|
|
312
364
|
}
|
|
313
365
|
}
|
|
@@ -4,7 +4,7 @@ import {union} from 'lodash';
|
|
|
4
4
|
import ServiceDetail from './service-detail';
|
|
5
5
|
import {IServiceDetail, ServiceGroup} from './types';
|
|
6
6
|
import {matchAllowedDomain, normalizeAllowedDomains} from '../domains';
|
|
7
|
-
import {
|
|
7
|
+
import {matchesParsedCatalogUrl, parseCatalogUrl} from '../services/service-catalog';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* @class
|
|
@@ -200,9 +200,17 @@ const ServiceCatalog = AmpState.extend({
|
|
|
200
200
|
findServiceDetailFromUrl(url: string): IServiceDetail | undefined {
|
|
201
201
|
const serviceDetails = this._getAllServiceDetails();
|
|
202
202
|
|
|
203
|
+
let candidateUrl: URL;
|
|
204
|
+
|
|
205
|
+
try {
|
|
206
|
+
candidateUrl = new URL(url);
|
|
207
|
+
} catch {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
|
|
203
211
|
return serviceDetails.find(({serviceUrls}) => {
|
|
204
212
|
for (const serviceUrl of serviceUrls) {
|
|
205
|
-
if (
|
|
213
|
+
if (matchesParsedCatalogUrl(candidateUrl, parseCatalogUrl(serviceUrl.baseUrl))) {
|
|
206
214
|
return true;
|
|
207
215
|
}
|
|
208
216
|
}
|
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
import {assert} from '@webex/test-helper-chai';
|
|
6
6
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
7
7
|
import {Services} from '@webex/webex-core';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
matchesCatalogUrl,
|
|
10
|
+
matchesParsedCatalogUrl,
|
|
11
|
+
parseCatalogUrl,
|
|
12
|
+
} from '../../../../src/lib/services/service-catalog';
|
|
9
13
|
|
|
10
14
|
describe('matchesCatalogUrl()', () => {
|
|
11
15
|
describe('origin validation', () => {
|
|
@@ -94,6 +98,86 @@ describe('matchesCatalogUrl()', () => {
|
|
|
94
98
|
});
|
|
95
99
|
});
|
|
96
100
|
|
|
101
|
+
describe('parseCatalogUrl()', () => {
|
|
102
|
+
it('returns the origin and pathname for a valid url', () => {
|
|
103
|
+
assert.deepEqual(parseCatalogUrl('https://example.com/api/v1'), {
|
|
104
|
+
origin: 'https://example.com',
|
|
105
|
+
path: '/api/v1',
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('strips a trailing slash from the path', () => {
|
|
110
|
+
assert.deepEqual(parseCatalogUrl('https://example.com/api/v1/'), {
|
|
111
|
+
origin: 'https://example.com',
|
|
112
|
+
path: '/api/v1',
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('normalizes a root url to the "/" path', () => {
|
|
117
|
+
assert.deepEqual(parseCatalogUrl('https://example.com'), {
|
|
118
|
+
origin: 'https://example.com',
|
|
119
|
+
path: '/',
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('returns null for an unparsable url', () => {
|
|
124
|
+
assert.isNull(parseCatalogUrl('not-a-url'));
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('memoizes results, returning the same reference for repeated calls', () => {
|
|
128
|
+
const first = parseCatalogUrl('https://memoized.example.com/api/v1');
|
|
129
|
+
const second = parseCatalogUrl('https://memoized.example.com/api/v1');
|
|
130
|
+
|
|
131
|
+
assert.strictEqual(first, second);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('matchesParsedCatalogUrl()', () => {
|
|
136
|
+
it('returns true when the candidate is under the catalog origin and path', () => {
|
|
137
|
+
assert.isTrue(
|
|
138
|
+
matchesParsedCatalogUrl(
|
|
139
|
+
new URL('https://example.com/api/v1/users'),
|
|
140
|
+
parseCatalogUrl('https://example.com/api/v1')
|
|
141
|
+
)
|
|
142
|
+
);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('returns false when origins differ (SECURITY)', () => {
|
|
146
|
+
assert.isFalse(
|
|
147
|
+
matchesParsedCatalogUrl(
|
|
148
|
+
new URL('https://trusted.example.attacker.com/activities/id'),
|
|
149
|
+
parseCatalogUrl('https://trusted.example')
|
|
150
|
+
)
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('returns false when the catalog path is not matched at a boundary (SECURITY)', () => {
|
|
155
|
+
assert.isFalse(
|
|
156
|
+
matchesParsedCatalogUrl(
|
|
157
|
+
new URL('https://example.com/api/v1extra/something'),
|
|
158
|
+
parseCatalogUrl('https://example.com/api/v1')
|
|
159
|
+
)
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('returns true for a root catalog path', () => {
|
|
164
|
+
assert.isTrue(
|
|
165
|
+
matchesParsedCatalogUrl(
|
|
166
|
+
new URL('https://example.com/any/path'),
|
|
167
|
+
parseCatalogUrl('https://example.com/')
|
|
168
|
+
)
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('returns false when the candidate url is missing', () => {
|
|
173
|
+
assert.isFalse(matchesParsedCatalogUrl(undefined, parseCatalogUrl('https://example.com/api')));
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('returns false when the parsed catalog url is null', () => {
|
|
177
|
+
assert.isFalse(matchesParsedCatalogUrl(new URL('https://example.com/api'), null));
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
97
181
|
/* eslint-disable no-underscore-dangle */
|
|
98
182
|
describe('webex-core', () => {
|
|
99
183
|
describe('ServiceCatalog', () => {
|
|
@@ -396,6 +396,16 @@ describe('webex-core', () => {
|
|
|
396
396
|
|
|
397
397
|
assert.isUndefined(service);
|
|
398
398
|
});
|
|
399
|
+
|
|
400
|
+
it('returns undefined for an unparsable url', () => {
|
|
401
|
+
const exampleService = {
|
|
402
|
+
serviceUrls: [{baseUrl: 'https://example.com/resource'}],
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
catalog.serviceGroups.postauth.push(exampleService);
|
|
406
|
+
|
|
407
|
+
assert.isUndefined(catalog.findServiceDetailFromUrl('not-a-url'));
|
|
408
|
+
});
|
|
399
409
|
});
|
|
400
410
|
});
|
|
401
411
|
});
|