@webex/plugin-authorization-browser-first-party 2.59.3-next.1 → 2.59.4-next.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.
package/.eslintrc.js CHANGED
@@ -1,6 +1,6 @@
1
- const config = {
2
- root: true,
3
- extends: ['@webex/eslint-config-legacy'],
4
- };
5
-
6
- module.exports = config;
1
+ const config = {
2
+ root: true,
3
+ extends: ['@webex/eslint-config-legacy'],
4
+ };
5
+
6
+ module.exports = config;
package/README.md CHANGED
@@ -1,53 +1,53 @@
1
- # @webex/plugin-authorization-browser-first-party
2
-
3
- [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)
4
-
5
- > Authorization plugin used by the Cisco Webex Client
6
-
7
- - [Install](#install)
8
- - [Usage](#usage)
9
- - [Contribute](#contribute)
10
- - [Maintainers](#maintainers)
11
- - [License](#license)
12
-
13
- ## Install
14
-
15
- ```bash
16
- npm install --save @webex/plugin-authorization-browser-first-party
17
- ```
18
-
19
- ## Usage
20
-
21
- This is a plugin for the Cisco Webex JS SDK . Please see our [developer portal](https://developer.webex.com/) and the [API docs](https://webex.github.io/webex-js-sdk/api/) for full details.
22
-
23
- ## Install
24
-
25
- ```bash
26
- npm install --save @webex/plugin-authorization-browser-first-party
27
- ```
28
-
29
- ## Usage
30
-
31
- ```js
32
-
33
- const Webex = require('webex');
34
-
35
- const webex = Webex.init();
36
- webex.authorization-browser-first-party.get(id)
37
- .then((authorization-browser-first-party) => {
38
- console.log(authorization-browser-first-party);
39
- })
40
-
41
- ```
42
-
43
- ## Maintainers
44
-
45
- This package is maintained by [Cisco Webex for Developers](https://developer.webex.com/).
46
-
47
- ## Contribute
48
-
49
- Pull requests welcome. Please see [CONTRIBUTING.md](https://github.com/webex/webex-js-sdk/blob/master/CONTRIBUTING.md) for more details.
50
-
51
- ## License
52
-
53
- © 2016-2020 Cisco and/or its affiliates. All Rights Reserved.
1
+ # @webex/plugin-authorization-browser-first-party
2
+
3
+ [![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme)
4
+
5
+ > Authorization plugin used by the Cisco Webex Client
6
+
7
+ - [Install](#install)
8
+ - [Usage](#usage)
9
+ - [Contribute](#contribute)
10
+ - [Maintainers](#maintainers)
11
+ - [License](#license)
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install --save @webex/plugin-authorization-browser-first-party
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ This is a plugin for the Cisco Webex JS SDK . Please see our [developer portal](https://developer.webex.com/) and the [API docs](https://webex.github.io/webex-js-sdk/api/) for full details.
22
+
23
+ ## Install
24
+
25
+ ```bash
26
+ npm install --save @webex/plugin-authorization-browser-first-party
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ```js
32
+
33
+ const Webex = require('webex');
34
+
35
+ const webex = Webex.init();
36
+ webex.authorization-browser-first-party.get(id)
37
+ .then((authorization-browser-first-party) => {
38
+ console.log(authorization-browser-first-party);
39
+ })
40
+
41
+ ```
42
+
43
+ ## Maintainers
44
+
45
+ This package is maintained by [Cisco Webex for Developers](https://developer.webex.com/).
46
+
47
+ ## Contribute
48
+
49
+ Pull requests welcome. Please see [CONTRIBUTING.md](https://github.com/webex/webex-js-sdk/blob/master/CONTRIBUTING.md) for more details.
50
+
51
+ ## License
52
+
53
+ © 2016-2020 Cisco and/or its affiliates. All Rights Reserved.
package/babel.config.js CHANGED
@@ -1,3 +1,3 @@
1
- const babelConfigLegacy = require('@webex/babel-config-legacy');
2
-
3
- module.exports = babelConfigLegacy;
1
+ const babelConfigLegacy = require('@webex/babel-config-legacy');
2
+
3
+ module.exports = babelConfigLegacy;
@@ -13,13 +13,11 @@ var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/cor
13
13
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
14
14
  var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
15
15
  var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/applyDecoratedDescriptor"));
16
- var _omit2 = _interopRequireDefault(require("lodash/omit"));
17
- var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
18
- var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
19
16
  var _querystring = _interopRequireDefault(require("querystring"));
20
17
  var _url = _interopRequireDefault(require("url"));
21
18
  var _common = require("@webex/common");
22
19
  var _webexCore = require("@webex/webex-core");
20
+ var _lodash = require("lodash");
23
21
  var _uuid = _interopRequireDefault(require("uuid"));
24
22
  var _encBase64url = _interopRequireDefault(require("crypto-js/enc-base64url"));
25
23
  var _cryptoJs = _interopRequireDefault(require("crypto-js"));
@@ -30,23 +28,23 @@ var lodash = require('lodash');
30
28
  var OAUTH2_CSRF_TOKEN = 'oauth2-csrf-token';
31
29
  var OAUTH2_CODE_VERIFIER = 'oauth2-code-verifier';
32
30
 
33
- /**
34
- * Browser support for OAuth2. Automatically parses the URL query for an
35
- * authorization code
36
- *
37
- * Use of this plugin for anything other than the Webex Web Client is strongly
38
- * discouraged and may be broken at any time
39
- * @class
40
- * @name AuthorizationBrowserFirstParty
41
- * @private
31
+ /**
32
+ * Browser support for OAuth2. Automatically parses the URL query for an
33
+ * authorization code
34
+ *
35
+ * Use of this plugin for anything other than the Webex Web Client is strongly
36
+ * discouraged and may be broken at any time
37
+ * @class
38
+ * @name AuthorizationBrowserFirstParty
39
+ * @private
42
40
  */
43
41
  var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFlight)('isAuthorizing'), _dec2 = (0, _common.whileInFlight)('isAuthorizing'), (_obj = {
44
42
  derived: {
45
- /**
46
- * Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}
47
- * @instance
48
- * @memberof AuthorizationBrowserFirstParty
49
- * @type {boolean}
43
+ /**
44
+ * Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}
45
+ * @instance
46
+ * @memberof AuthorizationBrowserFirstParty
47
+ * @type {boolean}
50
48
  */
51
49
  isAuthenticating: {
52
50
  deps: ['isAuthorizing'],
@@ -56,11 +54,11 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
56
54
  }
57
55
  },
58
56
  session: {
59
- /**
60
- * Indicates if an Authorization Code exchange is inflight
61
- * @instance
62
- * @memberof AuthorizationBrowserFirstParty
63
- * @type {boolean}
57
+ /**
58
+ * Indicates if an Authorization Code exchange is inflight
59
+ * @instance
60
+ * @memberof AuthorizationBrowserFirstParty
61
+ * @type {boolean}
64
62
  */
65
63
  isAuthorizing: {
66
64
  default: false,
@@ -72,12 +70,12 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
72
70
  }
73
71
  },
74
72
  namespace: 'Credentials',
75
- /**
76
- * Initializer
77
- * @instance
78
- * @memberof AuthorizationBrowserFirstParty
79
- * @private
80
- * @returns {Authorization}
73
+ /**
74
+ * Initializer
75
+ * @instance
76
+ * @memberof AuthorizationBrowserFirstParty
77
+ * @private
78
+ * @returns {Authorization}
81
79
  */
82
80
  // eslint-disable-next-line complexity
83
81
  initialize: function initialize() {
@@ -121,16 +119,16 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
121
119
  });
122
120
  return ret;
123
121
  },
124
- /**
125
- * Kicks off an oauth flow
126
- * @instance
127
- * @memberof AuthorizationBrowserFirstParty
128
- * @param {Object} options
129
- * @returns {Promise}
122
+ /**
123
+ * Kicks off an oauth flow
124
+ * @instance
125
+ * @memberof AuthorizationBrowserFirstParty
126
+ * @param {Object} options
127
+ * @returns {Promise}
130
128
  */
131
129
  initiateLogin: function initiateLogin() {
132
130
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
133
- options = (0, _cloneDeep2.default)(options);
131
+ options = (0, _lodash.cloneDeep)(options);
134
132
  if (options.email) {
135
133
  options.emailHash = _cryptoJs.default.SHA256(options.email).toString();
136
134
  }
@@ -143,13 +141,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
143
141
  options.code_challenge_method = 'S256';
144
142
  return this.initiateAuthorizationCodeGrant(options);
145
143
  },
146
- /**
147
- * Kicks off the Implicit Code grant flow. Typically called via
148
- * {@link AuthorizationBrowserFirstParty#initiateLogin}
149
- * @instance
150
- * @memberof AuthorizationBrowserFirstParty
151
- * @param {Object} options
152
- * @returns {Promise}
144
+ /**
145
+ * Kicks off the Implicit Code grant flow. Typically called via
146
+ * {@link AuthorizationBrowserFirstParty#initiateLogin}
147
+ * @instance
148
+ * @memberof AuthorizationBrowserFirstParty
149
+ * @param {Object} options
150
+ * @returns {Promise}
153
151
  */
154
152
  initiateAuthorizationCodeGrant: function initiateAuthorizationCodeGrant(options) {
155
153
  this.logger.info('authorization: initiating authorization code grant flow');
@@ -158,13 +156,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
158
156
  }, options));
159
157
  return _promise.default.resolve();
160
158
  },
161
- /**
162
- * Called by {@link WebexCore#logout()}. Redirects to the logout page
163
- * @instance
164
- * @memberof AuthorizationBrowserFirstParty
165
- * @param {Object} options
166
- * @param {boolean} options.noRedirect if true, does not redirect
167
- * @returns {Promise}
159
+ /**
160
+ * Called by {@link WebexCore#logout()}. Redirects to the logout page
161
+ * @instance
162
+ * @memberof AuthorizationBrowserFirstParty
163
+ * @param {Object} options
164
+ * @param {boolean} options.noRedirect if true, does not redirect
165
+ * @returns {Promise}
168
166
  */
169
167
  logout: function logout() {
170
168
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -172,13 +170,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
172
170
  this.webex.getWindow().location = this.webex.credentials.buildLogoutUrl(options);
173
171
  }
174
172
  },
175
- /**
176
- * Exchanges an authorization code for an access token
177
- * @instance
178
- * @memberof AuthorizationBrowserFirstParty
179
- * @param {Object} options
180
- * @param {Object} options.code
181
- * @returns {Promise}
173
+ /**
174
+ * Exchanges an authorization code for an access token
175
+ * @instance
176
+ * @memberof AuthorizationBrowserFirstParty
177
+ * @param {Object} options
178
+ * @param {Object} options.code
179
+ * @returns {Promise}
182
180
  */
183
181
  requestAuthorizationCodeGrant: function requestAuthorizationCodeGrant() {
184
182
  var _this2 = this;
@@ -218,13 +216,13 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
218
216
  return _promise.default.reject(new ErrorConstructor(res._res || res));
219
217
  });
220
218
  },
221
- /**
222
- * Checks if the result of the login redirect contains an error string
223
- * @instance
224
- * @memberof AuthorizationBrowserFirstParty
225
- * @param {Object} location
226
- * @private
227
- * @returns {Promise}
219
+ /**
220
+ * Checks if the result of the login redirect contains an error string
221
+ * @instance
222
+ * @memberof AuthorizationBrowserFirstParty
223
+ * @param {Object} location
224
+ * @private
225
+ * @returns {Promise}
228
226
  */
229
227
  _checkForErrors: function _checkForErrors(location) {
230
228
  var query = location.query;
@@ -233,34 +231,34 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
233
231
  throw new ErrorConstructor(query);
234
232
  }
235
233
  },
236
- /**
237
- * Removes no-longer needed values from the url (access token, csrf token, etc)
238
- * @instance
239
- * @memberof AuthorizationBrowserFirstParty
240
- * @param {Object} location
241
- * @private
242
- * @returns {Promise}
234
+ /**
235
+ * Removes no-longer needed values from the url (access token, csrf token, etc)
236
+ * @instance
237
+ * @memberof AuthorizationBrowserFirstParty
238
+ * @param {Object} location
239
+ * @private
240
+ * @returns {Promise}
243
241
  */
244
242
  _cleanUrl: function _cleanUrl(location) {
245
- location = (0, _cloneDeep2.default)(location);
243
+ location = (0, _lodash.cloneDeep)(location);
246
244
  if (this.webex.getWindow().history && this.webex.getWindow().history.replaceState) {
247
245
  (0, _deleteProperty.default)(location.query, 'code');
248
- if ((0, _isEmpty2.default)((0, _omit2.default)(location.query.state, 'csrf_token'))) {
246
+ if ((0, _lodash.isEmpty)((0, _lodash.omit)(location.query.state, 'csrf_token'))) {
249
247
  (0, _deleteProperty.default)(location.query, 'state');
250
248
  } else {
251
- location.query.state = _common.base64.encode((0, _stringify.default)((0, _omit2.default)(location.query.state, 'csrf_token')));
249
+ location.query.state = _common.base64.encode((0, _stringify.default)((0, _lodash.omit)(location.query.state, 'csrf_token')));
252
250
  }
253
251
  location.search = _querystring.default.stringify(location.query);
254
252
  (0, _deleteProperty.default)(location, 'query');
255
253
  this.webex.getWindow().history.replaceState({}, null, _url.default.format(location));
256
254
  }
257
255
  },
258
- /**
259
- * Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage
260
- * @instance
261
- * @memberof AuthorizationBrowserFirstParty
262
- * @private
263
- * @returns {string}
256
+ /**
257
+ * Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage
258
+ * @instance
259
+ * @memberof AuthorizationBrowserFirstParty
260
+ * @private
261
+ * @returns {string}
264
262
  */
265
263
  _generateCodeChallenge: function _generateCodeChallenge() {
266
264
  this.logger.info('authorization: generating PKCE code challenge');
@@ -274,12 +272,12 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
274
272
  this.webex.getWindow().sessionStorage.setItem(OAUTH2_CODE_VERIFIER, codeVerifier);
275
273
  return codeChallenge;
276
274
  },
277
- /**
278
- * Generates a CSRF token and sticks in in sessionStorage
279
- * @instance
280
- * @memberof AuthorizationBrowserFirstParty
281
- * @private
282
- * @returns {Promise}
275
+ /**
276
+ * Generates a CSRF token and sticks in in sessionStorage
277
+ * @instance
278
+ * @memberof AuthorizationBrowserFirstParty
279
+ * @private
280
+ * @returns {Promise}
283
281
  */
284
282
  _generateSecurityToken: function _generateSecurityToken() {
285
283
  this.logger.info('authorization: generating csrf token');
@@ -287,14 +285,14 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
287
285
  this.webex.getWindow().sessionStorage.setItem('oauth2-csrf-token', token);
288
286
  return token;
289
287
  },
290
- /**
291
- * Checks if the CSRF token in sessionStorage is the same as the one returned
292
- * in the url.
293
- * @instance
294
- * @memberof AuthorizationBrowserFirstParty
295
- * @param {Object} query
296
- * @private
297
- * @returns {Promise}
288
+ /**
289
+ * Checks if the CSRF token in sessionStorage is the same as the one returned
290
+ * in the url.
291
+ * @instance
292
+ * @memberof AuthorizationBrowserFirstParty
293
+ * @param {Object} query
294
+ * @private
295
+ * @returns {Promise}
298
296
  */
299
297
  _verifySecurityToken: function _verifySecurityToken(query) {
300
298
  var sessionToken = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CSRF_TOKEN);
@@ -313,7 +311,7 @@ var Authorization = _webexCore.WebexPlugin.extend((_dec = (0, _common.whileInFli
313
311
  throw new Error("CSRF token ".concat(token, " does not match stored token ").concat(sessionToken));
314
312
  }
315
313
  },
316
- version: "2.59.0"
314
+ version: "2.59.4-next.1"
317
315
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "initiateAuthorizationCodeGrant", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "initiateAuthorizationCodeGrant"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "requestAuthorizationCodeGrant", [_dec2, _common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "requestAuthorizationCodeGrant"), _obj)), _obj)));
318
316
  var _default = Authorization;
319
317
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["_querystring","_interopRequireDefault","require","_url","_common","_webexCore","_uuid","_encBase64url","_cryptoJs","_dec","_dec2","_obj","lodash","OAUTH2_CSRF_TOKEN","OAUTH2_CODE_VERIFIER","Authorization","WebexPlugin","extend","whileInFlight","derived","isAuthenticating","deps","fn","isAuthorizing","session","default","type","ready","namespace","initialize","_this","_len","arguments","length","attrs","Array","_key","ret","_apply","prototype","location","url","parse","webex","getWindow","href","_checkForErrors","code","query","state","JSON","base64","decode","codeVerifier","sessionStorage","getItem","removeItem","emailhash","_verifySecurityToken","_cleanUrl","process","nextTick","internal","services","collectPreauthCatalog","catch","_promise","resolve","then","requestAuthorizationCodeGrant","initiateLogin","options","undefined","_cloneDeep2","email","emailHash","CryptoJS","SHA256","toString","csrf_token","_generateSecurityToken","code_challenge","_generateCodeChallenge","code_challenge_method","initiateAuthorizationCodeGrant","logger","info","credentials","buildLoginUrl","_assign","response_type","logout","noRedirect","buildLogoutUrl","_this2","reject","Error","form","grant_type","redirect_uri","config","self_contained_token","code_verifier","request","method","uri","tokenUrl","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","res","set","supertoken","body","statusCode","ErrorConstructor","grantErrors","select","error","_res","history","replaceState","_deleteProperty","_isEmpty2","_omit2","encode","_stringify","search","querystring","stringify","format","safeCharacterMap","base64url","_safe_map","times","random","join","codeChallenge","setItem","token","uuid","v4","sessionToken","concat","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","oneFlight","_default","exports"],"sources":["authorization.js"],"sourcesContent":["/*!\r\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\r\n */\r\n\r\n/* eslint camelcase: [0] */\r\n\r\nimport querystring from 'querystring';\r\nimport url from 'url';\r\n\r\nimport {base64, oneFlight, whileInFlight} from '@webex/common';\r\nimport {grantErrors, WebexPlugin} from '@webex/webex-core';\r\nimport {cloneDeep, isEmpty, omit} from 'lodash';\r\nimport uuid from 'uuid';\r\nimport base64url from 'crypto-js/enc-base64url';\r\nimport CryptoJS from 'crypto-js';\r\n\r\n// Necessary to require lodash this way in order to stub\r\n// methods in the unit test\r\nconst lodash = require('lodash');\r\n\r\nconst OAUTH2_CSRF_TOKEN = 'oauth2-csrf-token';\r\nconst OAUTH2_CODE_VERIFIER = 'oauth2-code-verifier';\r\n\r\n/**\r\n * Browser support for OAuth2. Automatically parses the URL query for an\r\n * authorization code\r\n *\r\n * Use of this plugin for anything other than the Webex Web Client is strongly\r\n * discouraged and may be broken at any time\r\n * @class\r\n * @name AuthorizationBrowserFirstParty\r\n * @private\r\n */\r\nconst Authorization = WebexPlugin.extend({\r\n derived: {\r\n /**\r\n * Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @type {boolean}\r\n */\r\n isAuthenticating: {\r\n deps: ['isAuthorizing'],\r\n fn() {\r\n return this.isAuthorizing;\r\n },\r\n },\r\n },\r\n\r\n session: {\r\n /**\r\n * Indicates if an Authorization Code exchange is inflight\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @type {boolean}\r\n */\r\n isAuthorizing: {\r\n default: false,\r\n type: 'boolean',\r\n },\r\n ready: {\r\n default: false,\r\n type: 'boolean',\r\n },\r\n },\r\n\r\n namespace: 'Credentials',\r\n\r\n /**\r\n * Initializer\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @private\r\n * @returns {Authorization}\r\n */\r\n // eslint-disable-next-line complexity\r\n initialize(...attrs) {\r\n const ret = Reflect.apply(WebexPlugin.prototype.initialize, this, attrs);\r\n const location = url.parse(this.webex.getWindow().location.href, true);\r\n\r\n this._checkForErrors(location);\r\n\r\n const {code} = location.query;\r\n\r\n if (!code) {\r\n this.ready = true;\r\n\r\n return ret;\r\n }\r\n\r\n if (location.query.state) {\r\n location.query.state = JSON.parse(base64.decode(location.query.state));\r\n } else {\r\n location.query.state = {};\r\n }\r\n\r\n const codeVerifier = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CODE_VERIFIER);\r\n\r\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CODE_VERIFIER);\r\n\r\n const {emailhash} = location.query.state;\r\n\r\n this._verifySecurityToken(location.query);\r\n this._cleanUrl(location);\r\n\r\n // Wait until nextTick in case `credentials` hasn't initialized yet\r\n process.nextTick(() => {\r\n this.webex.internal.services\r\n .collectPreauthCatalog({emailhash})\r\n .catch(() => Promise.resolve())\r\n .then(() => this.requestAuthorizationCodeGrant({code, codeVerifier}))\r\n .then(() => {\r\n this.ready = true;\r\n });\r\n });\r\n\r\n return ret;\r\n },\r\n\r\n /**\r\n * Kicks off an oauth flow\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @returns {Promise}\r\n */\r\n initiateLogin(options = {}) {\r\n options = cloneDeep(options);\r\n if (options.email) {\r\n options.emailHash = CryptoJS.SHA256(options.email).toString();\r\n }\r\n delete options.email;\r\n options.state = options.state || {};\r\n options.state.csrf_token = this._generateSecurityToken();\r\n // catalog uses emailhash and redirectCI uses emailHash\r\n options.state.emailhash = options.emailHash;\r\n\r\n options.code_challenge = this._generateCodeChallenge();\r\n options.code_challenge_method = 'S256';\r\n\r\n return this.initiateAuthorizationCodeGrant(options);\r\n },\r\n\r\n @whileInFlight('isAuthorizing')\r\n /**\r\n * Kicks off the Implicit Code grant flow. Typically called via\r\n * {@link AuthorizationBrowserFirstParty#initiateLogin}\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @returns {Promise}\r\n */\r\n initiateAuthorizationCodeGrant(options) {\r\n this.logger.info('authorization: initiating authorization code grant flow');\r\n this.webex.getWindow().location = this.webex.credentials.buildLoginUrl(\r\n Object.assign({response_type: 'code'}, options)\r\n );\r\n\r\n return Promise.resolve();\r\n },\r\n\r\n /**\r\n * Called by {@link WebexCore#logout()}. Redirects to the logout page\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @param {boolean} options.noRedirect if true, does not redirect\r\n * @returns {Promise}\r\n */\r\n logout(options = {}) {\r\n if (!options.noRedirect) {\r\n this.webex.getWindow().location = this.webex.credentials.buildLogoutUrl(options);\r\n }\r\n },\r\n\r\n @whileInFlight('isAuthorizing')\r\n @oneFlight\r\n /**\r\n * Exchanges an authorization code for an access token\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} options\r\n * @param {Object} options.code\r\n * @returns {Promise}\r\n */\r\n requestAuthorizationCodeGrant(options = {}) {\r\n this.logger.info('credentials: requesting authorization code grant');\r\n\r\n if (!options.code) {\r\n return Promise.reject(new Error('`options.code` is required'));\r\n }\r\n\r\n const form = {\r\n grant_type: 'authorization_code',\r\n redirect_uri: this.config.redirect_uri,\r\n code: options.code,\r\n self_contained_token: true,\r\n };\r\n\r\n if (options.codeVerifier) {\r\n form.code_verifier = options.codeVerifier;\r\n }\r\n\r\n return this.webex\r\n .request({\r\n method: 'POST',\r\n uri: this.config.tokenUrl,\r\n form,\r\n auth: {\r\n user: this.config.client_id,\r\n pass: this.config.client_secret,\r\n sendImmediately: true,\r\n },\r\n shouldRefreshAccessToken: false,\r\n })\r\n .then((res) => {\r\n this.webex.credentials.set({supertoken: res.body});\r\n })\r\n .catch((res) => {\r\n if (res.statusCode !== 400) {\r\n return Promise.reject(res);\r\n }\r\n\r\n const ErrorConstructor = grantErrors.select(res.body.error);\r\n\r\n return Promise.reject(new ErrorConstructor(res._res || res));\r\n });\r\n },\r\n\r\n /**\r\n * Checks if the result of the login redirect contains an error string\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} location\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _checkForErrors(location) {\r\n const {query} = location;\r\n\r\n if (query && query.error) {\r\n const ErrorConstructor = grantErrors.select(query.error);\r\n\r\n throw new ErrorConstructor(query);\r\n }\r\n },\r\n\r\n /**\r\n * Removes no-longer needed values from the url (access token, csrf token, etc)\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} location\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _cleanUrl(location) {\r\n location = cloneDeep(location);\r\n if (this.webex.getWindow().history && this.webex.getWindow().history.replaceState) {\r\n Reflect.deleteProperty(location.query, 'code');\r\n if (isEmpty(omit(location.query.state, 'csrf_token'))) {\r\n Reflect.deleteProperty(location.query, 'state');\r\n } else {\r\n location.query.state = base64.encode(\r\n JSON.stringify(omit(location.query.state, 'csrf_token'))\r\n );\r\n }\r\n location.search = querystring.stringify(location.query);\r\n Reflect.deleteProperty(location, 'query');\r\n this.webex.getWindow().history.replaceState({}, null, url.format(location));\r\n }\r\n },\r\n\r\n /**\r\n * Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @private\r\n * @returns {string}\r\n */\r\n _generateCodeChallenge() {\r\n this.logger.info('authorization: generating PKCE code challenge');\r\n\r\n // eslint-disable-next-line no-underscore-dangle\r\n const safeCharacterMap = base64url._safe_map;\r\n\r\n const codeVerifier = lodash\r\n .times(128, () => safeCharacterMap[lodash.random(0, safeCharacterMap.length - 1)])\r\n .join('');\r\n\r\n const codeChallenge = CryptoJS.SHA256(codeVerifier).toString(base64url);\r\n\r\n this.webex.getWindow().sessionStorage.setItem(OAUTH2_CODE_VERIFIER, codeVerifier);\r\n\r\n return codeChallenge;\r\n },\r\n\r\n /**\r\n * Generates a CSRF token and sticks in in sessionStorage\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _generateSecurityToken() {\r\n this.logger.info('authorization: generating csrf token');\r\n\r\n const token = uuid.v4();\r\n\r\n this.webex.getWindow().sessionStorage.setItem('oauth2-csrf-token', token);\r\n\r\n return token;\r\n },\r\n\r\n /**\r\n * Checks if the CSRF token in sessionStorage is the same as the one returned\r\n * in the url.\r\n * @instance\r\n * @memberof AuthorizationBrowserFirstParty\r\n * @param {Object} query\r\n * @private\r\n * @returns {Promise}\r\n */\r\n _verifySecurityToken(query) {\r\n const sessionToken = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CSRF_TOKEN);\r\n\r\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CSRF_TOKEN);\r\n if (!sessionToken) {\r\n return;\r\n }\r\n\r\n if (!query.state) {\r\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\r\n }\r\n\r\n if (!query.state.csrf_token) {\r\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\r\n }\r\n\r\n const token = query.state.csrf_token;\r\n\r\n if (token !== sessionToken) {\r\n throw new Error(`CSRF token ${token} does not match stored token ${sessionToken}`);\r\n }\r\n },\r\n});\r\n\r\nexport default Authorization;\r\n"],"mappings":"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"}
1
+ {"version":3,"names":["_querystring","_interopRequireDefault","require","_url","_common","_webexCore","_lodash","_uuid","_encBase64url","_cryptoJs","_dec","_dec2","_obj","lodash","OAUTH2_CSRF_TOKEN","OAUTH2_CODE_VERIFIER","Authorization","WebexPlugin","extend","whileInFlight","derived","isAuthenticating","deps","fn","isAuthorizing","session","default","type","ready","namespace","initialize","_this","_len","arguments","length","attrs","Array","_key","ret","_apply","prototype","location","url","parse","webex","getWindow","href","_checkForErrors","code","query","state","JSON","base64","decode","codeVerifier","sessionStorage","getItem","removeItem","emailhash","_verifySecurityToken","_cleanUrl","process","nextTick","internal","services","collectPreauthCatalog","catch","_promise","resolve","then","requestAuthorizationCodeGrant","initiateLogin","options","undefined","cloneDeep","email","emailHash","CryptoJS","SHA256","toString","csrf_token","_generateSecurityToken","code_challenge","_generateCodeChallenge","code_challenge_method","initiateAuthorizationCodeGrant","logger","info","credentials","buildLoginUrl","_assign","response_type","logout","noRedirect","buildLogoutUrl","_this2","reject","Error","form","grant_type","redirect_uri","config","self_contained_token","code_verifier","request","method","uri","tokenUrl","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","res","set","supertoken","body","statusCode","ErrorConstructor","grantErrors","select","error","_res","history","replaceState","_deleteProperty","isEmpty","omit","encode","_stringify","search","querystring","stringify","format","safeCharacterMap","base64url","_safe_map","times","random","join","codeChallenge","setItem","token","uuid","v4","sessionToken","concat","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","oneFlight","_default","exports"],"sources":["authorization.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport {base64, oneFlight, whileInFlight} from '@webex/common';\nimport {grantErrors, WebexPlugin} from '@webex/webex-core';\nimport {cloneDeep, isEmpty, omit} from 'lodash';\nimport uuid from 'uuid';\nimport base64url from 'crypto-js/enc-base64url';\nimport CryptoJS from 'crypto-js';\n\n// Necessary to require lodash this way in order to stub\n// methods in the unit test\nconst lodash = require('lodash');\n\nconst OAUTH2_CSRF_TOKEN = 'oauth2-csrf-token';\nconst OAUTH2_CODE_VERIFIER = 'oauth2-code-verifier';\n\n/**\n * Browser support for OAuth2. Automatically parses the URL query for an\n * authorization code\n *\n * Use of this plugin for anything other than the Webex Web Client is strongly\n * discouraged and may be broken at any time\n * @class\n * @name AuthorizationBrowserFirstParty\n * @private\n */\nconst Authorization = WebexPlugin.extend({\n derived: {\n /**\n * Alias of {@link AuthorizationBrowserFirstParty#isAuthorizing}\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @type {boolean}\n */\n isAuthenticating: {\n deps: ['isAuthorizing'],\n fn() {\n return this.isAuthorizing;\n },\n },\n },\n\n session: {\n /**\n * Indicates if an Authorization Code exchange is inflight\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @type {boolean}\n */\n isAuthorizing: {\n default: false,\n type: 'boolean',\n },\n ready: {\n default: false,\n type: 'boolean',\n },\n },\n\n namespace: 'Credentials',\n\n /**\n * Initializer\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @private\n * @returns {Authorization}\n */\n // eslint-disable-next-line complexity\n initialize(...attrs) {\n const ret = Reflect.apply(WebexPlugin.prototype.initialize, this, attrs);\n const location = url.parse(this.webex.getWindow().location.href, true);\n\n this._checkForErrors(location);\n\n const {code} = location.query;\n\n if (!code) {\n this.ready = true;\n\n return ret;\n }\n\n if (location.query.state) {\n location.query.state = JSON.parse(base64.decode(location.query.state));\n } else {\n location.query.state = {};\n }\n\n const codeVerifier = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CODE_VERIFIER);\n\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CODE_VERIFIER);\n\n const {emailhash} = location.query.state;\n\n this._verifySecurityToken(location.query);\n this._cleanUrl(location);\n\n // Wait until nextTick in case `credentials` hasn't initialized yet\n process.nextTick(() => {\n this.webex.internal.services\n .collectPreauthCatalog({emailhash})\n .catch(() => Promise.resolve())\n .then(() => this.requestAuthorizationCodeGrant({code, codeVerifier}))\n .then(() => {\n this.ready = true;\n });\n });\n\n return ret;\n },\n\n /**\n * Kicks off an oauth flow\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @returns {Promise}\n */\n initiateLogin(options = {}) {\n options = cloneDeep(options);\n if (options.email) {\n options.emailHash = CryptoJS.SHA256(options.email).toString();\n }\n delete options.email;\n options.state = options.state || {};\n options.state.csrf_token = this._generateSecurityToken();\n // catalog uses emailhash and redirectCI uses emailHash\n options.state.emailhash = options.emailHash;\n\n options.code_challenge = this._generateCodeChallenge();\n options.code_challenge_method = 'S256';\n\n return this.initiateAuthorizationCodeGrant(options);\n },\n\n @whileInFlight('isAuthorizing')\n /**\n * Kicks off the Implicit Code grant flow. Typically called via\n * {@link AuthorizationBrowserFirstParty#initiateLogin}\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @returns {Promise}\n */\n initiateAuthorizationCodeGrant(options) {\n this.logger.info('authorization: initiating authorization code grant flow');\n this.webex.getWindow().location = this.webex.credentials.buildLoginUrl(\n Object.assign({response_type: 'code'}, options)\n );\n\n return Promise.resolve();\n },\n\n /**\n * Called by {@link WebexCore#logout()}. Redirects to the logout page\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @param {boolean} options.noRedirect if true, does not redirect\n * @returns {Promise}\n */\n logout(options = {}) {\n if (!options.noRedirect) {\n this.webex.getWindow().location = this.webex.credentials.buildLogoutUrl(options);\n }\n },\n\n @whileInFlight('isAuthorizing')\n @oneFlight\n /**\n * Exchanges an authorization code for an access token\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} options\n * @param {Object} options.code\n * @returns {Promise}\n */\n requestAuthorizationCodeGrant(options = {}) {\n this.logger.info('credentials: requesting authorization code grant');\n\n if (!options.code) {\n return Promise.reject(new Error('`options.code` is required'));\n }\n\n const form = {\n grant_type: 'authorization_code',\n redirect_uri: this.config.redirect_uri,\n code: options.code,\n self_contained_token: true,\n };\n\n if (options.codeVerifier) {\n form.code_verifier = options.codeVerifier;\n }\n\n return this.webex\n .request({\n method: 'POST',\n uri: this.config.tokenUrl,\n form,\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n })\n .then((res) => {\n this.webex.credentials.set({supertoken: res.body});\n })\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 /**\n * Checks if the result of the login redirect contains an error string\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} location\n * @private\n * @returns {Promise}\n */\n _checkForErrors(location) {\n const {query} = location;\n\n if (query && query.error) {\n const ErrorConstructor = grantErrors.select(query.error);\n\n throw new ErrorConstructor(query);\n }\n },\n\n /**\n * Removes no-longer needed values from the url (access token, csrf token, etc)\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} location\n * @private\n * @returns {Promise}\n */\n _cleanUrl(location) {\n location = cloneDeep(location);\n if (this.webex.getWindow().history && this.webex.getWindow().history.replaceState) {\n Reflect.deleteProperty(location.query, 'code');\n if (isEmpty(omit(location.query.state, 'csrf_token'))) {\n Reflect.deleteProperty(location.query, 'state');\n } else {\n location.query.state = base64.encode(\n JSON.stringify(omit(location.query.state, 'csrf_token'))\n );\n }\n location.search = querystring.stringify(location.query);\n Reflect.deleteProperty(location, 'query');\n this.webex.getWindow().history.replaceState({}, null, url.format(location));\n }\n },\n\n /**\n * Generates PKCE code verifier and code challenge and sets the the code verifier in sessionStorage\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @private\n * @returns {string}\n */\n _generateCodeChallenge() {\n this.logger.info('authorization: generating PKCE code challenge');\n\n // eslint-disable-next-line no-underscore-dangle\n const safeCharacterMap = base64url._safe_map;\n\n const codeVerifier = lodash\n .times(128, () => safeCharacterMap[lodash.random(0, safeCharacterMap.length - 1)])\n .join('');\n\n const codeChallenge = CryptoJS.SHA256(codeVerifier).toString(base64url);\n\n this.webex.getWindow().sessionStorage.setItem(OAUTH2_CODE_VERIFIER, codeVerifier);\n\n return codeChallenge;\n },\n\n /**\n * Generates a CSRF token and sticks in in sessionStorage\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @private\n * @returns {Promise}\n */\n _generateSecurityToken() {\n this.logger.info('authorization: generating csrf token');\n\n const token = uuid.v4();\n\n this.webex.getWindow().sessionStorage.setItem('oauth2-csrf-token', token);\n\n return token;\n },\n\n /**\n * Checks if the CSRF token in sessionStorage is the same as the one returned\n * in the url.\n * @instance\n * @memberof AuthorizationBrowserFirstParty\n * @param {Object} query\n * @private\n * @returns {Promise}\n */\n _verifySecurityToken(query) {\n const sessionToken = this.webex.getWindow().sessionStorage.getItem(OAUTH2_CSRF_TOKEN);\n\n this.webex.getWindow().sessionStorage.removeItem(OAUTH2_CSRF_TOKEN);\n if (!sessionToken) {\n return;\n }\n\n if (!query.state) {\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\n }\n\n if (!query.state.csrf_token) {\n throw new Error(`Expected CSRF token ${sessionToken}, but not found in redirect query`);\n }\n\n const token = query.state.csrf_token;\n\n if (token !== sessionToken) {\n throw new Error(`CSRF token ${token} does not match stored token ${sessionToken}`);\n }\n },\n});\n\nexport default Authorization;\n"],"mappings":"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"}
package/dist/config.js CHANGED
@@ -5,17 +5,17 @@ _Object$defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
- /*!
9
- * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
8
+ /*!
9
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
10
10
  */
11
11
  var _default = {
12
12
  credentials: {
13
- /**
14
- * Controls whether {@link Authorization#initiateLogin()} requests a token
15
- * or an auth code. Anything other than 'confidential' will be treated as
16
- * 'public'
17
- * @private
18
- * @type {string}
13
+ /**
14
+ * Controls whether {@link Authorization#initiateLogin()} requests a token
15
+ * or an auth code. Anything other than 'confidential' will be treated as
16
+ * 'public'
17
+ * @private
18
+ * @type {string}
19
19
  */
20
20
  clientType: 'public',
21
21
  refreshCallback: function refreshCallback(webex, token) {
@@ -1 +1 @@
1
- {"version":3,"names":["_default","credentials","clientType","refreshCallback","webex","token","request","method","uri","config","tokenUrl","form","grant_type","redirect_uri","refresh_token","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","exports","default"],"sources":["config.js"],"sourcesContent":["/*!\r\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\r\n */\r\n\r\nexport default {\r\n credentials: {\r\n /**\r\n * Controls whether {@link Authorization#initiateLogin()} requests a token\r\n * or an auth code. Anything other than 'confidential' will be treated as\r\n * 'public'\r\n * @private\r\n * @type {string}\r\n */\r\n clientType: 'public',\r\n\r\n refreshCallback(webex, token) {\r\n /* eslint-disable camelcase */\r\n return webex\r\n .request({\r\n method: 'POST',\r\n uri: token.config.tokenUrl,\r\n form: {\r\n grant_type: 'refresh_token',\r\n redirect_uri: token.config.redirect_uri,\r\n refresh_token: token.refresh_token,\r\n },\r\n auth: {\r\n user: token.config.client_id,\r\n pass: token.config.client_secret,\r\n sendImmediately: true,\r\n },\r\n shouldRefreshAccessToken: false,\r\n })\r\n .then((res) => res.body);\r\n /* eslint-enable camelcase */\r\n },\r\n },\r\n};\r\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAFA,IAAAA,QAAA,GAIe;EACbC,WAAW,EAAE;IACX;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,UAAU,EAAE,QAAQ;IAEpBC,eAAe,WAAAA,gBAACC,KAAK,EAAEC,KAAK,EAAE;MAC5B;MACA,OAAOD,KAAK,CACTE,OAAO,CAAC;QACPC,MAAM,EAAE,MAAM;QACdC,GAAG,EAAEH,KAAK,CAACI,MAAM,CAACC,QAAQ;QAC1BC,IAAI,EAAE;UACJC,UAAU,EAAE,eAAe;UAC3BC,YAAY,EAAER,KAAK,CAACI,MAAM,CAACI,YAAY;UACvCC,aAAa,EAAET,KAAK,CAACS;QACvB,CAAC;QACDC,IAAI,EAAE;UACJC,IAAI,EAAEX,KAAK,CAACI,MAAM,CAACQ,SAAS;UAC5BC,IAAI,EAAEb,KAAK,CAACI,MAAM,CAACU,aAAa;UAChCC,eAAe,EAAE;QACnB,CAAC;QACDC,wBAAwB,EAAE;MAC5B,CAAC,CAAC,CACDC,IAAI,CAAC,UAACC,GAAG;QAAA,OAAKA,GAAG,CAACC,IAAI;MAAA,EAAC;MAC1B;IACF;EACF;AACF,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAA1B,QAAA"}
1
+ {"version":3,"names":["_default","credentials","clientType","refreshCallback","webex","token","request","method","uri","config","tokenUrl","form","grant_type","redirect_uri","refresh_token","auth","user","client_id","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","exports","default"],"sources":["config.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nexport default {\n credentials: {\n /**\n * Controls whether {@link Authorization#initiateLogin()} requests a token\n * or an auth code. Anything other than 'confidential' will be treated as\n * 'public'\n * @private\n * @type {string}\n */\n clientType: 'public',\n\n refreshCallback(webex, token) {\n /* eslint-disable camelcase */\n return webex\n .request({\n method: 'POST',\n uri: token.config.tokenUrl,\n form: {\n grant_type: 'refresh_token',\n redirect_uri: token.config.redirect_uri,\n refresh_token: token.refresh_token,\n },\n auth: {\n user: token.config.client_id,\n pass: token.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n })\n .then((res) => res.body);\n /* eslint-enable camelcase */\n },\n },\n};\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAFA,IAAAA,QAAA,GAIe;EACbC,WAAW,EAAE;IACX;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,UAAU,EAAE,QAAQ;IAEpBC,eAAe,WAAAA,gBAACC,KAAK,EAAEC,KAAK,EAAE;MAC5B;MACA,OAAOD,KAAK,CACTE,OAAO,CAAC;QACPC,MAAM,EAAE,MAAM;QACdC,GAAG,EAAEH,KAAK,CAACI,MAAM,CAACC,QAAQ;QAC1BC,IAAI,EAAE;UACJC,UAAU,EAAE,eAAe;UAC3BC,YAAY,EAAER,KAAK,CAACI,MAAM,CAACI,YAAY;UACvCC,aAAa,EAAET,KAAK,CAACS;QACvB,CAAC;QACDC,IAAI,EAAE;UACJC,IAAI,EAAEX,KAAK,CAACI,MAAM,CAACQ,SAAS;UAC5BC,IAAI,EAAEb,KAAK,CAACI,MAAM,CAACU,aAAa;UAChCC,eAAe,EAAE;QACnB,CAAC;QACDC,wBAAwB,EAAE;MAC5B,CAAC,CAAC,CACDC,IAAI,CAAC,UAACC,GAAG;QAAA,OAAKA,GAAG,CAACC,IAAI;MAAA,EAAC;MAC1B;IACF;EACF;AACF,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAA1B,QAAA"}
package/dist/index.js CHANGED
@@ -20,8 +20,8 @@ _Object$defineProperty(exports, "default", {
20
20
  var _webexCore = require("@webex/webex-core");
21
21
  var _authorization = _interopRequireDefault(require("./authorization"));
22
22
  var _config = _interopRequireDefault(require("./config"));
23
- /*!
24
- * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
23
+ /*!
24
+ * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
25
25
  */
26
26
 
27
27
  var proxies = ['isAuthorizing', 'isAuthenticating'];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_authorization","_interopRequireDefault","_config","proxies","registerPlugin","Authorization","config"],"sources":["index.js"],"sourcesContent":["/*!\r\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\r\n */\r\n\r\nimport {registerPlugin} from '@webex/webex-core';\r\n\r\nimport Authorization from './authorization';\r\nimport config from './config';\r\n\r\nconst proxies = ['isAuthorizing', 'isAuthenticating'];\r\n\r\nregisterPlugin('authorization', Authorization, {\r\n config,\r\n proxies,\r\n});\r\n\r\nexport {default} from './authorization';\r\nexport {default as config} from './config';\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAD,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;;AAOA,IAAMI,OAAO,GAAG,CAAC,eAAe,EAAE,kBAAkB,CAAC;AAErD,IAAAC,yBAAc,EAAC,eAAe,EAAEC,sBAAa,EAAE;EAC7CC,MAAM,EAANA,eAAM;EACNH,OAAO,EAAPA;AACF,CAAC,CAAC"}
1
+ {"version":3,"names":["_webexCore","require","_authorization","_interopRequireDefault","_config","proxies","registerPlugin","Authorization","config"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerPlugin} from '@webex/webex-core';\n\nimport Authorization from './authorization';\nimport config from './config';\n\nconst proxies = ['isAuthorizing', 'isAuthenticating'];\n\nregisterPlugin('authorization', Authorization, {\n config,\n proxies,\n});\n\nexport {default} from './authorization';\nexport {default as config} from './config';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAD,sBAAA,CAAAF,OAAA;AAPA;AACA;AACA;;AAOA,IAAMI,OAAO,GAAG,CAAC,eAAe,EAAE,kBAAkB,CAAC;AAErD,IAAAC,yBAAc,EAAC,eAAe,EAAEC,sBAAa,EAAE;EAC7CC,MAAM,EAANA,eAAM;EACNH,OAAO,EAAPA;AACF,CAAC,CAAC"}
package/jest.config.js CHANGED
@@ -1,3 +1,3 @@
1
- const config = require('@webex/jest-config-legacy');
2
-
3
- module.exports = config;
1
+ const config = require('@webex/jest-config-legacy');
2
+
3
+ module.exports = config;
package/package.json CHANGED
@@ -26,23 +26,23 @@
26
26
  "@webex/eslint-config-legacy": "^0.0.0",
27
27
  "@webex/jest-config-legacy": "^0.0.0",
28
28
  "@webex/legacy-tools": "^0.0.0",
29
- "@webex/test-helper-chai": "^2.59.3-next.1",
30
- "@webex/test-helper-mocha": "^2.59.3-next.1",
31
- "@webex/test-helper-mock-webex": "^2.59.3-next.1",
32
- "@webex/test-helper-test-users": "^2.59.3-next.1",
29
+ "@webex/test-helper-chai": "^2.59.4-next.1",
30
+ "@webex/test-helper-mocha": "^2.59.4-next.1",
31
+ "@webex/test-helper-mock-webex": "^2.59.4-next.1",
32
+ "@webex/test-helper-test-users": "^2.59.4-next.1",
33
33
  "eslint": "^8.24.0",
34
34
  "prettier": "^2.7.1",
35
35
  "sinon": "^9.2.4"
36
36
  },
37
37
  "dependencies": {
38
- "@webex/common": "^2.59.3-next.1",
39
- "@webex/storage-adapter-local-storage": "^2.59.3-next.1",
40
- "@webex/test-helper-automation": "^2.59.3-next.1",
41
- "@webex/test-helper-chai": "^2.59.3-next.1",
42
- "@webex/test-helper-mocha": "^2.59.3-next.1",
43
- "@webex/test-helper-mock-webex": "^2.59.3-next.1",
44
- "@webex/test-helper-test-users": "^2.59.3-next.1",
45
- "@webex/webex-core": "^2.59.3-next.1",
38
+ "@webex/common": "^2.59.4-next.1",
39
+ "@webex/storage-adapter-local-storage": "^2.59.4-next.1",
40
+ "@webex/test-helper-automation": "^2.59.4-next.1",
41
+ "@webex/test-helper-chai": "^2.59.4-next.1",
42
+ "@webex/test-helper-mocha": "^2.59.4-next.1",
43
+ "@webex/test-helper-mock-webex": "^2.59.4-next.1",
44
+ "@webex/test-helper-test-users": "^2.59.4-next.1",
45
+ "@webex/webex-core": "^2.59.4-next.1",
46
46
  "crypto-js": "^4.1.1",
47
47
  "lodash": "^4.17.21",
48
48
  "uuid": "^3.3.2"
@@ -57,5 +57,5 @@
57
57
  "test:style": "eslint ./src/**/*.*",
58
58
  "test:unit": "webex-legacy-tools test --unit --runner jest"
59
59
  },
60
- "version": "2.59.3-next.1"
60
+ "version": "2.59.4-next.1"
61
61
  }