@webex/webex-core 3.12.0-next.43 → 3.12.0-next.45

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.
Files changed (35) hide show
  1. package/dist/config.js +9 -0
  2. package/dist/config.js.map +1 -1
  3. package/dist/index.js +7 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/interceptors/catalog-url.js +87 -0
  6. package/dist/interceptors/catalog-url.js.map +1 -0
  7. package/dist/lib/batcher.js +1 -1
  8. package/dist/lib/credentials/credentials.js +1 -1
  9. package/dist/lib/credentials/token.js +1 -1
  10. package/dist/lib/services/service-catalog.js +51 -6
  11. package/dist/lib/services/service-catalog.js.map +1 -1
  12. package/dist/lib/services/services.js +5 -3
  13. package/dist/lib/services/services.js.map +1 -1
  14. package/dist/lib/services-v2/service-catalog.js +2 -1
  15. package/dist/lib/services-v2/service-catalog.js.map +1 -1
  16. package/dist/lib/services-v2/services-v2.js +7 -4
  17. package/dist/lib/services-v2/services-v2.js.map +1 -1
  18. package/dist/plugins/logger.js +1 -1
  19. package/dist/webex-core.js +11 -3
  20. package/dist/webex-core.js.map +1 -1
  21. package/package.json +3 -3
  22. package/src/config.js +10 -0
  23. package/src/index.js +1 -0
  24. package/src/interceptors/catalog-url.js +66 -0
  25. package/src/lib/services/service-catalog.js +54 -6
  26. package/src/lib/services/services.js +10 -3
  27. package/src/lib/services-v2/service-catalog.ts +2 -1
  28. package/src/lib/services-v2/services-v2.ts +15 -4
  29. package/src/webex-core.js +8 -0
  30. package/test/unit/spec/credentials/credentials.js +31 -0
  31. package/test/unit/spec/interceptors/catalog-url.js +224 -0
  32. package/test/unit/spec/services/service-catalog.js +191 -0
  33. package/test/unit/spec/services-v2/service-catalog.ts +31 -0
  34. package/test/unit/spec/services-v2/services-v2.ts +20 -0
  35. package/test/unit/spec/webex-core.js +53 -1
