@webex/internal-plugin-calendar 3.0.0-beta.42 → 3.0.0-beta.421

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.
@@ -1 +1 @@
1
- {"version":3,"names":["Calendar","WebexPlugin","extend","namespace","registered","register","webex","canAuthorize","logger","error","reject","Error","info","resolve","internal","device","then","mercury","connect","listenForEvents","trigger","CALENDAR_REGISTERED","catch","message","unregister","stopListeningForEvents","disconnect","CALENDAR_UNREGISTERED","on","envelope","_handleCreate","data","_handleUpdate","_handleDelete","off","id","CalendarCollection","set","calendarMeetingExternal","CALENDAR_UPDATED","get","CALENDAR_CREATE","item","remove","CALENDAR_DELETE","syncCalendar","options","fromDate","config","toDate","list","res","setAll","getAll","getByType","key","value","includes","getBy","processMeetingEvent","event","transform","getParticipants","request","method","service","resource","btoa","getNotes","qs","meetingObjects","body","items","promises","forEach","meeting","encryptedNotes","push","notesResponse","encryptedParticipants","all"],"sources":["calendar.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * Calendar Item Create Event\n * Emitted when a calendar item has been added\n * @event calendar:meeting:create\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been updated\n * @event calendar:meeting:update\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been deleted\n * @event calendar:meeting:delete\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:registered\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:unregistered\n * @instance\n * @memberof Calendar\n */\n\nimport btoa from 'btoa';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CalendarCollection from './collection';\nimport {\n CALENDAR_REGISTERED,\n CALENDAR_UNREGISTERED,\n CALENDAR_DELETE,\n CALENDAR_CREATE,\n CALENDAR_UPDATED,\n} from './constants';\n\nconst Calendar = WebexPlugin.extend({\n namespace: 'Calendar',\n\n /**\n * registered value indicating events registration is successful\n * @instance\n * @type {Boolean}\n * @memberof Calendar\n */\n registered: false,\n\n /**\n * Explicitly sets up the calendar plugin by registering\n * the device, connecting to mercury, and listening for calendar events.\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n register() {\n if (!this.webex.canAuthorize) {\n this.logger.error('calendar->register#ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n this.logger.info('calendar->register#INFO, Calendar plugin already registered');\n\n return Promise.resolve();\n }\n\n return this.webex.internal.device\n .register()\n .then(() => this.webex.internal.mercury.connect())\n .then(() => {\n this.listenForEvents();\n this.trigger(CALENDAR_REGISTERED);\n this.registered = true;\n })\n .catch((error) => {\n this.logger.error(`calendar->register#ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Explicitly tears down the calendar plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to calendar events\n *\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n unregister() {\n if (!this.registered) {\n this.logger.info('calendar->unregister#INFO, Calendar plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury\n .disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n this.trigger(CALENDAR_UNREGISTERED);\n this.registered = false;\n });\n },\n\n /**\n * registers for calendar events through mercury\n * @returns {undefined}\n * @private\n */\n listenForEvents() {\n // Calendar mercury events listener\n this.webex.internal.mercury.on('event:calendar.meeting.create', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.create.minimal', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update.minimal', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.delete', (envelope) => {\n this._handleDelete(envelope.data);\n });\n },\n\n /**\n * unregisteres all the calendar events from mercury\n * @returns {undefined}\n * @private\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off('event:calendar.meeting.create');\n this.webex.internal.mercury.off('event:calendar.meeting.create.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.update');\n this.webex.internal.mercury.off('event:calendar.meeting.update.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.delete');\n },\n\n /**\n * handles update events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleUpdate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_UPDATED, CalendarCollection.get(id));\n },\n\n /**\n * handles create events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleCreate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_CREATE, CalendarCollection.get(id));\n },\n\n /**\n * handles delete events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleDelete(data) {\n const item = CalendarCollection.remove(data.calendarMeetingExternal.id);\n\n this.trigger(CALENDAR_DELETE, item);\n },\n\n /**\n * Retrieves a collection of calendars based on the request parameters\n * Defaults to 1 day before and 7 days ahead\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of calendars\n */\n syncCalendar(options = {fromDate: this.config.fromDate, toDate: this.config.toDate}) {\n return this.list({fromDate: options.fromDate, toDate: options.toDate}).then((res) => {\n CalendarCollection.setAll(res);\n\n return CalendarCollection.getAll();\n });\n },\n /**\n * get the calendar item that has a matching value\n * @param {String} key meeting property\n * @param {Any} value the meeting property to match\n * @returns {Object}\n */\n getByType(key, value) {\n if (['spaceURI', 'spaceMeetURL', 'conversationId'].includes(key)) {\n return CalendarCollection.getBy(key, value);\n }\n throw new Error('key must be one of, spaceURI, spaceMeetURL, or conversationId');\n },\n\n /**\n * gets all the calendar items that have been populated\n * @returns {Object}\n */\n getAll() {\n return CalendarCollection.getAll();\n },\n\n /**\n * Decrypts an encrypted incoming calendar event\n * @param {Object} event\n * @returns {Promise} Resolves with a decrypted calendar event\n */\n processMeetingEvent(event) {\n return this.webex.transform('inbound', event).then(() => event);\n },\n\n /**\n * Retrieves an array of meeting participants for the meeting id\n * @param {String} id\n * @returns {Promise} Resolves with an object of meeting participants\n */\n getParticipants(id) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: `calendarEvents/${btoa(id)}/participants`,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {String} id\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotes(id) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: `calendarEvents/${btoa(id)}/notes`,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of meetings\n */\n list(options) {\n options = options || {};\n\n return this.webex\n .request({\n method: 'GET',\n service: 'calendar',\n resource: 'calendarEvents',\n qs: options,\n })\n .then((res) => {\n const meetingObjects = res.body.items;\n const promises = [];\n\n meetingObjects.forEach((meeting) => {\n if (!meeting.encryptedNotes) {\n promises.push(\n this.getNotes(meeting.id).then((notesResponse) => {\n meeting.encryptedNotes = notesResponse.body && notesResponse.body.encryptedNotes;\n })\n );\n }\n\n if (!meeting.encryptedParticipants) {\n promises.push(\n this.getParticipants(meeting.id).then((notesResponse) => {\n meeting.encryptedParticipants = notesResponse.body.encryptedParticipants;\n })\n );\n }\n });\n\n return Promise.all(promises).then(() => meetingObjects);\n });\n },\n});\n\nexport default Calendar;\n"],"mappings":"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"}
1
+ {"version":3,"names":["Calendar","WebexPlugin","extend","namespace","registered","rpcEventRequests","encryptionKeyUrl","prefetchEncryptionKey","webex","canAuthorize","listenToOnce","credentials","isUnverifiedGuest","internal","encryption","kms","createUnboundKeys","count","then","keys","key","uri","logger","info","getKey","onBehalfOf","retrievedKey","initialize","register","error","reject","Error","resolve","device","mercury","connect","listenForEvents","trigger","CALENDAR_REGISTERED","catch","message","unregister","stopListeningForEvents","disconnect","CALENDAR_UNREGISTERED","on","envelope","_handleCreate","data","_handleUpdate","_handleDelete","_handleFreeBusy","off","id","CalendarCollection","set","calendarMeetingExternal","CALENDAR_UPDATED","get","CALENDAR_CREATE","item","remove","CALENDAR_DELETE","DecryptHelper","decryptFreeBusyResponse","response","calendarFreeBusyScheduleResponse","requestId","log","syncCalendar","options","fromDate","config","toDate","list","res","setAll","getAll","getByType","value","includes","getBy","processMeetingEvent","event","transform","getParticipants","participantsUrl","request","method","getNotesByUrl","notesUrl","getNotes","service","resource","base64","encode","qs","meetingObjects","body","items","promises","forEach","meeting","encryptedParticipants","push","notesResponse","all","createCalendarEvent","query","EncryptHelper","encryptCalendarEventRequest","updateCalendarEvent","deleteCalendarEvent","getSchedulerData","decryptSchedulerDataResponse","getFreeBusy","encryptFreeBusyRequest"],"sources":["calendar.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * Calendar Item Create Event\n * Emitted when a calendar item has been added\n * @event calendar:meeting:create\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been updated\n * @event calendar:meeting:update\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been deleted\n * @event calendar:meeting:delete\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:registered\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:unregistered\n * @instance\n * @memberof Calendar\n */\nimport {isArray} from 'lodash';\nimport {base64} from '@webex/common';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CalendarCollection from './collection';\nimport {\n CALENDAR_REGISTERED,\n CALENDAR_UNREGISTERED,\n CALENDAR_DELETE,\n CALENDAR_CREATE,\n CALENDAR_UPDATED,\n} from './constants';\n\nimport EncryptHelper from './calendar.encrypt.helper';\nimport DecryptHelper from './calendar.decrypt.helper';\n\nconst Calendar = WebexPlugin.extend({\n namespace: 'Calendar',\n\n /**\n * registered value indicating events registration is successful\n * @instance\n * @type {Boolean}\n * @memberof Calendar\n */\n registered: false,\n\n /**\n * Cache all rpc event request locally\n * */\n rpcEventRequests: [],\n\n /**\n * Cache KMS encryptionKeyUrl\n * */\n encryptionKeyUrl: null,\n\n /**\n * Pre-fetch a KMS encryption key url to improve performance.\n * Waits for the user to be authorized and skips if an unverified guest.\n * @private\n * @returns {void}\n */\n prefetchEncryptionKey() {\n if (!this.webex.canAuthorize) {\n this.listenToOnce(this.webex, 'change:canAuthorize', () => {\n this.prefetchEncryptionKey();\n });\n\n return;\n }\n\n if (this.webex.credentials.isUnverifiedGuest) {\n return;\n }\n\n this.webex.internal.encryption.kms.createUnboundKeys({count: 1}).then((keys) => {\n const key = isArray(keys) ? keys[0] : keys;\n this.encryptionKeyUrl = key ? key.uri : null;\n this.logger.info('calendar->bind a KMS encryption key url');\n this.webex.internal.encryption\n .getKey(this.encryptionKeyUrl, {onBehalfOf: null})\n .then((retrievedKey) => {\n this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;\n this.logger.info('calendar->retrieve the KMS encryption key url and cache it');\n });\n });\n },\n\n /**\n * WebexPlugin initialize method. This triggers once Webex has completed its\n * initialization workflow.\n *\n * If the plugin is meant to perform startup actions, place them in this\n * `initialize()` method instead of the `constructor()` method.\n * @private\n * @returns {void}\n */\n initialize() {\n // Used to perform actions after webex is fully qualified and ready for\n // operation.\n this.listenToOnce(this.webex, 'ready', () => {\n this.prefetchEncryptionKey();\n });\n },\n\n /**\n * Explicitly sets up the calendar plugin by registering\n * the device, connecting to mercury, and listening for calendar events.\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n register() {\n if (!this.webex.canAuthorize) {\n this.logger.error('calendar->register#ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n this.logger.info('calendar->register#INFO, Calendar plugin already registered');\n\n return Promise.resolve();\n }\n\n return this.webex.internal.device\n .register()\n .then(() => this.webex.internal.mercury.connect())\n .then(() => {\n this.listenForEvents();\n this.trigger(CALENDAR_REGISTERED);\n this.registered = true;\n })\n .catch((error) => {\n this.logger.error(`calendar->register#ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Explicitly tears down the calendar plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to calendar events\n *\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n unregister() {\n if (!this.registered) {\n this.logger.info('calendar->unregister#INFO, Calendar plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury\n .disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n this.trigger(CALENDAR_UNREGISTERED);\n this.registered = false;\n });\n },\n\n /**\n * registers for calendar events through mercury\n * @returns {undefined}\n * @private\n */\n listenForEvents() {\n // Calendar mercury events listener\n this.webex.internal.mercury.on('event:calendar.meeting.create', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.create.minimal', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update.minimal', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.delete', (envelope) => {\n this._handleDelete(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.free_busy', (envelope) => {\n this._handleFreeBusy(envelope.data);\n });\n },\n\n /**\n * unregisteres all the calendar events from mercury\n * @returns {undefined}\n * @private\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off('event:calendar.meeting.create');\n this.webex.internal.mercury.off('event:calendar.meeting.create.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.update');\n this.webex.internal.mercury.off('event:calendar.meeting.update.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.delete');\n this.webex.internal.mercury.off('event:calendar.free_busy');\n },\n\n /**\n * handles update events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleUpdate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_UPDATED, CalendarCollection.get(id));\n },\n\n /**\n * handles create events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleCreate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_CREATE, CalendarCollection.get(id));\n },\n\n /**\n * handles delete events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleDelete(data) {\n const item = CalendarCollection.remove(data.calendarMeetingExternal.id);\n\n this.trigger(CALENDAR_DELETE, item);\n },\n\n /**\n * handles free_busy events\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleFreeBusy(data) {\n DecryptHelper.decryptFreeBusyResponse(this, data).then(() => {\n let response = {};\n if (data && data.calendarFreeBusyScheduleResponse) {\n response = data.calendarFreeBusyScheduleResponse;\n }\n if (response && response.requestId && response.requestId in this.rpcEventRequests) {\n this.logger.log(\n `webex.internal.calendar - receive requests, requestId: ${response.requestId}`\n );\n delete response.encryptionKeyUrl;\n const {resolve} = this.rpcEventRequests[response.requestId];\n resolve(response);\n delete this.rpcEventRequests[response.requestId];\n } else {\n this.logger.log('webex.internal.calendar - receive other requests.');\n }\n });\n },\n\n /**\n * Retrieves a collection of calendars based on the request parameters\n * Defaults to 1 day before and 7 days ahead\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of calendars\n */\n syncCalendar(options = {fromDate: this.config.fromDate, toDate: this.config.toDate}) {\n return this.list({fromDate: options.fromDate, toDate: options.toDate}).then((res) => {\n CalendarCollection.setAll(res);\n\n return CalendarCollection.getAll();\n });\n },\n /**\n * get the calendar item that has a matching value\n * @param {String} key meeting property\n * @param {Any} value the meeting property to match\n * @returns {Object}\n */\n getByType(key, value) {\n if (['spaceURI', 'spaceMeetURL', 'conversationId'].includes(key)) {\n return CalendarCollection.getBy(key, value);\n }\n throw new Error('key must be one of, spaceURI, spaceMeetURL, or conversationId');\n },\n\n /**\n * gets all the calendar items that have been populated\n * @returns {Object}\n */\n getAll() {\n return CalendarCollection.getAll();\n },\n\n /**\n * Decrypts an encrypted incoming calendar event\n * @param {Object} event\n * @returns {Promise} Resolves with a decrypted calendar event\n */\n processMeetingEvent(event) {\n return this.webex.transform('inbound', event).then(() => event);\n },\n\n /**\n * Retrieves an array of meeting participants for the meeting participantsUrl\n * @param {String} participantsUrl\n * @returns {Promise} Resolves with an object of meeting participants\n */\n getParticipants(participantsUrl) {\n return this.request({\n method: 'GET',\n uri: participantsUrl,\n });\n },\n\n /**\n * get meeting notes using notesUrl from meeting object.\n * @param {String} notesUrl\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotesByUrl(notesUrl) {\n return this.request({\n method: 'GET',\n uri: notesUrl,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {String} id\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotes(id) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: `calendarEvents/${base64.encode(id)}/notes`,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of meetings\n */\n list(options) {\n options = options || {};\n\n return this.webex\n .request({\n method: 'GET',\n service: 'calendar',\n resource: 'calendarEvents',\n qs: options,\n })\n .then((res) => {\n const meetingObjects = res.body.items;\n const promises = [];\n\n meetingObjects.forEach((meeting) => {\n if (!meeting.encryptedParticipants) {\n promises.push(\n this.getParticipants(meeting.participantsUrl).then((notesResponse) => {\n meeting.encryptedParticipants = notesResponse.body.encryptedParticipants;\n })\n );\n }\n });\n\n return Promise.all(promises).then(() => meetingObjects);\n });\n },\n\n /**\n * Create calendar event\n * @param {object} [data] meeting payload data\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with creating calendar event response\n * */\n createCalendarEvent(data, query) {\n return EncryptHelper.encryptCalendarEventRequest(this, data).then(() =>\n this.request({\n method: 'POST',\n service: 'calendar',\n body: data,\n resource: 'calendarEvents/sync',\n qs: query || {},\n })\n );\n },\n\n /**\n * Update calendar event\n * @param {string} [id] calendar event id\n * @param {object} [data] meeting payload data\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with updating calendar event response\n * */\n updateCalendarEvent(id, data, query) {\n return EncryptHelper.encryptCalendarEventRequest(this, data).then(() =>\n this.request({\n method: 'PATCH',\n service: 'calendar',\n body: data,\n resource: `calendarEvents/${base64.encode(id)}/sync`,\n qs: query || {},\n })\n );\n },\n\n /**\n * Delete calendar event\n * @param {string} [id] calendar event id\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with deleting calendar event response\n * */\n deleteCalendarEvent(id, query) {\n return this.request({\n method: 'DELETE',\n service: 'calendar',\n resource: `calendarEvents/${base64.encode(id)}/sync`,\n qs: query || {},\n });\n },\n\n /**\n * @typedef QuerySchedulerDataOptions\n * @param {string} [siteName] it is site full url, must have. Example: ccctest.dmz.webex.com\n * @param {string} [id] it is seriesOrOccurrenceId. If present, the series/occurrence meeting ID to fetch data for.\n * Example: 040000008200E00074C5B7101A82E008000000004A99F11A0841D9010000000000000000100000009EE499D4A71C1A46B51494C70EC7BFE5\n * @param {string} [clientMeetingId] If present, the client meeting UUID to fetch data for.\n * Example: 7f318aa9-887c-6e94-802a-8dc8e6eb1a0a\n * @param {string} [scheduleTemplateId] it template id.\n * @param {string} [sessionTypeId] it session type id.\n * @param {string} [organizerCIUserId] required in schedule-on-behalf case. It is the organizer's CI UUID.\n * @param {boolean} [usmPreference]\n * @param {string} [webexMeetingId] webex side meeting UUID\n * @param {string} [eventId] event ID.\n * @param {string} [icalUid] icalendar UUID.\n * @param {string} [thirdPartyType] third part type, such as: Microsoft\n */\n /**\n * Get scheduler data from calendar service\n * @param {QuerySchedulerDataOptions} [query] the command parameters for fetching scheduler data.\n * @returns {Promise} Resolves with a decrypted scheduler data\n * */\n getSchedulerData(query) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: 'schedulerData',\n qs: query || {},\n }).then((response) => {\n return DecryptHelper.decryptSchedulerDataResponse(this, response.body).then(() => response);\n });\n },\n\n /**\n * Get free busy status from calendar service\n * @param {Object} [data] the command parameters for fetching free busy status.\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with a decrypted response\n * */\n getFreeBusy(data, query) {\n return EncryptHelper.encryptFreeBusyRequest(this, data)\n .then(() => {\n return this.request({\n method: 'POST',\n service: 'calendar',\n body: data,\n resource: 'freebusy',\n qs: query || {},\n });\n })\n .then(() => {\n return new Promise((resolve, reject) => {\n this.rpcEventRequests[data.requestId] = {resolve, reject};\n });\n })\n .catch((error) => {\n throw error;\n });\n },\n});\n\nexport default Calendar;\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ var _config = _interopRequireDefault(require("./config"));
30
30
  name: 'transformMeetingNotes',
31
31
  direction: 'inbound',
32
32
  test: function test(ctx, response) {
33
- return _promise.default.resolve((0, _has2.default)(response, 'body.encryptedNotes'));
33
+ return _promise.default.resolve((0, _has2.default)(response, 'body.encryptedNotes') && !(response.options && response.options.service === 'calendar' && response.options.method === 'GET' && response.options.resource === 'schedulerData'));
34
34
  },
35
35
  extract: function extract(response) {
36
36
  return _promise.default.resolve(response.body);
@@ -39,7 +39,7 @@ var _config = _interopRequireDefault(require("./config"));
39
39
  name: 'transformMeetingParticipants',
40
40
  direction: 'inbound',
41
41
  test: function test(ctx, response) {
42
- return _promise.default.resolve((0, _has2.default)(response, 'body.encryptedParticipants'));
42
+ return _promise.default.resolve((0, _has2.default)(response, 'body.encryptedParticipants') && !(response.options && response.options.service === 'calendar' && response.options.method === 'GET' && response.options.resource === 'schedulerData'));
43
43
  },
44
44
  extract: function extract(response) {
45
45
  return _promise.default.resolve(response.body);
@@ -57,7 +57,7 @@ var _config = _interopRequireDefault(require("./config"));
57
57
  name: 'transformMeeting',
58
58
  direction: 'inbound',
59
59
  test: function test(ctx, response) {
60
- return _promise.default.resolve((0, _has2.default)(response, 'body.seriesId'));
60
+ return _promise.default.resolve((0, _has2.default)(response, 'body.seriesId') && !(response.options && response.options.service === 'calendar' && response.options.method === 'GET' && response.options.resource === 'schedulerData'));
61
61
  },
62
62
  extract: function extract(response) {
63
63
  return _promise.default.resolve(response.body);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["registerInternalPlugin","Calendar","config","payloadTransformer","predicates","name","direction","test","ctx","response","resolve","extract","body","items","calendarMeetingExternal","transforms","fn","array","all","map","item","transform","object","encryptionKeyUrl","decryptedParticipants","encryptedParticipants","participant","decryptedMeetingJoinInfo","meetingJoinInfo","decryptedOrganizer","encryptedOrganizer","concat"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport '@webex/internal-plugin-device';\nimport '@webex/internal-plugin-encryption';\nimport '@webex/internal-plugin-conversation';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\nimport {has} from 'lodash';\n\nimport Calendar from './calendar';\nimport config from './config';\n\nregisterInternalPlugin('calendar', Calendar, {\n config,\n payloadTransformer: {\n predicates: [\n {\n name: 'transformMeetingNotes',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'body.encryptedNotes'));\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'transformMeetingParticipants',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'body.encryptedParticipants'));\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'transformMeetingArray',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'body.items[0].seriesId'));\n },\n extract(response) {\n return Promise.resolve(response.body.items);\n },\n },\n {\n name: 'transformMeeting',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'body.seriesId'));\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'transformMeeting',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'calendarMeetingExternal'));\n },\n extract(response) {\n return Promise.resolve(response.calendarMeetingExternal);\n },\n },\n ],\n transforms: [\n {\n name: 'transformMeetingArray',\n fn(ctx, array) {\n return Promise.all(array.map((item) => ctx.transform('transformMeeting', item)));\n },\n },\n {\n name: 'transformMeeting',\n direction: 'inbound',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.encryptionKeyUrl) {\n return Promise.resolve();\n }\n\n // Decrypt participant properties if meeting object contains participants\n const decryptedParticipants = object.encryptedParticipants\n ? object.encryptedParticipants.map((participant) =>\n Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'encryptedEmailAddress',\n object.encryptionKeyUrl,\n participant\n ),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedName',\n object.encryptionKeyUrl,\n participant\n ),\n ])\n )\n : [];\n\n // Decrypt meetingJoinInfo properties if meeting object contains meetingJoinInfo\n const decryptedMeetingJoinInfo = object.meetingJoinInfo\n ? Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'meetingJoinURI',\n object.encryptionKeyUrl,\n object.meetingJoinInfo\n ),\n ctx.transform(\n 'decryptTextProp',\n 'meetingJoinURL',\n object.encryptionKeyUrl,\n object.meetingJoinInfo\n ),\n ])\n : [];\n\n const decryptedOrganizer = object.encryptedOrganizer\n ? Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'encryptedEmailAddress',\n object.encryptionKeyUrl,\n object.encryptedOrganizer\n ),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedName',\n object.encryptionKeyUrl,\n object.encryptedOrganizer\n ),\n ])\n : [];\n\n return Promise.all(\n [\n ctx.transform('decryptTextProp', 'encryptedSubject', object.encryptionKeyUrl, object),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedLocation',\n object.encryptionKeyUrl,\n object\n ),\n ctx.transform('decryptTextProp', 'encryptedNotes', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'webexURI', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'webexURL', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'spaceMeetURL', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'spaceURI', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'spaceURL', object.encryptionKeyUrl, object),\n ].concat(decryptedOrganizer, decryptedParticipants, decryptedMeetingJoinInfo)\n );\n },\n },\n {\n name: 'transformMeetingNotes',\n direction: 'inbound',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.encryptionKeyUrl) {\n return Promise.resolve();\n }\n\n return Promise.all([\n ctx.transform('decryptTextProp', 'encryptedNotes', object.encryptionKeyUrl, object),\n ]);\n },\n },\n {\n name: 'transformMeetingParticipants',\n direction: 'inbound',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.encryptionKeyUrl || !object.encryptedParticipants) {\n return Promise.resolve();\n }\n\n // Decrypt participant properties\n const decryptedParticipants = object.encryptedParticipants.map((participant) =>\n Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'encryptedEmailAddress',\n object.encryptionKeyUrl,\n participant\n ),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedName',\n object.encryptionKeyUrl,\n participant\n ),\n ])\n );\n\n return Promise.all(decryptedParticipants);\n },\n },\n ],\n },\n});\n\nexport {default} from './calendar';\n"],"mappings":"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"}
1
+ {"version":3,"names":["registerInternalPlugin","Calendar","config","payloadTransformer","predicates","name","direction","test","ctx","response","resolve","options","service","method","resource","extract","body","items","calendarMeetingExternal","transforms","fn","array","all","map","item","transform","object","encryptionKeyUrl","decryptedParticipants","encryptedParticipants","participant","decryptedMeetingJoinInfo","meetingJoinInfo","decryptedOrganizer","encryptedOrganizer","concat"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport '@webex/internal-plugin-device';\nimport '@webex/internal-plugin-encryption';\nimport '@webex/internal-plugin-conversation';\n\nimport {registerInternalPlugin} from '@webex/webex-core';\nimport {has} from 'lodash';\n\nimport Calendar from './calendar';\nimport config from './config';\n\nregisterInternalPlugin('calendar', Calendar, {\n config,\n payloadTransformer: {\n predicates: [\n {\n name: 'transformMeetingNotes',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(\n has(response, 'body.encryptedNotes') &&\n !(\n response.options &&\n response.options.service === 'calendar' &&\n response.options.method === 'GET' &&\n response.options.resource === 'schedulerData'\n )\n );\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'transformMeetingParticipants',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(\n has(response, 'body.encryptedParticipants') &&\n !(\n response.options &&\n response.options.service === 'calendar' &&\n response.options.method === 'GET' &&\n response.options.resource === 'schedulerData'\n )\n );\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'transformMeetingArray',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'body.items[0].seriesId'));\n },\n extract(response) {\n return Promise.resolve(response.body.items);\n },\n },\n {\n name: 'transformMeeting',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(\n has(response, 'body.seriesId') &&\n !(\n response.options &&\n response.options.service === 'calendar' &&\n response.options.method === 'GET' &&\n response.options.resource === 'schedulerData'\n )\n );\n },\n extract(response) {\n return Promise.resolve(response.body);\n },\n },\n {\n name: 'transformMeeting',\n direction: 'inbound',\n test(ctx, response) {\n return Promise.resolve(has(response, 'calendarMeetingExternal'));\n },\n extract(response) {\n return Promise.resolve(response.calendarMeetingExternal);\n },\n },\n ],\n transforms: [\n {\n name: 'transformMeetingArray',\n fn(ctx, array) {\n return Promise.all(array.map((item) => ctx.transform('transformMeeting', item)));\n },\n },\n {\n name: 'transformMeeting',\n direction: 'inbound',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.encryptionKeyUrl) {\n return Promise.resolve();\n }\n\n // Decrypt participant properties if meeting object contains participants\n const decryptedParticipants = object.encryptedParticipants\n ? object.encryptedParticipants.map((participant) =>\n Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'encryptedEmailAddress',\n object.encryptionKeyUrl,\n participant\n ),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedName',\n object.encryptionKeyUrl,\n participant\n ),\n ])\n )\n : [];\n\n // Decrypt meetingJoinInfo properties if meeting object contains meetingJoinInfo\n const decryptedMeetingJoinInfo = object.meetingJoinInfo\n ? Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'meetingJoinURI',\n object.encryptionKeyUrl,\n object.meetingJoinInfo\n ),\n ctx.transform(\n 'decryptTextProp',\n 'meetingJoinURL',\n object.encryptionKeyUrl,\n object.meetingJoinInfo\n ),\n ])\n : [];\n\n const decryptedOrganizer = object.encryptedOrganizer\n ? Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'encryptedEmailAddress',\n object.encryptionKeyUrl,\n object.encryptedOrganizer\n ),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedName',\n object.encryptionKeyUrl,\n object.encryptedOrganizer\n ),\n ])\n : [];\n\n return Promise.all(\n [\n ctx.transform('decryptTextProp', 'encryptedSubject', object.encryptionKeyUrl, object),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedLocation',\n object.encryptionKeyUrl,\n object\n ),\n ctx.transform('decryptTextProp', 'encryptedNotes', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'webexURI', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'webexURL', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'spaceMeetURL', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'spaceURI', object.encryptionKeyUrl, object),\n ctx.transform('decryptTextProp', 'spaceURL', object.encryptionKeyUrl, object),\n ].concat(decryptedOrganizer, decryptedParticipants, decryptedMeetingJoinInfo)\n );\n },\n },\n {\n name: 'transformMeetingNotes',\n direction: 'inbound',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.encryptionKeyUrl) {\n return Promise.resolve();\n }\n\n return Promise.all([\n ctx.transform('decryptTextProp', 'encryptedNotes', object.encryptionKeyUrl, object),\n ]);\n },\n },\n {\n name: 'transformMeetingParticipants',\n direction: 'inbound',\n fn(ctx, object) {\n if (!object) {\n return Promise.resolve();\n }\n\n if (!object.encryptionKeyUrl || !object.encryptedParticipants) {\n return Promise.resolve();\n }\n\n // Decrypt participant properties\n const decryptedParticipants = object.encryptedParticipants.map((participant) =>\n Promise.all([\n ctx.transform(\n 'decryptTextProp',\n 'encryptedEmailAddress',\n object.encryptionKeyUrl,\n participant\n ),\n ctx.transform(\n 'decryptTextProp',\n 'encryptedName',\n object.encryptionKeyUrl,\n participant\n ),\n ])\n );\n\n return Promise.all(decryptedParticipants);\n },\n },\n ],\n },\n});\n\nexport {default} from './calendar';\n"],"mappings":"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"}
package/package.json CHANGED
@@ -19,21 +19,19 @@
19
19
  "envify"
20
20
  ]
21
21
  },
22
- "version": "3.0.0-beta.42",
22
+ "version": "3.0.0-beta.421",
23
23
  "devDependencies": {
24
- "@webex/test-helper-chai": "3.0.0-beta.42",
25
- "@webex/test-helper-mock-webex": "3.0.0-beta.42",
26
- "@webex/test-helper-retry": "3.0.0-beta.42",
27
- "@webex/test-helper-test-users": "3.0.0-beta.42",
24
+ "@webex/test-helper-chai": "3.0.0-beta.421",
25
+ "@webex/test-helper-mock-webex": "3.0.0-beta.421",
26
+ "@webex/test-helper-retry": "3.0.0-beta.421",
27
+ "@webex/test-helper-test-users": "3.0.0-beta.421",
28
28
  "sinon": "^9.2.4"
29
29
  },
30
30
  "dependencies": {
31
- "@webex/internal-plugin-calendar": "3.0.0-beta.42",
32
- "@webex/internal-plugin-conversation": "3.0.0-beta.42",
33
- "@webex/internal-plugin-device": "3.0.0-beta.42",
34
- "@webex/internal-plugin-encryption": "3.0.0-beta.42",
35
- "@webex/webex-core": "3.0.0-beta.42",
36
- "btoa": "^1.2.1",
31
+ "@webex/internal-plugin-conversation": "3.0.0-beta.421",
32
+ "@webex/internal-plugin-device": "3.0.0-beta.421",
33
+ "@webex/internal-plugin-encryption": "3.0.0-beta.421",
34
+ "@webex/webex-core": "3.0.0-beta.421",
37
35
  "lodash": "^4.17.21",
38
36
  "uuid": "^3.3.2"
39
37
  }
@@ -0,0 +1,121 @@
1
+ const _decryptTextProp = (ctx, name, key, object) => {
2
+ if (!object[name]) {
3
+ return Promise.resolve();
4
+ }
5
+
6
+ return ctx.webex.internal.encryption
7
+ .decryptText(key.uri || key, object[name])
8
+ .then((plaintext) => {
9
+ object[name] = plaintext;
10
+ });
11
+ };
12
+
13
+ const DecryptHelper = {
14
+ /**
15
+ * Decrypt scheduler data response
16
+ * @param {object} [ctx] context
17
+ * @param {object} [data] scheduler data response
18
+ * @returns {Promise} Resolves with decrypted response
19
+ * */
20
+ decryptSchedulerDataResponse: (ctx, data) => {
21
+ if (!data) {
22
+ return Promise.resolve();
23
+ }
24
+
25
+ if (!data.encryptionKeyUrl) {
26
+ return Promise.resolve();
27
+ }
28
+
29
+ // Decrypt participant properties if meeting object contains participants
30
+ const decryptedParticipants = data.encryptedParticipants
31
+ ? data.encryptedParticipants.map((participant) =>
32
+ Promise.all([
33
+ _decryptTextProp(ctx, 'encryptedEmailAddress', data.encryptionKeyUrl, participant),
34
+ _decryptTextProp(ctx, 'encryptedName', data.encryptionKeyUrl, participant),
35
+ ])
36
+ )
37
+ : [];
38
+
39
+ // Decrypt encryptedScheduleFor properties if meeting object contains SOB
40
+ const decryptedScheduleFor = Promise.all(
41
+ Object.values(data.encryptedScheduleFor || {}).flatMap((item) => [
42
+ _decryptTextProp(ctx, 'encryptedEmail', data.encryptionKeyUrl, item),
43
+ _decryptTextProp(ctx, 'encryptedDisplayName', data.encryptionKeyUrl, item),
44
+ ])
45
+ );
46
+
47
+ // Decrypt meetingJoinInfo properties if meeting object contains meetingJoinInfo
48
+ const decryptedMeetingJoinInfo = data.meetingJoinInfo
49
+ ? Promise.all([
50
+ _decryptTextProp(ctx, 'meetingJoinURI', data.encryptionKeyUrl, data.meetingJoinInfo),
51
+ _decryptTextProp(ctx, 'meetingJoinURL', data.encryptionKeyUrl, data.meetingJoinInfo),
52
+ ])
53
+ : [];
54
+
55
+ const decryptedOrganizer = data.encryptedOrganizer
56
+ ? Promise.all([
57
+ _decryptTextProp(
58
+ ctx,
59
+ 'encryptedEmailAddress',
60
+ data.encryptionKeyUrl,
61
+ data.encryptedOrganizer
62
+ ),
63
+ _decryptTextProp(ctx, 'encryptedName', data.encryptionKeyUrl, data.encryptedOrganizer),
64
+ ])
65
+ : [];
66
+
67
+ return Promise.all(
68
+ [
69
+ _decryptTextProp(ctx, 'encryptedSubject', data.encryptionKeyUrl, data),
70
+ _decryptTextProp(ctx, 'encryptedLocation', data.encryptionKeyUrl, data),
71
+ _decryptTextProp(ctx, 'encryptedNotes', data.encryptionKeyUrl, data),
72
+ _decryptTextProp(ctx, 'webexURI', data.encryptionKeyUrl, data),
73
+ _decryptTextProp(ctx, 'webexURL', data.encryptionKeyUrl, data),
74
+ _decryptTextProp(ctx, 'spaceMeetURL', data.encryptionKeyUrl, data),
75
+ _decryptTextProp(ctx, 'spaceURI', data.encryptionKeyUrl, data),
76
+ _decryptTextProp(ctx, 'spaceURL', data.encryptionKeyUrl, data),
77
+ ].concat(
78
+ decryptedOrganizer,
79
+ decryptedParticipants,
80
+ decryptedScheduleFor,
81
+ decryptedMeetingJoinInfo
82
+ )
83
+ );
84
+ },
85
+ /**
86
+ * Decrypt free-busy response
87
+ * @param {object} [ctx] context
88
+ * @param {object} [data] free-busy response
89
+ * @returns {Promise} Resolves with decrypted response
90
+ * */
91
+ decryptFreeBusyResponse: (ctx, data) => {
92
+ if (!data) {
93
+ return Promise.resolve();
94
+ }
95
+
96
+ if (!data.calendarFreeBusyScheduleResponse) {
97
+ return Promise.resolve();
98
+ }
99
+
100
+ if (!data.calendarFreeBusyScheduleResponse.encryptionKeyUrl) {
101
+ return Promise.resolve();
102
+ }
103
+
104
+ const calendarFreeBusyItems = data.calendarFreeBusyScheduleResponse.calendarFreeBusyItems
105
+ ? data.calendarFreeBusyScheduleResponse.calendarFreeBusyItems.map((calendarFreeBusyItem) =>
106
+ Promise.all([
107
+ _decryptTextProp(
108
+ ctx,
109
+ 'email',
110
+ data.calendarFreeBusyScheduleResponse.encryptionKeyUrl,
111
+ calendarFreeBusyItem
112
+ ),
113
+ ])
114
+ )
115
+ : [];
116
+
117
+ return Promise.all([].concat(calendarFreeBusyItems));
118
+ },
119
+ };
120
+
121
+ export default DecryptHelper;
@@ -0,0 +1,98 @@
1
+ import {isArray} from 'lodash';
2
+
3
+ const _encryptTextProp = (ctx, name, key, object) => {
4
+ if (!object[name]) {
5
+ return Promise.resolve();
6
+ }
7
+
8
+ return ctx.webex.internal.encryption
9
+ .encryptText(key.uri || key, object[name])
10
+ .then((ciphertext) => {
11
+ object[name] = ciphertext;
12
+ });
13
+ };
14
+
15
+ const _encryptCalendarEventPayload = (data, ctx) => {
16
+ Object.assign(data, {encryptionKeyUrl: ctx.encryptionKeyUrl});
17
+
18
+ const encryptedAttendees = data.attendees
19
+ ? data.attendees.map((attendee) =>
20
+ Promise.all([
21
+ _encryptTextProp(ctx, 'displayName', data.encryptionKeyUrl, attendee),
22
+ _encryptTextProp(ctx, 'email', data.encryptionKeyUrl, attendee),
23
+ ])
24
+ )
25
+ : [];
26
+
27
+ return Promise.all(
28
+ [
29
+ _encryptTextProp(ctx, 'subject', data.encryptionKeyUrl, data),
30
+ _encryptTextProp(ctx, 'notes', data.encryptionKeyUrl, data),
31
+ _encryptTextProp(ctx, 'webexOptions', data.encryptionKeyUrl, data),
32
+ ].concat([encryptedAttendees])
33
+ );
34
+ };
35
+
36
+ const _encryptFreeBusyPayload = (data, ctx) => {
37
+ Object.assign(data, {encryptionKeyUrl: ctx.encryptionKeyUrl});
38
+
39
+ const promises = [];
40
+ if (data.emails && Array.isArray(data.emails)) {
41
+ data.emails.map((item, index) =>
42
+ promises.push(
43
+ ctx.webex.internal.encryption
44
+ .encryptText(data.encryptionKeyUrl, item)
45
+ .then((encryptText) => {
46
+ data.emails[index] = encryptText;
47
+ })
48
+ )
49
+ );
50
+ }
51
+
52
+ return Promise.all(promises);
53
+ };
54
+
55
+ const EncryptHelper = {
56
+ /**
57
+ * Encrypt create / update calendar event request payload
58
+ * @param {object} [ctx] context
59
+ * @param {object} [data] meeting payload data
60
+ * @returns {Promise} Resolves with encrypted request payload
61
+ * */
62
+ encryptCalendarEventRequest: (ctx, data) => {
63
+ if (ctx.encryptionKeyUrl) {
64
+ return _encryptCalendarEventPayload(data, ctx);
65
+ }
66
+
67
+ return ctx.webex.internal.encryption.kms.createUnboundKeys({count: 1}).then((keys) => {
68
+ const key = isArray(keys) ? keys[0] : keys;
69
+ ctx.encryptionKeyUrl = key.uri;
70
+
71
+ return _encryptCalendarEventPayload(data, ctx);
72
+ });
73
+ },
74
+ /**
75
+ * Encrypt free-busy request payload, if request payload only includes the sensitive data, like email, need to encrypt these reqeust parameters, and playload includes encrypt url.
76
+ * Otherwise, don't encrypt playload and without encrypt url,Due to calendar serivce will vaild both encrypt url and sensitive that are both present. if not, will return 400 bad reqeust to caller.
77
+ * @param {object} [ctx] context
78
+ * @param {object} [data] free busy payload data
79
+ * @returns {Promise} Resolves with encrypted request payload
80
+ * */
81
+ encryptFreeBusyRequest: (ctx, data) => {
82
+ if (!data.emails || !Array.isArray(data.emails)) {
83
+ return Promise.resolve();
84
+ }
85
+ if (ctx.encryptionKeyUrl) {
86
+ return _encryptFreeBusyPayload(data, ctx);
87
+ }
88
+
89
+ return ctx.webex.internal.encryption.kms.createUnboundKeys({count: 1}).then((keys) => {
90
+ const key = isArray(keys) ? keys[0] : keys;
91
+ ctx.encryptionKeyUrl = key.uri;
92
+
93
+ return _encryptFreeBusyPayload(data, ctx);
94
+ });
95
+ },
96
+ };
97
+
98
+ export default EncryptHelper;