@webex/webex-core 1.157.0 → 1.159.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -68,6 +68,10 @@ var PayloadTransformerInterceptor = /*#__PURE__*/function (_Interceptor) {
68
68
  }, {
69
69
  key: "onResponse",
70
70
  value: function onResponse(options, response) {
71
+ if (options.disableTransform) {
72
+ return response;
73
+ }
74
+
71
75
  return this.webex.transform('inbound', response);
72
76
  }
73
77
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["payload-transformer.js"],"names":["PayloadTransformerInterceptor","options","noTransform","webex","transform","response","reason","then","r","reject","Interceptor"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;;;AAEA;AACA;AACA;IACqBA,6B;;;;;;;;;;;;;AASnB;AACF;AACA;AACA;AACA;AACE,uBAAUC,OAAV,EAAmB;AACjB,UAAIA,OAAO,CAACC,WAAZ,EAAyB;AACvB,eAAOD,OAAP;AACD;;AAED,aAAO,KAAKE,KAAL,CAAWC,SAAX,CAAqB,UAArB,EAAiCH,OAAjC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,oBAAWA,OAAX,EAAoBI,QAApB,EAA8B;AAC5B,aAAO,KAAKF,KAAL,CAAWC,SAAX,CAAqB,SAArB,EAAgCC,QAAhC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,yBAAgBJ,OAAhB,EAAyBK,MAAzB,EAAiC;AAC/B,aAAO,KAAKH,KAAL,CAAWC,SAAX,CAAqB,SAArB,EAAgCE,MAAhC,EACJC,IADI,CACC,UAACC,CAAD;AAAA,eAAO,iBAAQC,MAAR,CAAeD,CAAC,IAAIF,MAApB,CAAP;AAAA,OADD,CAAP;AAED;;;;AAxCD;AACF;AACA;AACA;AACE,sBAAgB;AACd,aAAO,IAAIN,6BAAJ,CAAkC;AAACG,QAAAA,KAAK,EAAE;AAAR,OAAlC,CAAP;AACD;;;EAPwDO,qB","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\n\n/**\n * @class\n */\nexport default class PayloadTransformerInterceptor extends Interceptor {\n /**\n * @param {Object} options\n * @returns {PayloadTransformerInterceptor}\n */\n static create() {\n return new PayloadTransformerInterceptor({webex: this});\n }\n\n /**\n * @see Interceptor#onRequest\n * @param {Object} options\n * @returns {Object}\n */\n onRequest(options) {\n if (options.noTransform) {\n return options;\n }\n\n return this.webex.transform('outbound', options);\n }\n\n /**\n * @see Interceptor#onResponse\n * @param {Object} options\n * @param {HttpResponse} response\n * @returns {Object}\n */\n onResponse(options, response) {\n return this.webex.transform('inbound', response);\n }\n\n /**\n * @see Interceptor#onResponseError\n * @param {Object} options\n * @param {Error} reason\n * @returns {Object}\n */\n onResponseError(options, reason) {\n return this.webex.transform('inbound', reason)\n .then((r) => Promise.reject(r || reason));\n }\n}\n"]}
1
+ {"version":3,"sources":["payload-transformer.js"],"names":["PayloadTransformerInterceptor","options","noTransform","webex","transform","response","disableTransform","reason","then","r","reject","Interceptor"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;;;AAEA;AACA;AACA;IACqBA,6B;;;;;;;;;;;;;AASnB;AACF;AACA;AACA;AACA;AACE,uBAAUC,OAAV,EAAmB;AACjB,UAAIA,OAAO,CAACC,WAAZ,EAAyB;AACvB,eAAOD,OAAP;AACD;;AAED,aAAO,KAAKE,KAAL,CAAWC,SAAX,CAAqB,UAArB,EAAiCH,OAAjC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,oBAAWA,OAAX,EAAoBI,QAApB,EAA8B;AAC5B,UAAIJ,OAAO,CAACK,gBAAZ,EAA8B;AAC5B,eAAOD,QAAP;AACD;;AAED,aAAO,KAAKF,KAAL,CAAWC,SAAX,CAAqB,SAArB,EAAgCC,QAAhC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,yBAAgBJ,OAAhB,EAAyBM,MAAzB,EAAiC;AAC/B,aAAO,KAAKJ,KAAL,CAAWC,SAAX,CAAqB,SAArB,EAAgCG,MAAhC,EACJC,IADI,CACC,UAACC,CAAD;AAAA,eAAO,iBAAQC,MAAR,CAAeD,CAAC,IAAIF,MAApB,CAAP;AAAA,OADD,CAAP;AAED;;;;AA5CD;AACF;AACA;AACA;AACE,sBAAgB;AACd,aAAO,IAAIP,6BAAJ,CAAkC;AAACG,QAAAA,KAAK,EAAE;AAAR,OAAlC,CAAP;AACD;;;EAPwDQ,qB","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Interceptor} from '@webex/http-core';\n\n/**\n * @class\n */\nexport default class PayloadTransformerInterceptor extends Interceptor {\n /**\n * @param {Object} options\n * @returns {PayloadTransformerInterceptor}\n */\n static create() {\n return new PayloadTransformerInterceptor({webex: this});\n }\n\n /**\n * @see Interceptor#onRequest\n * @param {Object} options\n * @returns {Object}\n */\n onRequest(options) {\n if (options.noTransform) {\n return options;\n }\n\n return this.webex.transform('outbound', options);\n }\n\n /**\n * @see Interceptor#onResponse\n * @param {Object} options\n * @param {HttpResponse} response\n * @returns {Object}\n */\n onResponse(options, response) {\n if (options.disableTransform) {\n return response;\n }\n\n return this.webex.transform('inbound', response);\n }\n\n /**\n * @see Interceptor#onResponseError\n * @param {Object} options\n * @param {Error} reason\n * @returns {Object}\n */\n onResponseError(options, reason) {\n return this.webex.transform('inbound', reason)\n .then((r) => Promise.reject(r || reason));\n }\n}\n"]}
@@ -329,7 +329,7 @@ var Batcher = _webexPlugin.default.extend({
329
329
  fingerprintResponse: function fingerprintResponse(item) {
330
330
  throw new Error('fingerprintResponse() must be implemented');
331
331
  },
332
- version: "1.157.0"
332
+ version: "1.159.0"
333
333
  });
334
334
 
335
335
  var _default2 = Batcher;
@@ -179,7 +179,15 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
179
179
  // Attempt to extract a user token's OrgId.
180
180
  this.logger.info('credentials: could not extract OrgId from JWT');
181
181
  this.logger.info('credentials: attempting to extract OrgId from user token');
182
- return this.extractOrgIdFromUserToken(this.supertoken.access_token);
182
+
183
+ try {
184
+ var _this$supertoken;
185
+
186
+ return this.extractOrgIdFromUserToken((_this$supertoken = this.supertoken) === null || _this$supertoken === void 0 ? void 0 : _this$supertoken.access_token);
187
+ } catch (f) {
188
+ this.logger.info('credentials: could not extract OrgId from user token');
189
+ throw f;
190
+ }
183
191
  }
184
192
  },
185
193
 
@@ -590,7 +598,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
590
598
  this.refresh();
591
599
  }
592
600
  },
593
- version: "1.157.0"
601
+ version: "1.159.0"
594
602
  }, ((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)));
595
603
 
596
604
  var _default = Credentials;
@@ -1 +1 @@
1
- {"version":3,"sources":["credentials.js"],"names":["Credentials","WebexPlugin","extend","keyFactory","scope","collections","userTokens","TokenCollection","dataTypes","token","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","base64","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","access_token","e","extractOrgIdFromUserToken","decodedJWT","jwt","decode","realm","fields","split","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","get","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","parse","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","oneFlight"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {\n base64,\n makeStateDataType,\n oneFlight,\n tap,\n whileInFlight\n} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType\n },\n\n derived: {\n canAuthorize: {\n deps: [\n 'supertoken',\n 'supertoken.canAuthorize',\n 'canRefresh'\n ],\n fn() {\n return Boolean(this.supertoken && this.supertoken.canAuthorize || this.canRefresh);\n }\n },\n canRefresh: {\n deps: [\n 'supertoken',\n 'supertoken.canRefresh'\n ],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n }\n }\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean'\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean'\n },\n refreshTimer: {\n default: undefined,\n type: 'any'\n }\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n }\n else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info(\n 'credentials: attempting to retrieve the OrgId from token'\n );\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n }\n catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info(\n 'credentials: attempting to extract OrgId from user token'\n );\n\n return this.extractOrgIdFromUserToken(this.supertoken.access_token);\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify(Object.assign({\n cisService: this.config.service,\n goto: this.config.redirect_uri\n }, options))}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor((Math.floor(Math.random() * 4) + 6) / 10 * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope)\n .catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token(Object.assign({scope}, this.supertoken.serialize())), {parent: this});\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex.request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true\n },\n shouldRefreshAccessToken: false\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(!this.isRefreshing || new Promise((resolve) => {\n this.logger.info('credentials: token refresh inflight; delaying getUserToken until refresh completes');\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n }))\n .then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope)\n .then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n }\n else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n }\n catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n }\n catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return this.config.jwtRefreshCallback(this.webex)\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}));\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken.refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(tokens.map((token) => this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token.revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })));\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n }\n catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n }\n else {\n this.refresh();\n }\n }\n\n});\n\nexport default Credentials;\n"]}
1
+ {"version":3,"sources":["credentials.js"],"names":["Credentials","WebexPlugin","extend","keyFactory","scope","collections","userTokens","TokenCollection","dataTypes","token","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","base64","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","access_token","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","decode","realm","fields","split","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","get","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","parse","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","oneFlight"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {\n base64,\n makeStateDataType,\n oneFlight,\n tap,\n whileInFlight\n} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType\n },\n\n derived: {\n canAuthorize: {\n deps: [\n 'supertoken',\n 'supertoken.canAuthorize',\n 'canRefresh'\n ],\n fn() {\n return Boolean(this.supertoken && this.supertoken.canAuthorize || this.canRefresh);\n }\n },\n canRefresh: {\n deps: [\n 'supertoken',\n 'supertoken.canRefresh'\n ],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n }\n }\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean'\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean'\n },\n refreshTimer: {\n default: undefined,\n type: 'any'\n }\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n }\n else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info(\n 'credentials: attempting to retrieve the OrgId from token'\n );\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n }\n catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info(\n 'credentials: attempting to extract OrgId from user token'\n );\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n }\n catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify(Object.assign({\n cisService: this.config.service,\n goto: this.config.redirect_uri\n }, options))}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor((Math.floor(Math.random() * 4) + 6) / 10 * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope)\n .catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token(Object.assign({scope}, this.supertoken.serialize())), {parent: this});\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex.request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true\n },\n shouldRefreshAccessToken: false\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(!this.isRefreshing || new Promise((resolve) => {\n this.logger.info('credentials: token refresh inflight; delaying getUserToken until refresh completes');\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n }))\n .then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope)\n .then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n }\n else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n }\n catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n }\n catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return this.config.jwtRefreshCallback(this.webex)\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}));\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken.refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(tokens.map((token) => this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token.revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })));\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n }\n catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n }\n else {\n this.refresh();\n }\n }\n\n});\n\nexport default Credentials;\n"]}
@@ -605,7 +605,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
605
605
  return res.body;
