@webex/internal-plugin-ediscovery 3.0.0-beta.9 → 3.0.0-beta.90
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/README.md +7 -5
- package/dist/config.js +0 -2
- package/dist/config.js.map +1 -1
- package/dist/ediscovery-error.js +2 -24
- package/dist/ediscovery-error.js.map +1 -1
- package/dist/ediscovery.js +236 -370
- package/dist/ediscovery.js.map +1 -1
- package/dist/index.js +4 -28
- package/dist/index.js.map +1 -1
- package/dist/report-request.js +0 -6
- package/dist/report-request.js.map +1 -1
- package/dist/retry.js +27 -43
- package/dist/retry.js.map +1 -1
- package/dist/transforms.js +81 -104
- package/dist/transforms.js.map +1 -1
- package/package.json +10 -10
- package/src/config.js +6 -4
- package/src/ediscovery.js +2 -2
- package/src/index.js +35 -22
- package/src/report-request.js +10 -1
- package/src/retry.js +23 -14
- package/src/transforms.js +483 -214
- package/test/integration/spec/ediscovery.js +62 -43
- package/test/unit/spec/content.js +304 -166
- package/test/unit/spec/report.js +76 -77
- package/test/unit/spec/transforms.js +227 -152
package/dist/transforms.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Transforms","ctx","object","body","resolve","reportRequest","webex","internal","encryption","kms","createUnboundKeys","count","then","keys","length","encryptionKeyUrl","uri","createResource","userIds","userId","promises","name","push","encryptText","encryptedName","description","encryptedDescription","spaceNames","all","map","spaceName","encryptedSpaceNames","keywords","keyword","encryptedKeywords","emails","unencryptedEmails","email","encryptedEmails","catch","reason","logger","error","reject","reportNamePromise","decryptText","decryptedName","id","reportDescriptionPromise","decryptedDescription","spaceNamePromises","decryptedSpaceNames","keywordPromises","decryptedKeywords","emailPromises","decryptedEmails","concat","reportId","activity","ediscovery","getContentContainerByContainerId","targetId","res","container","activityId","warning","spaceWarning","containerWarning","containerName","isOneOnOne","displayNames","participants","formerParticipants","p","displayName","join","includes","verb","meeting","recording","extension","extensionType","spaceInfo","info","onBehalfOfUser","objectDisplayName","requestWithRetries","onBehalfOf","decryptedMessage","previousName","previousEncryptionKeyUrl","objectType","contentUrl","decryptedContentUrl","decryptedDisplayName","webUrl","decryptedWebUrl","previous","decryptedPreviousContentUrl","decryptedPreviousDisplayName","title","topic","shares","Array","prototype","apply","files","whiteboards","links","i","share","warn","mimeType","fileSize","url","microsoftSharedLinkInfo","driveId","decryptedDriveId","itemId","decryptedItemId","scr","sslr","decryptScr","decryptedSCR","loc","containerType","containerId","descriptionEncryptionKeyUrl","decryptedContainerDescription","decryptedContainerName"],"sources":["transforms.js"],"sourcesContent":["import {requestWithRetries} from './retry';\n\n/**\n * This class is used to encrypt/decrypt various properties on ReportRequests, Activities and Spaces as they are sent/returned to/from the eDiscovery Service\n */\nclass Transforms {\n /**\n * This function is used to encrypt sensitive properties on the ReportRequest before it is sent to the eDiscovery Service createReport API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to encrypt some property on based on the type\n * @returns {Promise} - Returns a transform promise\n */\n static encryptReportRequest(ctx, object) {\n if (!object || !object.body) {\n return Promise.resolve(object);\n }\n const reportRequest = object.body;\n\n return ctx.webex.internal.encryption.kms.createUnboundKeys({count: 1})\n .then((keys) => {\n if (keys && keys.length > 0 && keys[0]) {\n reportRequest.encryptionKeyUrl = keys[0].uri;\n\n return ctx.webex.internal.encryption.kms.createResource({userIds: [keys[0].userId], keys})\n .then(() => {\n const promises = [];\n\n if (reportRequest.name) {\n promises.push(\n ctx.webex.internal.encryption.encryptText(keys[0], reportRequest.name)\n .then((encryptedName) => {\n reportRequest.name = encryptedName;\n })\n );\n }\n\n if (reportRequest.description) {\n promises.push(\n ctx.webex.internal.encryption.encryptText(keys[0], reportRequest.description)\n .then((encryptedDescription) => {\n reportRequest.description = encryptedDescription;\n })\n );\n }\n\n if (reportRequest.spaceNames) {\n promises.push(\n Promise.all(reportRequest.spaceNames.map((spaceName) => ctx.webex.internal.encryption.encryptText(keys[0], spaceName)))\n .then((encryptedSpaceNames) => {\n reportRequest.spaceNames = encryptedSpaceNames;\n })\n );\n }\n\n if (reportRequest.keywords) {\n promises.push(\n Promise.all(reportRequest.keywords.map((keyword) => ctx.webex.internal.encryption.encryptText(keys[0], keyword)))\n .then((encryptedKeywords) => {\n reportRequest.keywords = encryptedKeywords;\n })\n );\n }\n\n if (reportRequest.emails) {\n // store unencrypted emails for ediscovery service to convert to user ids\n reportRequest.unencryptedEmails = reportRequest.emails;\n promises.push(\n Promise.all(reportRequest.emails.map((email) => ctx.webex.internal.encryption.encryptText(keys[0], email)))\n .then((encryptedEmails) => {\n reportRequest.emails = encryptedEmails;\n })\n );\n }\n\n return Promise.all(promises);\n });\n }\n\n return Promise.resolve(object);\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error while encrypting report request: ${reportRequest} : ${reason}`);\n\n return Promise.reject(reason);\n });\n }\n\n /**\n * This function is used to decrypt encrypted properties on the ReportRequest that is returned from the eDiscovery Service getReport(s) API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to decrypt some property on based on the type\n * @returns {Promise} - Returns a transform promise\n */\n static decryptReportRequest(ctx, object) {\n if (!object || !object.body || !object.body.reportRequest || !object.body.reportRequest.encryptionKeyUrl) {\n return Promise.resolve(object);\n }\n const {reportRequest} = object.body;\n\n let reportNamePromise;\n\n if (reportRequest.name) {\n reportNamePromise = ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, reportRequest.name)\n .then((decryptedName) => {\n reportRequest.name = decryptedName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error decrypting report name for report ${object.body.id}: ${reason}`);\n });\n }\n\n let reportDescriptionPromise;\n\n if (reportRequest.description) {\n reportDescriptionPromise = ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, reportRequest.description)\n .then((decryptedDescription) => {\n reportRequest.description = decryptedDescription;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error decrypting description for report ${object.body.id}: ${reason}`);\n });\n }\n\n let spaceNamePromises = [];\n\n if (reportRequest.spaceNames) {\n spaceNamePromises = Promise.all(reportRequest.spaceNames.map((spaceName) => ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, spaceName)))\n .then((decryptedSpaceNames) => {\n reportRequest.spaceNames = decryptedSpaceNames;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error decrypting space name for report ${object.body.id}: ${reason}`);\n });\n }\n\n let keywordPromises = [];\n\n if (reportRequest.keywords) {\n keywordPromises = Promise.all(reportRequest.keywords.map((keyword) => ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, keyword)))\n .then((decryptedKeywords) => {\n reportRequest.keywords = decryptedKeywords;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error decrypting keywords for report ${object.body.id}: ${reason}`);\n });\n }\n\n let emailPromises = [];\n\n if (reportRequest.emails) {\n emailPromises = Promise.all(reportRequest.emails.map((email) => ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, email)))\n .then((decryptedEmails) => {\n reportRequest.emails = decryptedEmails;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error decrypting emails for report ${object.body.id}: ${reason}`);\n });\n }\n\n return Promise.all([reportNamePromise, reportDescriptionPromise].concat(spaceNamePromises, keywordPromises, emailPromises));\n }\n\n /**\n * This function is used to decrypt encrypted properties on the activities that are returned from the eDiscovery Service getContent API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to decrypt some property on based on the type\n * @param {String} reportId - Id of the report for which content is being retrieved\n * @returns {Promise} - Returns a transform promise\n */\n static decryptReportContent(ctx, object, reportId) {\n if (!object || !object.body || !reportId) {\n return Promise.resolve();\n }\n const activity = object.body;\n\n const promises = [];\n\n return ctx.webex.internal.ediscovery.getContentContainerByContainerId(reportId, activity.targetId)\n .then((res) => {\n const container = res.body;\n\n if (!container) {\n const reason = `Container ${activity.targetId} not found - unable to decrypt activity ${activity.activityId}`;\n\n activity.error = reason;\n ctx.webex.logger.error(reason);\n\n return Promise.resolve(object);\n }\n\n // add warning properties to the activity - these will be recorded in the downloader\n if (container.warning) {\n activity.spaceWarning = container.warning; // Remove this property once all clients are using the content container model\n activity.containerWarning = container.warning;\n }\n\n // set space name and participants on activity\n if (container.containerName) {\n activity.spaceName = container.containerName; // Remove this property once all clients are using the content container model\n activity.containerName = container.containerName;\n }\n else if (container.isOneOnOne) {\n const displayNames = (container.participants || []).concat(container.formerParticipants || []).map((p) => p.displayName).join(' & ');\n\n // One to One spaces have no space name, use participant names as 'Subject' instead\n activity.spaceName = displayNames; // Remove this property once all clients are using the content container model\n activity.containerName = displayNames;\n }\n else {\n activity.spaceName = ''; // Remove this property once all clients are using the content container model\n activity.containerName = '';\n }\n\n // post and share activities have content which needs to be decrypted\n // as do meeting, recording activities, customApp extensions, and space information updates\n if (!['post', 'share'].includes(activity.verb) && !activity.meeting && !activity.recording && !(activity.extension && activity.extension.extensionType === 'customApp') &&\n !activity.spaceInfo?.name && !activity.spaceInfo?.description) {\n return Promise.resolve(object);\n }\n\n if (!activity.encryptionKeyUrl) {\n // If the encryptionKeyUrl is empty we assume the activity is unencrypted\n ctx.webex.logger.info(`Activity ${activity.activityId} cannot be decrypted due to a missing encryption key url`);\n\n return Promise.resolve(object);\n }\n\n if (!container.onBehalfOfUser) {\n const reason = `No user available with which to decrypt activity ${activity.activityId} in container ${activity.targetId}`;\n\n ctx.webex.logger.error(reason);\n activity.error = reason;\n\n return Promise.resolve(object);\n }\n\n // Decrypt activity message if present\n if (activity.objectDisplayName) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.objectDisplayName, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedMessage) => {\n activity.objectDisplayName = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt message error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n\n // If the activity is a space information update, decrypt the name and description if present\n if (activity.spaceInfo?.name) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.spaceInfo.name, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedMessage) => {\n activity.spaceInfo.name = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.spaceInfo.name error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n if (activity.spaceInfo?.description) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.spaceInfo.description, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedMessage) => {\n activity.spaceInfo.description = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.spaceInfo.description error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n if (activity.spaceInfo?.previousName && activity.spaceInfo.previousEncryptionKeyUrl) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.spaceInfo.previousEncryptionKeyUrl, activity.spaceInfo.previousName, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedMessage) => {\n activity.spaceInfo.previousName = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.spaceInfo.previousName error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n\n // Decrypt content url and display name if extension is present\n if (activity.extension && activity.extension.objectType === 'extension' && activity.extension.extensionType === 'customApp') {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.extension.contentUrl, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedContentUrl) => {\n activity.extension.contentUrl = decryptedContentUrl;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.extension.contentUrl error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.extension.displayName, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedDisplayName) => {\n activity.extension.displayName = decryptedDisplayName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.extension.displayName error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n\n // Decrypt webUrl.\n if (activity.extension.webUrl) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.extension.webUrl, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedWebUrl) => {\n activity.extension.webUrl = decryptedWebUrl;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.extension.webUrl error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n if (activity.verb === 'update' && activity.extension.previous) {\n if (activity.extension.previous.contentUrl) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.extension.previous.contentUrl, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedPreviousContentUrl) => {\n activity.extension.previous.contentUrl = decryptedPreviousContentUrl;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.extension.previous.contentUrl error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n if (activity.extension.previous.displayName) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.extension.previous.displayName, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedPreviousDisplayName) => {\n activity.extension.previous.displayName = decryptedPreviousDisplayName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.extension.previous.displayName error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n }\n }\n\n // Decrypt meeting title if present\n if (activity?.meeting?.title) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.meeting.title, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedMessage) => {\n activity.meeting.title = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.meeting.title error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n\n // Decrypt meeting recording topic if present\n if (activity?.recording?.topic) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, activity.recording.topic, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedMessage) => {\n activity.recording.topic = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt activity.recording.topic error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n\n // Decrypt shares (files, whiteboards, shared links)\n // Array.prototype.concat.apply ignores undefined\n let shares = Array.prototype.concat.apply([], activity.files);\n\n shares = Array.prototype.concat.apply(shares, activity.whiteboards);\n shares = Array.prototype.concat.apply(shares, activity.links);\n for (let i = 0; i < shares.length; i += 1) {\n const share = shares[i];\n\n // Decrypt the share's display name\n // Ignore display names for whiteboards which are unencrypted\n if (share.displayName && (!activity.whiteboards || !activity.whiteboards.includes(share))) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, share.displayName, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedDisplayName) => {\n share.displayName = decryptedDisplayName;\n })\n .catch((reason) => {\n ctx.webex.logger.warn(`Decrypt DisplayName error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`);\n // add warning property to activity - this will present an indication that there was data loss on the downloader\n activity.warning = reason;\n }));\n }\n\n // Shared Links can have additional decryption fields\n if (share.microsoftSharedLinkInfo) {\n if (share.microsoftSharedLinkInfo.driveId) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, share.microsoftSharedLinkInfo.driveId, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedDriveId) => {\n share.microsoftSharedLinkInfo.driveId = decryptedDriveId;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt share.microsoftSharedLinkInfo.driveId error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`);\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n\n if (share.microsoftSharedLinkInfo.itemId) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, share.microsoftSharedLinkInfo.itemId, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedItemId) => {\n share.microsoftSharedLinkInfo.itemId = decryptedItemId;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt share.microsoftSharedLinkInfo.itemId error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`);\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n }\n\n // Decrypt the scr (Secure Content Reference) or sslr (Secure Shared Link Reference)\n // Unlike a scr the sslr contains only a loc. But decryptScr(...) is flexible and\n // leaves the tag, auth, IV, etc fields on the SCR object as undefined.\n if (share.scr || share.sslr) {\n promises.push(requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptScr,\n // A share will have an encryptionKeyUrl when it's activity uses a different encryptionKeyUrl. This can happen when old activities are edited\n // and key rotation is turn on.\n [share.encryptionKeyUrl || activity.encryptionKeyUrl, share.scr || share.sslr, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedSCR) => {\n if (share.scr) {\n share.scr = decryptedSCR;\n }\n else {\n share.sslr = decryptedSCR.loc;\n }\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt file scr or sslr error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`);\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n }));\n }\n }\n\n return Promise.all(promises);\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error retrieving content container for: ${activity.activityId} in container ${activity.targetId}: ${reason}`);\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n });\n }\n\n /**\n * This function is used to decrypt encrypted properties on the containers that are returned from the eDiscovery Service getContentContainer API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to decrypt some property on based on the type\n * @returns {Promise} - Returns a transform promise\n */\n static decryptReportContentContainer(ctx, object) {\n if (!object || !object.body) {\n return Promise.resolve();\n }\n const container = object.body;\n\n if (!container.containerName) {\n return Promise.resolve(object);\n }\n\n if (!container.encryptionKeyUrl) {\n // If the encryptionKeyUrl is empty we assume the container name is unencrypted\n ctx.webex.logger.info(`${container.containerType} container ${container.containerId} cannot be decrypted due to a missing encryption key url`);\n\n return Promise.resolve(object);\n }\n\n if (!container.onBehalfOfUser) {\n const reason = `No user available with which to decrypt ${container.containerType} container ${container.containerId}`;\n\n ctx.webex.logger.error(reason);\n container.error = reason;\n\n return Promise.resolve(object);\n }\n\n // decrypt description if present with a descriptionEncryptionKeyUrl\n if (container.description && container.descriptionEncryptionKeyUrl) {\n requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [container.descriptionEncryptionKeyUrl, container.description, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedContainerDescription) => {\n container.description = decryptedContainerDescription;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt container description error for ${container.containerType} container ${container.containerId}: ${reason}`);\n // add warn property to container info - this warning will be recorded in the downloader\n container.warning = reason;\n // don't return, attempt to decrypt the name first\n });\n }\n\n return requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText,\n [container.encryptionKeyUrl, container.containerName, {onBehalfOf: container.onBehalfOfUser}])\n .then((decryptedContainerName) => {\n container.containerName = decryptedContainerName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Decrypt container name error for ${container.containerType} container ${container.containerId}: ${reason}`);\n // add warn property to container info - this warning will be recorded in the downloader\n container.warning = reason;\n\n return Promise.resolve(object);\n });\n }\n}\n\nexport default Transforms;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Transforms","ctx","object","body","resolve","reportRequest","webex","internal","encryption","kms","createUnboundKeys","count","then","keys","length","encryptionKeyUrl","uri","createResource","userIds","userId","promises","name","push","encryptText","encryptedName","description","encryptedDescription","spaceNames","all","map","spaceName","encryptedSpaceNames","keywords","keyword","encryptedKeywords","emails","unencryptedEmails","email","encryptedEmails","catch","reason","logger","error","reject","reportNamePromise","decryptText","decryptedName","id","reportDescriptionPromise","decryptedDescription","spaceNamePromises","decryptedSpaceNames","keywordPromises","decryptedKeywords","emailPromises","decryptedEmails","concat","reportId","activity","ediscovery","getContentContainerByContainerId","targetId","res","container","activityId","warning","spaceWarning","containerWarning","containerName","isOneOnOne","displayNames","participants","formerParticipants","p","displayName","join","includes","verb","meeting","recording","extension","extensionType","spaceInfo","encryptedTextKeyValues","info","undefined","onBehalfOfUser","objectDisplayName","requestWithRetries","onBehalfOf","decryptedMessage","previousName","previousEncryptionKeyUrl","objectType","contentUrl","decryptedContentUrl","decryptedDisplayName","webUrl","decryptedWebUrl","previous","decryptedPreviousContentUrl","decryptedPreviousDisplayName","key","value","title","topic","shares","Array","prototype","apply","files","whiteboards","links","share","i","warn","mimeType","fileSize","url","microsoftSharedLinkInfo","driveId","decryptedDriveId","itemId","decryptedItemId","scr","sslr","decryptScr","decryptedSCR","loc","containerType","containerId","descriptionEncryptionKeyUrl","decryptedContainerDescription","decryptedContainerName"],"sources":["transforms.js"],"sourcesContent":["import {requestWithRetries} from './retry';\n\n/**\n * This class is used to encrypt/decrypt various properties on ReportRequests, Activities and Spaces as they are sent/returned to/from the eDiscovery Service\n */\nclass Transforms {\n /**\n * This function is used to encrypt sensitive properties on the ReportRequest before it is sent to the eDiscovery Service createReport API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to encrypt some property on based on the type\n * @returns {Promise} - Returns a transform promise\n */\n static encryptReportRequest(ctx, object) {\n if (!object || !object.body) {\n return Promise.resolve(object);\n }\n const reportRequest = object.body;\n\n return ctx.webex.internal.encryption.kms\n .createUnboundKeys({count: 1})\n .then((keys) => {\n if (keys && keys.length > 0 && keys[0]) {\n reportRequest.encryptionKeyUrl = keys[0].uri;\n\n return ctx.webex.internal.encryption.kms\n .createResource({userIds: [keys[0].userId], keys})\n .then(() => {\n const promises = [];\n\n if (reportRequest.name) {\n promises.push(\n ctx.webex.internal.encryption\n .encryptText(keys[0], reportRequest.name)\n .then((encryptedName) => {\n reportRequest.name = encryptedName;\n })\n );\n }\n\n if (reportRequest.description) {\n promises.push(\n ctx.webex.internal.encryption\n .encryptText(keys[0], reportRequest.description)\n .then((encryptedDescription) => {\n reportRequest.description = encryptedDescription;\n })\n );\n }\n\n if (reportRequest.spaceNames) {\n promises.push(\n Promise.all(\n reportRequest.spaceNames.map((spaceName) =>\n ctx.webex.internal.encryption.encryptText(keys[0], spaceName)\n )\n ).then((encryptedSpaceNames) => {\n reportRequest.spaceNames = encryptedSpaceNames;\n })\n );\n }\n\n if (reportRequest.keywords) {\n promises.push(\n Promise.all(\n reportRequest.keywords.map((keyword) =>\n ctx.webex.internal.encryption.encryptText(keys[0], keyword)\n )\n ).then((encryptedKeywords) => {\n reportRequest.keywords = encryptedKeywords;\n })\n );\n }\n\n if (reportRequest.emails) {\n // store unencrypted emails for ediscovery service to convert to user ids\n reportRequest.unencryptedEmails = reportRequest.emails;\n promises.push(\n Promise.all(\n reportRequest.emails.map((email) =>\n ctx.webex.internal.encryption.encryptText(keys[0], email)\n )\n ).then((encryptedEmails) => {\n reportRequest.emails = encryptedEmails;\n })\n );\n }\n\n return Promise.all(promises);\n });\n }\n\n return Promise.resolve(object);\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Error while encrypting report request: ${reportRequest} : ${reason}`\n );\n\n return Promise.reject(reason);\n });\n }\n\n /**\n * This function is used to decrypt encrypted properties on the ReportRequest that is returned from the eDiscovery Service getReport(s) API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to decrypt some property on based on the type\n * @returns {Promise} - Returns a transform promise\n */\n static decryptReportRequest(ctx, object) {\n if (\n !object ||\n !object.body ||\n !object.body.reportRequest ||\n !object.body.reportRequest.encryptionKeyUrl\n ) {\n return Promise.resolve(object);\n }\n const {reportRequest} = object.body;\n\n let reportNamePromise;\n\n if (reportRequest.name) {\n reportNamePromise = ctx.webex.internal.encryption\n .decryptText(reportRequest.encryptionKeyUrl, reportRequest.name)\n .then((decryptedName) => {\n reportRequest.name = decryptedName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Error decrypting report name for report ${object.body.id}: ${reason}`\n );\n });\n }\n\n let reportDescriptionPromise;\n\n if (reportRequest.description) {\n reportDescriptionPromise = ctx.webex.internal.encryption\n .decryptText(reportRequest.encryptionKeyUrl, reportRequest.description)\n .then((decryptedDescription) => {\n reportRequest.description = decryptedDescription;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Error decrypting description for report ${object.body.id}: ${reason}`\n );\n });\n }\n\n let spaceNamePromises = [];\n\n if (reportRequest.spaceNames) {\n spaceNamePromises = Promise.all(\n reportRequest.spaceNames.map((spaceName) =>\n ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, spaceName)\n )\n )\n .then((decryptedSpaceNames) => {\n reportRequest.spaceNames = decryptedSpaceNames;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Error decrypting space name for report ${object.body.id}: ${reason}`\n );\n });\n }\n\n let keywordPromises = [];\n\n if (reportRequest.keywords) {\n keywordPromises = Promise.all(\n reportRequest.keywords.map((keyword) =>\n ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, keyword)\n )\n )\n .then((decryptedKeywords) => {\n reportRequest.keywords = decryptedKeywords;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Error decrypting keywords for report ${object.body.id}: ${reason}`\n );\n });\n }\n\n let emailPromises = [];\n\n if (reportRequest.emails) {\n emailPromises = Promise.all(\n reportRequest.emails.map((email) =>\n ctx.webex.internal.encryption.decryptText(reportRequest.encryptionKeyUrl, email)\n )\n )\n .then((decryptedEmails) => {\n reportRequest.emails = decryptedEmails;\n })\n .catch((reason) => {\n ctx.webex.logger.error(`Error decrypting emails for report ${object.body.id}: ${reason}`);\n });\n }\n\n return Promise.all(\n [reportNamePromise, reportDescriptionPromise].concat(\n spaceNamePromises,\n keywordPromises,\n emailPromises\n )\n );\n }\n\n /**\n * This function is used to decrypt encrypted properties on the activities that are returned from the eDiscovery Service getContent API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to decrypt some property on based on the type\n * @param {String} reportId - Id of the report for which content is being retrieved\n * @returns {Promise} - Returns a transform promise\n */\n static decryptReportContent(ctx, object, reportId) {\n if (!object || !object.body || !reportId) {\n return Promise.resolve();\n }\n const activity = object.body;\n\n const promises = [];\n\n return ctx.webex.internal.ediscovery\n .getContentContainerByContainerId(reportId, activity.targetId)\n .then((res) => {\n const container = res.body;\n\n if (!container) {\n const reason = `Container ${activity.targetId} not found - unable to decrypt activity ${activity.activityId}`;\n\n activity.error = reason;\n ctx.webex.logger.error(reason);\n\n return Promise.resolve(object);\n }\n\n // add warning properties to the activity - these will be recorded in the downloader\n if (container.warning) {\n activity.spaceWarning = container.warning; // Remove this property once all clients are using the content container model\n activity.containerWarning = container.warning;\n }\n\n // set space name and participants on activity\n if (container.containerName) {\n activity.spaceName = container.containerName; // Remove this property once all clients are using the content container model\n activity.containerName = container.containerName;\n } else if (container.isOneOnOne) {\n const displayNames = (container.participants || [])\n .concat(container.formerParticipants || [])\n .map((p) => p.displayName)\n .join(' & ');\n\n // One to One spaces have no space name, use participant names as 'Subject' instead\n activity.spaceName = displayNames; // Remove this property once all clients are using the content container model\n activity.containerName = displayNames;\n } else {\n activity.spaceName = ''; // Remove this property once all clients are using the content container model\n activity.containerName = '';\n }\n\n // post and share activities have content which needs to be decrypted\n // as do meeting, recording activities, customApp extensions, and space information updates\n if (\n !['post', 'share'].includes(activity.verb) &&\n !activity.meeting &&\n !activity.recording &&\n !(activity.extension && activity.extension.extensionType === 'customApp') &&\n !activity.spaceInfo?.name &&\n !activity.spaceInfo?.description &&\n !activity.encryptedTextKeyValues\n ) {\n return Promise.resolve(object);\n }\n\n if (!activity.encryptionKeyUrl) {\n // If the encryptionKeyUrl is empty we assume the activity is unencrypted\n ctx.webex.logger.info(\n `Activity ${activity.activityId} cannot be decrypted due to a missing encryption key url`\n );\n\n return Promise.resolve(object);\n }\n\n // CDR Compliance uses org key and does depend on an onBehalfOfUser\n if (activity.encryptedTextKeyValues === undefined && !container.onBehalfOfUser) {\n const reason = `No user available with which to decrypt activity ${activity.activityId} in container ${activity.targetId}`;\n\n ctx.webex.logger.error(reason);\n activity.error = reason;\n\n return Promise.resolve(object);\n }\n\n // Decrypt activity message if present\n if (activity.objectDisplayName) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.objectDisplayName,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedMessage) => {\n activity.objectDisplayName = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt message error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n\n // If the activity is a space information update, decrypt the name and description if present\n if (activity.spaceInfo?.name) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.spaceInfo.name,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedMessage) => {\n activity.spaceInfo.name = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.spaceInfo.name error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n if (activity.spaceInfo?.description) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.spaceInfo.description,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedMessage) => {\n activity.spaceInfo.description = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.spaceInfo.description error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n if (activity.spaceInfo?.previousName && activity.spaceInfo.previousEncryptionKeyUrl) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.spaceInfo.previousEncryptionKeyUrl,\n activity.spaceInfo.previousName,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedMessage) => {\n activity.spaceInfo.previousName = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.spaceInfo.previousName error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n\n // Decrypt content url and display name if extension is present\n if (\n activity.extension &&\n activity.extension.objectType === 'extension' &&\n activity.extension.extensionType === 'customApp'\n ) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.extension.contentUrl,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedContentUrl) => {\n activity.extension.contentUrl = decryptedContentUrl;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.extension.contentUrl error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.extension.displayName,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedDisplayName) => {\n activity.extension.displayName = decryptedDisplayName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.extension.displayName error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n\n // Decrypt webUrl.\n if (activity.extension.webUrl) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.extension.webUrl,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedWebUrl) => {\n activity.extension.webUrl = decryptedWebUrl;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.extension.webUrl error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n if (activity.verb === 'update' && activity.extension.previous) {\n if (activity.extension.previous.contentUrl) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.extension.previous.contentUrl,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedPreviousContentUrl) => {\n activity.extension.previous.contentUrl = decryptedPreviousContentUrl;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.extension.previous.contentUrl error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n if (activity.extension.previous.displayName) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.extension.previous.displayName,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedPreviousDisplayName) => {\n activity.extension.previous.displayName = decryptedPreviousDisplayName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.extension.previous.displayName error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n }\n }\n\n // Decrypt encrypted text map if present\n if (activity.encryptedTextKeyValues !== undefined) {\n for (const [key, value] of Object.entries(activity.encryptedTextKeyValues)) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [activity.encryptionKeyUrl, value]\n )\n .then((decryptedMessage) => {\n activity.encryptedTextKeyValues[key] = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.encryptedTextKeyValues error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n }\n\n // Decrypt meeting title if present\n if (activity?.meeting?.title) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.meeting.title,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedMessage) => {\n activity.meeting.title = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.meeting.title error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n\n // Decrypt meeting recording topic if present\n if (activity?.recording?.topic) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n activity.recording.topic,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedMessage) => {\n activity.recording.topic = decryptedMessage;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt activity.recording.topic error for activity ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n\n // Decrypt shares (files, whiteboards, shared links)\n // Array.prototype.concat.apply ignores undefined\n let shares = Array.prototype.concat.apply([], activity.files);\n\n shares = Array.prototype.concat.apply(shares, activity.whiteboards);\n shares = Array.prototype.concat.apply(shares, activity.links);\n for (let i = 0; i < shares.length; i += 1) {\n const share = shares[i];\n\n // Decrypt the share's display name\n // Ignore display names for whiteboards which are unencrypted\n if (\n share.displayName &&\n (!activity.whiteboards || !activity.whiteboards.includes(share))\n ) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n share.displayName,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedDisplayName) => {\n share.displayName = decryptedDisplayName;\n })\n .catch((reason) => {\n ctx.webex.logger.warn(\n `Decrypt DisplayName error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`\n );\n // add warning property to activity - this will present an indication that there was data loss on the downloader\n activity.warning = reason;\n })\n );\n }\n\n // Shared Links can have additional decryption fields\n if (share.microsoftSharedLinkInfo) {\n if (share.microsoftSharedLinkInfo.driveId) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n share.microsoftSharedLinkInfo.driveId,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedDriveId) => {\n share.microsoftSharedLinkInfo.driveId = decryptedDriveId;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt share.microsoftSharedLinkInfo.driveId error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`\n );\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n\n if (share.microsoftSharedLinkInfo.itemId) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [\n activity.encryptionKeyUrl,\n share.microsoftSharedLinkInfo.itemId,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedItemId) => {\n share.microsoftSharedLinkInfo.itemId = decryptedItemId;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt share.microsoftSharedLinkInfo.itemId error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`\n );\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n }\n\n // Decrypt the scr (Secure Content Reference) or sslr (Secure Shared Link Reference)\n // Unlike a scr the sslr contains only a loc. But decryptScr(...) is flexible and\n // leaves the tag, auth, IV, etc fields on the SCR object as undefined.\n if (share.scr || share.sslr) {\n promises.push(\n requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptScr,\n // A share will have an encryptionKeyUrl when it's activity uses a different encryptionKeyUrl. This can happen when old activities are edited\n // and key rotation is turn on.\n [\n share.encryptionKeyUrl || activity.encryptionKeyUrl,\n share.scr || share.sslr,\n {onBehalfOf: container.onBehalfOfUser},\n ]\n )\n .then((decryptedSCR) => {\n if (share.scr) {\n share.scr = decryptedSCR;\n } else {\n share.sslr = decryptedSCR.loc;\n }\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt file scr or sslr error for activity ${activity.activityId} in container ${activity.targetId} for share type: ${share.mimeType}, size: ${share.fileSize}, and url: ${share.url} due to error: ${reason}`\n );\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n })\n );\n }\n }\n\n return Promise.all(promises);\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Error retrieving content container for: ${activity.activityId} in container ${activity.targetId}: ${reason}`\n );\n // add error property to activity - this error will be recorded in the downloader and the activity omitted from the report\n activity.error = reason;\n\n return Promise.resolve(object);\n });\n }\n\n /**\n * This function is used to decrypt encrypted properties on the containers that are returned from the eDiscovery Service getContentContainer API\n * @param {Object} ctx - An object containing a webex instance and a transform\n * @param {Object} object - Generic object that you want to decrypt some property on based on the type\n * @returns {Promise} - Returns a transform promise\n */\n static decryptReportContentContainer(ctx, object) {\n if (!object || !object.body) {\n return Promise.resolve();\n }\n const container = object.body;\n\n if (!container.containerName) {\n return Promise.resolve(object);\n }\n\n if (!container.encryptionKeyUrl) {\n // If the encryptionKeyUrl is empty we assume the container name is unencrypted\n ctx.webex.logger.info(\n `${container.containerType} container ${container.containerId} cannot be decrypted due to a missing encryption key url`\n );\n\n return Promise.resolve(object);\n }\n\n if (!container.onBehalfOfUser) {\n const reason = `No user available with which to decrypt ${container.containerType} container ${container.containerId}`;\n\n ctx.webex.logger.error(reason);\n container.error = reason;\n\n return Promise.resolve(object);\n }\n\n // decrypt description if present with a descriptionEncryptionKeyUrl\n if (container.description && container.descriptionEncryptionKeyUrl) {\n requestWithRetries(ctx.webex.internal.encryption, ctx.webex.internal.encryption.decryptText, [\n container.descriptionEncryptionKeyUrl,\n container.description,\n {onBehalfOf: container.onBehalfOfUser},\n ])\n .then((decryptedContainerDescription) => {\n container.description = decryptedContainerDescription;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt container description error for ${container.containerType} container ${container.containerId}: ${reason}`\n );\n // add warn property to container info - this warning will be recorded in the downloader\n container.warning = reason;\n // don't return, attempt to decrypt the name first\n });\n }\n\n return requestWithRetries(\n ctx.webex.internal.encryption,\n ctx.webex.internal.encryption.decryptText,\n [container.encryptionKeyUrl, container.containerName, {onBehalfOf: container.onBehalfOfUser}]\n )\n .then((decryptedContainerName) => {\n container.containerName = decryptedContainerName;\n })\n .catch((reason) => {\n ctx.webex.logger.error(\n `Decrypt container name error for ${container.containerType} container ${container.containerId}: ${reason}`\n );\n // add warn property to container info - this warning will be recorded in the downloader\n container.warning = reason;\n\n return Promise.resolve(object);\n });\n }\n}\n\nexport default Transforms;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-ediscovery",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.90",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -25,18 +25,18 @@
|
|
|
25
25
|
]
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
29
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
30
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
28
|
+
"@webex/test-helper-chai": "3.0.0-beta.90",
|
|
29
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.90",
|
|
30
|
+
"@webex/test-helper-test-users": "3.0.0-beta.90",
|
|
31
31
|
"sinon": "^9.2.4"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@webex/common": "3.0.0-beta.
|
|
35
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
36
|
-
"@webex/internal-plugin-ediscovery": "3.0.0-beta.
|
|
37
|
-
"@webex/internal-plugin-encryption": "3.0.0-beta.
|
|
38
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
39
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
34
|
+
"@webex/common": "3.0.0-beta.90",
|
|
35
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.90",
|
|
36
|
+
"@webex/internal-plugin-ediscovery": "3.0.0-beta.90",
|
|
37
|
+
"@webex/internal-plugin-encryption": "3.0.0-beta.90",
|
|
38
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.90",
|
|
39
|
+
"@webex/webex-core": "3.0.0-beta.90",
|
|
40
40
|
"lodash": "^4.17.21",
|
|
41
41
|
"uuid": "^3.3.2"
|
|
42
42
|
}
|
package/src/config.js
CHANGED
package/src/ediscovery.js
CHANGED
package/src/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
3
|
*/
|
|
4
|
+
/* eslint-disable */
|
|
4
5
|
|
|
5
6
|
import '@webex/internal-plugin-encryption';
|
|
6
7
|
import '@webex/internal-plugin-conversation';
|
|
@@ -24,7 +25,7 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
24
25
|
},
|
|
25
26
|
extract(object) {
|
|
26
27
|
return Promise.resolve(object);
|
|
27
|
-
}
|
|
28
|
+
},
|
|
28
29
|
},
|
|
29
30
|
{
|
|
30
31
|
name: 'decryptReportRequestArray',
|
|
@@ -34,17 +35,21 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
34
35
|
},
|
|
35
36
|
extract(object) {
|
|
36
37
|
return Promise.resolve(object);
|
|
37
|
-
}
|
|
38
|
+
},
|
|
38
39
|
},
|
|
39
40
|
{
|
|
40
41
|
name: 'encryptReportRequest',
|
|
41
42
|
direction: 'outbound',
|
|
42
43
|
test(ctx, object) {
|
|
43
|
-
return Promise.resolve(
|
|
44
|
+
return Promise.resolve(
|
|
45
|
+
has(object, 'body.keywords') ||
|
|
46
|
+
has(object, 'body.spaceNames') ||
|
|
47
|
+
has(object, 'body.emails')
|
|
48
|
+
);
|
|
44
49
|
},
|
|
45
50
|
extract(object) {
|
|
46
51
|
return Promise.resolve(object);
|
|
47
|
-
}
|
|
52
|
+
},
|
|
48
53
|
},
|
|
49
54
|
{
|
|
50
55
|
name: 'decryptReportContent',
|
|
@@ -54,7 +59,7 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
54
59
|
},
|
|
55
60
|
extract(object) {
|
|
56
61
|
return Promise.resolve(object);
|
|
57
|
-
}
|
|
62
|
+
},
|
|
58
63
|
},
|
|
59
64
|
{
|
|
60
65
|
name: 'decryptReportContentArray',
|
|
@@ -64,7 +69,7 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
64
69
|
},
|
|
65
70
|
extract(object) {
|
|
66
71
|
return Promise.resolve(object);
|
|
67
|
-
}
|
|
72
|
+
},
|
|
68
73
|
},
|
|
69
74
|
{
|
|
70
75
|
name: 'decryptReportContentContainer',
|
|
@@ -74,7 +79,7 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
74
79
|
},
|
|
75
80
|
extract(object) {
|
|
76
81
|
return Promise.resolve(object);
|
|
77
|
-
}
|
|
82
|
+
},
|
|
78
83
|
},
|
|
79
84
|
{
|
|
80
85
|
name: 'decryptReportContentContainerArray',
|
|
@@ -84,8 +89,8 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
84
89
|
},
|
|
85
90
|
extract(object) {
|
|
86
91
|
return Promise.resolve(object);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
92
|
+
},
|
|
93
|
+
},
|
|
89
94
|
],
|
|
90
95
|
transforms: [
|
|
91
96
|
{
|
|
@@ -93,7 +98,7 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
93
98
|
direction: 'inbound',
|
|
94
99
|
fn(ctx, object) {
|
|
95
100
|
return Transforms.decryptReportRequest(ctx, object);
|
|
96
|
-
}
|
|
101
|
+
},
|
|
97
102
|
},
|
|
98
103
|
{
|
|
99
104
|
name: 'decryptReportRequestArray',
|
|
@@ -103,22 +108,24 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
103
108
|
return Promise.resolve();
|
|
104
109
|
}
|
|
105
110
|
|
|
106
|
-
return Promise.all(
|
|
107
|
-
|
|
111
|
+
return Promise.all(
|
|
112
|
+
object.body.map((item) => ctx.transform('decryptReportRequest', {body: item}))
|
|
113
|
+
);
|
|
114
|
+
},
|
|
108
115
|
},
|
|
109
116
|
{
|
|
110
117
|
name: 'encryptReportRequest',
|
|
111
118
|
direction: 'outbound',
|
|
112
119
|
fn(ctx, object) {
|
|
113
120
|
return Transforms.encryptReportRequest(ctx, object);
|
|
114
|
-
}
|
|
121
|
+
},
|
|
115
122
|
},
|
|
116
123
|
{
|
|
117
124
|
name: 'decryptReportContent',
|
|
118
125
|
direction: 'inbound',
|
|
119
126
|
fn(ctx, object, reportId) {
|
|
120
127
|
return Transforms.decryptReportContent(ctx, object, reportId);
|
|
121
|
-
}
|
|
128
|
+
},
|
|
122
129
|
},
|
|
123
130
|
{
|
|
124
131
|
name: 'decryptReportContentArray',
|
|
@@ -129,15 +136,19 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
129
136
|
}
|
|
130
137
|
|
|
131
138
|
// Always use the report url as this'll resolve correctly for remote reports
|
|
132
|
-
return Promise.all(
|
|
133
|
-
|
|
139
|
+
return Promise.all(
|
|
140
|
+
object.body.map((item) =>
|
|
141
|
+
ctx.transform('decryptReportContent', {body: item}, object.options.uri)
|
|
142
|
+
)
|
|
143
|
+
);
|
|
144
|
+
},
|
|
134
145
|
},
|
|
135
146
|
{
|
|
136
147
|
name: 'decryptReportContentContainer',
|
|
137
148
|
direction: 'inbound',
|
|
138
149
|
fn(ctx, object) {
|
|
139
150
|
return Transforms.decryptReportContentContainer(ctx, object);
|
|
140
|
-
}
|
|
151
|
+
},
|
|
141
152
|
},
|
|
142
153
|
{
|
|
143
154
|
name: 'decryptReportContentContainerArray',
|
|
@@ -147,11 +158,13 @@ registerInternalPlugin('ediscovery', EDiscovery, {
|
|
|
147
158
|
return Promise.resolve();
|
|
148
159
|
}
|
|
149
160
|
|
|
150
|
-
return Promise.all(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
161
|
+
return Promise.all(
|
|
162
|
+
object.body.map((item) => ctx.transform('decryptReportContentContainer', {body: item}))
|
|
163
|
+
);
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
},
|
|
155
168
|
});
|
|
156
169
|
|
|
157
170
|
export default EDiscovery;
|
package/src/report-request.js
CHANGED
|
@@ -10,7 +10,16 @@
|
|
|
10
10
|
* @returns {Object} ReportRequest - Contains all search parameters
|
|
11
11
|
*/
|
|
12
12
|
class ReportRequest {
|
|
13
|
-
constructor(
|
|
13
|
+
constructor(
|
|
14
|
+
name = '',
|
|
15
|
+
description = '',
|
|
16
|
+
emails = [],
|
|
17
|
+
userIds = [],
|
|
18
|
+
keywords = [],
|
|
19
|
+
encryptionKeyUrl = '',
|
|
20
|
+
spaceNames = [],
|
|
21
|
+
range = {startTime: '2020-01-01T00:00:00', endTime: '2020-01-01T23:59:59'}
|
|
22
|
+
) {
|
|
14
23
|
this.name = name;
|
|
15
24
|
this.description = description;
|
|
16
25
|
this.emails = emails;
|
package/src/retry.js
CHANGED
|
@@ -1,24 +1,33 @@
|
|
|
1
1
|
const retryErrors = [429, 502, 503, 504];
|
|
2
2
|
|
|
3
|
-
async function requestWithRetries(
|
|
3
|
+
async function requestWithRetries(
|
|
4
|
+
ctx,
|
|
5
|
+
func,
|
|
6
|
+
args,
|
|
7
|
+
retryCount = 0,
|
|
8
|
+
retryIntervalInSeconds = 0,
|
|
9
|
+
maxRetries = 3
|
|
10
|
+
) {
|
|
4
11
|
await timeout(retryIntervalInSeconds);
|
|
5
12
|
|
|
6
|
-
return func.apply(ctx, args)
|
|
7
|
-
.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
return func.apply(ctx, args).catch((reason) => {
|
|
14
|
+
if (retryErrors.includes(reason.statusCode) && retryCount < maxRetries) {
|
|
15
|
+
retryCount += 1;
|
|
16
|
+
// eslint-disable-next-line no-shadow
|
|
17
|
+
let retryIntervalInSeconds = (retryCount + 1) ** 2; // 4, 9 and 16 second delays as default
|
|
11
18
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
console.error(`Request #${retryCount} error: ${reason.statusCode}. Attempting retry #${retryCount} in ${retryIntervalInSeconds} seconds`);
|
|
16
|
-
|
|
17
|
-
return requestWithRetries(ctx, func, args, retryCount, retryIntervalInSeconds, maxRetries);
|
|
19
|
+
if (reason.headers && reason.headers['retry-after']) {
|
|
20
|
+
retryIntervalInSeconds = reason.headers['retry-after'];
|
|
18
21
|
}
|
|
22
|
+
console.error(
|
|
23
|
+
`Request #${retryCount} error: ${reason.statusCode}. Attempting retry #${retryCount} in ${retryIntervalInSeconds} seconds`
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
return requestWithRetries(ctx, func, args, retryCount, retryIntervalInSeconds, maxRetries);
|
|
27
|
+
}
|
|
19
28
|
|
|
20
|
-
|
|
21
|
-
|
|
29
|
+
return Promise.reject(reason);
|
|
30
|
+
});
|
|
22
31
|
}
|
|
23
32
|
|
|
24
33
|
function timeout(sec) {
|