@webex/webex-core 3.12.0-next.14 → 3.12.0-next.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/credentials-config.js +12 -0
- package/dist/credentials-config.js.map +1 -1
- package/dist/lib/batcher.js +23 -7
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +34 -1
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/services/services.js +1 -1
- package/dist/lib/services-v2/services-v2.js +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +2 -2
- package/package.json +13 -13
- package/src/credentials-config.js +13 -0
- package/src/lib/batcher.js +25 -10
- package/src/lib/credentials/credentials.js +34 -0
- package/test/unit/spec/credentials/credentials.js +72 -2
- package/test/unit/spec/lib/batcher.js +56 -0
|
@@ -144,6 +144,18 @@ var CredentialsConfig = _ampersandState.default.extend({
|
|
|
144
144
|
},
|
|
145
145
|
cache: false
|
|
146
146
|
},
|
|
147
|
+
/**
|
|
148
|
+
* URL used to initiate the IdBroker third-party (social provider)
|
|
149
|
+
* sign-in flow.
|
|
150
|
+
* @type {string}
|
|
151
|
+
*/
|
|
152
|
+
thirdPartyLoginUrl: {
|
|
153
|
+
deps: ['idbroker.url'],
|
|
154
|
+
fn: function fn() {
|
|
155
|
+
return "".concat(this.idbroker.url, "/idb/ThirdPartyLogin");
|
|
156
|
+
},
|
|
157
|
+
cache: false
|
|
158
|
+
},
|
|
147
159
|
/**
|
|
148
160
|
* Set password URL
|
|
149
161
|
* @type {string}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_ampersandState","_interopRequireDefault","require","CredentialsConfig","AmpState","extend","extraProperties","props","idbroker","url","process","env","IDBROKER_BASE_URL","identity","IDENTITY_BASE_URL","authorizationString","WEBEX_AUTHORIZATION_STRING","AUTHORIZATION_STRING","authorizeUrl","WEBEX_AUTHORIZE_URL","concat","client_id","WEBEX_CLIENT_ID","COMMON_IDENTITY_CLIENT_ID","CLIENT_ID","client_secret","WEBEX_CLIENT_SECRET","COMMON_IDENTITY_CLIENT_SECRET","CLIENT_SECRET","redirect_uri","WEBEX_REDIRECT_URI","COMMON_IDENTITY_REDIRECT_URI","REDIRECT_URI","scope","WEBEX_SCOPE","WEBEX_SCOPES","COMMON_IDENTITY_SCOPE","SCOPE","cisService","derived","activationUrl","deps","fn","cache","generateOtpUrl","validateOtpUrl","tokenUrl","TOKEN_URL","revokeUrl","REVOKE_URL","logoutUrl","setPasswordUrl","_default","exports","default"],"sources":["credentials-config.js"],"sourcesContent":["import AmpState from 'ampersand-state';\n\n// The credentials config which includes the CI server info and derived\n// URL properties from them for the various CI services. The URL's\n// will be updated when the CI changes.\nconst CredentialsConfig = AmpState.extend({\n // we need to allow extra props for dynamic props like jwtRefreshCallback\n extraProperties: 'allow',\n\n props: {\n /**\n * The idbroker base host name\n * @returns {object}\n */\n idbroker: [\n 'object',\n false,\n () => ({\n url: process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com',\n }),\n ],\n\n /**\n * The identity base host name\n * @returns {object}\n */\n identity: [\n 'object',\n false,\n () => ({\n url: process.env.IDENTITY_BASE_URL || 'https://identity.webex.com',\n }),\n ],\n\n /**\n * This is the authorization url displayed on the\n * {@link developer portal|https://developer.webex.com}\n * @type {string}\n */\n authorizationString: [\n 'string',\n false,\n process.env.WEBEX_AUTHORIZATION_STRING || process.env.AUTHORIZATION_STRING,\n ],\n\n /**\n * Authorization URL which prompts for user's password. Inferred from\n * {@link config.credentials.authorizationString}. This config value will\n * be automatically set if `authorizationString` config value is specified.\n *\n * @type {string}\n */\n authorizeUrl: [\n 'string',\n false,\n process.env.WEBEX_AUTHORIZE_URL ||\n `${process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com'}/idb/oauth2/v1/authorize`,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n client_id: [\n 'string',\n false,\n process.env.WEBEX_CLIENT_ID || process.env.COMMON_IDENTITY_CLIENT_ID || process.env.CLIENT_ID,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n client_secret: [\n 'string',\n false,\n process.env.WEBEX_CLIENT_SECRET ||\n process.env.COMMON_IDENTITY_CLIENT_SECRET ||\n process.env.CLIENT_SECRET,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n redirect_uri: [\n 'string',\n false,\n process.env.WEBEX_REDIRECT_URI ||\n process.env.COMMON_IDENTITY_REDIRECT_URI ||\n process.env.REDIRECT_URI,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n scope: [\n 'string',\n false,\n process.env.WEBEX_SCOPE ||\n process.env.WEBEX_SCOPES ||\n process.env.COMMON_IDENTITY_SCOPE ||\n process.env.SCOPE,\n ],\n\n /**\n * Controls the UI of the CI login page.\n * @private\n * @type {string}\n */\n cisService: ['string', false, 'webex'],\n },\n\n derived: {\n /**\n * User activation URL\n * {@link config.credentials.activationUrl}\n * @type {string}\n */\n activationUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${\n this.idbroker.url || 'https://idbroker.webex.com'\n }/idb/token/v1/actions/UserActivation/invoke`;\n },\n cache: false,\n },\n\n /**\n * Generate OTP URL\n * {@link config.credentials.generateOtpUrl}\n * @type {string}\n */\n generateOtpUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${\n this.idbroker.url || 'https://idbroker.webex.com'\n }/idb/token/v1/actions/UserOTP/Generate/invoke`;\n },\n cache: false,\n },\n\n /**\n * Validate OTP URL\n * {@link config.credentials.validateOtpUrl}\n * @type {string}\n */\n validateOtpUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${\n this.idbroker.url || 'https://idbroker.webex.com'\n }/idb/token/v1/actions/UserOTP/Validate/invoke`;\n },\n cache: false,\n },\n\n // TODO does hydra also have an access_token endpoint?\n /**\n * Token URL used for token refresh and auth code exchange\n * @type {string}\n */\n tokenUrl: {\n deps: ['idbroker.url'],\n fn() {\n return process.env.TOKEN_URL || `${this.idbroker.url}/idb/oauth2/v1/access_token`;\n },\n cache: false,\n },\n\n /**\n * URL to revoke token\n * @type {string}\n */\n revokeUrl: {\n deps: ['idbroker.url'],\n fn() {\n return process.env.REVOKE_URL || `${this.idbroker.url}/idb/oauth2/v1/revoke`;\n },\n cache: false,\n },\n\n /**\n * URL to load when the app logs out\n * @type {string}\n */\n logoutUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${this.idbroker.url}/idb/oauth2/v1/logout`;\n },\n cache: false,\n },\n\n /**\n * Set password URL\n * @type {string}\n */\n setPasswordUrl: {\n deps: ['identity.url'],\n fn() {\n return `${this.identity.url || 'https://identity.webex.com'}/identity/scim/v1/Users`;\n },\n cache: false,\n },\n },\n});\n\nexport default CredentialsConfig;\n"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_ampersandState","_interopRequireDefault","require","CredentialsConfig","AmpState","extend","extraProperties","props","idbroker","url","process","env","IDBROKER_BASE_URL","identity","IDENTITY_BASE_URL","authorizationString","WEBEX_AUTHORIZATION_STRING","AUTHORIZATION_STRING","authorizeUrl","WEBEX_AUTHORIZE_URL","concat","client_id","WEBEX_CLIENT_ID","COMMON_IDENTITY_CLIENT_ID","CLIENT_ID","client_secret","WEBEX_CLIENT_SECRET","COMMON_IDENTITY_CLIENT_SECRET","CLIENT_SECRET","redirect_uri","WEBEX_REDIRECT_URI","COMMON_IDENTITY_REDIRECT_URI","REDIRECT_URI","scope","WEBEX_SCOPE","WEBEX_SCOPES","COMMON_IDENTITY_SCOPE","SCOPE","cisService","derived","activationUrl","deps","fn","cache","generateOtpUrl","validateOtpUrl","tokenUrl","TOKEN_URL","revokeUrl","REVOKE_URL","logoutUrl","thirdPartyLoginUrl","setPasswordUrl","_default","exports","default"],"sources":["credentials-config.js"],"sourcesContent":["import AmpState from 'ampersand-state';\n\n// The credentials config which includes the CI server info and derived\n// URL properties from them for the various CI services. The URL's\n// will be updated when the CI changes.\nconst CredentialsConfig = AmpState.extend({\n // we need to allow extra props for dynamic props like jwtRefreshCallback\n extraProperties: 'allow',\n\n props: {\n /**\n * The idbroker base host name\n * @returns {object}\n */\n idbroker: [\n 'object',\n false,\n () => ({\n url: process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com',\n }),\n ],\n\n /**\n * The identity base host name\n * @returns {object}\n */\n identity: [\n 'object',\n false,\n () => ({\n url: process.env.IDENTITY_BASE_URL || 'https://identity.webex.com',\n }),\n ],\n\n /**\n * This is the authorization url displayed on the\n * {@link developer portal|https://developer.webex.com}\n * @type {string}\n */\n authorizationString: [\n 'string',\n false,\n process.env.WEBEX_AUTHORIZATION_STRING || process.env.AUTHORIZATION_STRING,\n ],\n\n /**\n * Authorization URL which prompts for user's password. Inferred from\n * {@link config.credentials.authorizationString}. This config value will\n * be automatically set if `authorizationString` config value is specified.\n *\n * @type {string}\n */\n authorizeUrl: [\n 'string',\n false,\n process.env.WEBEX_AUTHORIZE_URL ||\n `${process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com'}/idb/oauth2/v1/authorize`,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n client_id: [\n 'string',\n false,\n process.env.WEBEX_CLIENT_ID || process.env.COMMON_IDENTITY_CLIENT_ID || process.env.CLIENT_ID,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n client_secret: [\n 'string',\n false,\n process.env.WEBEX_CLIENT_SECRET ||\n process.env.COMMON_IDENTITY_CLIENT_SECRET ||\n process.env.CLIENT_SECRET,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n redirect_uri: [\n 'string',\n false,\n process.env.WEBEX_REDIRECT_URI ||\n process.env.COMMON_IDENTITY_REDIRECT_URI ||\n process.env.REDIRECT_URI,\n ],\n\n /**\n * {@see https://tools.ietf.org/html/rfc6749#section-4.1.4}\n * @type {string}\n */\n scope: [\n 'string',\n false,\n process.env.WEBEX_SCOPE ||\n process.env.WEBEX_SCOPES ||\n process.env.COMMON_IDENTITY_SCOPE ||\n process.env.SCOPE,\n ],\n\n /**\n * Controls the UI of the CI login page.\n * @private\n * @type {string}\n */\n cisService: ['string', false, 'webex'],\n },\n\n derived: {\n /**\n * User activation URL\n * {@link config.credentials.activationUrl}\n * @type {string}\n */\n activationUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${\n this.idbroker.url || 'https://idbroker.webex.com'\n }/idb/token/v1/actions/UserActivation/invoke`;\n },\n cache: false,\n },\n\n /**\n * Generate OTP URL\n * {@link config.credentials.generateOtpUrl}\n * @type {string}\n */\n generateOtpUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${\n this.idbroker.url || 'https://idbroker.webex.com'\n }/idb/token/v1/actions/UserOTP/Generate/invoke`;\n },\n cache: false,\n },\n\n /**\n * Validate OTP URL\n * {@link config.credentials.validateOtpUrl}\n * @type {string}\n */\n validateOtpUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${\n this.idbroker.url || 'https://idbroker.webex.com'\n }/idb/token/v1/actions/UserOTP/Validate/invoke`;\n },\n cache: false,\n },\n\n // TODO does hydra also have an access_token endpoint?\n /**\n * Token URL used for token refresh and auth code exchange\n * @type {string}\n */\n tokenUrl: {\n deps: ['idbroker.url'],\n fn() {\n return process.env.TOKEN_URL || `${this.idbroker.url}/idb/oauth2/v1/access_token`;\n },\n cache: false,\n },\n\n /**\n * URL to revoke token\n * @type {string}\n */\n revokeUrl: {\n deps: ['idbroker.url'],\n fn() {\n return process.env.REVOKE_URL || `${this.idbroker.url}/idb/oauth2/v1/revoke`;\n },\n cache: false,\n },\n\n /**\n * URL to load when the app logs out\n * @type {string}\n */\n logoutUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${this.idbroker.url}/idb/oauth2/v1/logout`;\n },\n cache: false,\n },\n\n /**\n * URL used to initiate the IdBroker third-party (social provider)\n * sign-in flow.\n * @type {string}\n */\n thirdPartyLoginUrl: {\n deps: ['idbroker.url'],\n fn() {\n return `${this.idbroker.url}/idb/ThirdPartyLogin`;\n },\n cache: false,\n },\n\n /**\n * Set password URL\n * @type {string}\n */\n setPasswordUrl: {\n deps: ['identity.url'],\n fn() {\n return `${this.identity.url || 'https://identity.webex.com'}/identity/scim/v1/Users`;\n },\n cache: false,\n },\n },\n});\n\nexport default CredentialsConfig;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/lib/batcher.js
CHANGED
|
@@ -65,11 +65,12 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
65
65
|
}
|
|
66
66
|
_this2.deferreds.set(idx, defer);
|
|
67
67
|
_this2.prepareItem(item).then(function (req) {
|
|
68
|
-
|
|
68
|
+
// Attach cleanup handlers to the original deferred promise without
|
|
69
|
+
// creating an unobserved rejected chain.
|
|
70
|
+
defer.promise.then(function () {
|
|
71
|
+
return _this2.deferreds.delete(idx);
|
|
72
|
+
}, function () {
|
|
69
73
|
return _this2.deferreds.delete(idx);
|
|
70
|
-
})).catch(function (reason) {
|
|
71
|
-
_this2.deferreds.delete(idx);
|
|
72
|
-
return _promise.default.reject(reason);
|
|
73
74
|
});
|
|
74
75
|
_this2.enqueue(req).then(function () {
|
|
75
76
|
return _this2.bounce();
|
|
@@ -118,7 +119,17 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
118
119
|
});
|
|
119
120
|
}).catch(function (reason) {
|
|
120
121
|
if (reason instanceof _webexHttpError.default) {
|
|
121
|
-
|
|
122
|
+
// Some batched requests (for example GET-based batches) do not
|
|
123
|
+
// have reason.options.body, so handleHttpError() may reject
|
|
124
|
+
// without failing queued deferreds. Fallback to rejecting each
|
|
125
|
+
// queued request to ensure caller promises settle.
|
|
126
|
+
return _this3.handleHttpError(reason).catch(function () {
|
|
127
|
+
return _promise.default.all(queue.map(function (item) {
|
|
128
|
+
return _this3.getDeferredForRequest(item).then(function (defer) {
|
|
129
|
+
defer.reject(reason);
|
|
130
|
+
});
|
|
131
|
+
}));
|
|
132
|
+
});
|
|
122
133
|
}
|
|
123
134
|
return _promise.default.all(queue.map(function (item) {
|
|
124
135
|
return _this3.getDeferredForRequest(item).then(function (defer) {
|
|
@@ -128,7 +139,12 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
128
139
|
}));
|
|
129
140
|
}).catch(function (reason) {
|
|
130
141
|
_this3.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);
|
|
131
|
-
|
|
142
|
+
// executeQueue() is triggered via cappedDebounce(), which does not
|
|
143
|
+
// propagate promise chains. Re-throwing here causes global unhandled
|
|
144
|
+
// promise rejections even when request callers handle their own promise.
|
|
145
|
+
// Any known queued requests have already been failed above.
|
|
146
|
+
|
|
147
|
+
return undefined;
|
|
132
148
|
});
|
|
133
149
|
},
|
|
134
150
|
/**
|
|
@@ -286,7 +302,7 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
286
302
|
fingerprintResponse: function fingerprintResponse(item) {
|
|
287
303
|
throw new Error('fingerprintResponse() must be implemented');
|
|
288
304
|
},
|
|
289
|
-
version: "3.12.0-next.
|
|
305
|
+
version: "3.12.0-next.16"
|
|
290
306
|
});
|
|
291
307
|
var _default2 = exports.default = Batcher;
|
|
292
308
|
//# sourceMappingURL=batcher.js.map
|
package/dist/lib/batcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_lodash","require","_common","_webexPlugin","_interopRequireDefault","_webexHttpError","Batcher","WebexPlugin","extend","session","deferreds","type","default","_map","queue","derived","bounce","fn","_this","cappedDebounce","executeQueue","apply","arguments","config","batcherWait","maxCalls","batcherMaxCalls","maxWait","batcherMaxWait","request","item","_this2","defer","Defer","fingerprintRequest","then","idx","has","resolve","get","promise","set","prepareItem","req","tap","delete","catch","reason","_promise","reject","enqueue","push","_this3","splice","prepareRequest","payload","submitHttpRequest","res","handleHttpSuccess","WebexHttpError","handleHttpError","all","map","getDeferredForRequest","logger","error","process","env","NODE_ENV","stack","Error","_this4","body","items","acceptItem","_this5","options","_this6","didItemFail","didFail","handleItemFailure","handleItemSuccess","getDeferredForResponse","_this7","_this8","fingerprintResponse","version","_default2","exports"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {has} from 'lodash';\nimport {cappedDebounce, Defer, tap} from '@webex/common';\n\nimport WebexPlugin from './webex-plugin';\nimport WebexHttpError from './webex-http-error';\n\n/**\n * Base class for coalescing requests to batched APIs\n * @class Batcher\n */\nconst Batcher = WebexPlugin.extend({\n session: {\n deferreds: {\n type: 'object',\n default() {\n return new Map();\n },\n },\n queue: {\n type: 'array',\n default() {\n return [];\n },\n },\n },\n\n derived: {\n bounce: {\n fn() {\n return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {\n maxCalls: this.config.batcherMaxCalls,\n maxWait: this.config.batcherMaxWait,\n });\n },\n },\n },\n\n /**\n * Requests an item from a batched API\n * @param {Object} item\n * @returns {Promise<mixed>}\n */\n request(item) {\n // So far, I can't find a way to avoid three layers of nesting here.\n /* eslint max-nested-callbacks: [0] */\n const defer = new Defer();\n\n this.fingerprintRequest(item)\n .then((idx) => {\n if (this.deferreds.has(idx)) {\n defer.resolve(this.deferreds.get(idx).promise);\n\n return;\n }\n this.deferreds.set(idx, defer);\n this.prepareItem(item)\n .then((req) => {\n defer.promise = defer.promise\n .then(tap(() => this.deferreds.delete(idx)))\n .catch((reason) => {\n this.deferreds.delete(idx);\n\n return Promise.reject(reason);\n });\n\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n\n return defer.promise;\n },\n\n /**\n * Adds an item to the queue.\n * Intended to be overridden\n * @param {mixed} req\n * @returns {Promise<undefined>}\n */\n enqueue(req) {\n this.queue.push(req);\n\n return Promise.resolve();\n },\n\n /**\n * Transform the item before adding it to the queue\n * Intended to be overridden\n * @param {mixed} item\n * @returns {Promise<mixed>}\n */\n prepareItem(item) {\n return Promise.resolve(item);\n },\n\n /**\n * Detaches the current queue, does any appropriate transforms, and submits it\n * to the API.\n * @returns {Promise<undefined>}\n */\n executeQueue() {\n const queue = this.queue.splice(0, this.config.batcherMaxCalls);\n\n return new Promise((resolve) => {\n resolve(\n this.prepareRequest(queue)\n .then((payload) =>\n this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))\n )\n .catch((reason) => {\n if (reason instanceof WebexHttpError) {\n return this.handleHttpError(reason);\n }\n\n return Promise.all(\n queue.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n })\n );\n }).catch((reason) => {\n this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Performs any final transforms on the queue before submitting it to the API\n * Intended to be overridden\n * @param {Object|Array} queue\n * @returns {Promise<Object>}\n */\n prepareRequest(queue) {\n return Promise.resolve(queue);\n },\n\n /**\n * Submits the prepared request body to the API.\n * This method *must* be overridden\n * @param {Object} payload\n * @returns {Promise<HttpResponseObject>}\n */\n // eslint-disable-next-line no-unused-vars\n submitHttpRequest(payload) {\n throw new Error('request() must be implemented');\n },\n\n /**\n * Actions taken when the http request returns a success\n * Intended to be overridden\n * @param {Promise<HttpResponseObject>} res\n * @returns {Promise<undefined>}\n */\n handleHttpSuccess(res) {\n return Promise.all(\n ((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))\n );\n },\n\n /**\n * Actions taken when the http request returns a failure. Typically, this\n * means failing the entire queue, but could be overridden in some\n * implementations to e.g. reenqueue.\n * Intended to be overridden\n * @param {WebexHttpError} reason\n * @returns {Promise<undefined>}\n */\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError) {\n if (has(reason, 'options.body.map')) {\n return Promise.all(\n reason.options.body.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n }\n }\n this.logger.error('http error handler called without a WebexHttpError object', reason);\n\n return Promise.reject(reason);\n },\n\n /**\n * Determines if the item succeeded or failed and delegates accordingly\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n acceptItem(item) {\n return this.didItemFail(item).then((didFail) => {\n if (didFail) {\n return this.handleItemFailure(item);\n }\n\n return this.handleItemSuccess(item);\n });\n },\n\n /**\n * Indicates if the specified response item implies a success or a failure\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<Boolean>}\n */\n // eslint-disable-next-line no-unused-vars\n didItemFail(item) {\n return Promise.resolve(false);\n },\n\n /**\n * Finds the Defer for the specified item and rejects its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemFailure(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.reject(item);\n });\n },\n\n /**\n * Finds the Defer for the specified item and resolves its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemSuccess(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.resolve(item);\n });\n },\n\n /**\n * Returns the Deferred for the specified request item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForRequest(item) {\n return this.fingerprintRequest(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Returns the Deferred for the specified response item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForResponse(item) {\n return this.fingerprintResponse(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Generates a unique identifier for the item in a request payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintRequest(item) {\n throw new Error('fingerprintRequest() must be implemented');\n },\n\n /**\n * Generates a unique identifier for the item in a response payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintResponse(item) {\n throw new Error('fingerprintResponse() must be implemented');\n },\n});\n\nexport default Batcher;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_lodash","require","_common","_webexPlugin","_interopRequireDefault","_webexHttpError","Batcher","WebexPlugin","extend","session","deferreds","type","default","_map","queue","derived","bounce","fn","_this","cappedDebounce","executeQueue","apply","arguments","config","batcherWait","maxCalls","batcherMaxCalls","maxWait","batcherMaxWait","request","item","_this2","defer","Defer","fingerprintRequest","then","idx","has","resolve","get","promise","set","prepareItem","req","delete","enqueue","catch","reason","reject","push","_promise","_this3","splice","prepareRequest","payload","submitHttpRequest","res","handleHttpSuccess","WebexHttpError","handleHttpError","all","map","getDeferredForRequest","logger","error","process","env","NODE_ENV","stack","undefined","Error","_this4","body","items","acceptItem","_this5","options","_this6","didItemFail","didFail","handleItemFailure","handleItemSuccess","getDeferredForResponse","_this7","_this8","fingerprintResponse","version","_default2","exports"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {has} from 'lodash';\nimport {cappedDebounce, Defer} from '@webex/common';\n\nimport WebexPlugin from './webex-plugin';\nimport WebexHttpError from './webex-http-error';\n\n/**\n * Base class for coalescing requests to batched APIs\n * @class Batcher\n */\nconst Batcher = WebexPlugin.extend({\n session: {\n deferreds: {\n type: 'object',\n default() {\n return new Map();\n },\n },\n queue: {\n type: 'array',\n default() {\n return [];\n },\n },\n },\n\n derived: {\n bounce: {\n fn() {\n return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {\n maxCalls: this.config.batcherMaxCalls,\n maxWait: this.config.batcherMaxWait,\n });\n },\n },\n },\n\n /**\n * Requests an item from a batched API\n * @param {Object} item\n * @returns {Promise<mixed>}\n */\n request(item) {\n // So far, I can't find a way to avoid three layers of nesting here.\n /* eslint max-nested-callbacks: [0] */\n const defer = new Defer();\n\n this.fingerprintRequest(item)\n .then((idx) => {\n if (this.deferreds.has(idx)) {\n defer.resolve(this.deferreds.get(idx).promise);\n\n return;\n }\n this.deferreds.set(idx, defer);\n this.prepareItem(item)\n .then((req) => {\n // Attach cleanup handlers to the original deferred promise without\n // creating an unobserved rejected chain.\n defer.promise.then(\n () => this.deferreds.delete(idx),\n () => this.deferreds.delete(idx)\n );\n\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n\n return defer.promise;\n },\n\n /**\n * Adds an item to the queue.\n * Intended to be overridden\n * @param {mixed} req\n * @returns {Promise<undefined>}\n */\n enqueue(req) {\n this.queue.push(req);\n\n return Promise.resolve();\n },\n\n /**\n * Transform the item before adding it to the queue\n * Intended to be overridden\n * @param {mixed} item\n * @returns {Promise<mixed>}\n */\n prepareItem(item) {\n return Promise.resolve(item);\n },\n\n /**\n * Detaches the current queue, does any appropriate transforms, and submits it\n * to the API.\n * @returns {Promise<undefined>}\n */\n executeQueue() {\n const queue = this.queue.splice(0, this.config.batcherMaxCalls);\n\n return new Promise((resolve) => {\n resolve(\n this.prepareRequest(queue)\n .then((payload) =>\n this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))\n )\n .catch((reason) => {\n if (reason instanceof WebexHttpError) {\n // Some batched requests (for example GET-based batches) do not\n // have reason.options.body, so handleHttpError() may reject\n // without failing queued deferreds. Fallback to rejecting each\n // queued request to ensure caller promises settle.\n return this.handleHttpError(reason).catch(() =>\n Promise.all(\n queue.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n )\n );\n }\n\n return Promise.all(\n queue.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n })\n );\n }).catch((reason) => {\n this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);\n // executeQueue() is triggered via cappedDebounce(), which does not\n // propagate promise chains. Re-throwing here causes global unhandled\n // promise rejections even when request callers handle their own promise.\n // Any known queued requests have already been failed above.\n\n return undefined;\n });\n },\n\n /**\n * Performs any final transforms on the queue before submitting it to the API\n * Intended to be overridden\n * @param {Object|Array} queue\n * @returns {Promise<Object>}\n */\n prepareRequest(queue) {\n return Promise.resolve(queue);\n },\n\n /**\n * Submits the prepared request body to the API.\n * This method *must* be overridden\n * @param {Object} payload\n * @returns {Promise<HttpResponseObject>}\n */\n // eslint-disable-next-line no-unused-vars\n submitHttpRequest(payload) {\n throw new Error('request() must be implemented');\n },\n\n /**\n * Actions taken when the http request returns a success\n * Intended to be overridden\n * @param {Promise<HttpResponseObject>} res\n * @returns {Promise<undefined>}\n */\n handleHttpSuccess(res) {\n return Promise.all(\n ((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))\n );\n },\n\n /**\n * Actions taken when the http request returns a failure. Typically, this\n * means failing the entire queue, but could be overridden in some\n * implementations to e.g. reenqueue.\n * Intended to be overridden\n * @param {WebexHttpError} reason\n * @returns {Promise<undefined>}\n */\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError) {\n if (has(reason, 'options.body.map')) {\n return Promise.all(\n reason.options.body.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n }\n }\n this.logger.error('http error handler called without a WebexHttpError object', reason);\n\n return Promise.reject(reason);\n },\n\n /**\n * Determines if the item succeeded or failed and delegates accordingly\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n acceptItem(item) {\n return this.didItemFail(item).then((didFail) => {\n if (didFail) {\n return this.handleItemFailure(item);\n }\n\n return this.handleItemSuccess(item);\n });\n },\n\n /**\n * Indicates if the specified response item implies a success or a failure\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<Boolean>}\n */\n // eslint-disable-next-line no-unused-vars\n didItemFail(item) {\n return Promise.resolve(false);\n },\n\n /**\n * Finds the Defer for the specified item and rejects its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemFailure(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.reject(item);\n });\n },\n\n /**\n * Finds the Defer for the specified item and resolves its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemSuccess(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.resolve(item);\n });\n },\n\n /**\n * Returns the Deferred for the specified request item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForRequest(item) {\n return this.fingerprintRequest(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Returns the Deferred for the specified response item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForResponse(item) {\n return this.fingerprintResponse(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Generates a unique identifier for the item in a request payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintRequest(item) {\n throw new Error('fingerprintRequest() must be implemented');\n },\n\n /**\n * Generates a unique identifier for the item in a response payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintResponse(item) {\n throw new Error('fingerprintResponse() must be implemented');\n },\n});\n\nexport default Batcher;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -220,6 +220,39 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
220
220
|
// Return the token section that contains the OrgId.
|
|
221
221
|
return fields[2];
|
|
222
222
|
},
|
|
223
|
+
/**
|
|
224
|
+
* Generates a Third-Party Login URL pointing at IdBroker's
|
|
225
|
+
* `/idb/ThirdPartyLogin` endpoint. Used by the social-provider sign-in
|
|
226
|
+
* flow (Google / Microsoft / Apple / ...).
|
|
227
|
+
*
|
|
228
|
+
* Mirrors `buildLoginUrl` / `buildLogoutUrl` — pure URL construction,
|
|
229
|
+
* no navigation side effects. Reads from `this.config.thirdPartyLoginUrl`,
|
|
230
|
+
* which is derived from `idbroker.url` in `credentials-config.js`.
|
|
231
|
+
*
|
|
232
|
+
* @instance
|
|
233
|
+
* @memberof Credentials
|
|
234
|
+
* @param {Object} options
|
|
235
|
+
* @param {string} options.oauth2provider - Provider name (`google`,
|
|
236
|
+
* `microsoft`, `apple`, ...). Required.
|
|
237
|
+
* @param {string} options.returnURL - URL IdBroker should send the user
|
|
238
|
+
* back to after the third-party hand-off. Required.
|
|
239
|
+
* @returns {string}
|
|
240
|
+
*/
|
|
241
|
+
buildThirdPartyLoginUrl: function buildThirdPartyLoginUrl() {
|
|
242
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
243
|
+
var oauth2provider = options.oauth2provider,
|
|
244
|
+
returnURL = options.returnURL;
|
|
245
|
+
if (!oauth2provider) {
|
|
246
|
+
throw new Error('`options.oauth2provider` is required');
|
|
247
|
+
}
|
|
248
|
+
if (!returnURL) {
|
|
249
|
+
throw new Error('`options.returnURL` is required');
|
|
250
|
+
}
|
|
251
|
+
return "".concat(this.config.thirdPartyLoginUrl, "?").concat(_querystring.default.stringify({
|
|
252
|
+
oauth2provider: oauth2provider,
|
|
253
|
+
returnURL: returnURL
|
|
254
|
+
}));
|
|
255
|
+
},
|
|
223
256
|
/**
|
|
224
257
|
* Generates a Logout URL
|
|
225
258
|
* @instance
|
|
@@ -556,7 +589,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
556
589
|
this.refresh();
|
|
557
590
|
}
|
|
558
591
|
},
|
|
559
|
-
version: "3.12.0-next.
|
|
592
|
+
version: "3.12.0-next.16"
|
|
560
593
|
}, (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));
|
|
561
594
|
var _default = exports.default = Credentials;
|
|
562
595
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_querystring","_interopRequireDefault","require","_url","_jsonwebtoken","_common","_commonTimers","_lodash","_webexPlugin","_decorators","_grantErrors","_interopRequireWildcard","_scope","_token","_tokenCollection","_constants","_dec","_dec2","_dec3","_dec4","_dec5","_dec6","_obj","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor2","ownKeys","_Object$keys2","_Object$getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","_Object$getOwnPropertyDescriptors","_Object$defineProperties","Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","isUnverifiedGuest","isGuest","JSON","parse","base64","decode","access_token","split","user_type","_unused","props","prop","namespace","session","isRefreshing","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","isObject","Error","client_id","redirect_uri","cloneDeep","response_type","_deleteProperty","isEmpty","toBase64Url","_stringify","concat","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","_this$supertoken","extractOrgIdFromUserToken","decodedJWT","jwt","realm","fields","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_this","_dataTypes","_keys","key","bind","_len","args","Array","_key","_apply","downscope","_this2","catch","reason","_reason$body","failReason","body","warn","trace","webex","internal","metrics","submitClientMetrics","METRICS","JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED","requestedScope","_promise","resolve","serialize","parent","getClientToken","_this3","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","_this4","once","filterScope","sortScope","tap","add","initialize","attrs","_this5","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","models","remove","refresh","_this6","tokens","clone","requestAccessTokenFromJwt","services","updateCredentialsConfig","OAuthError","trigger","st","invalidScopes","diffScopes","JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH","all","map","tokenScope","revoke","_this7","expiresIn","_now","timeoutLength","safeSetTimeout","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","_default","exports"],"sources":["credentials.js"],"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 {base64, makeStateDataType, oneFlight, tap, whileInFlight} 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, {OAuthError} from './grant-errors';\nimport {filterScope, diffScopes, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\nimport {METRICS} from '../constants';\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: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\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 isUnverifiedGuest: {\n deps: ['supertoken'],\n /**\n * Returns true if the user is an unverified guest\n * @returns {boolean}\n */\n fn() {\n let isGuest = false;\n try {\n isGuest =\n JSON.parse(base64.decode(this.supertoken.access_token.split('.')[1])).user_type ===\n 'guest';\n } catch {\n /* the non-guest token is formatted differently so catch is expected */\n }\n\n return isGuest;\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 } 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('credentials: attempting to retrieve the OrgId from token');\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 } 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('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\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(\n `the provided token is not a valid format, token has ${fields.length} sections`\n );\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({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\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).catch((reason) => {\n const failReason = reason?.body ?? reason;\n this.logger.warn(`credentials: failed to downscope supertoken to \"${scope}\"`, failReason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED, {\n fields: {\n requestedScope: scope,\n failReason,\n },\n });\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\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\n .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(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\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.supertoken.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.supertoken.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).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 } 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 } 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 } 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 (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .catch((error) => {\n if (error instanceof OAuthError) {\n // Error: super token refresh failed with 400 status code.\n // 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 } 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 .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 const invalidScopes = diffScopes(this.config.scope, st.scope);\n\n if (invalidScopes !== '') {\n this.logger.warn(\n `credentials: \"${invalidScopes}\" scope(s) are invalid because not listed in the supertoken, they will be excluded from user token requests.`\n );\n this.webex.internal.metrics.submitClientMetrics(\n METRICS.JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH,\n {fields: {invalidScopes}}\n );\n }\n\n return Promise.all(\n tokens.map((token) => {\n const tokenScope = filterScope(diffScopes(token.scope, st.scope), token.scope);\n\n return (\n this.downscope(tokenScope)\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\n .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 })\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\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 } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_querystring","_interopRequireDefault","require","_url","_jsonwebtoken","_common","_commonTimers","_lodash","_webexPlugin","_decorators","_grantErrors","_interopRequireWildcard","_scope","_token","_tokenCollection","_constants","_dec","_dec2","_dec3","_dec4","_dec5","_dec6","_obj","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor2","ownKeys","_Object$keys2","_Object$getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","_Object$getOwnPropertyDescriptors","_Object$defineProperties","Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","isUnverifiedGuest","isGuest","JSON","parse","base64","decode","access_token","split","user_type","_unused","props","prop","namespace","session","isRefreshing","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","isObject","Error","client_id","redirect_uri","cloneDeep","response_type","_deleteProperty","isEmpty","toBase64Url","_stringify","concat","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","_this$supertoken","extractOrgIdFromUserToken","decodedJWT","jwt","realm","fields","buildThirdPartyLoginUrl","oauth2provider","returnURL","thirdPartyLoginUrl","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_this","_dataTypes","_keys","key","bind","_len","args","Array","_key","_apply","downscope","_this2","catch","reason","_reason$body","failReason","body","warn","trace","webex","internal","metrics","submitClientMetrics","METRICS","JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED","requestedScope","_promise","resolve","serialize","parent","getClientToken","_this3","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","_this4","once","filterScope","sortScope","tap","add","initialize","attrs","_this5","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","models","remove","refresh","_this6","tokens","clone","requestAccessTokenFromJwt","services","updateCredentialsConfig","OAuthError","trigger","st","invalidScopes","diffScopes","JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH","all","map","tokenScope","revoke","_this7","expiresIn","_now","timeoutLength","safeSetTimeout","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","_default","exports"],"sources":["credentials.js"],"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 {base64, makeStateDataType, oneFlight, tap, whileInFlight} 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, {OAuthError} from './grant-errors';\nimport {filterScope, diffScopes, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\nimport {METRICS} from '../constants';\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: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\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 isUnverifiedGuest: {\n deps: ['supertoken'],\n /**\n * Returns true if the user is an unverified guest\n * @returns {boolean}\n */\n fn() {\n let isGuest = false;\n try {\n isGuest =\n JSON.parse(base64.decode(this.supertoken.access_token.split('.')[1])).user_type ===\n 'guest';\n } catch {\n /* the non-guest token is formatted differently so catch is expected */\n }\n\n return isGuest;\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 } 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('credentials: attempting to retrieve the OrgId from token');\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 } 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('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\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(\n `the provided token is not a valid format, token has ${fields.length} sections`\n );\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Third-Party Login URL pointing at IdBroker's\n * `/idb/ThirdPartyLogin` endpoint. Used by the social-provider sign-in\n * flow (Google / Microsoft / Apple / ...).\n *\n * Mirrors `buildLoginUrl` / `buildLogoutUrl` — pure URL construction,\n * no navigation side effects. Reads from `this.config.thirdPartyLoginUrl`,\n * which is derived from `idbroker.url` in `credentials-config.js`.\n *\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @param {string} options.oauth2provider - Provider name (`google`,\n * `microsoft`, `apple`, ...). Required.\n * @param {string} options.returnURL - URL IdBroker should send the user\n * back to after the third-party hand-off. Required.\n * @returns {string}\n */\n buildThirdPartyLoginUrl(options = {}) {\n const {oauth2provider, returnURL} = options;\n\n if (!oauth2provider) {\n throw new Error('`options.oauth2provider` is required');\n }\n if (!returnURL) {\n throw new Error('`options.returnURL` is required');\n }\n\n return `${this.config.thirdPartyLoginUrl}?${querystring.stringify({\n oauth2provider,\n returnURL,\n })}`;\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({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\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).catch((reason) => {\n const failReason = reason?.body ?? reason;\n this.logger.warn(`credentials: failed to downscope supertoken to \"${scope}\"`, failReason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED, {\n fields: {\n requestedScope: scope,\n failReason,\n },\n });\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\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\n .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(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\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.supertoken.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.supertoken.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).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 } 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 } 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 } 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 (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .catch((error) => {\n if (error instanceof OAuthError) {\n // Error: super token refresh failed with 400 status code.\n // 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 } 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 .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 const invalidScopes = diffScopes(this.config.scope, st.scope);\n\n if (invalidScopes !== '') {\n this.logger.warn(\n `credentials: \"${invalidScopes}\" scope(s) are invalid because not listed in the supertoken, they will be excluded from user token requests.`\n );\n this.webex.internal.metrics.submitClientMetrics(\n METRICS.JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH,\n {fields: {invalidScopes}}\n );\n }\n\n return Promise.all(\n tokens.map((token) => {\n const tokenScope = filterScope(diffScopes(token.scope, st.scope), token.scope);\n\n return (\n this.downscope(tokenScope)\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\n .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 })\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\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 } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -532,7 +532,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
532
532
|
return res.body;
|
|
533
533
|
});
|
|
534
534
|
},
|
|
535
|
-
version: "3.12.0-next.
|
|
535
|
+
version: "3.12.0-next.16"
|
|
536
536
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "downscope", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "downscope"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "revoke", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "revoke"), _obj), _obj));
|
|
537
537
|
var _default = exports.default = Token;
|
|
538
538
|
//# sourceMappingURL=token.js.map
|
|
@@ -1443,7 +1443,7 @@ var Services = _webexPlugin.default.extend({
|
|
|
1443
1443
|
}, _callee4);
|
|
1444
1444
|
})));
|
|
1445
1445
|
},
|
|
1446
|
-
version: "3.12.0-next.
|
|
1446
|
+
version: "3.12.0-next.16"
|
|
1447
1447
|
});
|
|
1448
1448
|
/* eslint-enable no-underscore-dangle */
|
|
1449
1449
|
var _default = exports.default = Services;
|
|
@@ -1373,7 +1373,7 @@ var Services = _webexPlugin.default.extend({
|
|
|
1373
1373
|
}, _callee3);
|
|
1374
1374
|
})));
|
|
1375
1375
|
},
|
|
1376
|
-
version: "3.12.0-next.
|
|
1376
|
+
version: "3.12.0-next.16"
|
|
1377
1377
|
});
|
|
1378
1378
|
/* eslint-enable no-underscore-dangle */
|
|
1379
1379
|
var _default = exports.default = Services;
|
package/dist/plugins/logger.js
CHANGED
|
@@ -57,7 +57,7 @@ var Logger = _webexPlugin.default.extend({
|
|
|
57
57
|
info: wrapConsoleMethod('info'),
|
|
58
58
|
debug: wrapConsoleMethod('debug'),
|
|
59
59
|
trace: wrapConsoleMethod('trace'),
|
|
60
|
-
version: "3.12.0-next.
|
|
60
|
+
version: "3.12.0-next.16"
|
|
61
61
|
});
|
|
62
62
|
(0, _webexCore.registerPlugin)('logger', Logger);
|
|
63
63
|
var _default = exports.default = Logger;
|
package/dist/webex-core.js
CHANGED
|
@@ -96,7 +96,7 @@ var MAX_FILE_SIZE_IN_MB = 2048;
|
|
|
96
96
|
* @class
|
|
97
97
|
*/
|
|
98
98
|
var WebexCore = _ampersandState.default.extend((_obj = {
|
|
99
|
-
version: "3.12.0-next.
|
|
99
|
+
version: "3.12.0-next.16",
|
|
100
100
|
children: {
|
|
101
101
|
internal: _webexInternalCore.default
|
|
102
102
|
},
|
|
@@ -634,7 +634,7 @@ var WebexCore = _ampersandState.default.extend((_obj = {
|
|
|
634
634
|
});
|
|
635
635
|
}
|
|
636
636
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj), _obj));
|
|
637
|
-
WebexCore.version = "3.12.0-next.
|
|
637
|
+
WebexCore.version = "3.12.0-next.16";
|
|
638
638
|
(0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
|
|
639
639
|
(0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
|
|
640
640
|
var _default = exports.default = WebexCore;
|
package/package.json
CHANGED
|
@@ -33,16 +33,16 @@
|
|
|
33
33
|
"@sinonjs/fake-timers": "^6.0.1",
|
|
34
34
|
"@webex/babel-config-legacy": "0.0.0",
|
|
35
35
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
36
|
-
"@webex/internal-plugin-device": "3.12.0-next.
|
|
36
|
+
"@webex/internal-plugin-device": "3.12.0-next.16",
|
|
37
37
|
"@webex/jest-config-legacy": "0.0.0",
|
|
38
38
|
"@webex/legacy-tools": "0.0.0",
|
|
39
|
-
"@webex/plugin-logger": "3.12.0-next.
|
|
40
|
-
"@webex/test-helper-chai": "3.12.0-next.
|
|
41
|
-
"@webex/test-helper-make-local-url": "3.12.0-next.
|
|
42
|
-
"@webex/test-helper-mocha": "3.12.0-next.
|
|
43
|
-
"@webex/test-helper-mock-webex": "3.12.0-next.
|
|
44
|
-
"@webex/test-helper-refresh-callback": "3.12.0-next.
|
|
45
|
-
"@webex/test-helper-test-users": "3.12.0-next.
|
|
39
|
+
"@webex/plugin-logger": "3.12.0-next.16",
|
|
40
|
+
"@webex/test-helper-chai": "3.12.0-next.2",
|
|
41
|
+
"@webex/test-helper-make-local-url": "3.12.0-next.2",
|
|
42
|
+
"@webex/test-helper-mocha": "3.12.0-next.2",
|
|
43
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.2",
|
|
44
|
+
"@webex/test-helper-refresh-callback": "3.12.0-next.2",
|
|
45
|
+
"@webex/test-helper-test-users": "3.12.0-next.2",
|
|
46
46
|
"chai": "^4.3.4",
|
|
47
47
|
"chai-as-promised": "^7.1.1",
|
|
48
48
|
"eslint": "^8.24.0",
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"sinon": "^9.2.4"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@webex/common": "3.12.0-next.
|
|
54
|
-
"@webex/common-timers": "3.12.0-next.
|
|
55
|
-
"@webex/http-core": "3.12.0-next.
|
|
56
|
-
"@webex/storage-adapter-spec": "3.12.0-next.
|
|
53
|
+
"@webex/common": "3.12.0-next.2",
|
|
54
|
+
"@webex/common-timers": "3.12.0-next.2",
|
|
55
|
+
"@webex/http-core": "3.12.0-next.2",
|
|
56
|
+
"@webex/storage-adapter-spec": "3.12.0-next.2",
|
|
57
57
|
"ampersand-collection": "^2.0.2",
|
|
58
58
|
"ampersand-events": "^2.0.2",
|
|
59
59
|
"ampersand-state": "^5.0.3",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"test:style": "eslint ./src/**/*.*",
|
|
74
74
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
75
75
|
},
|
|
76
|
-
"version": "3.12.0-next.
|
|
76
|
+
"version": "3.12.0-next.16"
|
|
77
77
|
}
|
|
@@ -195,6 +195,19 @@ const CredentialsConfig = AmpState.extend({
|
|
|
195
195
|
cache: false,
|
|
196
196
|
},
|
|
197
197
|
|
|
198
|
+
/**
|
|
199
|
+
* URL used to initiate the IdBroker third-party (social provider)
|
|
200
|
+
* sign-in flow.
|
|
201
|
+
* @type {string}
|
|
202
|
+
*/
|
|
203
|
+
thirdPartyLoginUrl: {
|
|
204
|
+
deps: ['idbroker.url'],
|
|
205
|
+
fn() {
|
|
206
|
+
return `${this.idbroker.url}/idb/ThirdPartyLogin`;
|
|
207
|
+
},
|
|
208
|
+
cache: false,
|
|
209
|
+
},
|
|
210
|
+
|
|
198
211
|
/**
|
|
199
212
|
* Set password URL
|
|
200
213
|
* @type {string}
|
package/src/lib/batcher.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import {has} from 'lodash';
|
|
6
|
-
import {cappedDebounce, Defer
|
|
6
|
+
import {cappedDebounce, Defer} from '@webex/common';
|
|
7
7
|
|
|
8
8
|
import WebexPlugin from './webex-plugin';
|
|
9
9
|
import WebexHttpError from './webex-http-error';
|
|
@@ -59,13 +59,12 @@ const Batcher = WebexPlugin.extend({
|
|
|
59
59
|
this.deferreds.set(idx, defer);
|
|
60
60
|
this.prepareItem(item)
|
|
61
61
|
.then((req) => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
});
|
|
62
|
+
// Attach cleanup handlers to the original deferred promise without
|
|
63
|
+
// creating an unobserved rejected chain.
|
|
64
|
+
defer.promise.then(
|
|
65
|
+
() => this.deferreds.delete(idx),
|
|
66
|
+
() => this.deferreds.delete(idx)
|
|
67
|
+
);
|
|
69
68
|
|
|
70
69
|
this.enqueue(req)
|
|
71
70
|
.then(() => this.bounce())
|
|
@@ -116,7 +115,19 @@ const Batcher = WebexPlugin.extend({
|
|
|
116
115
|
)
|
|
117
116
|
.catch((reason) => {
|
|
118
117
|
if (reason instanceof WebexHttpError) {
|
|
119
|
-
|
|
118
|
+
// Some batched requests (for example GET-based batches) do not
|
|
119
|
+
// have reason.options.body, so handleHttpError() may reject
|
|
120
|
+
// without failing queued deferreds. Fallback to rejecting each
|
|
121
|
+
// queued request to ensure caller promises settle.
|
|
122
|
+
return this.handleHttpError(reason).catch(() =>
|
|
123
|
+
Promise.all(
|
|
124
|
+
queue.map((item) =>
|
|
125
|
+
this.getDeferredForRequest(item).then((defer) => {
|
|
126
|
+
defer.reject(reason);
|
|
127
|
+
})
|
|
128
|
+
)
|
|
129
|
+
)
|
|
130
|
+
);
|
|
120
131
|
}
|
|
121
132
|
|
|
122
133
|
return Promise.all(
|
|
@@ -130,8 +141,12 @@ const Batcher = WebexPlugin.extend({
|
|
|
130
141
|
);
|
|
131
142
|
}).catch((reason) => {
|
|
132
143
|
this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);
|
|
144
|
+
// executeQueue() is triggered via cappedDebounce(), which does not
|
|
145
|
+
// propagate promise chains. Re-throwing here causes global unhandled
|
|
146
|
+
// promise rejections even when request callers handle their own promise.
|
|
147
|
+
// Any known queued requests have already been failed above.
|
|
133
148
|
|
|
134
|
-
return
|
|
149
|
+
return undefined;
|
|
135
150
|
});
|
|
136
151
|
},
|
|
137
152
|
|
|
@@ -212,6 +212,40 @@ const Credentials = WebexPlugin.extend({
|
|
|
212
212
|
return fields[2];
|
|
213
213
|
},
|
|
214
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Generates a Third-Party Login URL pointing at IdBroker's
|
|
217
|
+
* `/idb/ThirdPartyLogin` endpoint. Used by the social-provider sign-in
|
|
218
|
+
* flow (Google / Microsoft / Apple / ...).
|
|
219
|
+
*
|
|
220
|
+
* Mirrors `buildLoginUrl` / `buildLogoutUrl` — pure URL construction,
|
|
221
|
+
* no navigation side effects. Reads from `this.config.thirdPartyLoginUrl`,
|
|
222
|
+
* which is derived from `idbroker.url` in `credentials-config.js`.
|
|
223
|
+
*
|
|
224
|
+
* @instance
|
|
225
|
+
* @memberof Credentials
|
|
226
|
+
* @param {Object} options
|
|
227
|
+
* @param {string} options.oauth2provider - Provider name (`google`,
|
|
228
|
+
* `microsoft`, `apple`, ...). Required.
|
|
229
|
+
* @param {string} options.returnURL - URL IdBroker should send the user
|
|
230
|
+
* back to after the third-party hand-off. Required.
|
|
231
|
+
* @returns {string}
|
|
232
|
+
*/
|
|
233
|
+
buildThirdPartyLoginUrl(options = {}) {
|
|
234
|
+
const {oauth2provider, returnURL} = options;
|
|
235
|
+
|
|
236
|
+
if (!oauth2provider) {
|
|
237
|
+
throw new Error('`options.oauth2provider` is required');
|
|
238
|
+
}
|
|
239
|
+
if (!returnURL) {
|
|
240
|
+
throw new Error('`options.returnURL` is required');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return `${this.config.thirdPartyLoginUrl}?${querystring.stringify({
|
|
244
|
+
oauth2provider,
|
|
245
|
+
returnURL,
|
|
246
|
+
})}`;
|
|
247
|
+
},
|
|
248
|
+
|
|
215
249
|
/**
|
|
216
250
|
* Generates a Logout URL
|
|
217
251
|
* @instance
|
|
@@ -232,6 +232,75 @@ describe('webex-core', () => {
|
|
|
232
232
|
});
|
|
233
233
|
});
|
|
234
234
|
|
|
235
|
+
describe('#buildThirdPartyLoginUrl()', () => {
|
|
236
|
+
it('throws if both `oauth2provider` and `returnURL` are missing', () => {
|
|
237
|
+
const webex = new MockWebex();
|
|
238
|
+
const credentials = new Credentials(undefined, {parent: webex});
|
|
239
|
+
|
|
240
|
+
webex.trigger('change:config');
|
|
241
|
+
|
|
242
|
+
assert.throws(() => {
|
|
243
|
+
credentials.buildThirdPartyLoginUrl({});
|
|
244
|
+
}, /`options.oauth2provider` is required/);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('throws if `oauth2provider` is missing', () => {
|
|
248
|
+
const webex = new MockWebex();
|
|
249
|
+
const credentials = new Credentials(undefined, {parent: webex});
|
|
250
|
+
|
|
251
|
+
webex.trigger('change:config');
|
|
252
|
+
|
|
253
|
+
assert.throws(() => {
|
|
254
|
+
credentials.buildThirdPartyLoginUrl({returnURL: 'https://web.webex.com'});
|
|
255
|
+
}, /`options.oauth2provider` is required/);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it('throws if `returnURL` is missing', () => {
|
|
259
|
+
const webex = new MockWebex();
|
|
260
|
+
const credentials = new Credentials(undefined, {parent: webex});
|
|
261
|
+
|
|
262
|
+
webex.trigger('change:config');
|
|
263
|
+
|
|
264
|
+
assert.throws(() => {
|
|
265
|
+
credentials.buildThirdPartyLoginUrl({oauth2provider: 'google'});
|
|
266
|
+
}, /`options.returnURL` is required/);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
skipInBrowser(it)('generates the third-party login url', () => {
|
|
270
|
+
const webex = new MockWebex();
|
|
271
|
+
const credentials = new Credentials(undefined, {parent: webex});
|
|
272
|
+
|
|
273
|
+
webex.trigger('change:config');
|
|
274
|
+
|
|
275
|
+
assert.equal(
|
|
276
|
+
credentials.buildThirdPartyLoginUrl({
|
|
277
|
+
oauth2provider: 'google',
|
|
278
|
+
returnURL: 'https://web.webex.com',
|
|
279
|
+
}),
|
|
280
|
+
`${
|
|
281
|
+
process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com'
|
|
282
|
+
}/idb/ThirdPartyLogin?oauth2provider=google&returnURL=https%3A%2F%2Fweb.webex.com`
|
|
283
|
+
);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
skipInBrowser(it)('generates the url with different parameter values', () => {
|
|
287
|
+
const webex = new MockWebex();
|
|
288
|
+
const credentials = new Credentials(undefined, {parent: webex});
|
|
289
|
+
|
|
290
|
+
webex.trigger('change:config');
|
|
291
|
+
|
|
292
|
+
assert.equal(
|
|
293
|
+
credentials.buildThirdPartyLoginUrl({
|
|
294
|
+
oauth2provider: 'apple',
|
|
295
|
+
returnURL: 'https://example.com/callback',
|
|
296
|
+
}),
|
|
297
|
+
`${
|
|
298
|
+
process.env.IDBROKER_BASE_URL || 'https://idbroker.webex.com'
|
|
299
|
+
}/idb/ThirdPartyLogin?oauth2provider=apple&returnURL=https%3A%2F%2Fexample.com%2Fcallback`
|
|
300
|
+
);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
|
|
235
304
|
describe('#buildLogoutUrl()', () => {
|
|
236
305
|
skipInBrowser(it)('generates the logout url', () => {
|
|
237
306
|
const webex = new MockWebex();
|
|
@@ -368,7 +437,9 @@ describe('webex-core', () => {
|
|
|
368
437
|
});
|
|
369
438
|
|
|
370
439
|
it('should throw when provided an invalid token', () =>
|
|
371
|
-
expect(() => credentials.extractOrgIdFromUserToken()).toThrow(
|
|
440
|
+
expect(() => credentials.extractOrgIdFromUserToken()).toThrow(
|
|
441
|
+
'the provided token is not a valid format, token has 1 sections'
|
|
442
|
+
));
|
|
372
443
|
|
|
373
444
|
it('should throw when no token is provided', () =>
|
|
374
445
|
expect(() => credentials.extractOrgIdFromUserToken()).toThrow());
|
|
@@ -799,7 +870,6 @@ describe('webex-core', () => {
|
|
|
799
870
|
.then(() => assert.isRejected(webex.boundedStorage.get('Credentials', '@'), /NotFound/));
|
|
800
871
|
});
|
|
801
872
|
|
|
802
|
-
|
|
803
873
|
// it('does not induce any token refreshes');
|
|
804
874
|
|
|
805
875
|
it('prevents #getUserToken() from being invoked', () => {
|
|
@@ -7,6 +7,7 @@ import {assert} from '@webex/test-helper-chai';
|
|
|
7
7
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
8
8
|
import sinon from 'sinon';
|
|
9
9
|
import {Batcher} from '@webex/webex-core';
|
|
10
|
+
import WebexHttpError from '../../../../src/lib/webex-http-error';
|
|
10
11
|
|
|
11
12
|
function promiseTick(count) {
|
|
12
13
|
let promise = Promise.resolve();
|
|
@@ -154,6 +155,61 @@ describe('webex-core', () => {
|
|
|
154
155
|
return Promise.all([assert.isRejected(p1), assert.isRejected(p2)]);
|
|
155
156
|
});
|
|
156
157
|
});
|
|
158
|
+
|
|
159
|
+
it('does not trigger unhandledRejection when caller handles rejection', () => {
|
|
160
|
+
const unhandled = [];
|
|
161
|
+
const onUnhandledRejection = (reason) => {
|
|
162
|
+
unhandled.push(reason);
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
process.on('unhandledRejection', onUnhandledRejection);
|
|
166
|
+
|
|
167
|
+
const p = webex.internal.batcher.request(1);
|
|
168
|
+
|
|
169
|
+
// eslint-disable-next-line prefer-promise-reject-errors
|
|
170
|
+
webex.request.returns(Promise.reject({statusCode: 0}));
|
|
171
|
+
|
|
172
|
+
return promiseTick(50)
|
|
173
|
+
.then(() => clock.tick(2))
|
|
174
|
+
.then(() => promiseTick(50))
|
|
175
|
+
.then(() => assert.isRejected(p))
|
|
176
|
+
.then(() => promiseTick(50))
|
|
177
|
+
.then(() => {
|
|
178
|
+
assert.lengthOf(unhandled, 0);
|
|
179
|
+
})
|
|
180
|
+
.finally(() => {
|
|
181
|
+
process.removeListener('unhandledRejection', onUnhandledRejection);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('fails queued deferreds for webex http errors without request body', () => {
|
|
186
|
+
const p1 = webex.internal.batcher.request(1);
|
|
187
|
+
const p2 = webex.internal.batcher.request(2);
|
|
188
|
+
const reason = new WebexHttpError.BadRequest({
|
|
189
|
+
statusCode: 400,
|
|
190
|
+
body: {message: 'simulated failure'},
|
|
191
|
+
options: {
|
|
192
|
+
method: 'GET',
|
|
193
|
+
uri: 'https://example.com/v1/mock/batch',
|
|
194
|
+
headers: {trackingid: 'test-tracking-id'},
|
|
195
|
+
},
|
|
196
|
+
headers: {},
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
webex.request.returns(Promise.reject(reason));
|
|
200
|
+
|
|
201
|
+
return promiseTick(50)
|
|
202
|
+
.then(() => clock.tick(2))
|
|
203
|
+
.then(() => promiseTick(50))
|
|
204
|
+
.then(() => {
|
|
205
|
+
assert.calledOnce(webex.request);
|
|
206
|
+
|
|
207
|
+
return Promise.all([
|
|
208
|
+
assert.isRejected(p1, /simulated failure/),
|
|
209
|
+
assert.isRejected(p2, /simulated failure/),
|
|
210
|
+
]);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
157
213
|
});
|
|
158
214
|
|
|
159
215
|
describe('when the number of request attempts exceeds a given threshold', () => {
|