package/dist/config.js CHANGED
@@ -84,6 +84,15 @@ var _default = exports.default = {
84
84
  * @type {boolean}
85
85
  */
86
86
  validateDomains: true,
87
+ /**
88
+ * When true, enables the CatalogUrlInterceptor which validates that all
89
+ * outbound request URLs are in the service catalog or allowed domains.
90
+ * This prevents SSRF attacks where attacker-controlled URLs could be
91
+ * sent to the SDK.
92
+ *
93
+ * @type {boolean}
94
+ */
95
+ validateCatalogUrls: false,
87
96
  /**
88
97
  * services that don't need auth validation
89
98
  */
@@ -1 +1 @@
1
- {"version":3,"names":["_storage","require","_credentialsConfig","_interopRequireDefault","_default","exports","default","maxAppLevelRedirects","maxLocusRedirects","maxAuthenticationReplays","maxReconnectAttempts","onBeforeLogout","trackingIdPrefix","trackingIdSuffix","AlternateLogger","undefined","credentials","CredentialsConfig","fedramp","process","env","ENABLE_FEDRAMP","services","useUserOnboardingServiceForActivations","useCatalogOverride","skipPreauthCatalogOnUnauthenticated","catalogInitTimeout","discovery","hydra","HYDRA_SERVICE_URL","sqdiscovery","SQDISCOVERY_SERVICE_URL","u2c","U2C_SERVICE_URL","validateDomains","servicesNotNeedValidation","allowedDomains","device","preDiscoveryServices","hydraServiceUrl","metrics","type","calling","cacheU2C","payloadTransformer","predicates","transforms","storage","boundedAdapter","MemoryStoreAdapter","unboundedAdapter"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {MemoryStoreAdapter} from './lib/storage';\nimport CredentialsConfig from './credentials-config';\n\nexport default {\n maxAppLevelRedirects: 10,\n maxLocusRedirects: 5,\n maxAuthenticationReplays: 1,\n maxReconnectAttempts: 1,\n onBeforeLogout: [],\n trackingIdPrefix: 'webex-js-sdk',\n trackingIdSuffix: '',\n AlternateLogger: undefined,\n credentials: new CredentialsConfig(),\n fedramp: process.env.ENABLE_FEDRAMP || false,\n services: {\n /**\n * When true, uses the user-onboarding service for user activation.\n * When false (default), uses the license service.\n *\n * @type {boolean}\n */\n useUserOnboardingServiceForActivations: false,\n\n /**\n * When true, requests the U2C catalog override.\n *\n * @type {boolean}\n */\n useCatalogOverride: false,\n\n /**\n * When true, skips fetching the preauth catalog during initialization\n * while the user is unauthenticated (no existing token). The catalog is\n * expected to be collected manually later instead. When false (default),\n * the preauth catalog is collected automatically during init.\n *\n * @type {boolean}\n */\n skipPreauthCatalogOnUnauthenticated: false,\n\n /**\n * Maximum time (in milliseconds) to wait for the initial service catalog\n * collection when `waitForCatalogInit` is enabled, before letting\n * `services.ready` (and therefore `webex.ready`) fire anyway. Prevents a\n * hung catalog request from leaving the app on a permanent spinner.\n *\n * @type {number}\n */\n catalogInitTimeout: 15000,\n\n /**\n * A list of services that are available prior to catalog collection.\n *\n * @type {Object}\n */\n discovery: {\n /**\n * The hydra discovery url.\n *\n * @type {string}\n */\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n\n /**\n * load balanced region info url\n */\n sqdiscovery: process.env.SQDISCOVERY_SERVICE_URL || 'https://ds.ciscospark.com/v1/region',\n\n /**\n * The u2c discovery url\n *\n * @type {string}\n */\n u2c: process.env.U2C_SERVICE_URL || 'https://u2c.wbx2.com/u2c/api/v1',\n },\n\n /**\n * When true, considers all urls in `allowedDomains` as safe for auth tokens\n *\n * @type {boolean}\n */\n validateDomains: true,\n\n /**\n * services that don't need auth validation\n */\n\n servicesNotNeedValidation: ['webex-appapi-service'],\n\n /**\n * Contains a list of allowed domain host addresses.\n *\n * @type {Array<string>}\n */\n allowedDomains: [],\n },\n device: {\n preDiscoveryServices: {\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n hydraServiceUrl: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n },\n validateDomains: true,\n },\n metrics: {\n type: ['behavioral', 'operational'],\n },\n calling: {\n /**\n * Controls whether U2C service catalogs should be cached and warmed from cache.\n * When false, the services layer will skip reading and writing the U2C cache.\n */\n cacheU2C: false,\n },\n payloadTransformer: {\n predicates: [],\n transforms: [],\n },\n storage: {\n boundedAdapter: MemoryStoreAdapter,\n unboundedAdapter: MemoryStoreAdapter,\n },\n};\n"],"mappings":";;;;;;;;AAMA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;AAEA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAKe;EACbC,oBAAoB,EAAE,EAAE;EACxBC,iBAAiB,EAAE,CAAC;EACpBC,wBAAwB,EAAE,CAAC;EAC3BC,oBAAoB,EAAE,CAAC;EACvBC,cAAc,EAAE,EAAE;EAClBC,gBAAgB,EAAE,cAAc;EAChCC,gBAAgB,EAAE,EAAE;EACpBC,eAAe,EAAEC,SAAS;EAC1BC,WAAW,EAAE,IAAIC,0BAAiB,CAAC,CAAC;EACpCC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAACC,cAAc,IAAI,KAAK;EAC5CC,QAAQ,EAAE;IACR;AACJ;AACA;AACA;AACA;AACA;IACIC,sCAAsC,EAAE,KAAK;IAE7C;AACJ;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mCAAmC,EAAE,KAAK;IAE1C;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;IACIC,SAAS,EAAE;MACT;AACN;AACA;AACA;AACA;MACMC,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MAEvE;AACN;AACA;MACMC,WAAW,EAAEX,OAAO,CAACC,GAAG,CAACW,uBAAuB,IAAI,qCAAqC;MAEzF;AACN;AACA;AACA;AACA;MACMC,GAAG,EAAEb,OAAO,CAACC,GAAG,CAACa,eAAe,IAAI;IACtC,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIC,eAAe,EAAE,IAAI;IAErB;AACJ;AACA;;IAEIC,yBAAyB,EAAE,CAAC,sBAAsB,CAAC;IAEnD;AACJ;AACA;AACA;AACA;IACIC,cAAc,EAAE;EAClB,CAAC;EACDC,MAAM,EAAE;IACNC,oBAAoB,EAAE;MACpBV,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MACvEU,eAAe,EAAEpB,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI;IACpD,CAAC;IACDK,eAAe,EAAE;EACnB,CAAC;EACDM,OAAO,EAAE;IACPC,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa;EACpC,CAAC;EACDC,OAAO,EAAE;IACP;AACJ;AACA;AACA;IACIC,QAAQ,EAAE;EACZ,CAAC;EACDC,kBAAkB,EAAE;IAClBC,UAAU,EAAE,EAAE;IACdC,UAAU,EAAE;EACd,CAAC;EACDC,OAAO,EAAE;IACPC,cAAc,EAAEC,2BAAkB;IAClCC,gBAAgB,EAAED;EACpB;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_storage","require","_credentialsConfig","_interopRequireDefault","_default","exports","default","maxAppLevelRedirects","maxLocusRedirects","maxAuthenticationReplays","maxReconnectAttempts","onBeforeLogout","trackingIdPrefix","trackingIdSuffix","AlternateLogger","undefined","credentials","CredentialsConfig","fedramp","process","env","ENABLE_FEDRAMP","services","useUserOnboardingServiceForActivations","useCatalogOverride","skipPreauthCatalogOnUnauthenticated","catalogInitTimeout","discovery","hydra","HYDRA_SERVICE_URL","sqdiscovery","SQDISCOVERY_SERVICE_URL","u2c","U2C_SERVICE_URL","validateDomains","validateCatalogUrls","servicesNotNeedValidation","allowedDomains","device","preDiscoveryServices","hydraServiceUrl","metrics","type","calling","cacheU2C","payloadTransformer","predicates","transforms","storage","boundedAdapter","MemoryStoreAdapter","unboundedAdapter"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {MemoryStoreAdapter} from './lib/storage';\nimport CredentialsConfig from './credentials-config';\n\nexport default {\n maxAppLevelRedirects: 10,\n maxLocusRedirects: 5,\n maxAuthenticationReplays: 1,\n maxReconnectAttempts: 1,\n onBeforeLogout: [],\n trackingIdPrefix: 'webex-js-sdk',\n trackingIdSuffix: '',\n AlternateLogger: undefined,\n credentials: new CredentialsConfig(),\n fedramp: process.env.ENABLE_FEDRAMP || false,\n services: {\n /**\n * When true, uses the user-onboarding service for user activation.\n * When false (default), uses the license service.\n *\n * @type {boolean}\n */\n useUserOnboardingServiceForActivations: false,\n\n /**\n * When true, requests the U2C catalog override.\n *\n * @type {boolean}\n */\n useCatalogOverride: false,\n\n /**\n * When true, skips fetching the preauth catalog during initialization\n * while the user is unauthenticated (no existing token). The catalog is\n * expected to be collected manually later instead. When false (default),\n * the preauth catalog is collected automatically during init.\n *\n * @type {boolean}\n */\n skipPreauthCatalogOnUnauthenticated: false,\n\n /**\n * Maximum time (in milliseconds) to wait for the initial service catalog\n * collection when `waitForCatalogInit` is enabled, before letting\n * `services.ready` (and therefore `webex.ready`) fire anyway. Prevents a\n * hung catalog request from leaving the app on a permanent spinner.\n *\n * @type {number}\n */\n catalogInitTimeout: 15000,\n\n /**\n * A list of services that are available prior to catalog collection.\n *\n * @type {Object}\n */\n discovery: {\n /**\n * The hydra discovery url.\n *\n * @type {string}\n */\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n\n /**\n * load balanced region info url\n */\n sqdiscovery: process.env.SQDISCOVERY_SERVICE_URL || 'https://ds.ciscospark.com/v1/region',\n\n /**\n * The u2c discovery url\n *\n * @type {string}\n */\n u2c: process.env.U2C_SERVICE_URL || 'https://u2c.wbx2.com/u2c/api/v1',\n },\n\n /**\n * When true, considers all urls in `allowedDomains` as safe for auth tokens\n *\n * @type {boolean}\n */\n validateDomains: true,\n\n /**\n * When true, enables the CatalogUrlInterceptor which validates that all\n * outbound request URLs are in the service catalog or allowed domains.\n * This prevents SSRF attacks where attacker-controlled URLs could be\n * sent to the SDK.\n *\n * @type {boolean}\n */\n validateCatalogUrls: false,\n\n /**\n * services that don't need auth validation\n */\n\n servicesNotNeedValidation: ['webex-appapi-service'],\n\n /**\n * Contains a list of allowed domain host addresses.\n *\n * @type {Array<string>}\n */\n allowedDomains: [],\n },\n device: {\n preDiscoveryServices: {\n hydra: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n hydraServiceUrl: process.env.HYDRA_SERVICE_URL || 'https://api.ciscospark.com/v1',\n },\n validateDomains: true,\n },\n metrics: {\n type: ['behavioral', 'operational'],\n },\n calling: {\n /**\n * Controls whether U2C service catalogs should be cached and warmed from cache.\n * When false, the services layer will skip reading and writing the U2C cache.\n */\n cacheU2C: false,\n },\n payloadTransformer: {\n predicates: [],\n transforms: [],\n },\n storage: {\n boundedAdapter: MemoryStoreAdapter,\n unboundedAdapter: MemoryStoreAdapter,\n },\n};\n"],"mappings":";;;;;;;;AAMA,IAAAA,QAAA,GAAAC,OAAA;AACA,IAAAC,kBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;AAEA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAKe;EACbC,oBAAoB,EAAE,EAAE;EACxBC,iBAAiB,EAAE,CAAC;EACpBC,wBAAwB,EAAE,CAAC;EAC3BC,oBAAoB,EAAE,CAAC;EACvBC,cAAc,EAAE,EAAE;EAClBC,gBAAgB,EAAE,cAAc;EAChCC,gBAAgB,EAAE,EAAE;EACpBC,eAAe,EAAEC,SAAS;EAC1BC,WAAW,EAAE,IAAIC,0BAAiB,CAAC,CAAC;EACpCC,OAAO,EAAEC,OAAO,CAACC,GAAG,CAACC,cAAc,IAAI,KAAK;EAC5CC,QAAQ,EAAE;IACR;AACJ;AACA;AACA;AACA;AACA;IACIC,sCAAsC,EAAE,KAAK;IAE7C;AACJ;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mCAAmC,EAAE,KAAK;IAE1C;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,kBAAkB,EAAE,KAAK;IAEzB;AACJ;AACA;AACA;AACA;IACIC,SAAS,EAAE;MACT;AACN;AACA;AACA;AACA;MACMC,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MAEvE;AACN;AACA;MACMC,WAAW,EAAEX,OAAO,CAACC,GAAG,CAACW,uBAAuB,IAAI,qCAAqC;MAEzF;AACN;AACA;AACA;AACA;MACMC,GAAG,EAAEb,OAAO,CAACC,GAAG,CAACa,eAAe,IAAI;IACtC,CAAC;IAED;AACJ;AACA;AACA;AACA;IACIC,eAAe,EAAE,IAAI;IAErB;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,mBAAmB,EAAE,KAAK;IAE1B;AACJ;AACA;;IAEIC,yBAAyB,EAAE,CAAC,sBAAsB,CAAC;IAEnD;AACJ;AACA;AACA;AACA;IACIC,cAAc,EAAE;EAClB,CAAC;EACDC,MAAM,EAAE;IACNC,oBAAoB,EAAE;MACpBX,KAAK,EAAET,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI,+BAA+B;MACvEW,eAAe,EAAErB,OAAO,CAACC,GAAG,CAACS,iBAAiB,IAAI;IACpD,CAAC;IACDK,eAAe,EAAE;EACnB,CAAC;EACDO,OAAO,EAAE;IACPC,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa;EACpC,CAAC;EACDC,OAAO,EAAE;IACP;AACJ;AACA;AACA;IACIC,QAAQ,EAAE;EACZ,CAAC;EACDC,kBAAkB,EAAE;IAClBC,UAAU,EAAE,EAAE;IACdC,UAAU,EAAE;EACd,CAAC;EACDC,OAAO,EAAE;IACPC,cAAc,EAAEC,2BAAkB;IAClCC,gBAAgB,EAAED;EACpB;AACF,CAAC","ignoreList":[]}
package/dist/index.js CHANGED
@@ -20,6 +20,12 @@ _Object$defineProperty(exports, "Batcher", {
20
20
  return _batcher.default;
21
21
  }
22
22
  });
