@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 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
- if (match) {
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 = 1;
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 1:
178
+ case 2:
175
179
  responses = _context2.sent;
176
180
  return _context2.abrupt("return", (0, _lodash.flatten)(responses));
177
- case 2:
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.51",
33
- "@webex/internal-plugin-device": "3.12.0-next.44",
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.44",
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.51"
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 (match) {
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(`The activity URL has a strange format (${activity}). Ignoring it.`);
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
 
@@ -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/));