@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
|
@@ -10,13 +10,7 @@ import sinon from 'sinon';
|
|
|
10
10
|
import {browserOnly, nodeOnly} from '@webex/test-helper-mocha';
|
|
11
11
|
import Logger from '@webex/plugin-logger';
|
|
12
12
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
13
|
-
import {
|
|
14
|
-
AuthInterceptor,
|
|
15
|
-
config,
|
|
16
|
-
Credentials,
|
|
17
|
-
WebexHttpError,
|
|
18
|
-
Token
|
|
19
|
-
} from '@webex/webex-core';
|
|
13
|
+
import {AuthInterceptor, config, Credentials, WebexHttpError, Token} from '@webex/webex-core';
|
|
20
14
|
import {cloneDeep, merge} from 'lodash';
|
|
21
15
|
|
|
22
16
|
const {assert} = chai;
|
|
@@ -33,64 +27,83 @@ describe('webex-core', () => {
|
|
|
33
27
|
webex = new MockWebex({
|
|
34
28
|
children: {
|
|
35
29
|
credentials: Credentials,
|
|
36
|
-
logger: Logger
|
|
30
|
+
logger: Logger,
|
|
37
31
|
},
|
|
38
|
-
config: merge(cloneDeep(config), {credentials: {client_secret: 'fake'}})
|
|
32
|
+
config: merge(cloneDeep(config), {credentials: {client_secret: 'fake'}}),
|
|
39
33
|
});
|
|
40
34
|
|
|
41
|
-
webex.credentials.supertoken = new Token(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
35
|
+
webex.credentials.supertoken = new Token(
|
|
36
|
+
{
|
|
37
|
+
access_token: 'ST1',
|
|
38
|
+
token_type: 'Bearer',
|
|
39
|
+
},
|
|
40
|
+
{parent: webex}
|
|
41
|
+
);
|
|
45
42
|
|
|
46
43
|
interceptor = Reflect.apply(AuthInterceptor.create, webex, []);
|
|
47
44
|
});
|
|
48
45
|
|
|
49
46
|
describe('#onRequest()', () => {
|
|
50
|
-
it('does not replace the auth header if one has been provided', () =>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
47
|
+
it('does not replace the auth header if one has been provided', () =>
|
|
48
|
+
interceptor
|
|
49
|
+
.onRequest({
|
|
50
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
51
|
+
headers: {
|
|
52
|
+
authorization: 'Bearer Alternate',
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
.then((result) =>
|
|
56
|
+
assert.deepEqual(result, {
|
|
57
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
58
|
+
headers: {
|
|
59
|
+
authorization: 'Bearer Alternate',
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
));
|
|
62
63
|
|
|
63
64
|
[undefined, null, false].forEach((falsey) => {
|
|
64
|
-
it(`does not add an auth header if ${falsey} has been provided`, () =>
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
65
|
+
it(`does not add an auth header if ${falsey} has been provided`, () =>
|
|
66
|
+
interceptor
|
|
67
|
+
.onRequest({
|
|
68
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
69
|
+
headers: {
|
|
70
|
+
authorization: falsey,
|
|
71
|
+
},
|
|
72
|
+
})
|
|
73
|
+
.then((result) =>
|
|
74
|
+
assert.deepEqual(result, {
|
|
75
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
76
|
+
headers: {},
|
|
77
|
+
})
|
|
78
|
+
));
|
|
74
79
|
});
|
|
75
80
|
|
|
76
81
|
// There should never be a case in which the services plugin is not
|
|
77
82
|
// loaded. But testing for legacy support.
|
|
78
83
|
describe('when the services plugin has not been loaded', () => {
|
|
79
|
-
it('does not add the auth header to hydra requests', () =>
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
84
|
+
it('does not add the auth header to hydra requests', () =>
|
|
85
|
+
interceptor
|
|
86
|
+
.onRequest({
|
|
87
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
88
|
+
})
|
|
89
|
+
.then((result) =>
|
|
90
|
+
assert.deepEqual(result, {
|
|
91
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
92
|
+
headers: {},
|
|
93
|
+
})
|
|
94
|
+
));
|
|
95
|
+
|
|
96
|
+
it('does not add the auth header to u2c requests', () =>
|
|
97
|
+
interceptor
|
|
98
|
+
.onRequest({
|
|
99
|
+
uri: `${config.services.discovery.u2c}/ping`,
|
|
100
|
+
})
|
|
101
|
+
.then((result) =>
|
|
102
|
+
assert.deepEqual(result, {
|
|
103
|
+
uri: `${config.services.discovery.u2c}/ping`,
|
|
104
|
+
headers: {},
|
|
105
|
+
})
|
|
106
|
+
));
|
|
94
107
|
});
|
|
95
108
|
|
|
96
109
|
describe('when the services plugin has been loaded', () => {
|
|
@@ -99,17 +112,14 @@ describe('webex-core', () => {
|
|
|
99
112
|
beforeEach(() => {
|
|
100
113
|
services = {
|
|
101
114
|
hydra: 'https://hydra-a.wbx.com',
|
|
102
|
-
example: 'https://service.example.com'
|
|
115
|
+
example: 'https://service.example.com',
|
|
103
116
|
};
|
|
104
117
|
|
|
105
118
|
webex.internal.services = {
|
|
106
119
|
hasService: (service) => Object.keys(services).includes(service),
|
|
107
120
|
hasAllowedDomains: () => true,
|
|
108
|
-
isAllowedDomainUrl: (uri) =>
|
|
109
|
-
.find(
|
|
110
|
-
(host) => uri.includes(host)
|
|
111
|
-
)
|
|
112
|
-
),
|
|
121
|
+
isAllowedDomainUrl: (uri) =>
|
|
122
|
+
!!config.services.allowedDomains.find((host) => uri.includes(host)),
|
|
113
123
|
getServiceFromUrl: (uri) => {
|
|
114
124
|
let targetKey;
|
|
115
125
|
|
|
@@ -120,78 +130,94 @@ describe('webex-core', () => {
|
|
|
120
130
|
});
|
|
121
131
|
|
|
122
132
|
return targetKey ? {name: targetKey} : undefined;
|
|
123
|
-
}
|
|
133
|
+
},
|
|
124
134
|
};
|
|
125
135
|
|
|
126
|
-
webex.internal.services.waitForService = (pto) =>
|
|
127
|
-
services[pto.name] || pto.url
|
|
128
|
-
);
|
|
136
|
+
webex.internal.services.waitForService = (pto) =>
|
|
137
|
+
Promise.resolve(services[pto.name] || pto.url);
|
|
129
138
|
});
|
|
130
139
|
|
|
131
|
-
it('adds the header to hydra requests', () =>
|
|
132
|
-
|
|
133
|
-
.then((result) =>
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
140
|
+
it('adds the header to hydra requests', () =>
|
|
141
|
+
Promise.all([
|
|
142
|
+
interceptor.onRequest({uri: `${services.hydra}/ping`}).then((result) =>
|
|
143
|
+
assert.deepEqual(result, {
|
|
144
|
+
uri: `${services.hydra}/ping`,
|
|
145
|
+
headers: {
|
|
146
|
+
authorization: 'Bearer ST1',
|
|
147
|
+
},
|
|
148
|
+
})
|
|
149
|
+
),
|
|
150
|
+
interceptor
|
|
151
|
+
.onRequest({
|
|
152
|
+
service: 'hydra',
|
|
153
|
+
resource: 'ping',
|
|
154
|
+
})
|
|
155
|
+
.then((result) =>
|
|
156
|
+
assert.deepEqual(result, {
|
|
157
|
+
service: 'hydra',
|
|
158
|
+
resource: 'ping',
|
|
159
|
+
headers: {
|
|
160
|
+
authorization: 'Bearer ST1',
|
|
161
|
+
},
|
|
162
|
+
})
|
|
163
|
+
),
|
|
164
|
+
]));
|
|
165
|
+
|
|
166
|
+
it('adds an auth header to uris that are in the service catalog', () =>
|
|
167
|
+
interceptor
|
|
168
|
+
.onRequest({
|
|
157
169
|
uri: `${services.example}/ping`,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
170
|
+
})
|
|
171
|
+
.then((result) =>
|
|
172
|
+
assert.deepEqual(result, {
|
|
173
|
+
uri: `${services.example}/ping`,
|
|
174
|
+
headers: {
|
|
175
|
+
authorization: 'Bearer ST1',
|
|
176
|
+
},
|
|
177
|
+
})
|
|
178
|
+
));
|
|
162
179
|
|
|
163
|
-
it('adds an auth header to services that are in the service catalog',
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
resource: 'some-resource'
|
|
167
|
-
})
|
|
168
|
-
.then((result) => assert.deepEqual(result, {
|
|
180
|
+
it('adds an auth header to services that are in the service catalog', () =>
|
|
181
|
+
interceptor
|
|
182
|
+
.onRequest({
|
|
169
183
|
service: 'example',
|
|
170
184
|
resource: 'some-resource',
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
185
|
+
})
|
|
186
|
+
.then((result) =>
|
|
187
|
+
assert.deepEqual(result, {
|
|
188
|
+
service: 'example',
|
|
189
|
+
resource: 'some-resource',
|
|
190
|
+
headers: {
|
|
191
|
+
authorization: 'Bearer ST1',
|
|
192
|
+
},
|
|
193
|
+
})
|
|
194
|
+
));
|
|
195
|
+
|
|
196
|
+
it('does not add an auth header to uris not in the service catalog', () =>
|
|
197
|
+
interceptor
|
|
198
|
+
.onRequest({
|
|
199
|
+
uri: 'https://not-a-service.com/ping',
|
|
200
|
+
})
|
|
201
|
+
.then((result) =>
|
|
202
|
+
assert.deepEqual(result, {
|
|
203
|
+
headers: {},
|
|
204
|
+
uri: 'https://not-a-service.com/ping',
|
|
205
|
+
})
|
|
206
|
+
));
|
|
207
|
+
|
|
208
|
+
it('does not add an auth header to non-existant services', () =>
|
|
209
|
+
interceptor
|
|
210
|
+
.onRequest({
|
|
192
211
|
service: 'non-existant',
|
|
193
|
-
resource: 'no-resource'
|
|
194
|
-
})
|
|
212
|
+
resource: 'no-resource',
|
|
213
|
+
})
|
|
214
|
+
.then((result) =>
|
|
215
|
+
assert.deepEqual(result, {
|
|
216
|
+
headers: {},
|
|
217
|
+
service: 'non-existant',
|
|
218
|
+
resource: 'no-resource',
|
|
219
|
+
})
|
|
220
|
+
));
|
|
195
221
|
});
|
|
196
222
|
});
|
|
197
223
|
|
|
@@ -202,7 +228,7 @@ describe('webex-core', () => {
|
|
|
202
228
|
services = {
|
|
203
229
|
hydra: 'https://hydra-a.wbx.com',
|
|
204
230
|
u2c: 'https://u2c.wbx2.com/u2c/api/v1',
|
|
205
|
-
example: 'https://service.example.com'
|
|
231
|
+
example: 'https://service.example.com',
|
|
206
232
|
};
|
|
207
233
|
|
|
208
234
|
webex.internal.services = {
|
|
@@ -219,17 +245,13 @@ describe('webex-core', () => {
|
|
|
219
245
|
},
|
|
220
246
|
hasService: (service) => Object.keys(services).includes(service),
|
|
221
247
|
hasAllowedDomains: () => true,
|
|
222
|
-
isAllowedDomainUrl: (uri) =>
|
|
223
|
-
.find(
|
|
224
|
-
|
|
225
|
-
)
|
|
226
|
-
),
|
|
227
|
-
validateDomains: true
|
|
248
|
+
isAllowedDomainUrl: (uri) =>
|
|
249
|
+
!!config.services.allowedDomains.find((host) => uri.includes(host)),
|
|
250
|
+
validateDomains: true,
|
|
228
251
|
};
|
|
229
252
|
|
|
230
|
-
webex.internal.services.waitForService = (pto) =>
|
|
231
|
-
services[pto.name] || pto.url
|
|
232
|
-
);
|
|
253
|
+
webex.internal.services.waitForService = (pto) =>
|
|
254
|
+
Promise.resolve(services[pto.name] || pto.url);
|
|
233
255
|
});
|
|
234
256
|
|
|
235
257
|
afterEach('remove services plugin', () => {
|
|
@@ -238,76 +260,84 @@ describe('webex-core', () => {
|
|
|
238
260
|
}
|
|
239
261
|
});
|
|
240
262
|
|
|
241
|
-
it('resolves to false when services plugin does not exist',
|
|
242
|
-
|
|
243
|
-
delete webex.internal.services;
|
|
263
|
+
it('resolves to false when services plugin does not exist', () => {
|
|
264
|
+
delete webex.internal.services;
|
|
244
265
|
|
|
245
|
-
|
|
246
|
-
|
|
266
|
+
return interceptor
|
|
267
|
+
.requiresCredentials({
|
|
268
|
+
uri: `${services.hydra}/ping`,
|
|
247
269
|
})
|
|
248
|
-
|
|
249
|
-
|
|
270
|
+
.then((response) => assert.isFalse(response));
|
|
271
|
+
});
|
|
250
272
|
|
|
251
|
-
it('resolves to true when the u2c service is specified via service',
|
|
252
|
-
|
|
253
|
-
services = {};
|
|
273
|
+
it('resolves to true when the u2c service is specified via service', () => {
|
|
274
|
+
services = {};
|
|
254
275
|
|
|
255
|
-
|
|
276
|
+
return interceptor
|
|
277
|
+
.requiresCredentials({
|
|
256
278
|
service: 'u2c',
|
|
257
|
-
resource: 'something'
|
|
279
|
+
resource: 'something',
|
|
258
280
|
})
|
|
259
|
-
|
|
260
|
-
|
|
281
|
+
.then((response) => assert.isTrue(response));
|
|
282
|
+
});
|
|
261
283
|
|
|
262
|
-
it('resolves to false when the u2c limited service is used via uri',
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
284
|
+
it('resolves to false when the u2c limited service is used via uri', () =>
|
|
285
|
+
interceptor
|
|
286
|
+
.requiresCredentials({
|
|
287
|
+
uri: `${services.u2c}/limited`,
|
|
288
|
+
})
|
|
266
289
|
.then((response) => assert.isFalse(response)));
|
|
267
290
|
|
|
268
|
-
it('resolves to true if the service exists in catalog via service',
|
|
269
|
-
|
|
291
|
+
it('resolves to true if the service exists in catalog via service', () =>
|
|
292
|
+
interceptor
|
|
293
|
+
.requiresCredentials({service: 'hydra'})
|
|
270
294
|
.then((response) => assert.isTrue(response)));
|
|
271
295
|
|
|
272
|
-
it('resolves to true if the service exists in catalog via uri',
|
|
273
|
-
|
|
296
|
+
it('resolves to true if the service exists in catalog via uri', () =>
|
|
297
|
+
interceptor
|
|
298
|
+
.requiresCredentials({uri: services.hydra})
|
|
274
299
|
.then((response) => assert.isTrue(response)));
|
|
275
300
|
|
|
276
|
-
it('resolves to false if that `addAuthHeader` is set to false',
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
301
|
+
it('resolves to false if that `addAuthHeader` is set to false', () =>
|
|
302
|
+
interceptor
|
|
303
|
+
.requiresCredentials({
|
|
304
|
+
addAuthHeader: false,
|
|
305
|
+
service: 'unknown',
|
|
306
|
+
resource: 'ping',
|
|
307
|
+
})
|
|
282
308
|
.then((response) => assert.isFalse(response)));
|
|
283
309
|
|
|
284
|
-
it('resolves to false if `validateDomains` is set to false',
|
|
285
|
-
|
|
286
|
-
webex.internal.services.validateDomains = false;
|
|
310
|
+
it('resolves to false if `validateDomains` is set to false', () => {
|
|
311
|
+
webex.internal.services.validateDomains = false;
|
|
287
312
|
|
|
288
|
-
|
|
289
|
-
|
|
313
|
+
return interceptor
|
|
314
|
+
.requiresCredentials({
|
|
315
|
+
uri: 'https://allowed-uri.com/resource',
|
|
290
316
|
})
|
|
291
|
-
|
|
292
|
-
|
|
317
|
+
.then((response) => assert.isFalse(response));
|
|
318
|
+
});
|
|
293
319
|
|
|
294
|
-
it('resolves to true with an allowed domain uri',
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
320
|
+
it('resolves to true with an allowed domain uri', () =>
|
|
321
|
+
interceptor
|
|
322
|
+
.requiresCredentials({
|
|
323
|
+
uri: `https://${config.services.allowedDomains[0]}/resource`,
|
|
324
|
+
})
|
|
298
325
|
.then((response) => assert.isTrue(response)));
|
|
299
326
|
|
|
300
|
-
it('resolves to false with a non-allowed uri',
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
327
|
+
it('resolves to false with a non-allowed uri', () =>
|
|
328
|
+
interceptor
|
|
329
|
+
.requiresCredentials({
|
|
330
|
+
uri: 'https://not-allowed/resource',
|
|
331
|
+
})
|
|
304
332
|
.then((response) => assert.isFalse(response)));
|
|
305
333
|
|
|
306
334
|
it('should return true if domain exists using isAllowedDomainUrl()', () => {
|
|
307
335
|
webex.internal.services.waitForService = sinon.stub();
|
|
308
336
|
const {isAllowedDomainUrl} = webex.internal.services;
|
|
309
337
|
|
|
310
|
-
const result = isAllowedDomainUrl(
|
|
338
|
+
const result = isAllowedDomainUrl(
|
|
339
|
+
`https://${config.services.allowedDomains[0]}/resource`
|
|
340
|
+
);
|
|
311
341
|
|
|
312
342
|
assert.equal(result, true);
|
|
313
343
|
});
|
|
@@ -315,23 +345,25 @@ describe('webex-core', () => {
|
|
|
315
345
|
it('should return true when called `requiresCredentials` with valid url', () => {
|
|
316
346
|
webex.internal.services.waitForService = sinon.stub();
|
|
317
347
|
|
|
318
|
-
return interceptor
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
348
|
+
return interceptor
|
|
349
|
+
.requiresCredentials({
|
|
350
|
+
uri: `https://${config.services.allowedDomains[0]}/resource`,
|
|
351
|
+
})
|
|
352
|
+
.then((res) => {
|
|
353
|
+
assert.equal(res, true);
|
|
354
|
+
});
|
|
322
355
|
});
|
|
323
356
|
|
|
324
357
|
it('should call waitForService()', () => {
|
|
325
358
|
webex.internal.services.waitForService = sinon.stub();
|
|
326
359
|
const {waitForService} = webex.internal.services;
|
|
327
360
|
|
|
328
|
-
waitForService.resolves(
|
|
329
|
-
`https://${config.services.allowedDomains[0]}/resource`
|
|
330
|
-
);
|
|
361
|
+
waitForService.resolves(`https://${config.services.allowedDomains[0]}/resource`);
|
|
331
362
|
|
|
332
|
-
return interceptor
|
|
333
|
-
|
|
334
|
-
|
|
363
|
+
return interceptor
|
|
364
|
+
.requiresCredentials({
|
|
365
|
+
service: 'locus',
|
|
366
|
+
})
|
|
335
367
|
.then(() => assert.calledOnce(waitForService));
|
|
336
368
|
});
|
|
337
369
|
});
|
|
@@ -339,96 +371,108 @@ describe('webex-core', () => {
|
|
|
339
371
|
describe('#onResponseError()', () => {
|
|
340
372
|
describe('when the server responds with 401', () => {
|
|
341
373
|
nodeOnly(it)('refreshes the access token and replays the request', () => {
|
|
342
|
-
webex.request.onCall(0).returns(
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
374
|
+
webex.request.onCall(0).returns(
|
|
375
|
+
Promise.resolve({
|
|
376
|
+
body: {
|
|
377
|
+
access_token: 'ST2',
|
|
378
|
+
},
|
|
379
|
+
})
|
|
380
|
+
);
|
|
381
|
+
webex.credentials.supertoken = new Token(
|
|
382
|
+
{
|
|
383
|
+
access_token: 'ST1',
|
|
384
|
+
refresh_token: 'RT1',
|
|
385
|
+
},
|
|
386
|
+
{parent: webex}
|
|
387
|
+
);
|
|
351
388
|
|
|
352
389
|
const err = new WebexHttpError.Unauthorized({
|
|
353
390
|
statusCode: 401,
|
|
354
391
|
options: {
|
|
355
392
|
headers: {
|
|
356
|
-
trackingid: 'blarg'
|
|
393
|
+
trackingid: 'blarg',
|
|
357
394
|
},
|
|
358
|
-
uri: `${config.services.discovery.hydra}/ping
|
|
395
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
359
396
|
},
|
|
360
397
|
body: {
|
|
361
|
-
error: 'fake error'
|
|
362
|
-
}
|
|
398
|
+
error: 'fake error',
|
|
399
|
+
},
|
|
363
400
|
});
|
|
364
401
|
|
|
365
402
|
assert.notCalled(webex.request);
|
|
366
403
|
|
|
367
|
-
return interceptor.onResponseError(err.options, err)
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
});
|
|
404
|
+
return interceptor.onResponseError(err.options, err).then(() => {
|
|
405
|
+
// once for refresh, once for replay
|
|
406
|
+
assert.calledTwice(webex.request);
|
|
407
|
+
assert.equal(webex.credentials.supertoken.access_token, 'ST2');
|
|
408
|
+
assert.equal(webex.request.args[1][0].replayCount, 1);
|
|
409
|
+
});
|
|
374
410
|
});
|
|
375
411
|
|
|
376
412
|
browserOnly(it)('refreshes the access token and replays the request', () => {
|
|
377
|
-
webex.config.credentials.refreshCallback = sinon.stub().returns(
|
|
378
|
-
|
|
379
|
-
|
|
413
|
+
webex.config.credentials.refreshCallback = sinon.stub().returns(
|
|
414
|
+
Promise.resolve({
|
|
415
|
+
access_token: 'ST2',
|
|
416
|
+
})
|
|
417
|
+
);
|
|
380
418
|
|
|
381
|
-
webex.credentials.supertoken = new Token(
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
419
|
+
webex.credentials.supertoken = new Token(
|
|
420
|
+
{
|
|
421
|
+
access_token: 'ST1',
|
|
422
|
+
refresh_token: 'RT1',
|
|
423
|
+
},
|
|
424
|
+
{parent: webex}
|
|
425
|
+
);
|
|
385
426
|
|
|
386
427
|
const err = new WebexHttpError.Unauthorized({
|
|
387
428
|
statusCode: 401,
|
|
388
429
|
options: {
|
|
389
430
|
headers: {
|
|
390
|
-
trackingid: 'blarg'
|
|
431
|
+
trackingid: 'blarg',
|
|
391
432
|
},
|
|
392
|
-
uri: `${config.services.discovery.hydra}/ping
|
|
433
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
393
434
|
},
|
|
394
435
|
body: {
|
|
395
|
-
error: 'fake error'
|
|
396
|
-
}
|
|
436
|
+
error: 'fake error',
|
|
437
|
+
},
|
|
397
438
|
});
|
|
398
439
|
|
|
399
440
|
assert.notCalled(webex.request);
|
|
400
441
|
|
|
401
|
-
return interceptor.onResponseError(err.options, err)
|
|
402
|
-
.then(() => {
|
|
442
|
+
return interceptor.onResponseError(err.options, err).then(() => {
|
|
403
443
|
// once for replay
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
444
|
+
assert.calledOnce(webex.request);
|
|
445
|
+
assert.equal(webex.credentials.supertoken.access_token, 'ST2');
|
|
446
|
+
assert.equal(webex.request.args[0][0].replayCount, 1);
|
|
447
|
+
});
|
|
408
448
|
});
|
|
409
449
|
|
|
410
450
|
describe('when the access token is not refreshable', () => {
|
|
411
451
|
it('responds with the original error', () => {
|
|
412
|
-
webex.credentials.supertoken = new Token(
|
|
413
|
-
|
|
414
|
-
|
|
452
|
+
webex.credentials.supertoken = new Token(
|
|
453
|
+
{
|
|
454
|
+
access_token: 'ST1',
|
|
455
|
+
},
|
|
456
|
+
{parent: webex}
|
|
457
|
+
);
|
|
415
458
|
|
|
416
459
|
const err = new WebexHttpError.Unauthorized({
|
|
417
460
|
statusCode: 401,
|
|
418
461
|
options: {
|
|
419
462
|
headers: {
|
|
420
|
-
trackingid: 'blarg'
|
|
463
|
+
trackingid: 'blarg',
|
|
421
464
|
},
|
|
422
|
-
uri: `${config.services.discovery.hydra}/ping
|
|
465
|
+
uri: `${config.services.discovery.hydra}/ping`,
|
|
423
466
|
},
|
|
424
467
|
body: {
|
|
425
|
-
error: 'fake error'
|
|
426
|
-
}
|
|
468
|
+
error: 'fake error',
|
|
469
|
+
},
|
|
427
470
|
});
|
|
428
471
|
|
|
429
472
|
assert.notCalled(webex.request);
|
|
430
473
|
|
|
431
|
-
return assert
|
|
474
|
+
return assert
|
|
475
|
+
.isRejected(interceptor.onResponseError(err.options, err))
|
|
432
476
|
.then((err2) => {
|
|
433
477
|
assert.equal(err2, err);
|
|
434
478
|
});
|
|
@@ -436,35 +480,39 @@ describe('webex-core', () => {
|
|
|
436
480
|
});
|
|
437
481
|
|
|
438
482
|
it('does not refresh if shouldRefreshAccessToken was false', () => {
|
|
439
|
-
webex.config.credentials.refreshCallback = sinon.stub().returns(
|
|
440
|
-
|
|
441
|
-
|
|
483
|
+
webex.config.credentials.refreshCallback = sinon.stub().returns(
|
|
484
|
+
Promise.resolve({
|
|
485
|
+
access_token: 'ST2',
|
|
486
|
+
})
|
|
487
|
+
);
|
|
442
488
|
|
|
443
|
-
webex.credentials.supertoken = new Token(
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
489
|
+
webex.credentials.supertoken = new Token(
|
|
490
|
+
{
|
|
491
|
+
access_token: 'ST1',
|
|
492
|
+
refresh_token: 'RT1',
|
|
493
|
+
},
|
|
494
|
+
{parent: webex}
|
|
495
|
+
);
|
|
447
496
|
|
|
448
497
|
const err = new WebexHttpError.Unauthorized({
|
|
449
498
|
statusCode: 401,
|
|
450
499
|
options: {
|
|
451
500
|
headers: {
|
|
452
|
-
trackingid: 'blarg'
|
|
501
|
+
trackingid: 'blarg',
|
|
453
502
|
},
|
|
454
503
|
uri: `${config.services.discovery.hydra}/ping`,
|
|
455
|
-
shouldRefreshAccessToken: false
|
|
504
|
+
shouldRefreshAccessToken: false,
|
|
456
505
|
},
|
|
457
506
|
body: {
|
|
458
|
-
error: 'fake error'
|
|
459
|
-
}
|
|
507
|
+
error: 'fake error',
|
|
508
|
+
},
|
|
460
509
|
});
|
|
461
510
|
|
|
462
511
|
assert.notCalled(webex.request);
|
|
463
512
|
|
|
464
|
-
return assert.isRejected(interceptor.onResponseError(err.options, err))
|
|
465
|
-
.
|
|
466
|
-
|
|
467
|
-
});
|
|
513
|
+
return assert.isRejected(interceptor.onResponseError(err.options, err)).then((err2) => {
|
|
514
|
+
assert.equal(err2, err);
|
|
515
|
+
});
|
|
468
516
|
});
|
|
469
517
|
});
|
|
470
518
|
});
|