@webex/webex-core 3.0.0-beta.2 → 3.0.0-beta.21
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/config.js +1 -11
- package/dist/config.js.map +1 -1
- package/dist/credentials-config.js +44 -64
- package/dist/credentials-config.js.map +1 -1
- package/dist/index.js +0 -76
- package/dist/index.js.map +1 -1
- package/dist/interceptors/auth.js +22 -55
- package/dist/interceptors/auth.js.map +1 -1
- package/dist/interceptors/default-options.js +0 -20
- package/dist/interceptors/default-options.js.map +1 -1
- package/dist/interceptors/embargo.js +0 -21
- package/dist/interceptors/embargo.js.map +1 -1
- package/dist/interceptors/network-timing.js +2 -21
- package/dist/interceptors/network-timing.js.map +1 -1
- package/dist/interceptors/payload-transformer.js +2 -22
- package/dist/interceptors/payload-transformer.js.map +1 -1
- package/dist/interceptors/rate-limit.js +25 -57
- package/dist/interceptors/rate-limit.js.map +1 -1
- package/dist/interceptors/redirect.js +4 -33
- package/dist/interceptors/redirect.js.map +1 -1
- package/dist/interceptors/request-event.js +3 -30
- package/dist/interceptors/request-event.js.map +1 -1
- package/dist/interceptors/request-logger.js +1 -30
- package/dist/interceptors/request-logger.js.map +1 -1
- package/dist/interceptors/request-timing.js +3 -22
- package/dist/interceptors/request-timing.js.map +1 -1
- package/dist/interceptors/response-logger.js +2 -31
- package/dist/interceptors/response-logger.js.map +1 -1
- package/dist/interceptors/user-agent.js +2 -29
- package/dist/interceptors/user-agent.js.map +1 -1
- package/dist/interceptors/webex-tracking-id.js +5 -28
- package/dist/interceptors/webex-tracking-id.js.map +1 -1
- package/dist/interceptors/webex-user-agent.js +5 -38
- package/dist/interceptors/webex-user-agent.js.map +1 -1
- package/dist/lib/batcher.js +3 -51
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +39 -119
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/grant-errors.js +0 -49
- package/dist/lib/credentials/grant-errors.js.map +1 -1
- package/dist/lib/credentials/index.js +1 -13
- package/dist/lib/credentials/index.js.map +1 -1
- package/dist/lib/credentials/scope.js +1 -7
- package/dist/lib/credentials/scope.js.map +1 -1
- package/dist/lib/credentials/token-collection.js +1 -7
- package/dist/lib/credentials/token-collection.js.map +1 -1
- package/dist/lib/credentials/token.js +39 -118
- package/dist/lib/credentials/token.js.map +1 -1
- package/dist/lib/page.js +13 -26
- package/dist/lib/page.js.map +1 -1
- package/dist/lib/services/constants.js +0 -2
- package/dist/lib/services/constants.js.map +1 -1
- package/dist/lib/services/index.js +1 -28
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/interceptors/server-error.js +2 -23
- package/dist/lib/services/interceptors/server-error.js.map +1 -1
- package/dist/lib/services/interceptors/service.js +12 -34
- package/dist/lib/services/interceptors/service.js.map +1 -1
- package/dist/lib/services/metrics.js +0 -2
- package/dist/lib/services/metrics.js.map +1 -1
- package/dist/lib/services/service-catalog.js +10 -90
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/service-fed-ramp.js +0 -2
- package/dist/lib/services/service-fed-ramp.js.map +1 -1
- package/dist/lib/services/service-host.js +47 -62
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js +78 -90
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js +3 -15
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/service-url.js +4 -25
- package/dist/lib/services/service-url.js.map +1 -1
- package/dist/lib/services/services.js +122 -238
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/stateless-webex-plugin.js +5 -28
- package/dist/lib/stateless-webex-plugin.js.map +1 -1
- package/dist/lib/storage/decorators.js +19 -62
- package/dist/lib/storage/decorators.js.map +1 -1
- package/dist/lib/storage/errors.js +0 -23
- package/dist/lib/storage/errors.js.map +1 -1
- package/dist/lib/storage/index.js +2 -16
- package/dist/lib/storage/index.js.map +1 -1
- package/dist/lib/storage/make-webex-plugin-store.js +11 -41
- package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
- package/dist/lib/storage/make-webex-store.js +8 -30
- package/dist/lib/storage/make-webex-store.js.map +1 -1
- package/dist/lib/storage/memory-store-adapter.js +1 -19
- package/dist/lib/storage/memory-store-adapter.js.map +1 -1
- package/dist/lib/webex-core-plugin-mixin.js +9 -29
- package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-http-error.js +1 -31
- package/dist/lib/webex-http-error.js.map +1 -1
- package/dist/lib/webex-internal-core-plugin-mixin.js +9 -29
- package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-plugin.js +6 -40
- package/dist/lib/webex-plugin.js.map +1 -1
- package/dist/plugins/logger.js +3 -17
- package/dist/plugins/logger.js.map +1 -1
- package/dist/webex-core.js +79 -203
- package/dist/webex-core.js.map +1 -1
- package/dist/webex-internal-core.js +0 -10
- package/dist/webex-internal-core.js.map +1 -1
- package/package.json +14 -14
- package/src/config.js +9 -11
- package/src/credentials-config.js +110 -72
- package/src/index.js +4 -14
- package/src/interceptors/auth.js +36 -37
- package/src/interceptors/default-options.js +0 -1
- package/src/interceptors/embargo.js +1 -1
- package/src/interceptors/payload-transformer.js +1 -2
- package/src/interceptors/rate-limit.js +8 -5
- package/src/interceptors/redirect.js +14 -8
- package/src/interceptors/request-event.js +4 -8
- package/src/interceptors/request-logger.js +8 -5
- package/src/interceptors/response-logger.js +11 -8
- package/src/interceptors/user-agent.js +1 -2
- package/src/interceptors/webex-user-agent.js +3 -9
- package/src/lib/batcher.js +70 -69
- package/src/lib/credentials/credentials.js +112 -122
- package/src/lib/credentials/grant-errors.js +6 -7
- package/src/lib/credentials/index.js +1 -4
- package/src/lib/credentials/scope.js +1 -4
- package/src/lib/credentials/token-collection.js +1 -1
- package/src/lib/credentials/token.js +86 -80
- package/src/lib/page.js +10 -11
- package/src/lib/services/constants.js +3 -13
- package/src/lib/services/index.js +2 -2
- package/src/lib/services/interceptors/server-error.js +12 -7
- package/src/lib/services/interceptors/service.js +6 -5
- package/src/lib/services/metrics.js +1 -1
- package/src/lib/services/service-catalog.js +110 -100
- package/src/lib/services/service-fed-ramp.js +1 -2
- package/src/lib/services/service-host.js +10 -17
- package/src/lib/services/service-registry.js +69 -96
- package/src/lib/services/service-state.js +4 -6
- package/src/lib/services/service-url.js +24 -23
- package/src/lib/services/services.js +260 -251
- package/src/lib/stateless-webex-plugin.js +4 -2
- package/src/lib/storage/decorators.js +68 -66
- package/src/lib/storage/index.js +4 -6
- package/src/lib/storage/make-webex-plugin-store.js +34 -21
- package/src/lib/storage/make-webex-store.js +6 -7
- package/src/lib/storage/memory-store-adapter.js +3 -3
- package/src/lib/webex-core-plugin-mixin.js +10 -7
- package/src/lib/webex-http-error.js +7 -8
- package/src/lib/webex-internal-core-plugin-mixin.js +9 -6
- package/src/lib/webex-plugin.js +41 -34
- package/src/plugins/logger.js +8 -3
- package/src/webex-core.js +185 -116
- package/src/webex-internal-core.js +15 -9
- package/test/integration/spec/credentials/credentials.js +26 -30
- package/test/integration/spec/credentials/token.js +36 -33
- package/test/integration/spec/services/service-catalog.js +177 -156
- package/test/integration/spec/services/services.js +313 -304
- package/test/integration/spec/webex-core.js +98 -86
- package/test/unit/spec/_setup.js +26 -18
- package/test/unit/spec/credentials/credentials.js +189 -154
- package/test/unit/spec/credentials/token.js +94 -76
- package/test/unit/spec/interceptors/auth.js +291 -243
- package/test/unit/spec/interceptors/default-options.js +36 -24
- package/test/unit/spec/interceptors/embargo.js +32 -27
- package/test/unit/spec/interceptors/network-timing.js +2 -2
- package/test/unit/spec/interceptors/payload-transformer.js +61 -52
- package/test/unit/spec/interceptors/rate-limit.js +104 -75
- package/test/unit/spec/interceptors/redirect.js +22 -20
- package/test/unit/spec/interceptors/request-timing.js +18 -22
- package/test/unit/spec/interceptors/user-agent.js +28 -16
- package/test/unit/spec/interceptors/webex-tracking-id.js +14 -8
- package/test/unit/spec/interceptors/webex-user-agent.js +83 -37
- package/test/unit/spec/lib/batcher.js +36 -32
- package/test/unit/spec/lib/page.js +36 -32
- package/test/unit/spec/lib/webex-plugin.js +1 -1
- package/test/unit/spec/services/interceptors/server-error.js +67 -90
- package/test/unit/spec/services/interceptors/service.js +17 -28
- package/test/unit/spec/services/service-catalog.js +19 -27
- package/test/unit/spec/services/service-host.js +29 -26
- package/test/unit/spec/services/service-registry.js +128 -170
- package/test/unit/spec/services/service-state.js +13 -22
- package/test/unit/spec/services/service-url.js +24 -43
- package/test/unit/spec/services/services.js +85 -41
- package/test/unit/spec/storage/persist.js +6 -9
- package/test/unit/spec/storage/wait-for-value.js +22 -21
- package/test/unit/spec/webex-core.js +78 -57
- package/test/unit/spec/webex-internal-core.js +56 -31
|
@@ -42,7 +42,7 @@ const Services = WebexPlugin.extend({
|
|
|
42
42
|
states: new WeakMap(),
|
|
43
43
|
|
|
44
44
|
props: {
|
|
45
|
-
validateDomains: ['boolean', false, true]
|
|
45
|
+
validateDomains: ['boolean', false, true],
|
|
46
46
|
},
|
|
47
47
|
|
|
48
48
|
_catalogs: new WeakMap(),
|
|
@@ -102,7 +102,7 @@ const Services = WebexPlugin.extend({
|
|
|
102
102
|
* @returns {boolean} - True if the service exists.
|
|
103
103
|
*/
|
|
104
104
|
hasService(serviceName) {
|
|
105
|
-
return !!
|
|
105
|
+
return !!this.get(serviceName);
|
|
106
106
|
},
|
|
107
107
|
|
|
108
108
|
/**
|
|
@@ -113,7 +113,7 @@ const Services = WebexPlugin.extend({
|
|
|
113
113
|
hasAllowedDomains() {
|
|
114
114
|
const catalog = this._getCatalog();
|
|
115
115
|
|
|
116
|
-
return
|
|
116
|
+
return catalog.getAllowedDomains().length > 0;
|
|
117
117
|
},
|
|
118
118
|
|
|
119
119
|
/**
|
|
@@ -149,15 +149,14 @@ const Services = WebexPlugin.extend({
|
|
|
149
149
|
},
|
|
150
150
|
|
|
151
151
|
/**
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
* saves all the services from the pre and post catalog service
|
|
153
|
+
* @param {Object} serviceUrls
|
|
154
|
+
* @returns {void}
|
|
155
|
+
*/
|
|
156
156
|
_updateServiceUrls(serviceUrls) {
|
|
157
157
|
this._serviceUrls = {...this._serviceUrls, ...serviceUrls};
|
|
158
158
|
},
|
|
159
159
|
|
|
160
|
-
|
|
161
160
|
/**
|
|
162
161
|
* Update a list of `serviceUrls` to the most current
|
|
163
162
|
* catalog via the defined `discoveryUrl` then returns the current
|
|
@@ -171,17 +170,22 @@ const Services = WebexPlugin.extend({
|
|
|
171
170
|
* @param {string} [param.token] - used for signin catalog
|
|
172
171
|
* @returns {Promise<object>}
|
|
173
172
|
*/
|
|
174
|
-
updateServices({
|
|
175
|
-
from, query, token, forceRefresh
|
|
176
|
-
} = {}) {
|
|
173
|
+
updateServices({from, query, token, forceRefresh} = {}) {
|
|
177
174
|
const catalog = this._getCatalog();
|
|
178
|
-
let formattedQuery
|
|
175
|
+
let formattedQuery;
|
|
176
|
+
let serviceGroup;
|
|
179
177
|
|
|
180
178
|
// map catalog name to service group name.
|
|
181
179
|
switch (from) {
|
|
182
|
-
case 'limited':
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
case 'limited':
|
|
181
|
+
serviceGroup = 'preauth';
|
|
182
|
+
break;
|
|
183
|
+
case 'signin':
|
|
184
|
+
serviceGroup = 'signin';
|
|
185
|
+
break;
|
|
186
|
+
default:
|
|
187
|
+
serviceGroup = 'postauth';
|
|
188
|
+
break;
|
|
185
189
|
}
|
|
186
190
|
|
|
187
191
|
// confirm catalog update for group is not in progress.
|
|
@@ -195,7 +199,9 @@ const Services = WebexPlugin.extend({
|
|
|
195
199
|
const queryKey = query && Object.keys(query)[0];
|
|
196
200
|
|
|
197
201
|
if (!['email', 'emailhash', 'userId', 'orgId', 'mode'].includes(queryKey)) {
|
|
198
|
-
return Promise.reject(
|
|
202
|
+
return Promise.reject(
|
|
203
|
+
new Error('a query param of email, emailhash, userId, orgId, or mode is required')
|
|
204
|
+
);
|
|
199
205
|
}
|
|
200
206
|
}
|
|
201
207
|
// encode email when query key is email
|
|
@@ -206,8 +212,7 @@ const Services = WebexPlugin.extend({
|
|
|
206
212
|
|
|
207
213
|
if (queryKey === 'email' && query.email) {
|
|
208
214
|
formattedQuery.emailhash = sha256(query.email.toLowerCase()).toString();
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
215
|
+
} else {
|
|
211
216
|
formattedQuery[queryKey] = query[queryKey];
|
|
212
217
|
}
|
|
213
218
|
}
|
|
@@ -216,7 +221,7 @@ const Services = WebexPlugin.extend({
|
|
|
216
221
|
from,
|
|
217
222
|
token,
|
|
218
223
|
query: formattedQuery,
|
|
219
|
-
forceRefresh
|
|
224
|
+
forceRefresh,
|
|
220
225
|
})
|
|
221
226
|
.then((serviceHostMap) => {
|
|
222
227
|
catalog.updateServiceUrls(serviceGroup, serviceHostMap);
|
|
@@ -260,7 +265,7 @@ const Services = WebexPlugin.extend({
|
|
|
260
265
|
reqId = 'WEBCLIENT',
|
|
261
266
|
forceRefresh = false,
|
|
262
267
|
activationOptions = {},
|
|
263
|
-
preloginUserId
|
|
268
|
+
preloginUserId,
|
|
264
269
|
}) {
|
|
265
270
|
this.logger.info('services: validating a user');
|
|
266
271
|
|
|
@@ -276,18 +281,20 @@ const Services = WebexPlugin.extend({
|
|
|
276
281
|
if (canAuthorize) {
|
|
277
282
|
return this.updateServices({forceRefresh})
|
|
278
283
|
.then(() => this.webex.credentials.getUserToken())
|
|
279
|
-
.then((token) =>
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
284
|
+
.then((token) =>
|
|
285
|
+
this.sendUserActivation({
|
|
286
|
+
email,
|
|
287
|
+
reqId,
|
|
288
|
+
token: token.toString(),
|
|
289
|
+
activationOptions,
|
|
290
|
+
preloginUserId,
|
|
291
|
+
})
|
|
292
|
+
)
|
|
286
293
|
.then((userObj) => ({
|
|
287
294
|
activated: true,
|
|
288
295
|
exists: true,
|
|
289
296
|
details: 'user is authorized via a user token',
|
|
290
|
-
user: userObj
|
|
297
|
+
user: userObj,
|
|
291
298
|
}));
|
|
292
299
|
}
|
|
293
300
|
|
|
@@ -297,9 +304,7 @@ const Services = WebexPlugin.extend({
|
|
|
297
304
|
|
|
298
305
|
// Validate that client authentication details exist.
|
|
299
306
|
if (!client_id || !client_secret) {
|
|
300
|
-
return Promise.reject(new Error(
|
|
301
|
-
'client authentication details are not available'
|
|
302
|
-
));
|
|
307
|
+
return Promise.reject(new Error('client authentication details are not available'));
|
|
303
308
|
}
|
|
304
309
|
/* eslint-enable camelcase */
|
|
305
310
|
|
|
@@ -307,61 +312,66 @@ const Services = WebexPlugin.extend({
|
|
|
307
312
|
let token;
|
|
308
313
|
|
|
309
314
|
// Begin client authentication user validation.
|
|
310
|
-
return
|
|
311
|
-
.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
315
|
+
return (
|
|
316
|
+
this.collectPreauthCatalog({email})
|
|
317
|
+
.then(() => {
|
|
318
|
+
// Retrieve the service url from the updated catalog. This is required
|
|
319
|
+
// since `WebexCore` is usually not fully initialized at the time this
|
|
320
|
+
// request completes.
|
|
321
|
+
const idbrokerService = this.get('idbroker', true);
|
|
322
|
+
|
|
323
|
+
// Collect the client auth token.
|
|
324
|
+
return this.webex.credentials.getClientToken({
|
|
325
|
+
uri: `${idbrokerService}idb/oauth2/v1/access_token`,
|
|
326
|
+
scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM',
|
|
327
|
+
});
|
|
328
|
+
})
|
|
329
|
+
.then((tokenObj) => {
|
|
330
|
+
// Generate the token string.
|
|
331
|
+
token = tokenObj.toString();
|
|
326
332
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
})
|
|
330
|
-
// Validate if collecting the signin catalog failed and populate the RTO
|
|
331
|
-
// with the appropriate content.
|
|
332
|
-
.catch((error) => ({
|
|
333
|
-
exists: (error.name !== 'NotFound'),
|
|
334
|
-
activated: false,
|
|
335
|
-
details: (error.name !== 'NotFound') ?
|
|
336
|
-
'user exists but is not activated' :
|
|
337
|
-
'user does not exist and is not activated'
|
|
338
|
-
}))
|
|
339
|
-
// Validate if the previous promise resolved with an RTO and populate the
|
|
340
|
-
// new RTO accordingly.
|
|
341
|
-
.then((rto) => Promise.all([
|
|
342
|
-
rto || {
|
|
343
|
-
activated: true,
|
|
344
|
-
exists: true,
|
|
345
|
-
details: 'user exists and is activated'
|
|
346
|
-
},
|
|
347
|
-
this.sendUserActivation({
|
|
348
|
-
email,
|
|
349
|
-
reqId,
|
|
350
|
-
token,
|
|
351
|
-
activationOptions,
|
|
352
|
-
preloginUserId
|
|
333
|
+
// Collect the signin catalog using the client auth information.
|
|
334
|
+
return this.collectSigninCatalog({email, token, forceRefresh});
|
|
353
335
|
})
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
336
|
+
// Validate if collecting the signin catalog failed and populate the RTO
|
|
337
|
+
// with the appropriate content.
|
|
338
|
+
.catch((error) => ({
|
|
339
|
+
exists: error.name !== 'NotFound',
|
|
340
|
+
activated: false,
|
|
341
|
+
details:
|
|
342
|
+
error.name !== 'NotFound'
|
|
343
|
+
? 'user exists but is not activated'
|
|
344
|
+
: 'user does not exist and is not activated',
|
|
345
|
+
}))
|
|
346
|
+
// Validate if the previous promise resolved with an RTO and populate the
|
|
347
|
+
// new RTO accordingly.
|
|
348
|
+
.then((rto) =>
|
|
349
|
+
Promise.all([
|
|
350
|
+
rto || {
|
|
351
|
+
activated: true,
|
|
352
|
+
exists: true,
|
|
353
|
+
details: 'user exists and is activated',
|
|
354
|
+
},
|
|
355
|
+
this.sendUserActivation({
|
|
356
|
+
email,
|
|
357
|
+
reqId,
|
|
358
|
+
token,
|
|
359
|
+
activationOptions,
|
|
360
|
+
preloginUserId,
|
|
361
|
+
}),
|
|
362
|
+
])
|
|
363
|
+
)
|
|
364
|
+
.then(([rto, user]) => ({...rto, user}))
|
|
365
|
+
.catch((error) => {
|
|
366
|
+
const response = {
|
|
367
|
+
statusCode: error.statusCode,
|
|
368
|
+
responseText: error.body && error.body.message,
|
|
369
|
+
body: error.body,
|
|
370
|
+
};
|
|
362
371
|
|
|
363
|
-
|
|
364
|
-
|
|
372
|
+
return Promise.reject(response);
|
|
373
|
+
})
|
|
374
|
+
);
|
|
365
375
|
},
|
|
366
376
|
|
|
367
377
|
/**
|
|
@@ -373,17 +383,18 @@ const Services = WebexPlugin.extend({
|
|
|
373
383
|
return this.request({
|
|
374
384
|
method: 'GET',
|
|
375
385
|
service: 'hydra',
|
|
376
|
-
resource: 'meetingPreferences'
|
|
377
|
-
})
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
return res.body;
|
|
381
|
-
}).catch((err) => {
|
|
382
|
-
this.logger.info('services: was not able to fetch user login information', err);
|
|
383
|
-
// resolve successfully even if request failed
|
|
384
|
-
});
|
|
385
|
-
},
|
|
386
|
+
resource: 'meetingPreferences',
|
|
387
|
+
})
|
|
388
|
+
.then((res) => {
|
|
389
|
+
this.logger.info('services: received user region info');
|
|
386
390
|
|
|
391
|
+
return res.body;
|
|
392
|
+
})
|
|
393
|
+
.catch((err) => {
|
|
394
|
+
this.logger.info('services: was not able to fetch user login information', err);
|
|
395
|
+
// resolve successfully even if request failed
|
|
396
|
+
});
|
|
397
|
+
},
|
|
387
398
|
|
|
388
399
|
/**
|
|
389
400
|
* Fetches client region info such as countryCode and timezone.
|
|
@@ -395,17 +406,19 @@ const Services = WebexPlugin.extend({
|
|
|
395
406
|
uri: 'https://ds.ciscospark.com/v1/region',
|
|
396
407
|
addAuthHeader: false,
|
|
397
408
|
headers: {
|
|
398
|
-
'spark-user-agent': null
|
|
409
|
+
'spark-user-agent': null,
|
|
399
410
|
},
|
|
400
|
-
timeout: 5000
|
|
401
|
-
})
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
411
|
+
timeout: 5000,
|
|
412
|
+
})
|
|
413
|
+
.then((res) => {
|
|
414
|
+
this.logger.info('services: received user region info');
|
|
415
|
+
|
|
416
|
+
return res.body;
|
|
417
|
+
})
|
|
418
|
+
.catch((err) => {
|
|
419
|
+
this.logger.info('services: was not able to get user region info', err);
|
|
420
|
+
// resolve successfully even if request failed
|
|
421
|
+
});
|
|
409
422
|
},
|
|
410
423
|
|
|
411
424
|
/**
|
|
@@ -424,48 +437,44 @@ const Services = WebexPlugin.extend({
|
|
|
424
437
|
* @param {SendUserActivationPTO} - The Parameter transfer object.
|
|
425
438
|
* @returns {LicenseDTO} - The DTO returned from the **License** service.
|
|
426
439
|
*/
|
|
427
|
-
sendUserActivation({
|
|
428
|
-
email,
|
|
429
|
-
reqId,
|
|
430
|
-
token,
|
|
431
|
-
activationOptions,
|
|
432
|
-
preloginUserId
|
|
433
|
-
}) {
|
|
440
|
+
sendUserActivation({email, reqId, token, activationOptions, preloginUserId}) {
|
|
434
441
|
this.logger.info('services: sending user activation request');
|
|
435
|
-
let countryCode
|
|
436
|
-
|
|
442
|
+
let countryCode;
|
|
443
|
+
let timezone;
|
|
437
444
|
|
|
438
445
|
// try to fetch client region info first
|
|
439
|
-
return
|
|
440
|
-
.
|
|
441
|
-
|
|
442
|
-
(
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
446
|
+
return (
|
|
447
|
+
this.fetchClientRegionInfo()
|
|
448
|
+
.then((clientRegionInfo) => {
|
|
449
|
+
if (clientRegionInfo) {
|
|
450
|
+
({countryCode, timezone} = clientRegionInfo);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
// Send the user activation request to the **License** service.
|
|
454
|
+
return this.request({
|
|
455
|
+
service: 'license',
|
|
456
|
+
resource: 'users/activations',
|
|
457
|
+
method: 'POST',
|
|
458
|
+
headers: {
|
|
459
|
+
accept: 'application/json',
|
|
460
|
+
authorization: token,
|
|
461
|
+
'x-prelogin-userid': preloginUserId,
|
|
462
|
+
},
|
|
463
|
+
body: {
|
|
464
|
+
email,
|
|
465
|
+
reqId,
|
|
466
|
+
countryCode,
|
|
467
|
+
timeZone: timezone,
|
|
468
|
+
...activationOptions,
|
|
469
|
+
},
|
|
470
|
+
shouldRefreshAccessToken: false,
|
|
471
|
+
});
|
|
472
|
+
})
|
|
473
|
+
// On success, return the **License** user object.
|
|
474
|
+
.then(({body}) => body)
|
|
475
|
+
// On failure, reject with error from **License**.
|
|
476
|
+
.catch((error) => Promise.reject(error))
|
|
477
|
+
);
|
|
469
478
|
},
|
|
470
479
|
|
|
471
480
|
/**
|
|
@@ -479,7 +488,11 @@ const Services = WebexPlugin.extend({
|
|
|
479
488
|
*/
|
|
480
489
|
collectPreauthCatalog(query, forceRefresh = false) {
|
|
481
490
|
if (!query) {
|
|
482
|
-
return this.updateServices({
|
|
491
|
+
return this.updateServices({
|
|
492
|
+
from: 'limited',
|
|
493
|
+
query: {mode: 'DEFAULT_BY_PROXIMITY'},
|
|
494
|
+
forceRefresh,
|
|
495
|
+
});
|
|
483
496
|
}
|
|
484
497
|
|
|
485
498
|
return this.updateServices({from: 'limited', query, forceRefresh});
|
|
@@ -501,7 +514,10 @@ const Services = WebexPlugin.extend({
|
|
|
501
514
|
}
|
|
502
515
|
|
|
503
516
|
return this.updateServices({
|
|
504
|
-
from: 'signin',
|
|
517
|
+
from: 'signin',
|
|
518
|
+
query: {email},
|
|
519
|
+
token,
|
|
520
|
+
forceRefresh,
|
|
505
521
|
});
|
|
506
522
|
},
|
|
507
523
|
|
|
@@ -518,20 +534,19 @@ const Services = WebexPlugin.extend({
|
|
|
518
534
|
|
|
519
535
|
// This must be set outside of the setConfig method used to assign the
|
|
520
536
|
// idbroker and identity url values.
|
|
521
|
-
this.webex.config.credentials.authorizeUrl = authorizationString
|
|
522
|
-
authorizeUrl
|
|
523
|
-
`${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;
|
|
524
|
-
|
|
537
|
+
this.webex.config.credentials.authorizeUrl = authorizationString
|
|
538
|
+
? authorizeUrl
|
|
539
|
+
: `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;
|
|
525
540
|
|
|
526
541
|
this.webex.setConfig({
|
|
527
542
|
credentials: {
|
|
528
543
|
idbroker: {
|
|
529
|
-
url: idbroker.replace(trailingSlashes, '') // remove trailing slash
|
|
544
|
+
url: idbroker.replace(trailingSlashes, ''), // remove trailing slash
|
|
530
545
|
},
|
|
531
546
|
identity: {
|
|
532
|
-
url: identity.replace(trailingSlashes, '') // remove trailing slash
|
|
533
|
-
}
|
|
534
|
-
}
|
|
547
|
+
url: identity.replace(trailingSlashes, ''), // remove trailing slash
|
|
548
|
+
},
|
|
549
|
+
},
|
|
535
550
|
});
|
|
536
551
|
}
|
|
537
552
|
},
|
|
@@ -586,7 +601,9 @@ const Services = WebexPlugin.extend({
|
|
|
586
601
|
// Save memory by grabbing the catalog after there isn't a priortyURL
|
|
587
602
|
const catalog = this._getCatalog();
|
|
588
603
|
|
|
589
|
-
const fetchFromServiceUrl = services.servicesNotNeedValidation.find(
|
|
604
|
+
const fetchFromServiceUrl = services.servicesNotNeedValidation.find(
|
|
605
|
+
(service) => service === name
|
|
606
|
+
);
|
|
590
607
|
|
|
591
608
|
if (fetchFromServiceUrl) {
|
|
592
609
|
return Promise.resolve(this._serviceUrls[name]);
|
|
@@ -600,21 +617,24 @@ const Services = WebexPlugin.extend({
|
|
|
600
617
|
}
|
|
601
618
|
|
|
602
619
|
if (catalog.isReady) {
|
|
603
|
-
if (url) {
|
|
620
|
+
if (url) {
|
|
621
|
+
return Promise.resolve(url);
|
|
622
|
+
}
|
|
604
623
|
|
|
605
624
|
this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {
|
|
606
|
-
fields: {service_name: name}
|
|
625
|
+
fields: {service_name: name},
|
|
607
626
|
});
|
|
608
627
|
|
|
609
|
-
return Promise.reject(
|
|
610
|
-
`services: service '${name}' was not found in any of the catalogs`
|
|
611
|
-
)
|
|
628
|
+
return Promise.reject(
|
|
629
|
+
new Error(`services: service '${name}' was not found in any of the catalogs`)
|
|
630
|
+
);
|
|
612
631
|
}
|
|
613
632
|
|
|
614
633
|
return new Promise((resolve, reject) => {
|
|
615
634
|
const groupsToCheck = ['preauth', 'signin', 'postauth'];
|
|
616
635
|
const checkCatalog = (catalogGroup) =>
|
|
617
|
-
catalog
|
|
636
|
+
catalog
|
|
637
|
+
.waitForCatalog(catalogGroup, timeout)
|
|
618
638
|
.then(() => {
|
|
619
639
|
const scopedPriorityUrl = this.get(name, true);
|
|
620
640
|
const scopedPrioriryUrlObj = this.getServiceFromUrl(url);
|
|
@@ -625,15 +645,12 @@ const Services = WebexPlugin.extend({
|
|
|
625
645
|
})
|
|
626
646
|
.catch(() => undefined);
|
|
627
647
|
|
|
628
|
-
Promise.all(groupsToCheck.map((group) => checkCatalog(group)))
|
|
629
|
-
.
|
|
630
|
-
|
|
631
|
-
fields: {service_name: name}
|
|
632
|
-
});
|
|
633
|
-
reject(new Error(
|
|
634
|
-
`services: service '${name}' was not found after waiting`
|
|
635
|
-
));
|
|
648
|
+
Promise.all(groupsToCheck.map((group) => checkCatalog(group))).then(() => {
|
|
649
|
+
this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {
|
|
650
|
+
fields: {service_name: name},
|
|
636
651
|
});
|
|
652
|
+
reject(new Error(`services: service '${name}' was not found after waiting`));
|
|
653
|
+
});
|
|
637
654
|
});
|
|
638
655
|
},
|
|
639
656
|
|
|
@@ -646,51 +663,45 @@ const Services = WebexPlugin.extend({
|
|
|
646
663
|
*/
|
|
647
664
|
_formatReceivedHostmap(serviceHostmap) {
|
|
648
665
|
// map the host catalog items to a formatted hostmap
|
|
649
|
-
const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce(
|
|
650
|
-
(
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
}
|
|
666
|
+
const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce((accumulator, key) => {
|
|
667
|
+
if (serviceHostmap.hostCatalog[key].length === 0) {
|
|
668
|
+
return accumulator;
|
|
669
|
+
}
|
|
654
670
|
|
|
655
|
-
|
|
656
|
-
|
|
671
|
+
const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];
|
|
672
|
+
const defaultUrl = serviceHostmap.serviceLinks[serviceName];
|
|
657
673
|
|
|
658
|
-
|
|
659
|
-
(item) => item.name === serviceName
|
|
660
|
-
);
|
|
674
|
+
let serviceItem = accumulator.find((item) => item.name === serviceName);
|
|
661
675
|
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
676
|
+
if (!serviceItem) {
|
|
677
|
+
serviceItem = {
|
|
678
|
+
name: serviceName,
|
|
679
|
+
defaultUrl,
|
|
680
|
+
defaultHost: Url.parse(defaultUrl).hostname,
|
|
681
|
+
hosts: [],
|
|
682
|
+
};
|
|
669
683
|
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
serviceItem.hosts.push(
|
|
674
|
-
// map the default key as a low priority default for cluster matching
|
|
675
|
-
{
|
|
676
|
-
host: key,
|
|
677
|
-
ttl: -1,
|
|
678
|
-
priority: 10,
|
|
679
|
-
id: serviceHostmap.hostCatalog[key][0].id,
|
|
680
|
-
homeCluster: serviceItem.defaultHost === key
|
|
681
|
-
},
|
|
682
|
-
// map the rest of the hosts in their proper locations
|
|
683
|
-
...serviceHostmap.hostCatalog[key].map(
|
|
684
|
-
(host) => ({
|
|
685
|
-
...host,
|
|
686
|
-
homeCluster: serviceItem.defaultHost === key
|
|
687
|
-
})
|
|
688
|
-
)
|
|
689
|
-
);
|
|
684
|
+
accumulator.push(serviceItem);
|
|
685
|
+
}
|
|
690
686
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
687
|
+
serviceItem.hosts.push(
|
|
688
|
+
// map the default key as a low priority default for cluster matching
|
|
689
|
+
{
|
|
690
|
+
host: key,
|
|
691
|
+
ttl: -1,
|
|
692
|
+
priority: 10,
|
|
693
|
+
id: serviceHostmap.hostCatalog[key][0].id,
|
|
694
|
+
homeCluster: serviceItem.defaultHost === key,
|
|
695
|
+
},
|
|
696
|
+
// map the rest of the hosts in their proper locations
|
|
697
|
+
...serviceHostmap.hostCatalog[key].map((host) => ({
|
|
698
|
+
...host,
|
|
699
|
+
homeCluster: serviceItem.defaultHost === key,
|
|
700
|
+
}))
|
|
701
|
+
);
|
|
702
|
+
|
|
703
|
+
return accumulator;
|
|
704
|
+
}, []);
|
|
694
705
|
|
|
695
706
|
// append service links that do not exist in the host catalog
|
|
696
707
|
Object.keys(serviceHostmap.serviceLinks).forEach((key) => {
|
|
@@ -701,7 +712,7 @@ const Services = WebexPlugin.extend({
|
|
|
701
712
|
name: key,
|
|
702
713
|
defaultUrl: serviceHostmap.serviceLinks[key],
|
|
703
714
|
defaultHost: Url.parse(serviceHostmap.serviceLinks[key]).hostname,
|
|
704
|
-
hosts: []
|
|
715
|
+
hosts: [],
|
|
705
716
|
});
|
|
706
717
|
}
|
|
707
718
|
});
|
|
@@ -761,7 +772,7 @@ const Services = WebexPlugin.extend({
|
|
|
761
772
|
return {
|
|
762
773
|
name: service.name,
|
|
763
774
|
priorityUrl: service.get(true),
|
|
764
|
-
defaultUrl: service.get()
|
|
775
|
+
defaultUrl: service.get(),
|
|
765
776
|
};
|
|
766
777
|
},
|
|
767
778
|
|
|
@@ -774,7 +785,7 @@ const Services = WebexPlugin.extend({
|
|
|
774
785
|
isServiceUrl(url) {
|
|
775
786
|
const catalog = this._getCatalog();
|
|
776
787
|
|
|
777
|
-
return !!
|
|
788
|
+
return !!catalog.findServiceUrlFromUrl(url);
|
|
778
789
|
},
|
|
779
790
|
|
|
780
791
|
/**
|
|
@@ -786,7 +797,7 @@ const Services = WebexPlugin.extend({
|
|
|
786
797
|
isAllowedDomainUrl(url) {
|
|
787
798
|
const catalog = this._getCatalog();
|
|
788
799
|
|
|
789
|
-
return !!
|
|
800
|
+
return !!catalog.findAllowedDomain(url);
|
|
790
801
|
},
|
|
791
802
|
|
|
792
803
|
/**
|
|
@@ -820,9 +831,7 @@ const Services = WebexPlugin.extend({
|
|
|
820
831
|
* @param {string} [param.token] - used for signin catalog
|
|
821
832
|
* @returns {Promise<object>}
|
|
822
833
|
*/
|
|
823
|
-
_fetchNewServiceHostmap({
|
|
824
|
-
from, query, token, forceRefresh
|
|
825
|
-
} = {}) {
|
|
834
|
+
_fetchNewServiceHostmap({from, query, token, forceRefresh} = {}) {
|
|
826
835
|
const service = 'u2c';
|
|
827
836
|
const resource = from ? `/${from}/catalog` : '/catalog';
|
|
828
837
|
const qs = {...query, format: 'hostmap'};
|
|
@@ -832,15 +841,17 @@ const Services = WebexPlugin.extend({
|
|
|
832
841
|
}
|
|
833
842
|
|
|
834
843
|
const requestObject = {
|
|
835
|
-
method: 'GET',
|
|
844
|
+
method: 'GET',
|
|
845
|
+
service,
|
|
846
|
+
resource,
|
|
847
|
+
qs,
|
|
836
848
|
};
|
|
837
849
|
|
|
838
850
|
if (token) {
|
|
839
851
|
requestObject.headers = {authorization: token};
|
|
840
852
|
}
|
|
841
853
|
|
|
842
|
-
return this.request(requestObject)
|
|
843
|
-
.then(({body}) => this._formatReceivedHostmap(body));
|
|
854
|
+
return this.request(requestObject).then(({body}) => this._formatReceivedHostmap(body));
|
|
844
855
|
},
|
|
845
856
|
|
|
846
857
|
/**
|
|
@@ -861,11 +872,10 @@ const Services = WebexPlugin.extend({
|
|
|
861
872
|
// Check for discovery services.
|
|
862
873
|
if (services.discovery) {
|
|
863
874
|
// Format the discovery configuration into an injectable array.
|
|
864
|
-
const formattedDiscoveryServices = Object.keys(services.discovery)
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
}));
|
|
875
|
+
const formattedDiscoveryServices = Object.keys(services.discovery).map((key) => ({
|
|
876
|
+
name: key,
|
|
877
|
+
defaultUrl: services.discovery[key],
|
|
878
|
+
}));
|
|
869
879
|
|
|
870
880
|
// Inject formatted discovery services into services catalog.
|
|
871
881
|
catalog.updateServiceUrls('discovery', formattedDiscoveryServices);
|
|
@@ -873,11 +883,10 @@ const Services = WebexPlugin.extend({
|
|
|
873
883
|
|
|
874
884
|
if (services.override) {
|
|
875
885
|
// Format the override configuration into an injectable array.
|
|
876
|
-
const formattedOverrideServices = Object.keys(services.override)
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
}));
|
|
886
|
+
const formattedOverrideServices = Object.keys(services.override).map((key) => ({
|
|
887
|
+
name: key,
|
|
888
|
+
defaultUrl: services.override[key],
|
|
889
|
+
}));
|
|
881
890
|
|
|
882
891
|
// Inject formatted override services into services catalog.
|
|
883
892
|
catalog.updateServiceUrls('override', formattedOverrideServices);
|
|
@@ -907,24 +916,25 @@ const Services = WebexPlugin.extend({
|
|
|
907
916
|
|
|
908
917
|
// Init a promise chain. Must be done as a Promise.resolve() to allow
|
|
909
918
|
// credentials#getOrgId() to properly throw.
|
|
910
|
-
return
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
.catch(() =>
|
|
921
|
-
'services: cannot retrieve postauth catalog'
|
|
922
|
-
)
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
919
|
+
return (
|
|
920
|
+
Promise.resolve()
|
|
921
|
+
// Get the user's OrgId.
|
|
922
|
+
.then(() => credentials.getOrgId())
|
|
923
|
+
// Begin collecting the preauth/limited catalog.
|
|
924
|
+
.then((orgId) => this.collectPreauthCatalog({orgId}))
|
|
925
|
+
.then(() => {
|
|
926
|
+
// Validate if the token is authorized.
|
|
927
|
+
if (credentials.canAuthorize) {
|
|
928
|
+
// Attempt to collect the postauth catalog.
|
|
929
|
+
return this.updateServices().catch(() =>
|
|
930
|
+
this.logger.warn('services: cannot retrieve postauth catalog')
|
|
931
|
+
);
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
// Return a resolved promise for consistent return value.
|
|
935
|
+
return Promise.resolve();
|
|
936
|
+
})
|
|
937
|
+
);
|
|
928
938
|
},
|
|
929
939
|
|
|
930
940
|
/**
|
|
@@ -959,17 +969,16 @@ const Services = WebexPlugin.extend({
|
|
|
959
969
|
.then(() => {
|
|
960
970
|
catalog.isReady = true;
|
|
961
971
|
})
|
|
962
|
-
.catch((error) =>
|
|
963
|
-
`services: failed to init initial services, ${error.message}`
|
|
964
|
-
)
|
|
965
|
-
}
|
|
966
|
-
else {
|
|
972
|
+
.catch((error) =>
|
|
973
|
+
this.logger.error(`services: failed to init initial services, ${error.message}`)
|
|
974
|
+
);
|
|
975
|
+
} else {
|
|
967
976
|
const {email} = this.webex.config;
|
|
968
977
|
|
|
969
978
|
this.collectPreauthCatalog(email ? {email} : undefined);
|
|
970
979
|
}
|
|
971
980
|
});
|
|
972
|
-
}
|
|
981
|
+
},
|
|
973
982
|
});
|
|
974
983
|
/* eslint-enable no-underscore-dangle */
|
|
975
984
|
|