23
+ _Object$defineProperty(exports, "CatalogUrlInterceptor", {
24
+ enumerable: true,
25
+ get: function get() {
26
+ return _catalogUrl.default;
27
+ }
28
+ });
23
29
  _Object$defineProperty(exports, "Credentials", {
24
30
  enumerable: true,
25
31
  get: function get() {
@@ -315,6 +321,7 @@ var _webexHttpError = _interopRequireDefault(require("./lib/webex-http-error"));
315
321
  var _statelessWebexPlugin = _interopRequireDefault(require("./lib/stateless-webex-plugin"));
316
322
  var _webexPlugin = _interopRequireDefault(require("./lib/webex-plugin"));
317
323
  var _auth = _interopRequireDefault(require("./interceptors/auth"));
324
+ var _catalogUrl = _interopRequireDefault(require("./interceptors/catalog-url"));
318
325
  var _networkTiming = _interopRequireDefault(require("./interceptors/network-timing"));
319
326
  var _payloadTransformer = _interopRequireDefault(require("./interceptors/payload-transformer"));
320
327
  var _redirect = _interopRequireDefault(require("./interceptors/redirect"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["require","_credentials","_services","_servicesV","_serviceConstants","_interopRequireWildcard","exports","serviceConstants","_storage","_webexCore","_webexHttpError","_interopRequireDefault","_statelessWebexPlugin","_webexPlugin","_auth","_networkTiming","_payloadTransformer","_redirect","_responseLogger","_requestEvent","_requestLogger","_requestTiming","_userAgent","_proxy","_webexTrackingId","_webexUserAgent","_rateLimit","_embargo","_defaultOptions","_hostmap","_service","_serverError","_batcher","_page","_config","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n *\n * Services is currently a part of webex-core due to how the contents of\n * the original internal-plugin-services needed to be accessed when webex-core\n * is initialized. As a plugin outside of webex-core, it would initialize after\n * credentials, causing all requests prior to its initialization to fail\n * federation requirements, and instead send requests to the environmentally-\n * assigned urls.\n */\n\nimport './plugins/logger';\nimport './lib/credentials';\nimport './lib/services';\n\nexport {Credentials, filterScope, grantErrors, sortScope, Token} from './lib/credentials';\n\nexport {\n ServiceCatalog,\n ServiceRegistry,\n ServiceState,\n Services,\n ServiceHost,\n ServiceUrl,\n} from './lib/services';\n\nexport {ServiceCatalogV2, ServicesV2, ServiceDetail} from './lib/services-v2';\nexport * as serviceConstants from './lib/constants';\nexport {\n makeWebexStore,\n makeWebexPluginStore,\n MemoryStoreAdapter,\n NotFoundError,\n persist,\n StorageError,\n waitForValue,\n} from './lib/storage';\n\nexport {default, registerPlugin, registerInternalPlugin} from './webex-core';\n\nexport {default as WebexHttpError} from './lib/webex-http-error';\nexport {default as StatelessWebexPlugin} from './lib/stateless-webex-plugin';\nexport {default as WebexPlugin} from './lib/webex-plugin';\nexport {default as AuthInterceptor} from './interceptors/auth';\nexport {default as NetworkTimingInterceptor} from './interceptors/network-timing';\nexport {default as PayloadTransformerInterceptor} from './interceptors/payload-transformer';\nexport {default as RedirectInterceptor} from './interceptors/redirect';\nexport {default as ResponseLoggerInterceptor} from './interceptors/response-logger';\nexport {default as RequestEventInterceptor} from './interceptors/request-event';\nexport {default as RequestLoggerInterceptor} from './interceptors/request-logger';\nexport {default as RequestTimingInterceptor} from './interceptors/request-timing';\nexport {default as UserAgentInterceptor} from './interceptors/user-agent';\nexport {default as ProxyInterceptor} from './interceptors/proxy';\nexport {default as WebexTrackingIdInterceptor} from './interceptors/webex-tracking-id';\nexport {sequenceNumbers as webexTrackingIdSequenceNumbers} from './interceptors/webex-tracking-id';\nexport {default as WebexUserAgentInterceptor} from './interceptors/webex-user-agent';\nexport {default as RateLimitInterceptor} from './interceptors/rate-limit';\nexport {default as EmbargoInterceptor} from './interceptors/embargo';\nexport {default as DefaultOptionsInterceptor} from './interceptors/default-options';\nexport {default as HostMapInterceptor} from './lib/interceptors/hostmap';\nexport {default as ServiceInterceptor} from './lib/interceptors/service';\nexport {default as ServerErrorInterceptor} from './lib/interceptors/server-error';\n\nexport {default as Batcher} from './lib/batcher';\nexport {default as Page} from './lib/page';\nexport {default as config} from './config';\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["require","_credentials","_services","_servicesV","_serviceConstants","_interopRequireWildcard","exports","serviceConstants","_storage","_webexCore","_webexHttpError","_interopRequireDefault","_statelessWebexPlugin","_webexPlugin","_auth","_catalogUrl","_networkTiming","_payloadTransformer","_redirect","_responseLogger","_requestEvent","_requestLogger","_requestTiming","_userAgent","_proxy","_webexTrackingId","_webexUserAgent","_rateLimit","_embargo","_defaultOptions","_hostmap","_service","_serverError","_batcher","_page","_config","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n *\n * Services is currently a part of webex-core due to how the contents of\n * the original internal-plugin-services needed to be accessed when webex-core\n * is initialized. As a plugin outside of webex-core, it would initialize after\n * credentials, causing all requests prior to its initialization to fail\n * federation requirements, and instead send requests to the environmentally-\n * assigned urls.\n */\n\nimport './plugins/logger';\nimport './lib/credentials';\nimport './lib/services';\n\nexport {Credentials, filterScope, grantErrors, sortScope, Token} from './lib/credentials';\n\nexport {\n ServiceCatalog,\n ServiceRegistry,\n ServiceState,\n Services,\n ServiceHost,\n ServiceUrl,\n} from './lib/services';\n\nexport {ServiceCatalogV2, ServicesV2, ServiceDetail} from './lib/services-v2';\nexport * as serviceConstants from './lib/constants';\nexport {\n makeWebexStore,\n makeWebexPluginStore,\n MemoryStoreAdapter,\n NotFoundError,\n persist,\n StorageError,\n waitForValue,\n} from './lib/storage';\n\nexport {default, registerPlugin, registerInternalPlugin} from './webex-core';\n\nexport {default as WebexHttpError} from './lib/webex-http-error';\nexport {default as StatelessWebexPlugin} from './lib/stateless-webex-plugin';\nexport {default as WebexPlugin} from './lib/webex-plugin';\nexport {default as AuthInterceptor} from './interceptors/auth';\nexport {default as CatalogUrlInterceptor} from './interceptors/catalog-url';\nexport {default as NetworkTimingInterceptor} from './interceptors/network-timing';\nexport {default as PayloadTransformerInterceptor} from './interceptors/payload-transformer';\nexport {default as RedirectInterceptor} from './interceptors/redirect';\nexport {default as ResponseLoggerInterceptor} from './interceptors/response-logger';\nexport {default as RequestEventInterceptor} from './interceptors/request-event';\nexport {default as RequestLoggerInterceptor} from './interceptors/request-logger';\nexport {default as RequestTimingInterceptor} from './interceptors/request-timing';\nexport {default as UserAgentInterceptor} from './interceptors/user-agent';\nexport {default as ProxyInterceptor} from './interceptors/proxy';\nexport {default as WebexTrackingIdInterceptor} from './interceptors/webex-tracking-id';\nexport {sequenceNumbers as webexTrackingIdSequenceNumbers} from './interceptors/webex-tracking-id';\nexport {default as WebexUserAgentInterceptor} from './interceptors/webex-user-agent';\nexport {default as RateLimitInterceptor} from './interceptors/rate-limit';\nexport {default as EmbargoInterceptor} from './interceptors/embargo';\nexport {default as DefaultOptionsInterceptor} from './interceptors/default-options';\nexport {default as HostMapInterceptor} from './lib/interceptors/hostmap';\nexport {default as ServiceInterceptor} from './lib/interceptors/service';\nexport {default as ServerErrorInterceptor} from './lib/interceptors/server-error';\n\nexport {default as Batcher} from './lib/batcher';\nexport {default as Page} from './lib/page';\nexport {default as config} from './config';\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
13
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
14
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
15
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
16
+ var _httpCore = require("@webex/http-core");
17
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
18
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /*!
19
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
20
+ */
21
+ /**
22
+ * Validates that request URLs are in the service catalog.
23
+ * Prevents SSRF attacks by blocking requests to unknown hosts.
24
+ * @class
25
+ */
26
+ var CatalogUrlInterceptor = exports.default = /*#__PURE__*/function (_Interceptor) {
27
+ function CatalogUrlInterceptor() {
28
+ (0, _classCallCheck2.default)(this, CatalogUrlInterceptor);
29
+ return _callSuper(this, CatalogUrlInterceptor, arguments);
30
+ }
31
+ (0, _inherits2.default)(CatalogUrlInterceptor, _Interceptor);
32
+ return (0, _createClass2.default)(CatalogUrlInterceptor, [{
33
+ key: "onRequest",
34
+ value:
35
+ /**
36
+ * @see {@link Interceptor#onRequest}
37
+ * @param {Object} options
38
+ * @returns {Object}
39
+ */
40
+ function onRequest(options) {
41
+ var _this$webex$internal;
42
+ if (options.service && !options.uri && !options.url) {
43
+ return _promise.default.resolve(options);
44
+ }
45
+ var url = options.uri || options.url;
46
+
47
+ // No URL to validate
48
+ if (!url) {
49
+ return _promise.default.resolve(options);
50
+ }
51
+
52
+ // Check if services plugin is available
53
+ if (!((_this$webex$internal = this.webex.internal) !== null && _this$webex$internal !== void 0 && _this$webex$internal.services)) {
54
+ var _this$webex$logger, _this$webex$logger$wa;
55
+ // Services not loaded yet - allow but log
56
+ (_this$webex$logger = this.webex.logger) === null || _this$webex$logger === void 0 ? void 0 : (_this$webex$logger$wa = _this$webex$logger.warn) === null || _this$webex$logger$wa === void 0 ? void 0 : _this$webex$logger$wa.call(_this$webex$logger, "catalog-url: Cannot validate URL (services not loaded): ".concat(url));
57
+ return _promise.default.resolve(options);
58
+ }
59
+ var services = this.webex.internal.services;
60
+
61
+ // Check if URL is in service catalog
62
+ if (services.getServiceFromUrl(url)) {
63
+ return _promise.default.resolve(options);
64
+ }
65
+
66
+ // Honor allowedDomains (same policy as auth interceptor)
67
+ if (services.validateDomains && services.hasAllowedDomains() && services.isAllowedDomainUrl(url)) {
68
+ return _promise.default.resolve(options);
69
+ }
70
+
71
+ // URL not in catalog or allowed domains - block the request
72
+ return _promise.default.reject(new Error("Request blocked: URL not in service catalog or allowed domains: ".concat(url, ".")));
73
+ }
74
+ }], [{
75
+ key: "create",
76
+ value:
77
+ /**
78
+ * @returns {CatalogUrlInterceptor}
79
+ */
80
+ function create() {
81
+ return new CatalogUrlInterceptor({
82
+ webex: this
83
+ });
84
+ }
85
+ }]);
86
+ }(_httpCore.Interceptor);
87
+ //# sourceMappingURL=catalog-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_httpCore","require","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","CatalogUrlInterceptor","exports","_Interceptor","_classCallCheck2","arguments","_inherits2","_createClass2","key","value","onRequest","options","_this$webex$internal","service","uri","url","_promise","resolve","webex","internal","services","_this$webex$logger","_this$webex$logger$wa","logger","warn","concat","getServiceFromUrl","validateDomains","hasAllowedDomains","isAllowedDomainUrl","reject","Error","create","Interceptor"],"sources":["catalog-url.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\n\n/**\n * Validates that request URLs are in the service catalog.\n * Prevents SSRF attacks by blocking requests to unknown hosts.\n * @class\n */\nexport default class CatalogUrlInterceptor extends Interceptor {\n /**\n * @returns {CatalogUrlInterceptor}\n */\n static create() {\n return new CatalogUrlInterceptor({webex: this});\n }\n\n /**\n * @see {@link Interceptor#onRequest}\n * @param {Object} options\n * @returns {Object}\n */\n onRequest(options) {\n if (options.service && !options.uri && !options.url) {\n return Promise.resolve(options);\n }\n\n const url = options.uri || options.url;\n\n // No URL to validate\n if (!url) {\n return Promise.resolve(options);\n }\n\n // Check if services plugin is available\n if (!this.webex.internal?.services) {\n // Services not loaded yet - allow but log\n this.webex.logger?.warn?.(`catalog-url: Cannot validate URL (services not loaded): ${url}`);\n\n return Promise.resolve(options);\n }\n\n const {services} = this.webex.internal;\n\n // Check if URL is in service catalog\n if (services.getServiceFromUrl(url)) {\n return Promise.resolve(options);\n }\n\n // Honor allowedDomains (same policy as auth interceptor)\n if (\n services.validateDomains &&\n services.hasAllowedDomains() &&\n services.isAllowedDomainUrl(url)\n ) {\n return Promise.resolve(options);\n }\n\n // URL not in catalog or allowed domains - block the request\n return Promise.reject(\n new Error(`Request blocked: URL not in service catalog or allowed domains: ${url}.`)\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -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-next.43"
305
+ version: "3.12.0-next.45"
306
306
  });
307
307
  var _default2 = exports.default = Batcher;
308
308
  //# sourceMappingURL=batcher.js.map
@@ -600,7 +600,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
600
600
  this.refresh();
601
601
  }
602
602
  },
603
- version: "3.12.0-next.43"
603
+ version: "3.12.0-next.45"
604
604
  }, (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));
