@webex/internal-plugin-flag 3.12.0-next.51 → 3.12.0-next.52
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/flag.js +10 -6
- package/dist/flag.js.map +1 -1
- package/package.json +4 -4
- package/src/flag.js +10 -2
- package/test/unit/spec/flag.js +142 -0
package/dist/flag.js
CHANGED
|
@@ -107,10 +107,13 @@ var Flag = WebexCore.WebexPlugin.extend({
|
|
|
107
107
|
mapToActivities: function mapToActivities(flags) {
|
|
108
108
|
var _this = this;
|
|
109
109
|
return (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
110
|
-
var mapUrlActivities, _iterator, _step, flag, convoUrlRegex, activity, match, url, activities, responses;
|
|
110
|
+
var mapUrlActivities, _iterator, _step, flag, convoUrlRegex, activity, match, service, url, activities, responses;
|
|
111
111
|
return _regenerator.default.wrap(function (_context2) {
|
|
112
112
|
while (1) switch (_context2.prev = _context2.next) {
|
|
113
113
|
case 0:
|
|
114
|
+
_context2.next = 1;
|
|
115
|
+
return _this.webex.internal.services.waitForCatalog('postauth');
|
|
116
|
+
case 1:
|
|
114
117
|
mapUrlActivities = new _map.default();
|
|
115
118
|
_iterator = _createForOfIteratorHelper(flags);
|
|
116
119
|
try {
|
|
@@ -119,7 +122,8 @@ var Flag = WebexCore.WebexPlugin.extend({
|
|
|
119
122
|
convoUrlRegex = /(.*)\/activities\//;
|
|
120
123
|
activity = flag['flag-item'];
|
|
121
124
|
match = convoUrlRegex.exec(activity);
|
|
122
|
-
|
|
125
|
+
service = match && _this.webex.internal.services.getServiceFromUrl(match[1]);
|
|
126
|
+
if ((service === null || service === void 0 ? void 0 : service.name) === 'conversation') {
|
|
123
127
|
url = match[1];
|
|
124
128
|
activities = mapUrlActivities.get(url);
|
|
125
129
|
if (!activities) {
|
|
@@ -128,7 +132,7 @@ var Flag = WebexCore.WebexPlugin.extend({
|
|
|
128
132
|
}
|
|
129
133
|
activities.push(activity);
|
|
130
134
|
} else {
|
|
131
|
-
_this.logger.warn("The activity URL has a strange format (".concat(activity, "). Ignoring it."));
|
|
135
|
+
_this.logger.warn("The activity URL has a strange format or an unrecognized host (".concat(activity, "). Ignoring it."));
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
138
|
} catch (err) {
|
|
@@ -136,7 +140,7 @@ var Flag = WebexCore.WebexPlugin.extend({
|
|
|
136
140
|
} finally {
|
|
137
141
|
_iterator.f();
|
|
138
142
|
}
|
|
139
|
-
_context2.next =
|
|
143
|
+
_context2.next = 2;
|
|
140
144
|
return _promise.default.all((0, _from.default)(mapUrlActivities, /*#__PURE__*/function () {
|
|
141
145
|
var _ref2 = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(_ref) {
|
|
142
146
|
var _ref3, convoUrl, activityUrls, params, res;
|
|
@@ -171,10 +175,10 @@ var Flag = WebexCore.WebexPlugin.extend({
|
|
|
171
175
|
return _ref2.apply(this, arguments);
|
|
172
176
|
};
|
|
173
177
|
}()));
|
|
174
|
-
case
|
|
178
|
+
case 2:
|
|
175
179
|
responses = _context2.sent;
|
|
176
180
|
return _context2.abrupt("return", (0, _lodash.flatten)(responses));
|
|
177
|
-
case
|
|
181
|
+
case 3:
|
|
178
182
|
case "end":
|
|
179
183
|
return _context2.stop();
|
|
180
184
|
}
|
package/dist/flag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_lodash","require","WebexCore","_interopRequireWildcard","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","done","value","TypeError","a","u","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from2","test","Array","Flag","WebexPlugin","extend","namespace","archive","flag","options","url","_promise","reject","Error","params","method","uri","body","state","webex","request","then","res","create","activity","service","resource","target","list","qs","items","mapToActivities","flags","_this","_asyncToGenerator2","_regenerator","mark","_callee2","mapUrlActivities","_iterator","_step","convoUrlRegex","match","activities","responses","wrap","_context2","prev","_map","exec","push","logger","warn","concat","err","all","_from","_ref2","_callee","_ref","_ref3","convoUrl","activityUrls","_context","_slicedToArray2","sent","abrupt","multistatus","reduce","activitiesArr","statusData","status","data","stop","_x","apply","arguments","flatten","delete","unflag","_default","exports"],"sources":["flag.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport {flatten} from 'lodash';\nimport * as WebexCore from '@webex/webex-core';\n\nconst Flag = WebexCore.WebexPlugin.extend({\n namespace: 'Flag',\n\n /**\n * Archive a flag\n * @param {Object} flag\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag archival\n */\n archive(flag, options) {\n if (!flag.url) {\n return Promise.reject(new Error('`flag.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'PUT',\n uri: flag.url,\n options,\n body: {\n state: 'archived',\n },\n };\n\n return this.webex.request(params).then((res) => res.body);\n },\n\n /**\n * Flags an activity\n * @param {Object} activity\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag creation\n */\n create(activity, options) {\n if (!activity.url) {\n return Promise.reject(new Error('`activity.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'POST',\n service: 'userApps',\n resource: '/flags',\n options,\n body: {\n 'conversation-url': activity.target.url,\n 'flag-item': activity.url,\n state: 'flagged',\n },\n };\n\n return this.webex.request(params).then((res) => res.body);\n },\n\n /**\n * Gets a list of Flags for a user\n * @param {Object} options\n * @returns {Promise} Resolves with the fetched flags\n */\n list(options) {\n options = options || {};\n const params = {\n method: 'GET',\n service: 'userApps',\n resource: '/flags',\n options,\n qs: {\n state: 'flagged',\n },\n };\n\n return this.webex.request(params).then((res) => res.body.items);\n },\n\n /**\n * Gets an array of activities where the status is 200\n * @param {Object} flags\n * @returns {Promise<Object>} Resolves with the activities\n * TODO: this should be implemented as a batched request when migrating to the modular sdk\n */\n async mapToActivities(flags) {\n const mapUrlActivities = new Map();\n\n for (const flag of flags) {\n const convoUrlRegex = /(.*)\\/activities\\//;\n const activity = flag['flag-item'];\n const match = convoUrlRegex.exec(activity);\n\n if (match) {\n const url = match[1];\n let activities = mapUrlActivities.get(url);\n\n if (!activities) {\n activities = [];\n mapUrlActivities.set(url, activities);\n }\n activities.push(activity);\n } else {\n this.logger.warn(`The activity URL has a strange format (${activity}). Ignoring it.`);\n }\n }\n\n const responses = await Promise.all(\n Array.from(mapUrlActivities, async ([convoUrl, activityUrls]) => {\n const params = {\n method: 'POST',\n url: `${convoUrl}/bulk_activities_fetch`,\n body: {\n activityUrls,\n },\n };\n\n const res = await this.webex.request(params);\n\n return res.body.multistatus.reduce((activitiesArr, statusData) => {\n if (statusData.status === '200') {\n activitiesArr.push(statusData.data.activity);\n }\n\n return activitiesArr;\n }, []);\n })\n );\n\n return flatten(responses);\n },\n\n /**\n * Delete a flag\n * @param {Object} flag\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag deletion\n */\n delete(flag, options) {\n if (!flag.url) {\n return Promise.reject(new Error('`flag.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'DELETE',\n options,\n uri: flag.url,\n };\n\n return this.request(params).then((res) => res.body);\n },\n\n /**\n * UnFlags an activity\n * @param {Object} flag\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag removal\n */\n unflag(flag, options) {\n if (!flag.url) {\n return Promise.reject(new Error('`flag.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'PUT',\n uri: flag.url,\n options,\n body: {\n state: 'unflagged',\n },\n };\n\n return this.webex.request(params).then((res) => res.body);\n },\n});\n\nexport default Flag;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_lodash","require","WebexCore","_interopRequireWildcard","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","done","value","TypeError","a","u","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from2","test","Array","Flag","WebexPlugin","extend","namespace","archive","flag","options","url","_promise","reject","Error","params","method","uri","body","state","webex","request","then","res","create","activity","service","resource","target","list","qs","items","mapToActivities","flags","_this","_asyncToGenerator2","_regenerator","mark","_callee2","mapUrlActivities","_iterator","_step","convoUrlRegex","match","activities","responses","wrap","_context2","prev","internal","services","waitForCatalog","_map","exec","getServiceFromUrl","push","logger","warn","concat","err","all","_from","_ref2","_callee","_ref","_ref3","convoUrl","activityUrls","_context","_slicedToArray2","sent","abrupt","multistatus","reduce","activitiesArr","statusData","status","data","stop","_x","apply","arguments","flatten","delete","unflag","_default","exports"],"sources":["flag.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\nimport {flatten} from 'lodash';\nimport * as WebexCore from '@webex/webex-core';\n\nconst Flag = WebexCore.WebexPlugin.extend({\n namespace: 'Flag',\n\n /**\n * Archive a flag\n * @param {Object} flag\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag archival\n */\n archive(flag, options) {\n if (!flag.url) {\n return Promise.reject(new Error('`flag.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'PUT',\n uri: flag.url,\n options,\n body: {\n state: 'archived',\n },\n };\n\n return this.webex.request(params).then((res) => res.body);\n },\n\n /**\n * Flags an activity\n * @param {Object} activity\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag creation\n */\n create(activity, options) {\n if (!activity.url) {\n return Promise.reject(new Error('`activity.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'POST',\n service: 'userApps',\n resource: '/flags',\n options,\n body: {\n 'conversation-url': activity.target.url,\n 'flag-item': activity.url,\n state: 'flagged',\n },\n };\n\n return this.webex.request(params).then((res) => res.body);\n },\n\n /**\n * Gets a list of Flags for a user\n * @param {Object} options\n * @returns {Promise} Resolves with the fetched flags\n */\n list(options) {\n options = options || {};\n const params = {\n method: 'GET',\n service: 'userApps',\n resource: '/flags',\n options,\n qs: {\n state: 'flagged',\n },\n };\n\n return this.webex.request(params).then((res) => res.body.items);\n },\n\n /**\n * Gets an array of activities where the status is 200\n * @param {Object} flags\n * @returns {Promise<Object>} Resolves with the activities\n * TODO: this should be implemented as a batched request when migrating to the modular sdk\n */\n async mapToActivities(flags) {\n // Wait for the postauth catalog to be ready before validating URLs.\n // Without this, calls immediately after webex.ready would see an empty\n // catalog and incorrectly filter all flags as unrecognized.\n await this.webex.internal.services.waitForCatalog('postauth');\n\n const mapUrlActivities = new Map();\n\n for (const flag of flags) {\n const convoUrlRegex = /(.*)\\/activities\\//;\n const activity = flag['flag-item'];\n const match = convoUrlRegex.exec(activity);\n const service = match && this.webex.internal.services.getServiceFromUrl(match[1]);\n\n if (service?.name === 'conversation') {\n const url = match[1];\n let activities = mapUrlActivities.get(url);\n\n if (!activities) {\n activities = [];\n mapUrlActivities.set(url, activities);\n }\n activities.push(activity);\n } else {\n this.logger.warn(\n `The activity URL has a strange format or an unrecognized host (${activity}). Ignoring it.`\n );\n }\n }\n\n const responses = await Promise.all(\n Array.from(mapUrlActivities, async ([convoUrl, activityUrls]) => {\n const params = {\n method: 'POST',\n url: `${convoUrl}/bulk_activities_fetch`,\n body: {\n activityUrls,\n },\n };\n\n const res = await this.webex.request(params);\n\n return res.body.multistatus.reduce((activitiesArr, statusData) => {\n if (statusData.status === '200') {\n activitiesArr.push(statusData.data.activity);\n }\n\n return activitiesArr;\n }, []);\n })\n );\n\n return flatten(responses);\n },\n\n /**\n * Delete a flag\n * @param {Object} flag\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag deletion\n */\n delete(flag, options) {\n if (!flag.url) {\n return Promise.reject(new Error('`flag.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'DELETE',\n options,\n uri: flag.url,\n };\n\n return this.request(params).then((res) => res.body);\n },\n\n /**\n * UnFlags an activity\n * @param {Object} flag\n * @param {Object} options\n * @returns {Promise<Object>} Resolves with the flag removal\n */\n unflag(flag, options) {\n if (!flag.url) {\n return Promise.reject(new Error('`flag.url` is required'));\n }\n options = options || {};\n const params = {\n method: 'PUT',\n uri: flag.url,\n options,\n body: {\n state: 'unflagged',\n },\n };\n\n return this.webex.request(params).then((res) => res.body);\n },\n});\n\nexport default Flag;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@webex/internal-plugin-conversation": "3.12.0-next.
|
|
33
|
-
"@webex/internal-plugin-device": "3.12.0-next.
|
|
32
|
+
"@webex/internal-plugin-conversation": "3.12.0-next.52",
|
|
33
|
+
"@webex/internal-plugin-device": "3.12.0-next.45",
|
|
34
34
|
"@webex/test-helper-chai": "3.12.0-next.6",
|
|
35
35
|
"@webex/test-helper-mock-webex": "3.12.0-next.6",
|
|
36
36
|
"@webex/test-helper-test-users": "3.12.0-next.6",
|
|
37
|
-
"@webex/webex-core": "3.12.0-next.
|
|
37
|
+
"@webex/webex-core": "3.12.0-next.45",
|
|
38
38
|
"lodash": "^4.17.21"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"mocha": "^10.2.0",
|
|
53
53
|
"prettier": "^2.7.1"
|
|
54
54
|
},
|
|
55
|
-
"version": "3.12.0-next.
|
|
55
|
+
"version": "3.12.0-next.52"
|
|
56
56
|
}
|
package/src/flag.js
CHANGED
|
@@ -83,14 +83,20 @@ const Flag = WebexCore.WebexPlugin.extend({
|
|
|
83
83
|
* TODO: this should be implemented as a batched request when migrating to the modular sdk
|
|
84
84
|
*/
|
|
85
85
|
async mapToActivities(flags) {
|
|
86
|
+
// Wait for the postauth catalog to be ready before validating URLs.
|
|
87
|
+
// Without this, calls immediately after webex.ready would see an empty
|
|
88
|
+
// catalog and incorrectly filter all flags as unrecognized.
|
|
89
|
+
await this.webex.internal.services.waitForCatalog('postauth');
|
|
90
|
+
|
|
86
91
|
const mapUrlActivities = new Map();
|
|
87
92
|
|
|
88
93
|
for (const flag of flags) {
|
|
89
94
|
const convoUrlRegex = /(.*)\/activities\//;
|
|
90
95
|
const activity = flag['flag-item'];
|
|
91
96
|
const match = convoUrlRegex.exec(activity);
|
|
97
|
+
const service = match && this.webex.internal.services.getServiceFromUrl(match[1]);
|
|
92
98
|
|
|
93
|
-
if (
|
|
99
|
+
if (service?.name === 'conversation') {
|
|
94
100
|
const url = match[1];
|
|
95
101
|
let activities = mapUrlActivities.get(url);
|
|
96
102
|
|
|
@@ -100,7 +106,9 @@ const Flag = WebexCore.WebexPlugin.extend({
|
|
|
100
106
|
}
|
|
101
107
|
activities.push(activity);
|
|
102
108
|
} else {
|
|
103
|
-
this.logger.warn(
|
|
109
|
+
this.logger.warn(
|
|
110
|
+
`The activity URL has a strange format or an unrecognized host (${activity}). Ignoring it.`
|
|
111
|
+
);
|
|
104
112
|
}
|
|
105
113
|
}
|
|
106
114
|
|
package/test/unit/spec/flag.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import {assert} from '@webex/test-helper-chai';
|
|
6
|
+
import sinon from 'sinon';
|
|
6
7
|
import Flag from '@webex/internal-plugin-flag';
|
|
7
8
|
import MockWebex from '@webex/test-helper-mock-webex';
|
|
8
9
|
|
|
@@ -23,6 +24,147 @@ describe('plugin-flag', () => {
|
|
|
23
24
|
assert.isRejected(webex.internal.flag.create({}, {}), /`activity.url` is required/));
|
|
24
25
|
});
|
|
25
26
|
|
|
27
|
+
describe('#mapToActivities()', () => {
|
|
28
|
+
let getServiceFromUrlStub;
|
|
29
|
+
let waitForCatalogStub;
|
|
30
|
+
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
getServiceFromUrlStub = sinon.stub();
|
|
33
|
+
waitForCatalogStub = sinon.stub().resolves();
|
|
34
|
+
webex.internal.services = {
|
|
35
|
+
getServiceFromUrl: getServiceFromUrlStub,
|
|
36
|
+
waitForCatalog: waitForCatalogStub,
|
|
37
|
+
};
|
|
38
|
+
// Reset the request stub that MockWebex already created
|
|
39
|
+
webex.request.resetHistory();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
sinon.restore();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('rejects activity URLs with unrecognized hosts (SECURITY)', async () => {
|
|
47
|
+
const maliciousFlags = [
|
|
48
|
+
{
|
|
49
|
+
'flag-item': 'http://attacker.example/pwn/activities/fake-id',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
// Service catalog does not recognize the attacker host
|
|
54
|
+
getServiceFromUrlStub.returns(undefined);
|
|
55
|
+
|
|
56
|
+
const activities = await webex.internal.flag.mapToActivities(maliciousFlags);
|
|
57
|
+
|
|
58
|
+
// Should NOT make any request to the attacker host
|
|
59
|
+
assert.notCalled(webex.request);
|
|
60
|
+
// Should return empty array
|
|
61
|
+
assert.deepEqual(activities, []);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('rejects activity URLs from non-conversation Webex services', async () => {
|
|
65
|
+
const flags = [
|
|
66
|
+
{
|
|
67
|
+
'flag-item': 'https://idbroker.webex.com/idb/activities/fake-id',
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
getServiceFromUrlStub.returns({name: 'idbroker'});
|
|
72
|
+
|
|
73
|
+
const activities = await webex.internal.flag.mapToActivities(flags);
|
|
74
|
+
|
|
75
|
+
assert.notCalled(webex.request);
|
|
76
|
+
assert.deepEqual(activities, []);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('allows activity URLs from known Webex services', async () => {
|
|
80
|
+
const legitimateFlags = [
|
|
81
|
+
{
|
|
82
|
+
'flag-item': 'https://conv-a.wbx2.com/conversation/api/v1/activities/abc-123',
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
// Service catalog recognizes this host
|
|
87
|
+
getServiceFromUrlStub.returns({
|
|
88
|
+
name: 'conversation',
|
|
89
|
+
priorityUrl: 'https://conv-a.wbx2.com',
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
webex.request.resolves({
|
|
93
|
+
body: {
|
|
94
|
+
multistatus: [
|
|
95
|
+
{
|
|
96
|
+
status: '200',
|
|
97
|
+
data: {activity: {id: 'abc-123', verb: 'post'}},
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const activities = await webex.internal.flag.mapToActivities(legitimateFlags);
|
|
104
|
+
|
|
105
|
+
// Should make request to legitimate URL
|
|
106
|
+
assert.calledOnce(webex.request);
|
|
107
|
+
assert.calledWithMatch(webex.request, {
|
|
108
|
+
url: 'https://conv-a.wbx2.com/conversation/api/v1/bulk_activities_fetch',
|
|
109
|
+
});
|
|
110
|
+
assert.lengthOf(activities, 1);
|
|
111
|
+
assert.equal(activities[0].id, 'abc-123');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('filters out malicious URLs while processing legitimate ones', async () => {
|
|
115
|
+
const mixedFlags = [
|
|
116
|
+
{
|
|
117
|
+
'flag-item': 'http://evil.com/activities/bad-id',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
'flag-item': 'https://conv-a.wbx2.com/conversation/api/v1/activities/good-id',
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
// Only recognize the legitimate host
|
|
125
|
+
getServiceFromUrlStub.callsFake((url) => {
|
|
126
|
+
if (url.includes('conv-a.wbx2.com')) {
|
|
127
|
+
return {name: 'conversation', priorityUrl: 'https://conv-a.wbx2.com'};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return undefined;
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
webex.request.resolves({
|
|
134
|
+
body: {
|
|
135
|
+
multistatus: [
|
|
136
|
+
{
|
|
137
|
+
status: '200',
|
|
138
|
+
data: {activity: {id: 'good-id', verb: 'post'}},
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const activities = await webex.internal.flag.mapToActivities(mixedFlags);
|
|
145
|
+
|
|
146
|
+
// Should only make request to legitimate URL, not evil.com
|
|
147
|
+
assert.calledOnce(webex.request);
|
|
148
|
+
const requestUrl = webex.request.firstCall.args[0].url;
|
|
149
|
+
assert.notInclude(requestUrl, 'evil.com');
|
|
150
|
+
assert.include(requestUrl, 'conv-a.wbx2.com');
|
|
151
|
+
assert.lengthOf(activities, 1);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('handles malformed activity URLs gracefully', async () => {
|
|
155
|
+
const malformedFlags = [
|
|
156
|
+
{
|
|
157
|
+
'flag-item': 'not-a-valid-url',
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
|
|
161
|
+
const activities = await webex.internal.flag.mapToActivities(malformedFlags);
|
|
162
|
+
|
|
163
|
+
assert.notCalled(webex.request);
|
|
164
|
+
assert.deepEqual(activities, []);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
|
|
26
168
|
describe('#unflag()', () => {
|
|
27
169
|
it('requires a Flag Id', () =>
|
|
28
170
|
assert.isRejected(webex.internal.flag.unflag({}, {}), /`flag.url` is required/));
|