606
606
  });
607
607
  },
608
- version: "1.157.0"
608
+ version: "1.159.0"
609
609
  }, ((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)));
610
610
 
611
611
  var _default = Token;
@@ -427,13 +427,35 @@ var Services = _webexPlugin.default.extend({
427
427
  });
428
428
  },
429
429
 
430
+ /**
431
+ * Fetch login user infomation (preferred webex site).
432
+ *
433
+ * @returns {object} - User Information including user preferrences .
434
+ */
435
+ fetchLoginUserInformation: function fetchLoginUserInformation() {
436
+ var _this3 = this;
437
+
438
+ return this.request({
439
+ method: 'GET',
440
+ service: 'identity',
441
+ resource: 'identity/scim/v1/Users/me?showAllTypes=true'
442
+ }).then(function (res) {
443
+ _this3.logger.info('services: received user region info');
444
+
445
+ return res.body;
446
+ }).catch(function (err) {
447
+ _this3.logger.info('services: was not able to fetch user login information', err); // resolve successfully even if request failed
448
+
449
+ });
450
+ },
451
+
430
452
  /**
431
453
  * Fetches client region info such as countryCode and timezone.
432
454
  *
433
455
  * @returns {object} - The region info object.
434
456
  */
435
457
  fetchClientRegionInfo: function fetchClientRegionInfo() {
436
- var _this3 = this;
458
+ var _this4 = this;
437
459
 
438
460
  return this.request({
439
461
  uri: 'https://ds.ciscospark.com/v1/region',
@@ -442,11 +464,11 @@ var Services = _webexPlugin.default.extend({
442
464
  'spark-user-agent': null
443
465
  }
444
466
  }).then(function (res) {
445
- _this3.logger.info('services: received user region info');
467
+ _this4.logger.info('services: received user region info');
446
468
 
447
469
  return res.body;
448
470
  }).catch(function (err) {
449
- _this3.logger.info('services: was not able to get user region info', err); // resolve successfully even if request failed
471
+ _this4.logger.info('services: was not able to get user region info', err); // resolve successfully even if request failed
450
472
 
451
473
  });
452
474
  },
@@ -468,7 +490,7 @@ var Services = _webexPlugin.default.extend({
468
490
  * @returns {LicenseDTO} - The DTO returned from the **License** service.
469
491
  */
470
492
  sendUserActivation: function sendUserActivation(_ref5) {
471
- var _this4 = this;
493
+ var _this5 = this;
472
494
 
473
495
  var email = _ref5.email,
474
496
  reqId = _ref5.reqId,
@@ -485,7 +507,7 @@ var Services = _webexPlugin.default.extend({
485
507
  } // Send the user activation request to the **License** service.
486
508
 
487
509
 
488
- return _this4.request({
510
+ return _this5.request({
489
511
  service: 'license',
490
512
  resource: 'users/activations',
491
513
  method: 'POST',
@@ -644,7 +666,7 @@ var Services = _webexPlugin.default.extend({
644
666
  * @returns {Promise<string>} - Resolves to the priority host of a service.
645
667
  */
646
668
  waitForService: function waitForService(_ref8) {
647
- var _this5 = this;
669
+ var _this6 = this;
648
670
 
649
671
  var name = _ref8.name,
650
672
  _ref8$timeout = _ref8.timeout,
@@ -687,9 +709,9 @@ var Services = _webexPlugin.default.extend({
687
709
 
688
710
  var checkCatalog = function checkCatalog(catalogGroup) {
689
711
  return catalog.waitForCatalog(catalogGroup, timeout).then(function () {
690
- var scopedPriorityUrl = _this5.get(name, true);
712
+ var scopedPriorityUrl = _this6.get(name, true);
691
713
 
692
- var scopedPrioriryUrlObj = _this5.getServiceFromUrl(url);
714
+ var scopedPrioriryUrlObj = _this6.getServiceFromUrl(url);
693
715
 
694
716
  if (scopedPriorityUrl || scopedPrioriryUrlObj) {
695
717
  resolve(scopedPriorityUrl || scopedPrioriryUrlObj.priorityUrl);
@@ -702,7 +724,7 @@ var Services = _webexPlugin.default.extend({
702
724
  _promise.default.all(groupsToCheck.map(function (group) {
703
725
  return checkCatalog(group);
704
726
  })).then(function () {
705
- _this5.webex.internal.metrics.submitClientMetrics(_metrics.default.JS_SDK_SERVICE_NOT_FOUND, {
727
+ _this6.webex.internal.metrics.submitClientMetrics(_metrics.default.JS_SDK_SERVICE_NOT_FOUND, {
706
728
  fields: {
707
729
  service_name: name
708
730
  }
@@ -892,7 +914,7 @@ var Services = _webexPlugin.default.extend({
892
914
  * @returns {Promise<object>}
893
915
  */
894
916
  _fetchNewServiceHostmap: function _fetchNewServiceHostmap() {
895
- var _this6 = this;
917
+ var _this7 = this;
896
918
 
897
919
  var _ref9 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
898
920
  from = _ref9.from,
@@ -926,7 +948,7 @@ var Services = _webexPlugin.default.extend({
926
948
 
927
949
  return this.request(requestObject).then(function (_ref10) {
928
950
  var body = _ref10.body;
929
- return _this6._formatReceivedHostmap(body);
951
+ return _this7._formatReceivedHostmap(body);
930
952
  });
931
953
  },
932
954
 
@@ -990,7 +1012,7 @@ var Services = _webexPlugin.default.extend({
990
1012
  * @returns {Promise<void, Error>} - Errors if the token is unavailable.
991
1013
  */
992
1014
  initServiceCatalogs: function initServiceCatalogs() {
993
- var _this7 = this;
1015
+ var _this8 = this;
994
1016
 
995
1017
  this.logger.info('services: initializing initial service catalogs'); // Destructure the credentials plugin.
996
1018
 
@@ -1002,15 +1024,15 @@ var Services = _webexPlugin.default.extend({
1002
1024
  return credentials.getOrgId();
1003
1025
  }) // Begin collecting the preauth/limited catalog.
1004
1026
  .then(function (orgId) {
1005
- return _this7.collectPreauthCatalog({
1027
+ return _this8.collectPreauthCatalog({
1006
1028
  orgId: orgId
1007
1029
  });
1008
1030
  }).then(function () {
1009
1031
  // Validate if the token is authorized.
1010
1032
  if (credentials.canAuthorize) {
1011
1033
  // Attempt to collect the postauth catalog.
1012
- return _this7.updateServices().catch(function () {
1013
- return _this7.logger.warn('services: cannot retrieve postauth catalog');
1034
+ return _this8.updateServices().catch(function () {
1035
+ return _this8.logger.warn('services: cannot retrieve postauth catalog');
1014
1036
  });
1015
1037
  } // Return a resolved promise for consistent return value.
1016
1038
 
@@ -1027,7 +1049,7 @@ var Services = _webexPlugin.default.extend({
1027
1049
  * @returns {Services}
1028
1050
  */
1029
1051
  initialize: function initialize() {
1030
- var _this8 = this;
1052
+ var _this9 = this;
1031
1053
 
1032
1054
  var catalog = new _serviceCatalog.default();
1033
1055
  var registry = new _serviceRegistry.default();
@@ -1039,29 +1061,29 @@ var Services = _webexPlugin.default.extend({
1039
1061
  this.states.set(this.webex, state); // Listen for configuration changes once.
1040
1062
 
1041
1063
  this.listenToOnce(this.webex, 'change:config', function () {
1042
- _this8.initConfig();
1064
+ _this9.initConfig();
1043
1065
  }); // wait for webex instance to be ready before attempting
1044
1066
  // to update the service catalogs
1045
1067
 
1046
1068
  this.listenToOnce(this.webex, 'ready', function () {
1047
- var supertoken = _this8.webex.credentials.supertoken; // Validate if the supertoken exists.
1069
+ var supertoken = _this9.webex.credentials.supertoken; // Validate if the supertoken exists.
1048
1070
 
1049
1071
  if (supertoken && supertoken.access_token) {
1050
- _this8.initServiceCatalogs().then(function () {
1072
+ _this9.initServiceCatalogs().then(function () {
1051
1073
  catalog.isReady = true;
1052
1074
  }).catch(function (error) {
1053
- return _this8.logger.error("services: failed to init initial services, ".concat(error.message));
1075
+ return _this9.logger.error("services: failed to init initial services, ".concat(error.message));
1054
1076
  });
1055
1077
  } else {
1056
- var email = _this8.webex.config.email;
1078
+ var email = _this9.webex.config.email;
1057
1079
 
1058
- _this8.collectPreauthCatalog(email ? {
1080
+ _this9.collectPreauthCatalog(email ? {
1059
1081
  email: email
1060
1082
  } : undefined);
1061
1083
  }
1062
1084
  });
1063
1085
  },
1064
- version: "1.157.0"
1086
+ version: "1.159.0"
1065
1087
  });
1066
1088
  /* eslint-enable no-underscore-dangle */
1067
1089
 
@@ -1 +1 @@
1
- {"version":3,"sources":["services.js"],"names":["trailingSlashes","Services","WebexPlugin","extend","namespace","registries","states","props","validateDomains","_catalogs","_serviceUrls","getRegistry","get","webex","getState","_getCatalog","name","priorityHost","serviceGroup","catalog","hasService","serviceName","hasAllowedDomains","getAllowedDomains","length","list","markFailedUrl","url","noPriorityHosts","_updateServiceUrls","serviceUrls","updateServices","from","query","token","forceRefresh","formattedQuery","status","collecting","waitForCatalog","queryKey","includes","reject","Error","email","emailhash","toLowerCase","toString","_fetchNewServiceHostmap","then","serviceHostMap","updateServiceUrls","updateCredentialsConfig","catch","error","validateUser","reqId","activationOptions","preloginUserId","logger","info","canAuthorize","credentials","getUserToken","sendUserActivation","userObj","activated","exists","details","user","config","client_id","client_secret","collectPreauthCatalog","idbrokerService","getClientToken","uri","scope","tokenObj","collectSigninCatalog","rto","all","response","statusCode","responseText","body","message","fetchClientRegionInfo","request","addAuthHeader","headers","res","err","countryCode","timezone","clientRegionInfo","service","resource","method","accept","authorization","timeZone","shouldRefreshAccessToken","mode","idbroker","identity","authorizationString","authorizeUrl","replace","setConfig","timeout","supertoken","access_token","postauth","ready","preauth","initServiceCatalogs","waitForService","services","fetchFromServiceUrl","servicesNotNeedValidation","find","resolve","priorityUrl","priorityUrlObj","getServiceFromUrl","isReady","internal","metrics","submitClientMetrics","METRICS","JS_SDK_SERVICE_NOT_FOUND","fields","service_name","groupsToCheck","checkCatalog","catalogGroup","scopedPriorityUrl","scopedPrioriryUrlObj","undefined","map","group","_formatReceivedHostmap","serviceHostmap","formattedHostmap","hostCatalog","reduce","accumulator","key","id","split","defaultUrl","serviceLinks","serviceItem","item","defaultHost","Url","parse","hostname","hosts","push","host","ttl","priority","homeCluster","forEach","getClusterId","findClusterId","getServiceFromClusterId","params","findServiceFromClusterId","findServiceUrlFromUrl","isServiceUrl","isAllowedDomainUrl","findAllowedDomain","convertUrlToPriorityHostUrl","data","qs","format","timestamp","Date","getTime","requestObject","initConfig","fedramp","discovery","fedRampServices","formattedDiscoveryServices","override","formattedOverrideServices","allowedDomains","setAllowedDomains","getOrgId","orgId","warn","initialize","ServiceCatalog","registry","ServiceRegistry","state","ServiceState","set","listenToOnce"],"mappings":"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","sourcesContent":["import Url from 'url';\n\nimport sha256 from 'crypto-js/sha256';\n\nimport WebexPlugin from '../webex-plugin';\n\nimport METRICS from './metrics';\nimport ServiceCatalog from './service-catalog';\nimport ServiceRegistry from './service-registry';\nimport ServiceState from './service-state';\nimport fedRampServices from './service-fed-ramp';\n\n\nconst trailingSlashes = /(?:^\\/)|(?:\\/$)/;\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst Services = WebexPlugin.extend({\n namespace: 'Services',\n\n /**\n * The {@link WeakMap} of {@link ServiceRegistry} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceRegistry>}\n * @private\n * @memberof Services\n */\n registries: new WeakMap(),\n\n /**\n * The {@link WeakMap} of {@link ServiceState} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceState>}\n * @private\n * @memberof Services\n */\n states: new WeakMap(),\n\n props: {\n validateDomains: ['boolean', false, true]\n },\n\n _catalogs: new WeakMap(),\n\n _serviceUrls: null,\n\n /**\n * Get the registry associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceRegistry} - The associated {@link ServiceRegistry}.\n */\n getRegistry() {\n return this.registries.get(this.webex);\n },\n\n /**\n * Get the state associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceState} - The associated {@link ServiceState}.\n */\n getState() {\n return this.states.get(this.webex);\n },\n\n /**\n * @private\n * Get the current catalog based on the assocaited\n * webex instance.\n * @returns {ServiceCatalog}\n */\n _getCatalog() {\n return this._catalogs.get(this.webex);\n },\n\n /**\n * Get a service url from the current services list by name\n * from the associated instance catalog.\n * @param {string} name\n * @param {boolean} [priorityHost]\n * @param {string} [serviceGroup]\n * @returns {string|undefined}\n */\n get(name, priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.get(name, priorityHost, serviceGroup);\n },\n\n /**\n * Determine if the catalog contains a specific service\n *\n * @param {string} serviceName - The service name to validate.\n * @returns {boolean} - True if the service exists.\n */\n hasService(serviceName) {\n return !!(this.get(serviceName));\n },\n\n /**\n * Determine if a whilelist exists in the service catalog.\n *\n * @returns {boolean} - True if a allowed domains list exists.\n */\n hasAllowedDomains() {\n const catalog = this._getCatalog();\n\n return (catalog.getAllowedDomains().length > 0);\n },\n\n /**\n * Generate a service catalog as an object from\n * the associated instance catalog.\n * @param {boolean} [priorityHost] - use highest priority host if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.list(priorityHost, serviceGroup);\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 catalog = this._getCatalog();\n\n return catalog.markFailedUrl(url, noPriorityHosts);\n },\n\n /**\n * saves all the services from the pre and post catalog service\n * @param {Object} serviceUrls\n * @returns {void}\n */\n _updateServiceUrls(serviceUrls) {\n this._serviceUrls = {...this._serviceUrls, ...serviceUrls};\n },\n\n\n /**\n * Update a list of `serviceUrls` to the most current\n * catalog via the defined `discoveryUrl` then returns the current\n * list of services.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n updateServices({\n from, query, token, forceRefresh\n } = {}) {\n const catalog = this._getCatalog();\n let formattedQuery, serviceGroup;\n\n // map catalog name to service group name.\n switch (from) {\n case 'limited': serviceGroup = 'preauth'; break;\n case 'signin': serviceGroup = 'signin'; break;\n default: serviceGroup = 'postauth'; break;\n }\n\n // confirm catalog update for group is not in progress.\n if (catalog.status[serviceGroup].collecting) {\n return this.waitForCatalog(serviceGroup);\n }\n\n catalog.status[serviceGroup].collecting = true;\n\n if (serviceGroup === 'preauth') {\n const queryKey = query && Object.keys(query)[0];\n\n if (!['email', 'emailhash', 'userId', 'orgId', 'mode'].includes(queryKey)) {\n return Promise.reject(new Error('a query param of email, emailhash, userId, orgId, or mode is required'));\n }\n }\n // encode email when query key is email\n if (serviceGroup === 'preauth' || serviceGroup === 'signin') {\n const queryKey = Object.keys(query)[0];\n\n formattedQuery = {};\n\n if (queryKey === 'email' && query.email) {\n formattedQuery.emailhash = sha256(query.email.toLowerCase()).toString();\n }\n else {\n formattedQuery[queryKey] = query[queryKey];\n }\n }\n\n return this._fetchNewServiceHostmap({\n from,\n token,\n query: formattedQuery,\n forceRefresh\n })\n .then((serviceHostMap) => {\n catalog.updateServiceUrls(serviceGroup, serviceHostMap);\n this.updateCredentialsConfig();\n catalog.status[serviceGroup].collecting = false;\n })\n .catch((error) => {\n catalog.status[serviceGroup].collecting = false;\n\n return Promise.reject(error);\n });\n },\n\n /**\n * User validation parameter transfer object for {@link validateUser}.\n * @param {object} ValidateUserPTO\n * @property {string} ValidateUserPTO.email - The email of the user.\n * @property {string} [ValidateUserPTO.reqId] - The activation requester.\n * @property {object} [ValidateUserPTO.activationOptions] - Extra options to pass when sending the activation\n * @property {object} [ValidateUserPTO.preloginUserId] - The prelogin user id to set when sending the activation.\n */\n\n /**\n * User validation return transfer object for {@link validateUser}.\n * @param {object} ValidateUserRTO\n * @property {boolean} ValidateUserRTO.activated - If the user is activated.\n * @property {boolean} ValidateUserRTO.exists - If the user exists.\n * @property {string} ValidateUserRTO.details - A descriptive status message.\n * @property {object} ValidateUserRTO.user - **License** service user object.\n */\n\n /**\n * Validate if a user is activated and update the service catalogs as needed\n * based on the user's activation status.\n *\n * @param {ValidateUserPTO} - The parameter transfer object.\n * @returns {ValidateUserRTO} - The return transfer object.\n */\n validateUser({\n email,\n reqId = 'WEBCLIENT',\n forceRefresh = false,\n activationOptions = {},\n preloginUserId\n }) {\n this.logger.info('services: validating a user');\n\n // Validate that an email parameter key was provided.\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n\n // Destructure the credentials object.\n const {canAuthorize} = this.webex.credentials;\n\n // Validate that the user is already authorized.\n if (canAuthorize) {\n return this.updateServices({forceRefresh})\n .then(() => this.webex.credentials.getUserToken())\n .then((token) => this.sendUserActivation({\n email,\n reqId,\n token: token.toString(),\n activationOptions,\n preloginUserId\n }))\n .then((userObj) => ({\n activated: true,\n exists: true,\n details: 'user is authorized via a user token',\n user: userObj\n }));\n }\n\n // Destructure the client authorization details.\n /* eslint-disable camelcase */\n const {client_id, client_secret} = this.webex.credentials.config;\n\n // Validate that client authentication details exist.\n if (!client_id || !client_secret) {\n return Promise.reject(new Error(\n 'client authentication details are not available'\n ));\n }\n /* eslint-enable camelcase */\n\n // Declare a class-memeber-scoped token for usage within the promise chain.\n let token;\n\n // Begin client authentication user validation.\n return this.collectPreauthCatalog({email})\n .then(() => {\n // Retrieve the service url from the updated catalog. This is required\n // since `WebexCore` is usually not fully initialized at the time this\n // request completes.\n const idbrokerService = this.get('idbroker', true);\n\n // Collect the client auth token.\n return this.webex.credentials.getClientToken({\n uri: `${idbrokerService}idb/oauth2/v1/access_token`,\n scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM'\n });\n })\n .then((tokenObj) => {\n // Generate the token string.\n token = tokenObj.toString();\n\n // Collect the signin catalog using the client auth information.\n return this.collectSigninCatalog({email, token, forceRefresh});\n })\n // Validate if collecting the signin catalog failed and populate the RTO\n // with the appropriate content.\n .catch((error) => ({\n exists: (error.name !== 'NotFound'),\n activated: false,\n details: (error.name !== 'NotFound') ?\n 'user exists but is not activated' :\n 'user does not exist and is not activated'\n }))\n // Validate if the previous promise resolved with an RTO and populate the\n // new RTO accordingly.\n .then((rto) => Promise.all([\n rto || {\n activated: true,\n exists: true,\n details: 'user exists and is activated'\n },\n this.sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n })\n ]))\n .then(([rto, user]) => ({...rto, user}))\n .catch((error) => {\n const response = {\n statusCode: error.statusCode,\n responseText: error.body && error.body.message,\n body: error.body\n };\n\n return Promise.reject(response);\n });\n },\n\n /**\n * Fetches client region info such as countryCode and timezone.\n *\n * @returns {object} - The region info object.\n */\n fetchClientRegionInfo() {\n return this.request({\n uri: 'https://ds.ciscospark.com/v1/region',\n addAuthHeader: false,\n headers: {\n 'spark-user-agent': null\n }\n }).then((res) => {\n this.logger.info('services: received user region info');\n\n return res.body;\n }).catch((err) => {\n this.logger.info('services: was not able to get user region info', err);\n // resolve successfully even if request failed\n });\n },\n\n /**\n * User activation parameter transfer object for {@link sendUserActivation}.\n * @typedef {object} SendUserActivationPTO\n * @property {string} SendUserActivationPTO.email - The email of the user.\n * @property {string} SendUserActivationPTO.reqId - The activation requester.\n * @property {string} SendUserActivationPTO.token - The client auth token.\n * @property {object} SendUserActivationPTO.activationOptions - Extra options to pass when sending the activation.\n * @property {object} SendUserActivationPTO.preloginUserId - The prelogin user id to set when sending the activation.\n */\n\n /**\n * Send a request to activate a user using a client token.\n *\n * @param {SendUserActivationPTO} - The Parameter transfer object.\n * @returns {LicenseDTO} - The DTO returned from the **License** service.\n */\n sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n }) {\n this.logger.info('services: sending user activation request');\n let countryCode, timezone;\n\n\n // try to fetch client region info first\n return this.fetchClientRegionInfo()\n .then((clientRegionInfo) => {\n if (clientRegionInfo) {\n ({countryCode, timezone} = clientRegionInfo);\n }\n\n // Send the user activation request to the **License** service.\n return this.request({\n service: 'license',\n resource: 'users/activations',\n method: 'POST',\n headers: {\n accept: 'application/json',\n authorization: token,\n 'x-prelogin-userid': preloginUserId\n },\n body: {\n email,\n reqId,\n countryCode,\n timeZone: timezone,\n ...activationOptions\n },\n shouldRefreshAccessToken: false\n });\n })\n // On success, return the **License** user object.\n .then(({body}) => body)\n // On failure, reject with error from **License**.\n .catch((error) => Promise.reject(error));\n },\n\n /**\n * simplified method to update the preauth catalog via email\n *\n * @param {object} query\n * @param {string} query.email - A standard format email.\n * @param {string} query.orgId - The user's OrgId.\n * @param {boolean} forceRefresh - Boolean to bypass u2c cache control header\n * @returns {Promise<void>}\n */\n collectPreauthCatalog(query, forceRefresh = false) {\n if (!query) {\n return this.updateServices({from: 'limited', query: {mode: 'DEFAULT_BY_PROXIMITY'}, forceRefresh});\n }\n\n return this.updateServices({from: 'limited', query, forceRefresh});\n },\n\n /**\n * simplified method to update the signin catalog via email and token\n * @param {object} param\n * @param {string} param.email - must be a standard-format email\n * @param {string} param.token - must be a client token\n * @returns {Promise<void>}\n */\n collectSigninCatalog({email, token, forceRefresh} = {}) {\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n if (!token) {\n return Promise.reject(new Error('`token` is required'));\n }\n\n return this.updateServices({\n from: 'signin', query: {email}, token, forceRefresh\n });\n },\n\n /**\n * Updates credentials config to utilize u2c catalog\n * urls.\n * @returns {void}\n */\n updateCredentialsConfig() {\n const {idbroker, identity} = this.list(true);\n\n if (idbroker && identity) {\n const {authorizationString, authorizeUrl} = this.webex.config.credentials;\n\n // This must be set outside of the setConfig method used to assign the\n // idbroker and identity url values.\n this.webex.config.credentials.authorizeUrl = authorizationString ?\n authorizeUrl :\n `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;\n\n\n this.webex.setConfig({\n credentials: {\n idbroker: {\n url: idbroker.replace(trailingSlashes, '') // remove trailing slash\n },\n identity: {\n url: identity.replace(trailingSlashes, '') // remove trailing slash\n }\n }\n });\n }\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject afte ra timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n const catalog = this._getCatalog();\n const {supertoken} = this.webex.credentials;\n\n if (\n serviceGroup === 'postauth' &&\n supertoken &&\n supertoken.access_token &&\n !catalog.status.postauth.collecting &&\n !catalog.status.postauth.ready\n ) {\n if (!catalog.status.preauth.ready) {\n return this.initServiceCatalogs();\n }\n\n return this.updateServices();\n }\n\n return catalog.waitForCatalog(serviceGroup, timeout);\n },\n\n /**\n * Service waiting parameter transfer object for {@link waitForService}.\n *\n * @typedef {object} WaitForServicePTO\n * @property {string} [WaitForServicePTO.name] - The service name.\n * @property {string} [WaitForServicePTO.url] - The service url.\n * @property {string} [WaitForServicePTO.timeout] - wait duration in seconds.\n */\n\n /**\n * Wait until the service has been ammended to any service catalog. This\n * method prioritizes the service name over the service url when searching.\n *\n * @param {WaitForServicePTO} - The parameter transfer object.\n * @returns {Promise<string>} - Resolves to the priority host of a service.\n */\n waitForService({name, timeout = 5, url}) {\n const {services} = this.webex.config;\n\n // Save memory by grabbing the catalog after there isn't a priortyURL\n const catalog = this._getCatalog();\n\n const fetchFromServiceUrl = services.servicesNotNeedValidation.find((service) => service === name);\n\n if (fetchFromServiceUrl) {\n return Promise.resolve(this._serviceUrls[name]);\n }\n\n const priorityUrl = this.get(name, true);\n const priorityUrlObj = this.getServiceFromUrl(url);\n\n if (priorityUrl || priorityUrlObj) {\n return Promise.resolve(priorityUrl || priorityUrlObj.priorityUrl);\n }\n\n if (catalog.isReady) {\n if (url) { return Promise.resolve(url); }\n\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {\n fields: {service_name: name}\n });\n\n return Promise.reject(new Error(\n `services: service '${name}' was not found in any of the catalogs`\n ));\n }\n\n return new Promise((resolve, reject) => {\n const groupsToCheck = ['preauth', 'signin', 'postauth'];\n const checkCatalog = (catalogGroup) =>\n catalog.waitForCatalog(catalogGroup, timeout)\n .then(() => {\n const scopedPriorityUrl = this.get(name, true);\n const scopedPrioriryUrlObj = this.getServiceFromUrl(url);\n\n if (scopedPriorityUrl || scopedPrioriryUrlObj) {\n resolve(scopedPriorityUrl || scopedPrioriryUrlObj.priorityUrl);\n }\n })\n .catch(() => undefined);\n\n Promise.all(groupsToCheck.map((group) => checkCatalog(group)))\n .then(() => {\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {\n fields: {service_name: name}\n });\n reject(new Error(\n `services: service '${name}' was not found after waiting`\n ));\n });\n });\n },\n\n /**\n * @private\n * Organize a received hostmap from a service\n * catalog endpoint.\n * @param {object} serviceHostmap\n * @returns {object}\n */\n _formatReceivedHostmap(serviceHostmap) {\n // map the host catalog items to a formatted hostmap\n const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce(\n (accumulator, key) => {\n if (serviceHostmap.hostCatalog[key].length === 0) {\n return accumulator;\n }\n\n const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];\n const defaultUrl = serviceHostmap.serviceLinks[serviceName];\n\n let serviceItem = accumulator.find(\n (item) => item.name === serviceName\n );\n\n if (!serviceItem) {\n serviceItem = {\n name: serviceName,\n defaultUrl,\n defaultHost: Url.parse(defaultUrl).hostname,\n hosts: []\n };\n\n accumulator.push(serviceItem);\n }\n\n serviceItem.hosts.push(\n // map the default key as a low priority default for cluster matching\n {\n host: key,\n ttl: -1,\n priority: 10,\n id: serviceHostmap.hostCatalog[key][0].id,\n homeCluster: serviceItem.defaultHost === key\n },\n // map the rest of the hosts in their proper locations\n ...serviceHostmap.hostCatalog[key].map(\n (host) => ({\n ...host,\n homeCluster: serviceItem.defaultHost === key\n })\n )\n );\n\n return accumulator;\n }, []\n );\n\n // append service links that do not exist in the host catalog\n Object.keys(serviceHostmap.serviceLinks).forEach((key) => {\n const service = formattedHostmap.find((item) => item.name === key);\n\n if (!service) {\n formattedHostmap.push({\n name: key,\n defaultUrl: serviceHostmap.serviceLinks[key],\n defaultHost: Url.parse(serviceHostmap.serviceLinks[key]).hostname,\n hosts: []\n });\n }\n });\n\n // update all the service urls in the host catalog\n\n this._updateServiceUrls(serviceHostmap.serviceLinks);\n\n return formattedHostmap;\n },\n\n /**\n * Get the clusterId associated with a URL string.\n * @param {string} url\n * @returns {string} - Cluster ID of url provided\n */\n getClusterId(url) {\n const catalog = this._getCatalog();\n\n return catalog.findClusterId(url);\n },\n\n /**\n * Get a service value from a provided clusterId. This method will\n * return an object containing both the name and url of a found service.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost] - 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 getServiceFromClusterId(params) {\n const catalog = this._getCatalog();\n\n return catalog.findServiceFromClusterId(params);\n },\n\n /**\n * Get a service object from a service url if the service url exists in the\n * catalog.\n *\n * @param {string} url - The url to be validated.\n * @returns {object} - Service object.\n * @returns {object.name} - The name of the service found.\n * @returns {object.priorityUrl} - The priority url of the found service.\n * @returns {object.defaultUrl} - The default url of the found service.\n */\n getServiceFromUrl(url = '') {\n const service = this._getCatalog().findServiceUrlFromUrl(url);\n\n if (!service) {\n return undefined;\n }\n\n return {\n name: service.name,\n priorityUrl: service.get(true),\n defaultUrl: service.get()\n };\n },\n\n /**\n * Verify that a provided url exists in the service\n * catalog.\n * @param {string} url\n * @returns {boolean} - true if exists, false otherwise\n */\n isServiceUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findServiceUrlFromUrl(url));\n },\n\n /**\n * Determine if a provided url is in the catalog's allowed domains.\n *\n * @param {string} url - The url to match allowed domains against.\n * @returns {boolean} - True if the url provided is allowed.\n */\n isAllowedDomainUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findAllowedDomain(url));\n },\n\n /**\n * Converts the host portion of the url from default host\n * to a priority host\n *\n * @param {string} url a service url that contains a default host\n * @returns {string} a service url that contains the top priority host.\n * @throws if url isn't a service url\n */\n convertUrlToPriorityHostUrl(url = '') {\n const data = this.getServiceFromUrl(url);\n\n if (!data) {\n throw Error(`No service associated with url: [${url}]`);\n }\n\n return url.replace(data.defaultUrl, data.priorityUrl);\n },\n\n /**\n * @private\n * Simplified method wrapper for sending a request to get\n * an updated service hostmap.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n _fetchNewServiceHostmap({\n from, query, token, forceRefresh\n } = {}) {\n const service = 'u2c';\n const resource = from ? `/${from}/catalog` : '/catalog';\n const qs = {...query, format: 'hostmap'};\n\n if (forceRefresh) {\n qs.timestamp = new Date().getTime();\n }\n\n const requestObject = {\n method: 'GET', service, resource, qs\n };\n\n if (token) {\n requestObject.headers = {authorization: token};\n }\n\n return this.request(requestObject)\n .then(({body}) => this._formatReceivedHostmap(body));\n },\n\n /**\n * Initialize the discovery services and the whitelisted services.\n *\n * @returns {void}\n */\n initConfig() {\n // Get the catalog and destructure the services config.\n const catalog = this._getCatalog();\n const {services, fedramp} = this.webex.config;\n\n // Validate that the services configuration exists.\n if (services) {\n if (fedramp) {\n services.discovery = fedRampServices;\n }\n // Check for discovery services.\n if (services.discovery) {\n // Format the discovery configuration into an injectable array.\n const formattedDiscoveryServices = Object.keys(services.discovery)\n .map((key) => ({\n name: key,\n defaultUrl: services.discovery[key]\n }));\n\n // Inject formatted discovery services into services catalog.\n catalog.updateServiceUrls('discovery', formattedDiscoveryServices);\n }\n\n if (services.override) {\n // Format the override configuration into an injectable array.\n const formattedOverrideServices = Object.keys(services.override)\n .map((key) => ({\n name: key,\n defaultUrl: services.override[key]\n }));\n\n // Inject formatted override services into services catalog.\n catalog.updateServiceUrls('override', formattedOverrideServices);\n }\n\n // Check for allowed host domains.\n if (services.allowedDomains) {\n // Store the allowed domains as a property of the catalog.\n catalog.setAllowedDomains(services.allowedDomains);\n }\n\n // Set `validateDomains` property to match configuration\n this.validateDomains = services.validateDomains;\n }\n },\n\n /**\n * Make the initial requests to collect the root catalogs.\n *\n * @returns {Promise<void, Error>} - Errors if the token is unavailable.\n */\n initServiceCatalogs() {\n this.logger.info('services: initializing initial service catalogs');\n\n // Destructure the credentials plugin.\n const {credentials} = this.webex;\n\n // Init a promise chain. Must be done as a Promise.resolve() to allow\n // credentials#getOrgId() to properly throw.\n return Promise.resolve()\n // Get the user's OrgId.\n .then(() => credentials.getOrgId())\n // Begin collecting the preauth/limited catalog.\n .then((orgId) => this.collectPreauthCatalog({orgId}))\n .then(() => {\n // Validate if the token is authorized.\n if (credentials.canAuthorize) {\n // Attempt to collect the postauth catalog.\n return this.updateServices()\n .catch(() => this.logger.warn(\n 'services: cannot retrieve postauth catalog'\n ));\n }\n\n // Return a resolved promise for consistent return value.\n return Promise.resolve();\n });\n },\n\n /**\n * Initializer\n *\n * @instance\n * @memberof Services\n * @returns {Services}\n */\n initialize() {\n const catalog = new ServiceCatalog();\n const registry = new ServiceRegistry();\n const state = new ServiceState();\n\n this._catalogs.set(this.webex, catalog);\n this.registries.set(this.webex, registry);\n this.states.set(this.webex, state);\n\n // Listen for configuration changes once.\n this.listenToOnce(this.webex, 'change:config', () => {\n this.initConfig();\n });\n\n // wait for webex instance to be ready before attempting\n // to update the service catalogs\n this.listenToOnce(this.webex, 'ready', () => {\n const {supertoken} = this.webex.credentials;\n\n // Validate if the supertoken exists.\n if (supertoken && supertoken.access_token) {\n this.initServiceCatalogs()\n .then(() => {\n catalog.isReady = true;\n })\n .catch((error) => this.logger.error(\n `services: failed to init initial services, ${error.message}`\n ));\n }\n else {\n const {email} = this.webex.config;\n\n this.collectPreauthCatalog(email ? {email} : undefined);\n }\n });\n }\n});\n/* eslint-enable no-underscore-dangle */\n\nexport default Services;\n"]}
1
+ {"version":3,"sources":["services.js"],"names":["trailingSlashes","Services","WebexPlugin","extend","namespace","registries","states","props","validateDomains","_catalogs","_serviceUrls","getRegistry","get","webex","getState","_getCatalog","name","priorityHost","serviceGroup","catalog","hasService","serviceName","hasAllowedDomains","getAllowedDomains","length","list","markFailedUrl","url","noPriorityHosts","_updateServiceUrls","serviceUrls","updateServices","from","query","token","forceRefresh","formattedQuery","status","collecting","waitForCatalog","queryKey","includes","reject","Error","email","emailhash","toLowerCase","toString","_fetchNewServiceHostmap","then","serviceHostMap","updateServiceUrls","updateCredentialsConfig","catch","error","validateUser","reqId","activationOptions","preloginUserId","logger","info","canAuthorize","credentials","getUserToken","sendUserActivation","userObj","activated","exists","details","user","config","client_id","client_secret","collectPreauthCatalog","idbrokerService","getClientToken","uri","scope","tokenObj","collectSigninCatalog","rto","all","response","statusCode","responseText","body","message","fetchLoginUserInformation","request","method","service","resource","res","err","fetchClientRegionInfo","addAuthHeader","headers","countryCode","timezone","clientRegionInfo","accept","authorization","timeZone","shouldRefreshAccessToken","mode","idbroker","identity","authorizationString","authorizeUrl","replace","setConfig","timeout","supertoken","access_token","postauth","ready","preauth","initServiceCatalogs","waitForService","services","fetchFromServiceUrl","servicesNotNeedValidation","find","resolve","priorityUrl","priorityUrlObj","getServiceFromUrl","isReady","internal","metrics","submitClientMetrics","METRICS","JS_SDK_SERVICE_NOT_FOUND","fields","service_name","groupsToCheck","checkCatalog","catalogGroup","scopedPriorityUrl","scopedPrioriryUrlObj","undefined","map","group","_formatReceivedHostmap","serviceHostmap","formattedHostmap","hostCatalog","reduce","accumulator","key","id","split","defaultUrl","serviceLinks","serviceItem","item","defaultHost","Url","parse","hostname","hosts","push","host","ttl","priority","homeCluster","forEach","getClusterId","findClusterId","getServiceFromClusterId","params","findServiceFromClusterId","findServiceUrlFromUrl","isServiceUrl","isAllowedDomainUrl","findAllowedDomain","convertUrlToPriorityHostUrl","data","qs","format","timestamp","Date","getTime","requestObject","initConfig","fedramp","discovery","fedRampServices","formattedDiscoveryServices","override","formattedOverrideServices","allowedDomains","setAllowedDomains","getOrgId","orgId","warn","initialize","ServiceCatalog","registry","ServiceRegistry","state","ServiceState","set","listenToOnce"],"mappings":"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","sourcesContent":["import Url from 'url';\n\nimport sha256 from 'crypto-js/sha256';\n\nimport WebexPlugin from '../webex-plugin';\n\nimport METRICS from './metrics';\nimport ServiceCatalog from './service-catalog';\nimport ServiceRegistry from './service-registry';\nimport ServiceState from './service-state';\nimport fedRampServices from './service-fed-ramp';\n\n\nconst trailingSlashes = /(?:^\\/)|(?:\\/$)/;\n\n/* eslint-disable no-underscore-dangle */\n/**\n * @class\n */\nconst Services = WebexPlugin.extend({\n namespace: 'Services',\n\n /**\n * The {@link WeakMap} of {@link ServiceRegistry} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceRegistry>}\n * @private\n * @memberof Services\n */\n registries: new WeakMap(),\n\n /**\n * The {@link WeakMap} of {@link ServiceState} class instances that are\n * keyed with WebexCore instances.\n *\n * @instance\n * @type {WeakMap<WebexCore, ServiceState>}\n * @private\n * @memberof Services\n */\n states: new WeakMap(),\n\n props: {\n validateDomains: ['boolean', false, true]\n },\n\n _catalogs: new WeakMap(),\n\n _serviceUrls: null,\n\n /**\n * Get the registry associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceRegistry} - The associated {@link ServiceRegistry}.\n */\n getRegistry() {\n return this.registries.get(this.webex);\n },\n\n /**\n * Get the state associated with this webex instance.\n *\n * @private\n * @memberof Services\n * @returns {ServiceState} - The associated {@link ServiceState}.\n */\n getState() {\n return this.states.get(this.webex);\n },\n\n /**\n * @private\n * Get the current catalog based on the assocaited\n * webex instance.\n * @returns {ServiceCatalog}\n */\n _getCatalog() {\n return this._catalogs.get(this.webex);\n },\n\n /**\n * Get a service url from the current services list by name\n * from the associated instance catalog.\n * @param {string} name\n * @param {boolean} [priorityHost]\n * @param {string} [serviceGroup]\n * @returns {string|undefined}\n */\n get(name, priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.get(name, priorityHost, serviceGroup);\n },\n\n /**\n * Determine if the catalog contains a specific service\n *\n * @param {string} serviceName - The service name to validate.\n * @returns {boolean} - True if the service exists.\n */\n hasService(serviceName) {\n return !!(this.get(serviceName));\n },\n\n /**\n * Determine if a whilelist exists in the service catalog.\n *\n * @returns {boolean} - True if a allowed domains list exists.\n */\n hasAllowedDomains() {\n const catalog = this._getCatalog();\n\n return (catalog.getAllowedDomains().length > 0);\n },\n\n /**\n * Generate a service catalog as an object from\n * the associated instance catalog.\n * @param {boolean} [priorityHost] - use highest priority host if set to `true`\n * @param {string} [serviceGroup]\n * @returns {Record<string, string>}\n */\n list(priorityHost, serviceGroup) {\n const catalog = this._getCatalog();\n\n return catalog.list(priorityHost, serviceGroup);\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 catalog = this._getCatalog();\n\n return catalog.markFailedUrl(url, noPriorityHosts);\n },\n\n /**\n * saves all the services from the pre and post catalog service\n * @param {Object} serviceUrls\n * @returns {void}\n */\n _updateServiceUrls(serviceUrls) {\n this._serviceUrls = {...this._serviceUrls, ...serviceUrls};\n },\n\n\n /**\n * Update a list of `serviceUrls` to the most current\n * catalog via the defined `discoveryUrl` then returns the current\n * list of services.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n updateServices({\n from, query, token, forceRefresh\n } = {}) {\n const catalog = this._getCatalog();\n let formattedQuery, serviceGroup;\n\n // map catalog name to service group name.\n switch (from) {\n case 'limited': serviceGroup = 'preauth'; break;\n case 'signin': serviceGroup = 'signin'; break;\n default: serviceGroup = 'postauth'; break;\n }\n\n // confirm catalog update for group is not in progress.\n if (catalog.status[serviceGroup].collecting) {\n return this.waitForCatalog(serviceGroup);\n }\n\n catalog.status[serviceGroup].collecting = true;\n\n if (serviceGroup === 'preauth') {\n const queryKey = query && Object.keys(query)[0];\n\n if (!['email', 'emailhash', 'userId', 'orgId', 'mode'].includes(queryKey)) {\n return Promise.reject(new Error('a query param of email, emailhash, userId, orgId, or mode is required'));\n }\n }\n // encode email when query key is email\n if (serviceGroup === 'preauth' || serviceGroup === 'signin') {\n const queryKey = Object.keys(query)[0];\n\n formattedQuery = {};\n\n if (queryKey === 'email' && query.email) {\n formattedQuery.emailhash = sha256(query.email.toLowerCase()).toString();\n }\n else {\n formattedQuery[queryKey] = query[queryKey];\n }\n }\n\n return this._fetchNewServiceHostmap({\n from,\n token,\n query: formattedQuery,\n forceRefresh\n })\n .then((serviceHostMap) => {\n catalog.updateServiceUrls(serviceGroup, serviceHostMap);\n this.updateCredentialsConfig();\n catalog.status[serviceGroup].collecting = false;\n })\n .catch((error) => {\n catalog.status[serviceGroup].collecting = false;\n\n return Promise.reject(error);\n });\n },\n\n /**\n * User validation parameter transfer object for {@link validateUser}.\n * @param {object} ValidateUserPTO\n * @property {string} ValidateUserPTO.email - The email of the user.\n * @property {string} [ValidateUserPTO.reqId] - The activation requester.\n * @property {object} [ValidateUserPTO.activationOptions] - Extra options to pass when sending the activation\n * @property {object} [ValidateUserPTO.preloginUserId] - The prelogin user id to set when sending the activation.\n */\n\n /**\n * User validation return transfer object for {@link validateUser}.\n * @param {object} ValidateUserRTO\n * @property {boolean} ValidateUserRTO.activated - If the user is activated.\n * @property {boolean} ValidateUserRTO.exists - If the user exists.\n * @property {string} ValidateUserRTO.details - A descriptive status message.\n * @property {object} ValidateUserRTO.user - **License** service user object.\n */\n\n /**\n * Validate if a user is activated and update the service catalogs as needed\n * based on the user's activation status.\n *\n * @param {ValidateUserPTO} - The parameter transfer object.\n * @returns {ValidateUserRTO} - The return transfer object.\n */\n validateUser({\n email,\n reqId = 'WEBCLIENT',\n forceRefresh = false,\n activationOptions = {},\n preloginUserId\n }) {\n this.logger.info('services: validating a user');\n\n // Validate that an email parameter key was provided.\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n\n // Destructure the credentials object.\n const {canAuthorize} = this.webex.credentials;\n\n // Validate that the user is already authorized.\n if (canAuthorize) {\n return this.updateServices({forceRefresh})\n .then(() => this.webex.credentials.getUserToken())\n .then((token) => this.sendUserActivation({\n email,\n reqId,\n token: token.toString(),\n activationOptions,\n preloginUserId\n }))\n .then((userObj) => ({\n activated: true,\n exists: true,\n details: 'user is authorized via a user token',\n user: userObj\n }));\n }\n\n // Destructure the client authorization details.\n /* eslint-disable camelcase */\n const {client_id, client_secret} = this.webex.credentials.config;\n\n // Validate that client authentication details exist.\n if (!client_id || !client_secret) {\n return Promise.reject(new Error(\n 'client authentication details are not available'\n ));\n }\n /* eslint-enable camelcase */\n\n // Declare a class-memeber-scoped token for usage within the promise chain.\n let token;\n\n // Begin client authentication user validation.\n return this.collectPreauthCatalog({email})\n .then(() => {\n // Retrieve the service url from the updated catalog. This is required\n // since `WebexCore` is usually not fully initialized at the time this\n // request completes.\n const idbrokerService = this.get('idbroker', true);\n\n // Collect the client auth token.\n return this.webex.credentials.getClientToken({\n uri: `${idbrokerService}idb/oauth2/v1/access_token`,\n scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM'\n });\n })\n .then((tokenObj) => {\n // Generate the token string.\n token = tokenObj.toString();\n\n // Collect the signin catalog using the client auth information.\n return this.collectSigninCatalog({email, token, forceRefresh});\n })\n // Validate if collecting the signin catalog failed and populate the RTO\n // with the appropriate content.\n .catch((error) => ({\n exists: (error.name !== 'NotFound'),\n activated: false,\n details: (error.name !== 'NotFound') ?\n 'user exists but is not activated' :\n 'user does not exist and is not activated'\n }))\n // Validate if the previous promise resolved with an RTO and populate the\n // new RTO accordingly.\n .then((rto) => Promise.all([\n rto || {\n activated: true,\n exists: true,\n details: 'user exists and is activated'\n },\n this.sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n })\n ]))\n .then(([rto, user]) => ({...rto, user}))\n .catch((error) => {\n const response = {\n statusCode: error.statusCode,\n responseText: error.body && error.body.message,\n body: error.body\n };\n\n return Promise.reject(response);\n });\n },\n\n /**\n * Fetch login user infomation (preferred webex site).\n *\n * @returns {object} - User Information including user preferrences .\n */\n fetchLoginUserInformation() {\n return this.request({\n method: 'GET',\n service: 'identity',\n resource: 'identity/scim/v1/Users/me?showAllTypes=true'\n }).then((res) => {\n this.logger.info('services: received user region info');\n\n return res.body;\n }).catch((err) => {\n this.logger.info('services: was not able to fetch user login information', err);\n // resolve successfully even if request failed\n });\n },\n\n\n /**\n * Fetches client region info such as countryCode and timezone.\n *\n * @returns {object} - The region info object.\n */\n fetchClientRegionInfo() {\n return this.request({\n uri: 'https://ds.ciscospark.com/v1/region',\n addAuthHeader: false,\n headers: {\n 'spark-user-agent': null\n }\n }).then((res) => {\n this.logger.info('services: received user region info');\n\n return res.body;\n }).catch((err) => {\n this.logger.info('services: was not able to get user region info', err);\n // resolve successfully even if request failed\n });\n },\n\n /**\n * User activation parameter transfer object for {@link sendUserActivation}.\n * @typedef {object} SendUserActivationPTO\n * @property {string} SendUserActivationPTO.email - The email of the user.\n * @property {string} SendUserActivationPTO.reqId - The activation requester.\n * @property {string} SendUserActivationPTO.token - The client auth token.\n * @property {object} SendUserActivationPTO.activationOptions - Extra options to pass when sending the activation.\n * @property {object} SendUserActivationPTO.preloginUserId - The prelogin user id to set when sending the activation.\n */\n\n /**\n * Send a request to activate a user using a client token.\n *\n * @param {SendUserActivationPTO} - The Parameter transfer object.\n * @returns {LicenseDTO} - The DTO returned from the **License** service.\n */\n sendUserActivation({\n email,\n reqId,\n token,\n activationOptions,\n preloginUserId\n }) {\n this.logger.info('services: sending user activation request');\n let countryCode, timezone;\n\n\n // try to fetch client region info first\n return this.fetchClientRegionInfo()\n .then((clientRegionInfo) => {\n if (clientRegionInfo) {\n ({countryCode, timezone} = clientRegionInfo);\n }\n\n // Send the user activation request to the **License** service.\n return this.request({\n service: 'license',\n resource: 'users/activations',\n method: 'POST',\n headers: {\n accept: 'application/json',\n authorization: token,\n 'x-prelogin-userid': preloginUserId\n },\n body: {\n email,\n reqId,\n countryCode,\n timeZone: timezone,\n ...activationOptions\n },\n shouldRefreshAccessToken: false\n });\n })\n // On success, return the **License** user object.\n .then(({body}) => body)\n // On failure, reject with error from **License**.\n .catch((error) => Promise.reject(error));\n },\n\n /**\n * simplified method to update the preauth catalog via email\n *\n * @param {object} query\n * @param {string} query.email - A standard format email.\n * @param {string} query.orgId - The user's OrgId.\n * @param {boolean} forceRefresh - Boolean to bypass u2c cache control header\n * @returns {Promise<void>}\n */\n collectPreauthCatalog(query, forceRefresh = false) {\n if (!query) {\n return this.updateServices({from: 'limited', query: {mode: 'DEFAULT_BY_PROXIMITY'}, forceRefresh});\n }\n\n return this.updateServices({from: 'limited', query, forceRefresh});\n },\n\n /**\n * simplified method to update the signin catalog via email and token\n * @param {object} param\n * @param {string} param.email - must be a standard-format email\n * @param {string} param.token - must be a client token\n * @returns {Promise<void>}\n */\n collectSigninCatalog({email, token, forceRefresh} = {}) {\n if (!email) {\n return Promise.reject(new Error('`email` is required'));\n }\n if (!token) {\n return Promise.reject(new Error('`token` is required'));\n }\n\n return this.updateServices({\n from: 'signin', query: {email}, token, forceRefresh\n });\n },\n\n /**\n * Updates credentials config to utilize u2c catalog\n * urls.\n * @returns {void}\n */\n updateCredentialsConfig() {\n const {idbroker, identity} = this.list(true);\n\n if (idbroker && identity) {\n const {authorizationString, authorizeUrl} = this.webex.config.credentials;\n\n // This must be set outside of the setConfig method used to assign the\n // idbroker and identity url values.\n this.webex.config.credentials.authorizeUrl = authorizationString ?\n authorizeUrl :\n `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;\n\n\n this.webex.setConfig({\n credentials: {\n idbroker: {\n url: idbroker.replace(trailingSlashes, '') // remove trailing slash\n },\n identity: {\n url: identity.replace(trailingSlashes, '') // remove trailing slash\n }\n }\n });\n }\n },\n\n /**\n * Wait until the service catalog is available,\n * or reject afte ra timeout of 60 seconds.\n * @param {string} serviceGroup\n * @param {number} [timeout] - in seconds\n * @returns {Promise<void>}\n */\n waitForCatalog(serviceGroup, timeout) {\n const catalog = this._getCatalog();\n const {supertoken} = this.webex.credentials;\n\n if (\n serviceGroup === 'postauth' &&\n supertoken &&\n supertoken.access_token &&\n !catalog.status.postauth.collecting &&\n !catalog.status.postauth.ready\n ) {\n if (!catalog.status.preauth.ready) {\n return this.initServiceCatalogs();\n }\n\n return this.updateServices();\n }\n\n return catalog.waitForCatalog(serviceGroup, timeout);\n },\n\n /**\n * Service waiting parameter transfer object for {@link waitForService}.\n *\n * @typedef {object} WaitForServicePTO\n * @property {string} [WaitForServicePTO.name] - The service name.\n * @property {string} [WaitForServicePTO.url] - The service url.\n * @property {string} [WaitForServicePTO.timeout] - wait duration in seconds.\n */\n\n /**\n * Wait until the service has been ammended to any service catalog. This\n * method prioritizes the service name over the service url when searching.\n *\n * @param {WaitForServicePTO} - The parameter transfer object.\n * @returns {Promise<string>} - Resolves to the priority host of a service.\n */\n waitForService({name, timeout = 5, url}) {\n const {services} = this.webex.config;\n\n // Save memory by grabbing the catalog after there isn't a priortyURL\n const catalog = this._getCatalog();\n\n const fetchFromServiceUrl = services.servicesNotNeedValidation.find((service) => service === name);\n\n if (fetchFromServiceUrl) {\n return Promise.resolve(this._serviceUrls[name]);\n }\n\n const priorityUrl = this.get(name, true);\n const priorityUrlObj = this.getServiceFromUrl(url);\n\n if (priorityUrl || priorityUrlObj) {\n return Promise.resolve(priorityUrl || priorityUrlObj.priorityUrl);\n }\n\n if (catalog.isReady) {\n if (url) { return Promise.resolve(url); }\n\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {\n fields: {service_name: name}\n });\n\n return Promise.reject(new Error(\n `services: service '${name}' was not found in any of the catalogs`\n ));\n }\n\n return new Promise((resolve, reject) => {\n const groupsToCheck = ['preauth', 'signin', 'postauth'];\n const checkCatalog = (catalogGroup) =>\n catalog.waitForCatalog(catalogGroup, timeout)\n .then(() => {\n const scopedPriorityUrl = this.get(name, true);\n const scopedPrioriryUrlObj = this.getServiceFromUrl(url);\n\n if (scopedPriorityUrl || scopedPrioriryUrlObj) {\n resolve(scopedPriorityUrl || scopedPrioriryUrlObj.priorityUrl);\n }\n })\n .catch(() => undefined);\n\n Promise.all(groupsToCheck.map((group) => checkCatalog(group)))\n .then(() => {\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {\n fields: {service_name: name}\n });\n reject(new Error(\n `services: service '${name}' was not found after waiting`\n ));\n });\n });\n },\n\n /**\n * @private\n * Organize a received hostmap from a service\n * catalog endpoint.\n * @param {object} serviceHostmap\n * @returns {object}\n */\n _formatReceivedHostmap(serviceHostmap) {\n // map the host catalog items to a formatted hostmap\n const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce(\n (accumulator, key) => {\n if (serviceHostmap.hostCatalog[key].length === 0) {\n return accumulator;\n }\n\n const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];\n const defaultUrl = serviceHostmap.serviceLinks[serviceName];\n\n let serviceItem = accumulator.find(\n (item) => item.name === serviceName\n );\n\n if (!serviceItem) {\n serviceItem = {\n name: serviceName,\n defaultUrl,\n defaultHost: Url.parse(defaultUrl).hostname,\n hosts: []\n };\n\n accumulator.push(serviceItem);\n }\n\n serviceItem.hosts.push(\n // map the default key as a low priority default for cluster matching\n {\n host: key,\n ttl: -1,\n priority: 10,\n id: serviceHostmap.hostCatalog[key][0].id,\n homeCluster: serviceItem.defaultHost === key\n },\n // map the rest of the hosts in their proper locations\n ...serviceHostmap.hostCatalog[key].map(\n (host) => ({\n ...host,\n homeCluster: serviceItem.defaultHost === key\n })\n )\n );\n\n return accumulator;\n }, []\n );\n\n // append service links that do not exist in the host catalog\n Object.keys(serviceHostmap.serviceLinks).forEach((key) => {\n const service = formattedHostmap.find((item) => item.name === key);\n\n if (!service) {\n formattedHostmap.push({\n name: key,\n defaultUrl: serviceHostmap.serviceLinks[key],\n defaultHost: Url.parse(serviceHostmap.serviceLinks[key]).hostname,\n hosts: []\n });\n }\n });\n\n // update all the service urls in the host catalog\n\n this._updateServiceUrls(serviceHostmap.serviceLinks);\n\n return formattedHostmap;\n },\n\n /**\n * Get the clusterId associated with a URL string.\n * @param {string} url\n * @returns {string} - Cluster ID of url provided\n */\n getClusterId(url) {\n const catalog = this._getCatalog();\n\n return catalog.findClusterId(url);\n },\n\n /**\n * Get a service value from a provided clusterId. This method will\n * return an object containing both the name and url of a found service.\n * @param {object} params\n * @param {string} params.clusterId - clusterId of found service\n * @param {boolean} [params.priorityHost] - 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 getServiceFromClusterId(params) {\n const catalog = this._getCatalog();\n\n return catalog.findServiceFromClusterId(params);\n },\n\n /**\n * Get a service object from a service url if the service url exists in the\n * catalog.\n *\n * @param {string} url - The url to be validated.\n * @returns {object} - Service object.\n * @returns {object.name} - The name of the service found.\n * @returns {object.priorityUrl} - The priority url of the found service.\n * @returns {object.defaultUrl} - The default url of the found service.\n */\n getServiceFromUrl(url = '') {\n const service = this._getCatalog().findServiceUrlFromUrl(url);\n\n if (!service) {\n return undefined;\n }\n\n return {\n name: service.name,\n priorityUrl: service.get(true),\n defaultUrl: service.get()\n };\n },\n\n /**\n * Verify that a provided url exists in the service\n * catalog.\n * @param {string} url\n * @returns {boolean} - true if exists, false otherwise\n */\n isServiceUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findServiceUrlFromUrl(url));\n },\n\n /**\n * Determine if a provided url is in the catalog's allowed domains.\n *\n * @param {string} url - The url to match allowed domains against.\n * @returns {boolean} - True if the url provided is allowed.\n */\n isAllowedDomainUrl(url) {\n const catalog = this._getCatalog();\n\n return !!(catalog.findAllowedDomain(url));\n },\n\n /**\n * Converts the host portion of the url from default host\n * to a priority host\n *\n * @param {string} url a service url that contains a default host\n * @returns {string} a service url that contains the top priority host.\n * @throws if url isn't a service url\n */\n convertUrlToPriorityHostUrl(url = '') {\n const data = this.getServiceFromUrl(url);\n\n if (!data) {\n throw Error(`No service associated with url: [${url}]`);\n }\n\n return url.replace(data.defaultUrl, data.priorityUrl);\n },\n\n /**\n * @private\n * Simplified method wrapper for sending a request to get\n * an updated service hostmap.\n * @param {object} [param]\n * @param {string} [param.from] - This accepts `limited` or `signin`\n * @param {object} [param.query] - This accepts `email`, `orgId` or `userId` key values\n * @param {string} [param.query.email] - must be a standard-format email\n * @param {string} [param.query.orgId] - must be an organization id\n * @param {string} [param.query.userId] - must be a user id\n * @param {string} [param.token] - used for signin catalog\n * @returns {Promise<object>}\n */\n _fetchNewServiceHostmap({\n from, query, token, forceRefresh\n } = {}) {\n const service = 'u2c';\n const resource = from ? `/${from}/catalog` : '/catalog';\n const qs = {...query, format: 'hostmap'};\n\n if (forceRefresh) {\n qs.timestamp = new Date().getTime();\n }\n\n const requestObject = {\n method: 'GET', service, resource, qs\n };\n\n if (token) {\n requestObject.headers = {authorization: token};\n }\n\n return this.request(requestObject)\n .then(({body}) => this._formatReceivedHostmap(body));\n },\n\n /**\n * Initialize the discovery services and the whitelisted services.\n *\n * @returns {void}\n */\n initConfig() {\n // Get the catalog and destructure the services config.\n const catalog = this._getCatalog();\n const {services, fedramp} = this.webex.config;\n\n // Validate that the services configuration exists.\n if (services) {\n if (fedramp) {\n services.discovery = fedRampServices;\n }\n // Check for discovery services.\n if (services.discovery) {\n // Format the discovery configuration into an injectable array.\n const formattedDiscoveryServices = Object.keys(services.discovery)\n .map((key) => ({\n name: key,\n defaultUrl: services.discovery[key]\n }));\n\n // Inject formatted discovery services into services catalog.\n catalog.updateServiceUrls('discovery', formattedDiscoveryServices);\n }\n\n if (services.override) {\n // Format the override configuration into an injectable array.\n const formattedOverrideServices = Object.keys(services.override)\n .map((key) => ({\n name: key,\n defaultUrl: services.override[key]\n }));\n\n // Inject formatted override services into services catalog.\n catalog.updateServiceUrls('override', formattedOverrideServices);\n }\n\n // Check for allowed host domains.\n if (services.allowedDomains) {\n // Store the allowed domains as a property of the catalog.\n catalog.setAllowedDomains(services.allowedDomains);\n }\n\n // Set `validateDomains` property to match configuration\n this.validateDomains = services.validateDomains;\n }\n },\n\n /**\n * Make the initial requests to collect the root catalogs.\n *\n * @returns {Promise<void, Error>} - Errors if the token is unavailable.\n */\n initServiceCatalogs() {\n this.logger.info('services: initializing initial service catalogs');\n\n // Destructure the credentials plugin.\n const {credentials} = this.webex;\n\n // Init a promise chain. Must be done as a Promise.resolve() to allow\n // credentials#getOrgId() to properly throw.\n return Promise.resolve()\n // Get the user's OrgId.\n .then(() => credentials.getOrgId())\n // Begin collecting the preauth/limited catalog.\n .then((orgId) => this.collectPreauthCatalog({orgId}))\n .then(() => {\n // Validate if the token is authorized.\n if (credentials.canAuthorize) {\n // Attempt to collect the postauth catalog.\n return this.updateServices()\n .catch(() => this.logger.warn(\n 'services: cannot retrieve postauth catalog'\n ));\n }\n\n // Return a resolved promise for consistent return value.\n return Promise.resolve();\n });\n },\n\n /**\n * Initializer\n *\n * @instance\n * @memberof Services\n * @returns {Services}\n */\n initialize() {\n const catalog = new ServiceCatalog();\n const registry = new ServiceRegistry();\n const state = new ServiceState();\n\n this._catalogs.set(this.webex, catalog);\n this.registries.set(this.webex, registry);\n this.states.set(this.webex, state);\n\n // Listen for configuration changes once.\n this.listenToOnce(this.webex, 'change:config', () => {\n this.initConfig();\n });\n\n // wait for webex instance to be ready before attempting\n // to update the service catalogs\n this.listenToOnce(this.webex, 'ready', () => {\n const {supertoken} = this.webex.credentials;\n\n // Validate if the supertoken exists.\n if (supertoken && supertoken.access_token) {\n this.initServiceCatalogs()\n .then(() => {\n catalog.isReady = true;\n })\n .catch((error) => this.logger.error(\n `services: failed to init initial services, ${error.message}`\n ));\n }\n else {\n const {email} = this.webex.config;\n\n this.collectPreauthCatalog(email ? {email} : undefined);\n }\n });\n }\n});\n/* eslint-enable no-underscore-dangle */\n\nexport default Services;\n"]}
@@ -70,7 +70,7 @@ var Logger = _webexPlugin.default.extend({
70
70
  info: wrapConsoleMethod('info'),
71
71
  debug: wrapConsoleMethod('debug'),
72
72
  trace: wrapConsoleMethod('trace'),
73
- version: "1.157.0"
73
+ version: "1.159.0"
74
74
  });
75
75
 
76
76
  (0, _webexCore.registerPlugin)('logger', Logger);
@@ -159,7 +159,7 @@ var MAX_FILE_SIZE_IN_MB = 2048;
159
159
  */
160
160
 
161
161
  var WebexCore = _ampersandState.default.extend((_obj = {
162
- version: "1.157.0",
162
+ version: "1.159.0",
163
163
  children: {
164
164
  internal: _webexInternalCore.default
165
165
  },
@@ -757,7 +757,7 @@ var WebexCore = _ampersandState.default.extend((_obj = {
757
757
  }
758
758
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj)), _obj));
759
759
 
760
- WebexCore.version = "1.157.0";
760
+ WebexCore.version = "1.159.0";
761
761
  (0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
762
762
  (0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
763
763
  var _default = WebexCore;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/webex-core",
3
- "version": "1.157.0",
3
+ "version": "1.159.0",
4
4
  "description": "Plugin handling for Cisco Webex",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -28,15 +28,15 @@
28
28
  "@babel/runtime-corejs2": "^7.14.8",
29
29
  "lodash": "^4.17.21",
30
30
  "ampersand-state": "^5.0.3",
31
- "@webex/common": "1.157.0",
31
+ "@webex/common": "1.159.0",
32
32
  "ampersand-events": "^2.0.2",
33
- "@webex/http-core": "1.157.0",
33
+ "@webex/http-core": "1.159.0",
34
34
  "uuid": "^3.3.2",
35
35
  "jsonwebtoken": "^8.5.1",
36
- "@webex/common-timers": "1.157.0",
36
+ "@webex/common-timers": "1.159.0",
37
37
  "ampersand-collection": "^2.0.2",
38
38
  "crypto-js": "^4.1.1",
39
- "@webex/webex-core": "1.157.0",
39
+ "@webex/webex-core": "1.159.0",
40
40
  "core-decorators": "^0.20.0",
41
41
  "envify": "^4.1.0"
42
42
  }
@@ -36,6 +36,10 @@ export default class PayloadTransformerInterceptor extends Interceptor {
36
36
  * @returns {Object}
37
37
  */
38
38
  onResponse(options, response) {
39
+ if (options.disableTransform) {
40
+ return response;
41
+ }
42
+
39
43
  return this.webex.transform('inbound', response);
40
44
  }
41
45
 
@@ -154,7 +154,13 @@ const Credentials = WebexPlugin.extend({
154
154
  'credentials: attempting to extract OrgId from user token'
155
155
  );
156
156
 
157
- return this.extractOrgIdFromUserToken(this.supertoken.access_token);
157
+ try {
158
+ return this.extractOrgIdFromUserToken(this.supertoken?.access_token);
159
+ }
160
+ catch (f) {
161
+ this.logger.info('credentials: could not extract OrgId from user token');
162
+ throw f;
163
+ }
158
164
  }
159
165
  },
160
166
 
@@ -365,6 +365,27 @@ const Services = WebexPlugin.extend({
365
365
  });
366
366
  },
367
367
 
368
+ /**
369
+ * Fetch login user infomation (preferred webex site).
370
+ *
371
+ * @returns {object} - User Information including user preferrences .
372
+ */
373
+ fetchLoginUserInformation() {
374
+ return this.request({
375
+ method: 'GET',
376
+ service: 'identity',
377
+ resource: 'identity/scim/v1/Users/me?showAllTypes=true'
378
+ }).then((res) => {
379
+ this.logger.info('services: received user region info');
380
+
381
+ return res.body;
382
+ }).catch((err) => {
383
+ this.logger.info('services: was not able to fetch user login information', err);
384
+ // resolve successfully even if request failed
385
+ });
386
+ },
387
+
388
+
368
389
  /**
369
390
  * Fetches client region info such as countryCode and timezone.
370
391
  *
@@ -259,7 +259,10 @@ describe('webex-core', () => {
259
259
  });
260
260
 
261
261
  it('should throw if the OrgId was not determined', () =>
262
- assert.throws(() => credentials.getOrgId()));
262
+ assert.throws(
263
+ () => credentials.getOrgId(),
264
+ 'the provided token is not a valid format'
265
+ ));
263
266
  });
264
267
 
265
268
  describe('#extractOrgIdFromJWT()', () => {
@@ -17,7 +17,7 @@ import {
17
17
  WebexHttpError,
18
18
  Token
19
19
  } from '@webex/webex-core';
20
- import {cloneDeep} from 'lodash';
20
+ import {cloneDeep, merge} from 'lodash';
21
21
 
22
22
  const {assert} = chai;
23
23
 
@@ -35,7 +35,7 @@ describe('webex-core', () => {
35
35
  credentials: Credentials,
36
36
  logger: Logger
37
37
  },
38
- config: cloneDeep(config)
38
+ config: merge(cloneDeep(config), {credentials: {client_secret: 'fake'}})
39
39
  });
40
40
 
41
41
  webex.credentials.supertoken = new Token({
@@ -344,7 +344,6 @@ describe('webex-core', () => {
344
344
  access_token: 'ST2'
345
345
  }
346
346
  }));
347
-
348
347
  webex.credentials.supertoken = new Token({
349
348
  access_token: 'ST1',
350
349
  refresh_token: 'RT1'
@@ -367,7 +366,7 @@ describe('webex-core', () => {
367
366
 
368
367
  return interceptor.onResponseError(err.options, err)
369
368
  .then(() => {
370
- // once for refresh, once for replay
369
+ // once for refresh, once for replay
371
370
  assert.calledTwice(webex.request);
372
371
  assert.equal(webex.credentials.supertoken.access_token, 'ST2');
373
372
  assert.equal(webex.request.args[1][0].replayCount, 1);
@@ -4,8 +4,8 @@
4
4
 
5
5
  import {assert} from '@webex/test-helper-chai';
6
6
  import MockWebex from '@webex/test-helper-mock-webex';
7
- import {Services, ServiceRegistry, ServiceState} from '@webex/webex-core';
8
7
  import sinon from 'sinon';
8
+ import {Services, ServiceRegistry, ServiceState} from '@webex/webex-core';
9
9
 
10
10
  /* eslint-disable no-underscore-dangle */
11
11
  describe('webex-core', () => {
@@ -100,6 +100,37 @@ describe('webex-core', () => {
100
100
  });
101
101
  });
102
102
 
103
+ describe('#fetchLoginUserInformation', () => {
104
+ it('Fetch login users information ', async () => {
105
+ const userPreferences = {userPreferences: 'userPreferences'};
106
+
107
+ webex.request = sinon.stub().returns(Promise.resolve({body: userPreferences}));
108
+
109
+ const res = await services.fetchLoginUserInformation();
110
+
111
+ assert.calledWith(webex.request, {
112
+ method: 'GET',
113
+ service: 'identity',
114
+ resource: 'identity/scim/v1/Users/me?showAllTypes=true'
115
+ });
116
+ assert.isDefined(res);
117
+ assert.equal(res, userPreferences);
118
+ });
119
+
120
+ it('Resolve fetchLoginUserInformation if the api request fails ', async () => {
121
+ webex.request = sinon.stub().returns(Promise.reject());
122
+
123
+ const res = await services.fetchLoginUserInformation();
124
+
125
+ assert.calledWith(webex.request, {
126
+ method: 'GET',
127
+ service: 'identity',
128
+ resource: 'identity/scim/v1/Users/me?showAllTypes=true'
129
+ });
130
+ assert.isUndefined(res);
131
+ });
132
+ });
133
+
103
134
  describe('#_formatReceivedHostmap()', () => {
104
135
  let serviceHostmap;
105
136
  let formattedHM;