605
605
  var _default = exports.default = Credentials;
606
606
  //# 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-next.43"
535
+ version: "3.12.0-next.45"
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
@@ -15,6 +15,7 @@ _Object$defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
17
  exports.default = void 0;
18
+ exports.matchesCatalogUrl = matchesCatalogUrl;
18
19
  var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
19
20
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
20
21
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
@@ -29,6 +30,44 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
29
30
  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; } } }; }
30
31
  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; } }
31
32
  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; }
33
+ /**
34
+ * Check if a candidate URL matches a catalog URL with proper origin validation.
35
+ * This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
36
+ *
37
+ * @param {string} candidateUrlString - The URL to validate
38
+ * @param {string} catalogUrlString - The catalog URL to compare against
39
+ * @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
40
+ */
41
+ function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
42
+ try {
43
+ var candidateUrl = new URL(candidateUrlString);
44
+ var catalogUrl = new URL(catalogUrlString);
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) {
67
+ return false;
68
+ }
69
+ }
70
+
32
71
  /* eslint-disable no-underscore-dangle */
33
72
  /**
34
73
  * @class
@@ -255,15 +294,21 @@ var ServiceCatalog = _ampersandState.default.extend({
255
294
  */
256
295
  findServiceUrlFromUrl: function findServiceUrlFromUrl(url) {
257
296
  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
+
298
+ // Invalid URLs cannot match any service
299
+ try {
300
+ // eslint-disable-next-line no-new
301
+ new URL(url);
302
+ } catch (_unused2) {
303
+ return undefined;
304
+ }
258
305
  return serviceUrls.find(function (serviceUrl) {
259
- // Check to see if the URL we are checking starts with the default URL
260
- if (url.startsWith(serviceUrl.defaultUrl)) {
306
+ // Check if the URL matches the default URL with proper origin validation
307
+ if (matchesCatalogUrl(url, serviceUrl.defaultUrl)) {
261
308
  return true;
262
309
  }
263
310
 
264
- // If not, we check to see if the alternate URLs match
265
- // These are made by swapping the host of the default URL
266
- // with that of an alternate host
311
+ // Check alternate URLs (built by swapping host with alternate hosts)
267
312
  var _iterator4 = _createForOfIteratorHelper(serviceUrl.hosts),
268
313
  _step4;
269
314
  try {
@@ -271,7 +316,7 @@ var ServiceCatalog = _ampersandState.default.extend({
271
316
  var host = _step4.value;
272
317
  var alternateUrl = new URL(serviceUrl.defaultUrl);
273
318
  alternateUrl.host = host.host;
274
- if (url.startsWith(alternateUrl.toString())) {
319
+ if (matchesCatalogUrl(url, alternateUrl.toString())) {
275
320
  return true;
276
321
  }
277
322
  }
@@ -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","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","undefined","findServiceFromClusterId","_ref","clusterId","_ref$priorityHost","priorityHost","identifiedServiceUrl","get","findServiceUrlFromUrl","startsWith","_iterator4","_step4","alternateUrl","URL","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/* 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 return serviceUrls.find((serviceUrl) => {\n // Check to see if the URL we are checking starts with the default URL\n if (url.startsWith(serviceUrl.defaultUrl)) {\n return true;\n }\n\n // If not, we check to see if the alternate URLs match\n // These are made by swapping the host of the default URL\n // with that of an alternate host\n for (const host of serviceUrl.hosts) {\n const alternateUrl = new URL(serviceUrl.defaultUrl);\n alternateUrl.host = host.host;\n\n if (url.startsWith(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","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":[]}
@@ -1075,9 +1075,11 @@ var Services = _webexPlugin.default.extend({
1075
1075
  authorization: token
1076
1076
  };
1077
1077
  }
1078
- return this.webex.internal.newMetrics.callDiagnosticLatencies.measureLatency(function () {
1078
+ var sendRequest = function sendRequest() {
1079
1079
  return _this7.request(requestObject);
1080
- }, 'internal.get.u2c.time').then(function (_ref12) {
1080
+ };
1081
+ var responsePromise = this.webex.internal.newMetrics ? this.webex.internal.newMetrics.callDiagnosticLatencies.measureLatency(sendRequest, 'internal.get.u2c.time') : sendRequest();
1082
+ return responsePromise.then(function (_ref12) {
1081
1083
  var body = _ref12.body;
1082
1084
  return body;
1083
1085
  });
@@ -1639,7 +1641,7 @@ var Services = _webexPlugin.default.extend({
1639
1641
  }, _callee6);
1640
1642
  })));
1641
1643
  },
1642
- version: "3.12.0-next.43"
1644
+ version: "3.12.0-next.45"
1643
1645
  });
1644
1646
  /* eslint-enable no-underscore-dangle */
1645
1647
  var _default = exports.default = Services;