@webex/webex-core 1.156.3 → 1.157.1

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.
@@ -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.156.3"
332
+ version: "1.157.1"
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.156.3"
601
+ version: "1.157.1"
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.156.3"
608
+ version: "1.157.1"
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;
@@ -1061,7 +1061,7 @@ var Services = _webexPlugin.default.extend({
1061
1061
  }
1062
1062
  });
1063
1063
  },
1064
- version: "1.156.3"
1064
+ version: "1.157.1"
1065
1065
  });
1066
1066
  /* eslint-enable no-underscore-dangle */
1067
1067
 
@@ -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.156.3"
73
+ version: "1.157.1"
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.156.3",
162
+ version: "1.157.1",
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.156.3";
760
+ WebexCore.version = "1.157.1";
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.156.3",
3
+ "version": "1.157.1",
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.156.3",
31
+ "@webex/common": "1.157.1",
32
32
  "ampersand-events": "^2.0.2",
33
- "@webex/http-core": "1.156.3",
33
+ "@webex/http-core": "1.157.1",
34
34
  "uuid": "^3.3.2",
35
35
  "jsonwebtoken": "^8.5.1",
36
- "@webex/common-timers": "1.156.3",
36
+ "@webex/common-timers": "1.157.1",
37
37
  "ampersand-collection": "^2.0.2",
38
38
  "crypto-js": "^4.1.1",
39
- "@webex/webex-core": "1.156.3",
39
+ "@webex/webex-core": "1.157.1",
40
40
  "core-decorators": "^0.20.0",
41
41
  "envify": "^4.1.0"
42
42
  }
@@ -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
 
@@ -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);