",
- "receivedBy": "test@demistodev.onmicrosoft.com",
- "datetimeSent": "2019-08-11T10:57:36Z",
- "lastModifiedTime": "2019-08-11T11:13:59Z",
- "mailbox": "test@demistodev.onmicrosoft.com",
- "importance": "Normal",
- "textBody": "Some text inside email\r\n",
- "sender": "test2@demistodev.onmicrosoft.com"
- }
- }
-}
-
-```
-
-### 14\. Get items
-
-* * *
-
-Retrieves items by item ID.
-
-##### Required Permissions
-
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-##### Base Command
-
-`ews-get-items`
-
-##### Input
-
-|**Argument Name**|**Description**|**Required**|
-|--- |--- |--- |
-|item-ids|A CSV list of item IDs.|Required|
-|target-mailbox|The mailbox on which to run the command on.|Optional|
-
-##### Context Output
-
-|**Path**|**Type**|**Description**|
-|--- |--- |--- |
-|EWS.Items.itemId|string|The email item ID.|
-|EWS.Items.hasAttachments|boolean|Whether the email has attachments.|
-|EWS.Items.datetimeReceived|date|Received time of the email.|
-|EWS.Items.datetimeSent|date|Sent time of the email.|
-|EWS.Items.headers|Unknown|Email headers (list).|
-|EWS.Items.sender|string|Sender mail address of the email.|
-|EWS.Items.subject|string|Subject of the email.|
-|EWS.Items.textBody|string|Body of the email (as text).|
-|EWS.Items.size|number|Email size.|
-|EWS.Items.toRecipients|Unknown|Email recipients addresses (list).|
-|EWS.Items.receivedBy|Unknown|Received by address of the email.|
-|EWS.Items.messageId|string|Email message ID.|
-|EWS.Items.body|string|Body of the email (as HTML).|
-|EWS.Items.FileAttachments.attachmentId|unknown|Attachment ID of the file attachment.|
-|EWS.Items.ItemAttachments.attachmentId|unknown|Attachment ID of the item attachment.|
-|EWS.Items.FileAttachments.attachmentName|unknown|Attachment name of the file attachment.|
-|EWS.Items.ItemAttachments.attachmentName|unknown|Attachment name of the item attachment.|
-|EWS.Items.isRead|String|The read status of the email.|
-|Email.CC|String|Email addresses CC'ed to the email.|
-|Email.BCC|String|Email addresses BCC'ed to the email.|
-|Email.To|String|The recipient of the email.|
-|Email.From|String|The sender of the email.|
-|Email.Subject|String|The subject of the email.|
-|Email.Text|String|The plain-text version of the email.|
-|Email.HTML|String|The HTML version of the email.|
-|Email.HeadersMap|String|The headers of the email.|
-
-##### Command Example
-
-```
-!ews-get-items item-ids=AAMkADQ0NmFkODFkLWQ4MDEtNDFDFZjNTMxNwBGAAAAAAA4kxhFFAfxw+jAAA= target-mailbox=test@demistodev.onmicrosoft.com
-```
-
-##### Human Readable Output
-
-Identical outputs to `ews-get-items-from-folder` command.
-
-### 15\. Move an item to a different mailbox
-
-* * *
-
-Moves an item from one mailbox to a different mailbox.
-
-##### Required Permissions
-
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-##### Base Command
-
-`ews-move-item-between-mailboxes`
-
-##### Input
-
-|**Argument Name**|**Description**|**Required**|
-|--- |--- |--- |
-|item-id|The item ID to move.|Required|
-|destination-folder-path|The folder in the destination mailbox to which to move the item. You can specify a complex path, for example, "Inbox\Phishing".|Required|
-|destination-mailbox|The mailbox to which to move the item.|Required|
-|source-mailbox|The mailbox from which to move the item (conventionally called the "target-mailbox", the target mailbox on which to run the command).|Optional|
-|is-public|Whether the destination folder is a Public Folder. Default is "False".|Optional|
-
-##### Context Output
-
-|**Path**|**Type**|**Description**|
-|--- |--- |--- |
-|EWS.Items.movedToMailbox|string|The mailbox to which the item was moved.|
-|EWS.Items.movedToFolder|string|The folder to which the item was moved.|
-|EWS.Items.action|string|The action taken on the item. The value will be "moved".|
-
-##### Command Example
-
-```
-!ews-move-item-between-mailboxes item-id=AAMkAGY3OTQyMzMzLWYxNjktNDE0My05NFSFSyNzBkNABGAAAAAACYCKjWAjq/zTrN6vWSzK4OWAAK2ISFSA= destination-folder-path=Moving destination-mailbox=test@demistodev.onmicrosoft.com source-mailbox=test2@demistodev.onmicrosoft.com
-```
-
-##### Human Readable Output
-
-Item was moved successfully.
-
-##### Context Example
-
-```
-{
- "EWS": {
- "Items": {
- "movedToMailbox": "test@demistodev.onmicrosoft.com",
- "movedToFolder": "Moving"
- }
- }
-}
-
-```
-
-### 16\. Get a folder
-
-* * *
-
-Retrieves a single folder.
-
-##### Required Permissions
-
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-##### Base Command
-
-`ews-get-folder`
-
-##### Input
-
-|**Argument Name**|**Description**|**Required**|
-|--- |--- |--- |
-|target-mailbox|The mailbox on which to apply the search.|Optional|
-|folder-path|The path of the folder to retrieve. If empty, will retrieve the folder "AllItems".|Optional|
-|is-public|Whether the folder is a Public Folder. Default is "False".|Optional|
-
-##### Context Output
-
-|**Path**|**Type**|**Description**|
-|--- |--- |--- |
-|EWS.Folders.id|string|Folder ID.|
-|EWS.Folders.name|string|Folder name.|
-|EWS.Folders.changeKey|string|Folder change key.|
-|EWS.Folders.totalCount|number|Total number of emails in the folder.|
-|EWS.Folders.childrenFolderCount|number|Number of sub-folders.|
-|EWS.Folders.unreadCount|number|Number of unread emails in the folder.|
-
-##### Command Example
-
-```
-!ews-get-folder folder-path=demistoEmail target-mailbox=test@demistodev.onmicrosoft.com
-```
-
-##### Human Readable Output
-
-|changeKey|childrenFolderCount|id|name|totalCount|unreadCount|
-|--- |--- |--- |--- |--- |--- |
-|***yFtCdJSH|0|AAMkADQ0NmFkODFkLWQ4MDEtNDE4Mi1hN2NlsjflsjfSF=|demistoEmail|1|0|
-
-##### Context Example
-
-```
-{
- "EWS": {
- "Folders": {
- "unreadCount": 0,
- "name": "demistoEmail",
- "childrenFolderCount": 0,
- "totalCount": 1,
- "changeKey": "***yFtCdJSH",
- "id": "AAMkADQ0NmFkODFkLWQ4MDEtNDE4Mi1hN2NlsjflsjfSF="
- }
- }
-}
-
-```
-
-### 17\. Expand a distribution list
-
-* * *
-
-Expands a distribution list to display all members. By default, expands only the first layer of the distribution list. If recursive-expansion is "True", the command expands nested distribution lists and returns all members.
-
-##### Required Permissions
-
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-##### Base Command
-
-`ews-expand-group`
-
-##### Input
-
-|**Argument Name**|**Description**|**Required**|
-|--- |--- |--- |
-|email-address|Email address of the group to expand.|Required|
-|recursive-expansion|Whether to enable recursive expansion. Default is "False".|Optional|
-
-##### Context Output
-
-There is no context output for this command.
-
-##### Command Example
-
-```
-!ews-expand-group email-address="TestPublic" recursive-expansion="False"
-```
-
-##### Human Readable Output
-
-|displayName|mailbox|mailboxType|
-|--- |--- |--- |
-|John Wick|john@wick.com|Mailbox|
-
-##### Context Example
-
-```
-{
- "EWS.ExpandGroup": {
- "name": "TestPublic",
- "members": [
- {
- "mailboxType": "Mailbox",
- "displayName": "John Wick",
- "mailbox": "john@wick.com"
- }
- ]
- }
-}
-
-```
-
-### 18\. Mark items as read
-
-* * *
-
-Marks items as read or unread.
-
-##### Required Permissions
-
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-##### Base Command
-
-`ews-mark-items-as-read`
-
-##### Input
-
-|**Argument Name**|**Description**|**Required**|
-|--- |--- |--- |
-|item-ids|A CSV list of item IDs.|Required|
-|operation|How to mark the item. Can be "read" or "unread". Default is "read".|Optional|
-|target-mailbox|The mailbox on which to run the command. If empty, the command will be applied on the default mailbox.|Optional|
-
-##### Context Output
-
-|**Path**|**Type**|**Description**|
-|--- |--- |--- |
-|EWS.Items.action|String|The action that was performed on the item.|
-|EWS.Items.itemId|String|The ID of the item.|
-|EWS.Items.messageId|String|The message ID of the item.|
-
-##### Command Example
-
-```
-!ews-mark-items-as-read item-ids=AAMkADQ0NFSffU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMnpkUAAAfxw+jAAA= operation=read target-mailbox=test@demistodev.onmicrosoft.com
-```
-
-##### Human Readable Output
-
-|action|itemId|messageId|
-|--- |--- |--- |
-|marked-as-read|AAMkADQ0NFSffU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMnpkUAAAfxw+jAAA=||
-
-##### Context Example
-
-```
-{
- "EWS": {
- "Items": {
- "action": "marked-as-read",
- "itemId": "AAMkADQ0NFSffU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMnpkUAAAfxw+jAAA= ",
- "messageId": "message_id"
- }
- }
-}
-
-```
-
-### 19\. Send an email
-
-* * *
-
-##### Required Permissions
-
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-##### Base Command
-
-`send-mail`
-
-##### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| to | Email addresses for the 'To' field. Supports comma-separated values | Optional |
-| cc | Email addresses for the 'Cc' field. Supports comma-separated values | Optional |
-| bcc | Email addresses for the 'Bcc' field. Supports comma-separated values | Optional |
-| subject | Subject for the email to be sent | Optional |
-| body | The contents (body) of the email to be sent in plain text | Optional |
-| htmlBody | The contents (body) of the email to be sent in HTML format | Optional |
-| attachIDs | A comma-separated list of IDs of war room entries that contains the files that should be attached to the email | Optional |
-| attachNames | A comma-separated list to rename file-names of corresponding attachments IDs. (e.g. rename first two files - attachNames=file_name1,file_name2. rename first and third file - attachNames=file_name1,,file_name3) | Optional |
-| attachCIDs | A comma-separated list of CIDs to embed attachments inside the email itself | Optional |
-| transientFile | Desired name for attached file. Multiple files are supported as comma-separated list. (e.g. transientFile="t1.txt,temp.txt,t3.txt" transientFileContent="test 2,temporary file content,third file content" transientFileCID="t1.txt@xxx.yyy,t2.txt@xxx.zzz") | Optional |
-| transientFileContent | Content for attached file. Multiple files are supported as comma-separated list. (e.g. transientFile="t1.txt,temp.txt,t3.txt" transientFileContent="test 2,temporary file content,third file content" transientFileCID="t1.txt@xxx.yyy,t2.txt@xxx.zzz") | Optional |
-| transientFileCID | CID for attached file if we want it inline. Multiple files are supported as comma-separated list. (e.g. transientFile="t1.txt,temp.txt,t3.txt" transientFileContent="test 2,temporary file content,third file content" transientFileCID="t1.txt@xxx.yyy,t2.txt@xxx.zzz") | Optional |
-| templateParams | Replace {varname} variables with values from this argument. Expected values are in the form of a JSON document like {"varname": {"value": "some value", "key": "context key"}}. Each var name can either be provided with the value or a context key to retrieve the value from. Note that only context data is accessible for this argument, while incident fields are not. | Optional |
-| additionalHeader | A comma-separated list list of additional headers in the format: headerName=headerValue. For example: "headerName1=headerValue1,headerName2=headerValue2". | Optional |
-| raw_message | Raw email message to send. If provided, all other arguments, but to, cc and bcc, will be ignored. | Optional |
-| from_address | The email address from which to reply. | Optional |
-| replyTo | Email addresses that need to be used to reply to the message. Supports comma-separated values. | Optional |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-##### Command Example
-
-```
-!send-mail to=demisto@demisto.onmicrosoft.com subject=some_subject body=some_text attachIDs=110@457,116@457 htmlBody="Hello World " additionalHeader="some_header_name=some_header_value" transientFile=some_file.txt transientFileContent="Some file content"
-```
-
-##### Human Readable Output
-
-Mail sent successfully
-
-
-### 20\. ews-get-items-as-eml
-***
-Retrieves items by item ID and uploads its content as an EML file.
-
-
-#### Base Command
-
-`ews-get-items-as-eml`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| item-id | The item ID of item to upload as and EML file. | Required |
-| target-mailbox | The mailbox in which this email was found. If empty, the default mailbox is used. Otherwise the user might require impersonation rights to this mailbox. | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| File.Size | String | The size of the file. |
-| File.SHA1 | String | The SHA1 hash of the file. |
-| File.SHA256 | String | The SHA256 hash of the file. |
-| File.SHA512 | String | The SHA512 hash of the file. |
-| File.Name | String | The name of the file. |
-| File.SSDeep | String | The SSDeep hash of the file. |
-| File.EntryID | String | EntryID of the file |
-| File.Info | String | Information about the file. |
-| File.Type | String | The file type. |
-| File.MD5 | String | The MD5 hash of the file. |
-| File.Extension | String | The extension of the file. |
-
-
-### 21\. reply-mail
-***
-##### Required Permissions
-
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-
-
-#### Base Command
-
-`reply-mail`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| inReplyTo | ID of the item to reply to. | Required |
-| to | A comma-separated list of email addresses for the 'to' field. | Required |
-| cc | A comma-separated list of email addresses for the 'cc' field. | Optional |
-| bcc | A comma-separated list of email addresses for the 'bcc' field. | Optional |
-| subject | Subject for the email to be sent. | Optional |
-| body | The contents (body) of the email to send. | Optional |
-| htmlBody | HTML formatted content (body) of the email to be sent. This argument overrides the "body" argument. | Optional |
-| attachIDs | A comma-separated list of War Room entry IDs that contain files, and are used to attach files to the outgoing email. For example: attachIDs=15@8,19@8. | Optional |
-| attachNames | A comma-separated list of names of attachments to send. Should be the same number of elements as attachIDs. | Optional |
-| attachCIDs | A comma-separated list of CIDs to embed attachments within the email itself. | Optional |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!reply-mail item_id=AAMkAGY3OTQyMzMzLWYxNjktNDE0My05NmZhLWQ5MGY1YjIyNzBkNABGAAAAAACYCKjWAnXBTrnhgWJCcLX7BwDrxRwRjq/zTrN6vWSzK4OWAAAAAAEMAADrxRwRjq/zTrN6vWSzK4OWAAPYQGFeAAA= body=hello subject=hi to="avishai@demistodev.onmicrosoft.com"```
-
-#### Human Readable Output
-
->### Sent email
->|attachments|from|subject|to|
->|---|---|---|---|
->| | avishai@demistodev.onmicrosoft.com | hi | avishai@demistodev.onmicrosoft.com |
-
-## Additional Information
-
-* * *
-
-#### EWS Permissions
-
-To perform actions on mailboxes of other users, and to execute searches on the Exchange server, you need specific permissions. For a comparison between Delegate and Impersonation permissions, see the [Microsoft documentation](https://blogs.msdn.microsoft.com/exchangedev/2009/06/15/exchange-impersonation-vs-delegate-access/).
-
-|Permission|Use Case|How to Configure|
-|--- |--- |--- |
-|Delegate|One-to-one relationship between users.|Read more [here](https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/delegate-access-and-ews-in-exchange).|
-|Impersonation|A single account needs to access multiple mailboxes.|Read more [here](https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-configure-impersonation).|
-|eDiscovery|Search the Exchange server.|Read more [here](https://docs.microsoft.com/en-us/Exchange/policy-and-compliance/ediscovery/assign-permissions?view=exchserver-2019).|
-|Compliance Search|Perform searches across mailboxes and get an estimate of the results.|Read more [here](https://docs.microsoft.com/en-us/office365/securitycompliance/permissions-in-the-security-and-compliance-center).|
diff --git a/Packs/EWS/Integrations/EWSv2/README.md b/Packs/EWS/Integrations/EWSv2/README.md
deleted file mode 100644
index 8cc16ec8fc72..000000000000
--- a/Packs/EWS/Integrations/EWSv2/README.md
+++ /dev/null
@@ -1,2841 +0,0 @@
-
-Exchange Web Services (EWS) provides the functionality to enable client applications to communicate with the Exchange server. EWS provides access to much of the same data that is made available through Microsoft OfficeOutlook.
-The EWS v2 integration implants EWS leading services. The integration allows getting information on emails and activities in a target mailbox, and some active operations on the mailbox such as deleting emails and attachments or moving emails from folder to folder.
-Note: EWS v2 does not support Multi-Factor Authentication (MFA). If using MFA, use EWS O365 (see https://xsoar.pan.dev/docs/reference/integrations/ewso365
) or if you have Graph Outlook use O365 Outlook Mail (Using Graph API) (see https://xsoar.pan.dev/docs/reference/integrations/microsoft-graph-mail
) or O365 Outlook Mail Single User (Using Graph API) (see https://xsoar.pan.dev/docs/reference/integrations/microsoft-graph-mail-single-user
).
-EWS v2 Playbook
-
-Office 365 Search and Delete
-Search And Delete Emails - EWS
-Get Original Email - EWS
-Process Email - EWS
-
-Use Cases
-The EWS integration can be used for the following use cases.
-
-
-Monitor a specific email account and create incidents from incoming emails to the defined folder. Follow the instructions in the Fetched Incidents Data section.
-
-
-Search for an email message across mailboxes and folders. This can be achieved in the following ways:
-
-Use the ews-search-mailboxes
command to search for all emails in a specific scope of mailboxes. Use the filter argument to narrow the search for emails sent from a specific account and more.
-Use the ews-search-mailbox
command to search for all emails in a specific folder within the target mailbox. Use the query argument to narrow the search for emails sent from a specific account and more.
-
-
-Both of these commands retrieve the ItemID field for each email item listed in the results. The ItemID
 can be used in the ews-get-items
 command in order to get more information about the email item itself.
-For instance, use the ews-search-mailboxes
command to hunt for emails that were marked as malicious in prior investigations, across organization mailboxes. Focus your hunt on emails sent from a specific mail account, emails with a specific subject and more.
-
-
-
-Get email attachment information. Use the ews-get-attachment
 command to retrieve information on one attachment or all attachments of a message at once. It supports both file attachments and item attachments (e.g., email messages).
-
-
-Delete email items from a mailbox. First, make sure you obtain the email item ID. The item ID can be obtained with one of the integration’s search commands. Use the ews-delete-items
 command to delete one or more items from the target mailbox in a single action. A less common use case is to remove emails that were marked as malicious from a user’s mailbox. You can delete the items permanently (hard delete), or delete the items (soft delete), so they can be recovered by running the ews-recover-messages
 command.
-
-
-Configure EWS v2 on Cortex XSOAR
-
-Navigate to Settings  > Integrations  > Servers & Services .
-Search for EWS v2.
-Click Add instance  to create and configure a new integration instance.
-
-
-Name : a textual name for the integration instance.
-
-Email address  The email address
-
-Password  The password of the account.
-
-Email address from which to fetch incidents  This argument can take various user accounts in your organization. Usually is used as phishing mailbox. Note: To use this functionality, your account must have impersonation rights or delegation for the account specified. In the case of impersonation, make sure to check the Has impersonation rights
 checkbox in the instance settings. For more information on impersonation rights see ‘Additional Info’ section below.
-Name of the folder from which to fetch incidents (supports Exchange Folder ID and sub-folders e.g. Inbox/Phishing)
-Public Folder
-Has impersonation rights
-Use system proxy settings
-Fetch incidents
-First fetch timestamp
-Mark fetched emails as read
-
-Incident type ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ ‎ Manual Mode In case the auto-discovery process failed, you will need to configure manually the exchange server endpoint, domain\username for exchange on-premise and enter exchange server version
-
-
-Exchange Server Hostname or IP address  For office 365 use https://outlook.office365.com/EWS/Exchange.asmx/
 and for exchange on-premise https://<ip>/EWS/Exchange.asmx/
-
-DOMAIN\USERNAME (e.g. XSOAR.INT\admin)
-Exchange Server Version (On-Premise only. Supported versions: 2007, 2010, 2010_SP2, 2013, and 2016)
-
-Trust any certificate (not secure) ┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ ‎ Advanced Mode Override Authentication Type (NTLM, Basic, or Digest)._
-Timeout (in seconds) for HTTP requests to Exchange Server
-
-
-Click Test  to validate the URLs, token, and connection.
-
-Fetched Incidents Data
-The integration imports email messages from the destination folder in the target mailbox as incidents. If the message contains any attachments, they are uploaded to the War Room as files. If the attachment is an email, Cortex XSOAR fetches information about the attached email and downloads all of its attachments (if there are any) as files.
-To use Fetch incidents, configure a new instance and select the Fetches incidents
 option in the instance settings.
-IMPORTANT: The initial fetch interval is the previous 10 minutes. If no emails were fetched before from the destination folder- all emails from 10 minutes prior to the instance configuration and up to the current time will be fetched. Additionally moving messages manually to the destination folder will not trigger fetch incident. Define rules on phishing/target mailbox instead of moving messages manually.
-You can configure the ``First fetch timestamp`` field to determine how much time back you want to fetch incidents.
-
Notice that it might required to set the ``Timeout`` field to a higher value.
-Pay special attention to the following fields in the instance settings:
-Email address from which to fetch incidents
 – mailbox to fetch incidents from. Name of the folder from which to fetch incidents
 – use this field to configure the destination folder from where emails should be fetched. The default is Inbox folder. Please note, if Exchange is configured with an international flavor `Inbox` will be named according to the configured language. Has impersonation rights
 – mark this option if you set the target mailbox to an account different than your personal account. Otherwise Delegation access will be used instead of Impersonation. Find more information on impersonation or delegation rights at ‘Additional Info’ section below.
-Commands
-You can execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook. After you successfully execute a command, a DBot message appears in the War Room with the command details.
-
-Get the attachments of an item: ews-get-attachment
-Delete the attachments of an item: ews-delete-attachment
-Get a list of searchable mailboxes: ews-get-searchable-mailboxes
-Search mailboxes: ews-search-mailboxes
-Move an item to a different folder: ews-move-item
-Delete an item from a mailbox: ews-delete-items
-Search a single mailbox: ews-search-mailbox
-Get the contacts for a mailbox: ews-get-contacts
-Get the out-of-office status for a mailbox: ews-get-out-of-office
-Recover soft-deleted messages: ews-recover-messages
-Create a folder: ews-create-folder
-Mark an item as junk: ews-mark-item-as-junk
-Search for folders: ews-find-folders
-Get items of a folder: ews-get-items-from-folder
-Get items: ews-get-items
-Move an item to a different mailbox: ews-move-item-between-mailboxes
-Get a folder: ews-get-folder
-Initiate a compliance search: ews-o365-start-compliance-search
-Get the status and results of a compliance search: ews-o365-get-compliance-search
-Purge compliance search results: ews-o365-purge-compliance-search-results
-Remove a compliance search: ews-o365-remove-compliance-search
-Get the purge status of a compliance search: ews-o365-get-compliance-search-purge-status
-Get auto-discovery information: ews-get-autodiscovery-config
-Expand a distribution list: ews-expand-group
-Mark items as read: ews-mark-items-as-read
-
-1. Get the attachments of an item
-
-Retrieves the actual attachments from an item (email message). To get all attachments for a message, only specify the item-id argument.
-Required Permissions
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-get-attachment
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-id
-The ID of the email message for which to get the attachments.
-Required
-
-
-target-mailbox
-The mailbox in which this attachment was found. If empty, the default mailbox is used. Otherwise, the user might require impersonation rights to this mailbox.
-Optional
-
-
-attachment-ids
-The attachments ids to get. If none - all attachments will be retrieved from the message. Support multiple attachments with comma-separated value or array.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.FileAttachments.attachmentId
-string
-The attachment ID. Used for file attachments only.
-
-
-EWS.Items.FileAttachments.attachmentName
-string
-The attachment name. Used for file attachments only.
-
-
-EWS.Items.FileAttachments.attachmentSHA256
-string
-The SHA256 hash of the attached file.
-
-
-EWS.Items.FileAttachments.attachmentLastModifiedTime
-date
-The attachment last modified time. Used for file attachments only.
-
-
-EWS.Items.ItemAttachments.datetimeCreated
-date
-The created time of the attached email.
-
-
-EWS.Items.ItemAttachments.datetimeReceived
-date
-The received time of the attached email.
-
-
-EWS.Items.ItemAttachments.datetimeSent
-date
-The sent time of the attached email.
-
-
-EWS.Items.ItemAttachments.receivedBy
-string
-The received by address of the attached email.
-
-
-EWS.Items.ItemAttachments.subject
-string
-The subject of the attached email.
-
-
-EWS.Items.ItemAttachments.textBody
-string
-The body of the attached email (as text).
-
-
-EWS.Items.ItemAttachments.headers
-Unknown
-The headers of the attached email.
-
-
-EWS.Items.ItemAttachments.hasAttachments
-boolean
-Whether the attached email has attachments.
-
-
-EWS.Items.ItemAttachments.itemId
-string
-The attached email item ID.
-
-
-EWS.Items.ItemAttachments.toRecipients
-Unknown
-A list of recipient email addresses for the attached email.
-
-
-EWS.Items.ItemAttachments.body
-string
-The body of the attached email (as HTML).
-
-
-EWS.Items.ItemAttachments.attachmentSHA256
-string
-SHA256 hash of the attached email (as EML file).
-
-
-EWS.Items.ItemAttachments.FileAttachments.attachmentSHA256
-string
-SHA256 hash of the attached files inside of the attached email.
-
-
-EWS.Items.ItemAttachments.ItemAttachments.attachmentSHA256
-string
-SHA256 hash of the attached emails inside of the attached email.
-
-
-EWS.Items.ItemAttachments.isRead
-String
-The read status of the attachment.
-
-
-
-Â
-Command Example
-!ews-get-attachment item-id=BBFDShfdafFSDF3FADR3434DFASDFADAFDADFADFCJebinpkUAAAfxuiVAAA= target-mailbox=test@demistodev.onmicrosoft.com
-Context Example
-{
- "EWS": {
- "Items": {
- "ItemAttachments": {
- "originalItemId": "BBFDShfdafFSDF3FADR3434DFASDFADAFDADFADFCJebinpkUAAAfxuiVAAA=",
- "attachmentSize": 2956,
- "receivedBy": "test@demistodev.onmicrosoft.com",
- "size": 28852,
- "author": "test2@demistodev.onmicrosoft.com",
- "attachmentLastModifiedTime": "2019-08-11T15:01:30+00:00",
- "subject": "Moving Email between mailboxes",
- "body": "Some text inside",
- "datetimeCreated": "2019-08-11T15:01:47Z",
- "importance": "Normal",
- "attachmentType": "ItemAttachment",
- "toRecipients": [
- "test@demistodev.onmicrosoft.com"
- ],
- "mailbox": "test@demistodev.onmicrosoft.com",
- "isRead": false,
- "attachmentIsInline": false,
- "datetimeSent": "2019-08-07T12:50:19Z",
- "lastModifiedTime": "2019-08-11T15:01:30Z",
- "sender": "test2@demistodev.onmicrosoft.com",
- "attachmentName": "Moving Email between mailboxes",
- "datetimeReceived": "2019-08-07T12:50:20Z",
- "attachmentSHA256": "119e27b28dc81bdfd4f498d44bd7a6d553a74ee03bdc83e6255a53",
- "hasAttachments": false,
- "headers": [
- {
- "name": "Subject",
- "value": "Moving Email between mailboxes"
- }
- ...
- ],
- "attachmentId": "BBFDShfdafFSDF3FADR3434DFASDFADAFDADFADFCJebinpkUAAAfxuiVAAABEgAQAOpEfpzDB4dFkZ+/K4XSj44=",
- "messageId": "<message_id>"
- }
- }
- }
-
-2. Delete the attachments of an item
-
-Deletes the attachments of an item (email message).
-Required Permissions
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-delete-attachment
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-id
-The ID of the email message for which to delete attachments.
-Required
-
-
-target-mailbox
-The mailbox in which this attachment was found. If empty, the default mailbox is used. Otherwise, the user might require impersonation rights to this mailbox.
-Optional
-
-
-attachment-ids
-A CSV list (or array) of attachment IDs to delete. If empty, all attachments will be deleted from the message.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.FileAttachments.attachmentId
-string
-The ID of the deleted attachment, in case of file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentId
-string
-The ID of the deleted attachment, in case of other attachment (for example, "email").
-
-
-EWS.Items.FileAttachments.action
-string
-The deletion action in case of file attachment. This is a constant value: 'deleted'.
-
-
-EWS.Items.ItemAttachments.action
-string
-The deletion action in case of other attachment (for example, "email"). This is a constant value: 'deleted'.
-
-
-
-Â
-Command Example
-!ews-delete-attachment item-id=AAMkADQ0NmwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJjfaljfAFDVSDinpkUAAAfxxd9AAA= target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-action
-attachmentId
-
-
-
-
-deleted
-AAMkADQ0NmwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJjfaljfAFDVSDinpkUAAAfxxd9AAABEgAQAIUht2vrOdErec33=
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "FileAttachments": {
- "action": "deleted",
- "attachmentId": "AAMkADQ0NmwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJjfaljfAFDVSDinpkUAAAfxxd9AAABEgAQAIUht2vrOdErec33="
- }
- }
- }
-}
-
-3. Get a list of searchable mailboxes
-
-Returns a list of searchable mailboxes.
-Note: We recommend that you do not run this command if you have over 1M mailboxes.
-Required Permissions
-Requires eDiscovery permissions to the Exchange Server. For more information see the Microsoft documentation .
-Base Command
-ews-get-searchable-mailboxes
-Input
-There are no input arguments for this command.
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Mailboxes.mailbox
-string
-Addresses of the searchable mailboxes.
-
-
-EWS.Mailboxes.mailboxId
-string
-IDs of the searchable mailboxes.
-
-
-EWS.Mailboxes.displayName
-string
-The email display name.
-
-
-EWS.Mailboxes.isExternal
-boolean
-Whether the mailbox is external.
-
-
-EWS.Mailboxes.externalEmailAddress
-string
-The external email address.
-
-
-
-Â
-Command Example
-!ews-get-searchable-mailboxes
-Human Readable Output
-
-
-
-displayName
-isExternal
-mailbox
-mailboxId
-
-
-
-
-test
-false
-test@demistodev.onmicrosoft.com
-/o=Exchange***/ou=Exchange Administrative Group ()/cn=/cn= -**
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Mailboxes": [
- {
- "mailbox": "test@demistodev.onmicrosoft.com",
- "displayName": "test",
- "mailboxId": "/o=Exchange***/ou=Exchange Administrative Group ()/cn=**/cn=**-**",
- "isExternal": "false"
- }
- ...
- ]
- }
-}
-
-4. Search mailboxes
-
-Searches over multiple mailboxes or all Exchange mailboxes. The maximum number of mailboxes that can be searched is 20,000. Use either the mailbox-search-scope command or the email-addresses command to search specific mailboxes.
-Required Permissions
-Requires eDiscovery permissions to the Exchange Server. For more information, see the Microsoft documentation .
-Note: If you have over 1M mailboxes, you should limit the number of mailboxes to search by defining the mailbox-search-scope argument before running this command.
-Base Command
-ews-search-mailboxes
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-filter
-The filter query to search.
-Required
-
-
-mailbox-search-scope
-The mailbox IDs to search. If empty, all mailboxes are searched.
-Optional
-
-
-limit
-Maximum number of results to return.
-Optional
-
-
-email_addresses
-CSV list or array of email addresses.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.itemId
-string
-The item ID.
-
-
-EWS.Items.mailbox
-string
-The mailbox address where the item was found.
-
-
-EWS.Items.subject
-string
-The subject of the email.
-
-
-EWS.Items.toRecipients
-Unknown
-List of recipient email addresses.
-
-
-EWS.Items.sender
-string
-Sender email address.
-
-
-EWS.Items.hasAttachments
-boolean
-Whether the email has attachments?
-
-
-EWS.Items.datetimeSent
-date
-Sent time of the email.
-
-
-EWS.Items.datetimeReceived
-date
-Received time of the email.
-
-
-
-Â
-Command Example
-!ews-search-mailboxes filter="subject:Test" limit=1
-Human Readable Output
-
-
-
-datetimeReceived
-datetimeSent
-hasAttachments
-itemId
-mailbox
-sender
-subject
-toRecipients
-
-
-
-
-2019-08-11T11:00:28Z
-2019-08-11T11:00:28Z
-false
-AAMkAGY3OTQyMzMzLWYxNjktNDE0My05NmZhLWQ5MGY1YjIyNzBkNABGACASFAACYCKjWAnXDFrfsdhdnfkanpAAA=
-test2@demistodev.onmicrosoft.com
-John Smith
-test report
-dem@demistodev.onmicrosoft.com
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "itemId": "AAMkAGY3OTQyMzMzLWYxNjktNDE0My05NmZhLWQ5MGY1YjIyNzBkNABGACASFAACYCKjWAnXDFrfsdhdnfkanpAAA=",
- "sender": "John Smith",
- "datetimeReceived": "2019-08-11T11:00:28Z",
- "hasAttachments": "false",
- "toRecipients": [
- "dem@demistodev.onmicrosoft.com"
- ],
- "mailbox": "test2@demistodev.onmicrosoft.com",
- "datetimeSent": "2019-08-11T11:00:28Z",
- "subject": "test report "
- }
- }
-}
-
-5. Move an item to a different folder
-
-Move an item to a different folder in the mailbox.
-Required Permissions
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-move-item
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-id
-The ID of the item to move.
-Required
-
-
-target-folder-path
-The path to the folder to which to move the item. Complex paths are supported, for example, "Inbox\Phishing".
-Required
-
-
-target-mailbox
-The mailbox on which to run the command.
-Optional
-
-
-is-public
-Whether the target folder is a public folder.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.newItemID
-string
-The item ID after the move.
-
-
-EWS.Items.messageID
-string
-The item message ID.
-
-
-EWS.Items.itemId
-string
-The original item ID.
-
-
-EWS.Items.action
-string
-The action taken. The value will be "moved".
-
-
-
-Â
-Command Example
-!ews-move-item item-id=VDAFNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU34cSCSSSfBJebinpkUAAAAAAEMAACyyVyFtlsUQZfBJebinpkUAAAfxuiRAAA= target-folder-path=Moving target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-action
-itemId
-messageId
-newItemId
-
-
-
-
-moved
-VDAFNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU34cSCSSSfBJebinpkUAAAAAAEMAACyyVyFtlsUQZfBJebinpkUAAAfxuiRAAA
-<message_id>
-AAVAAAVN2NkLThmZjdmNTZjNTMxFFFFJTJPMPXU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAAa2bUBAACyyVfafainpkUAAAfxxd+AAA=
-
-
-
-Context Example
-{
- "EWS": {
- "Items": {
- "action": "moved",
- "itemId": "VDAFNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU34cSCSSSfBJebinpkUAAAAAAEMAACyyVyFtlsUQZfBJebinpkUAAAfxuiRAAA",
- "newItemId": "AAVAAAVN2NkLThmZjdmNTZjNTMxFFFFJTJPMPXU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAAa2bUBAACyyVfafainpkUAAAfxxd+AAA=",
- "messageId": "<message_id>"
- }
- }
-}
-
-6. Delete an item from a mailbox
-
-Delete items from mailbox.
-Required Permissions
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-delete-items
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-ids
-The item IDs to delete.
-Required
-
-
-delete-type
-Deletion type. Can be "trash", "soft", or "hard".
-Required
-
-
-target-mailbox
-The mailbox on which to run the command.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.itemId
-string
-The deleted item ID.
-
-
-EWS.Items.messageId
-string
-The deleted message ID.
-
-
-EWS.Items.action
-string
-The deletion action. Can be 'trash-deleted', 'soft-deleted', or 'hard-deleted'.
-
-
-
-Â
-Command Example
-!ews-delete-items item-ids=VWAFA3hmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMGAACyw+kAAA= delete-type=soft target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-action
-itemId
-messageId
-
-
-
-
-soft-deleted
-VWAFA3hmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMGAACyw+kAAA=
-<message_id>
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "action": "soft-deleted",
- "itemId": "VWAFA3hmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMGAACyw+kAAA=",
- "messageId": "<messaage_id>"
- }
- }
-}
-
-7. Search a single mailbox
-
-Searches for items in the specified mailbox. Specific permissions are needed for this operation to search in a target mailbox other than the default.
-Required Permissions
-Impersonation rights required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-search-mailbox
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-query
-The search query string. For more information about the query syntax, see the Microsoft documentation .
-Optional
-
-
-folder-path
-The folder path in which to search. If empty, searches all the folders in the mailbox.
-Optional
-
-
-limit
-Maximum number of results to return.
-Optional
-
-
-target-mailbox
-The mailbox on which to apply the search.
-Optional
-
-
-is-public
-Whether the folder is a Public Folder?
-Optional
-
-
-message-id
-The message ID of the email. This will be ignored if a query argument is provided.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.itemId
-string
-The email item ID.
-
-
-EWS.Items.hasAttachments
-boolean
-Whether the email has attachments.
-
-
-EWS.Items.datetimeReceived
-date
-Received time of the email.
-
-
-EWS.Items.datetimeSent
-date
-Sent time of the email.
-
-
-EWS.Items.headers
-Unknown
-Email headers (list).
-
-
-EWS.Items.sender
-string
-Sender email address of the email.
-
-
-EWS.Items.subject
-string
-Subject of the email.
-
-
-EWS.Items.textBody
-string
-Body of the email (as text).
-
-
-EWS.Items.size
-number
-Email size.
-
-
-EWS.Items.toRecipients
-Unknown
-List of email recipients addresses.
-
-
-EWS.Items.receivedBy
-Unknown
-Email received by address.
-
-
-EWS.Items.messageId
-string
-Email message ID.
-
-
-EWS.Items.body
-string
-Body of the email (as HTML).
-
-
-EWS.Items.FileAttachments.attachmentId
-unknown
-Attachment ID of the file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentId
-unknown
-Attachment ID of the item attachment.
-
-
-EWS.Items.FileAttachments.attachmentName
-unknown
-Attachment name of the file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentName
-unknown
-Attachment name of the item attachment.
-
-
-EWS.Items.isRead
-String
-The read status of the email.
-
-
-
-Â
-Command Example
-!ews-search-mailbox query="subject:"Get Attachment Email" target-mailbox=test@demistodev.onmicrosoft.com limit=1
-Human Readable Output
-
-
-
-sender
-subject
-hasAttachments
-datetimeReceived
-receivedBy
-author
-toRecipients
-
-
-
-
-test2@demistodev.onmicrosoft.com
-Get Attachment Email
-true
-2019-08-11T10:57:37Z
-test@demistodev.onmicrosoft.com
-test2@demistodev.onmicrosoft.com
-test@demistodev.onmicrosoft.com
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "body": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<style type=\"text/css\" style=\"display:none;\"><!-- P {margin-top:0;margin-bottom:0;} --></style>\r\n</head>\r\n<body dir=\"ltr\">\r\n<div id=\"divtagrapper\" style=\"font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;\" dir=\"ltr\">\r\n<p style=\"margin-top:0;margin-bottom:0\">Some text inside email</p>\r\n</div>\r\n</body>\r\n</html>\r\n",
- "itemId": "AAMkADQ0NmFFijer3FFmNTZjNTMxNwBGAAAAAAFSAAfxw+jAAA=",
- "toRecipients": [
- "test@demistodev.onmicrosoft.com"
- ],
- "datetimeCreated": "2019-08-11T10:57:37Z",
- "datetimeReceived": "2019-08-11T10:57:37Z",
- "author": "test2@demistodev.onmicrosoft.com",
- "hasAttachments": true,
- "size": 30455,
- "subject": "Get Attachment Email",
- "FileAttachments": [
- {
- "attachmentName": "atta1.rtf",
- "attachmentSHA256": "csfd81097bc049fbcff6e637ade0407a00308bfdfa339e31a44a1c4e98f28ce36e4f",
- "attachmentType": "FileAttachment",
- "attachmentSize": 555,
- "attachmentId": "AAMkADQ0NmFkODFkLWQ4MDEtNDE4Mi1hN2NkLThmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMGAACyyVyFtlsUQZfBJebinpkUAAAfxw+jAAABEgAQAEyq1TB2nKBLpKUiFUJ5Geg=",
- "attachmentIsInline": false,
- "attachmentLastModifiedTime": "2019-08-11T11:06:02+00:00",
- "attachmentContentLocation": null,
- "attachmentContentType": "text/rtf",
- "originalItemId": "AAMkADQ0NmFFijer3FFmNTZjNTMxNwBGAAAAAAFSAAfxw+jAAA=",
- "attachmentContentId": null
- }
- ],
- "headers": [
- {
- "name": "Subject",
- "value": "Get Attachment Email"
- },
- ...
- ],
- "isRead": true,
- "messageId": "<mesage_id>",
- "receivedBy": "test@demistodev.onmicrosoft.com",
- "datetimeSent": "2019-08-11T10:57:36Z",
- "lastModifiedTime": "2019-08-11T11:13:59Z",
- "mailbox": "test@demistodev.onmicrosoft.com",
- "importance": "Normal",
- "textBody": "Some text inside email\r\n",
- "sender": "test2@demistodev.onmicrosoft.com"
- }
- }
-}
-
-8. Get the contacts for a mailbox
-
-Retrieves contacts for a specified mailbox.
-Required Permissions
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-get-contacts
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-target-mailbox
-The mailbox for which to retrieve the contacts.
-Optional
-
-
-limit
-Maximum number of results to return.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-Account.Email.EwsContacts.displayName
-Unknown
-The contact name.
-
-
-Account.Email.EwsContacts.lastModifiedTime
-Unknown
-The time that the contact was last modified.
-
-
-Account.Email.EwsContacts.emailAddresses
-Unknown
-Phone numbers of the contact.
-
-
-Account.Email.EwsContacts.physicalAddresses
-Unknown
-Physical addresses of the contact.
-
-
-Account.Email.EwsContacts.phoneNumbers.phoneNumber
-Unknown
-Email addresses of the contact.
-
-
-
-Â
-Command Example
-!ews-get-contacts limit="1"
-Human Readable Output
-
-
-
-changekey
-culture
-datetimeCreated
-datetimeReceived
-datetimeSent
-displayName
-emailAddresses
-fileAs
-fileAsMapping
-givenName
-id
-importance
-itemClass
-lastModifiedName
-lastModifiedTime
-postalAddressIndex
-sensitivity
-subject
-uniqueBody
-webClientReadFormQueryString
-
-
-
-
-EABYACAADcsxRwRjq/zTrN6vWSzKAK1Dl3N
-en-US
-2019-08-05T12:35:36Z
-2019-08-05T12:35:36Z
-2019-08-05T12:35:36Z
-Contact Name
-some@dev.microsoft.com
-Contact Name
-LastCommaFirst
-Contact Name
-AHSNNK3NQNcasnc3SAS/zTrN6vWSzK4OWAAAAAAEOAADrxRwRjq/zTrNFSsfsfVWAAK1KsF3AAA=
-Normal
-IPM.Contact
-John Smith
-2019-08-05T12:35:36Z
-None
-Normal
-Contact Name
-Â
-https://outlook.office365.com/owa/?ItemID=***
-
-
-
-Â
-Context Example
-{
- "Account.Email": [
- {
- "itemClass": "IPM.Contact",
- "lastModifiedName": "John Smith",
- "displayName": "Contact Name",
- "datetimeCreated": "2019-08-05T12:35:36Z",
- "datetimeReceived": "2019-08-05T12:35:36Z",
- "fileAsMapping": "LastCommaFirst",
- "importance": "Normal",
- "sensitivity": "Normal",
- "postalAddressIndex": "None",
- "webClientReadFormQueryString": "https://outlook.office365.com/owa/?ItemID=***",
- "uniqueBody": "<html><body></body></html>",
- "fileAs": "Contact Name",
- "culture": "en-US",
- "changekey": "EABYACAADcsxRwRjq/zTrN6vWSzKAK1Dl3N",
- "lastModifiedTime": "2019-08-05T12:35:36Z",
- "datetimeSent": "2019-08-05T12:35:36Z",
- "emailAddresses": [
- "some@dev.microsoft.com"
- ],
- "givenName": "Contact Name",
- "id": "AHSNNK3NQNcasnc3SAS/zTrN6vWSzK4OWAAAAAAEOAADrxRwRjq/zTrNFSsfsfVWAAK1KsF3AAA=",
- "subject": "Contact Name"
- }
- ]
-}
-
-9. Get the out-of-office status for a mailbox
-
-Retrieves the out-of-office status for a specified mailbox.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part the ApplicationImpersonation role.
-Base Command
-ews-get-out-of-office
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-target-mailbox
-The mailbox for which to get the out-of-office status.
-Required
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-Account.Email.OutOfOffice.state
-Unknown
-Out-of-office state. The result can be: "Enabled", "Scheduled", or "Disabled".
-
-
-Account.Email.OutOfOffice.externalAudience
-Unknown
-Out-of-office external audience. Can be "None", "Known", or "All".
-
-
-Account.Email.OutOfOffice.start
-Unknown
-Out-of-office start date.
-
-
-Account.Email.OutOfOffice.end
-Unknown
-Out-of-office end date.
-
-
-Account.Email.OutOfOffice.internalReply
-Unknown
-Out-of-office internal reply.
-
-
-Account.Email.OutOfOffice.externalReply
-Unknown
-Out-of-office external reply.
-
-
-Account.Email.OutOfOffice.mailbox
-Unknown
-Out-of-office mailbox.
-
-
-
-Â
-Command Example
-!ews-get-out-of-office target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-end
-externalAudience
-mailbox
-start
-state
-
-
-
-
-2019-08-12T13:00:00Z
-All
-test@demistodev.onmicrosoft.com
-2019-08-11T13:00:00Z
-Disabled
-
-
-
-Â
-Context Example
-{
- "Account": {
- "Email": {
- "OutOfOffice": {
- "start": "2019-08-11T13:00:00Z",
- "state": "Disabled",
- "mailbox": "test@demistodev.onmicrosoft.com",
- "end": "2019-08-12T13:00:00Z",
- "externalAudience": "All"
- }
- }
- }
-}
-
-10. Recover soft-deleted messages
-
-Recovers messages that were soft-deleted.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-recover-messages
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-message-ids
-A CSV list of message IDs. Run the py-ews-delete-items command to retrieve the message IDs
-Required
-
-
-target-folder-path
-The folder path to recover the messages to.
-Required
-
-
-target-mailbox
-The mailbox in which the messages found. If empty, will use the default mailbox. If you specify a different mailbox, you might need impersonation rights to the mailbox.
-Optional
-
-
-is-public
-Whether the target folder is a Public Folder.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.itemId
-Unknown
-The item ID of the recovered item.
-
-
-EWS.Items.messageId
-Unknown
-The message ID of the recovered item.
-
-
-EWS.Items.action
-Unknown
-The action taken on the item. The value will be 'recovered'.
-
-
-
-Â
-Command Example
-!ews-recover-messages message-ids=<DFVDFmvsCSCS.com> target-folder-path=Moving target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-action
-itemId
-messageId
-
-
-
-
-recovered
-AAVCSVS1hN2NkLThmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed33wX3aBwCyyVyFtlsUQZfBJebinpkUAAAa2bUBAACyyVyFtlscfxxd/AAA=
-<DFVDFmvsCSCS.com>
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "action": "recovered",
- "itemId": "AAVCSVS1hN2NkLThmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed33wX3aBwCyyVyFtlsUQZfBJebinpkUAAAa2bUBAACyyVyFtlscfxxd/AAA=",
- "messageId": "<DFVDFmvsCSCS.com>"
- }
- }
-}
-
-11. Create a folder
-
-Creates a new folder in a specified mailbox.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-create-folder
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-new-folder-name
-The name of the new folder.
-Required
-
-
-folder-path
-Path to locate the new folder. Exchange folder ID is also supported.
-Required
-
-
-target-mailbox
-The mailbox in which to create the folder.
-Optional
-
-
-
-Â
-Context Output
-There is no context output for this command.
-Command Example
-!ews-create-folder folder-path=Inbox new-folder-name="Created Folder" target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-Folder Inbox\Created Folder created successfully
-12. Mark an item as junk
-
-Marks an item as junk. This is commonly used to block an email address. For more information, see the Microsoft documentation .Â
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-mark-item-as-junk
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-id
-The item ID to mark as junk.
-Required
-
-
-move-items
-Whether to move the item from the original folder to the junk folder.
-Optional
-
-
-target-mailbox
-If empty, will use the default mailbox. If you specify a different mailbox, you might need impersonation rights to the mailbox.
-Optional
-
-
-
-Â
-Context Output
-There is no context output for this command.
-Command Example
-!ews-mark-item-as-junk item-id=AAMkcSQ0NmFkOhmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUcsBJebinpkUAAAAAAEMASFDkUAAAfxuiSAAA= move-items=yes target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-action
-itemId
-
-
-
-
-marked-as-junk
-AAMkcSQ0NmFkOhmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUcsBJebinpkUAAAAAAEMASFDkUAAAfxuiSAAA=
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "action": "marked-as-junk",
- "itemId": "AAMkcSQ0NmFkOhmZjdmNTZjNTMxNwBGAAAAAAA4kxh+ed3JTJPMPXU3wX3aBwCyyVyFtlsUcsBJebinpkUAAAAAAEMASFDkUAAAfxuiSAAA="
- }
- }
-}
-
-13. Search for folders
-
-Retrieves information for the folders of the specified mailbox. Only folders with read permissions will be returned. Your visual folders on the mailbox, such as "Inbox", are under the folder "Top of Information Store".
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-find-folders
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-target-mailbox
-The mailbox on which to apply the command.
-Optional
-
-
-is-public
-Whether to find Public Folders.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Folders.name
-string
-Folder name.
-
-
-EWS.Folders.id
-string
-Folder ID.
-
-
-EWS.Folders.totalCount
-Unknown
-Number of items in the folder.
-
-
-EWS.Folders.unreadCount
-number
-Number of unread items in the folder.
-
-
-EWS.Folders.changeKey
-number
-Folder change key.
-
-
-EWS.Folders.childrenFolderCount
-number
-Number of sub-folders.
-
-
-
-Â
-Command Example
-!ews-find-folders target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-root
-├── AllContacts
-├── AllItems
-├── Common Views
-├── Deferred Action
-├── ExchangeSyncData
-├── Favorites
-├── Freebusy Data
-├── Location
-├── MailboxAssociations
-├── My Contacts
-├── MyContactsExtended
-├── People I Know
-├── PeopleConnect
-├── Recoverable Items
-│ ├── Calendar Logging
-│ ├── Deletions
-│ ── Purges
-│ └── Versions
-├── Reminders
-├── Schedule
-├── Sharing
-├── Shortcuts
-├── Spooler Queue
-├── System
-├── To-Do Search
-├── Top of Information Store
-│ ├── Calendar
-│ ├── Contacts
-│ │ ├── GAL Contacts
-│ │ ├── Recipient Cache
-│ ├── Conversation Action Settings
-│ ├── Deleted Items
-│ │ └── Create1
-│ ├── Drafts
-│ ├── Inbox
-...
-
-Context Example
-{
- "EWS": {
- "Folders": [
- {
- "unreadCount": 1,
- "name": "Inbox",
- "childrenFolderCount": 1,
- "totalCount": 44,
- "changeKey": "**********fefsduQi0",
- "id": "*******VyFtlFDSAFDSFDAAA="
- }
- ...
- ]
- }
-}
-
-14. Get items of a folder
-
-Retrieves items from a specified folder in a mailbox. The items are ordered by the item created time, most recent is first.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-get-items-from-folder
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-folder-path
-The folder path from which to get the items.
-Required
-
-
-limit
-Maximum number of items to return.
-Optional
-
-
-target-mailbox
-The mailbox on which to apply the command.
-Optional
-
-
-is-public
-Whether the folder is a Public Folder. Default is 'False'.
-Optional
-
-
-get-internal-items
-If the email item contains another email as an attachment (EML or MSG file), whether to retrieve the EML/MSG file attachment. Can be "yes" or "no". Default is "no".
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.itemId
-string
-The item ID of the email.
-
-
-EWS.Items.hasAttachments
-boolean
-Whether the email has attachments.
-
-
-EWS.Items.datetimeReceived
-date
-Received time of the email.
-
-
-EWS.Items.datetimeSent
-date
-Sent time of the email.
-
-
-EWS.Items.headers
-Unknown
-Email headers (list).
-
-
-EWS.Items.sender
-string
-Sender mail address of the email.
-
-
-EWS.Items.subject
-string
-Subject of the email.
-
-
-EWS.Items.textBody
-string
-Body of the email (as text).
-
-
-EWS.Items.size
-number
-Email size.
-
-
-EWS.Items.toRecipients
-Unknown
-Email recipients addresses (list).
-
-
-EWS.Items.receivedBy
-Unknown
-Received by address of the email.
-
-
-EWS.Items.messageId
-string
-Email message ID.
-
-
-EWS.Items.body
-string
-Body of the email (as HTML).
-
-
-EWS.Items.FileAttachments.attachmentId
-unknown
-Attachment ID of file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentId
-unknown
-Attachment ID of the item attachment.
-
-
-EWS.Items.FileAttachments.attachmentName
-unknown
-Attachment name of the file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentName
-unknown
-Attachment name of the item attachment.
-
-
-Email.Items.ItemAttachments.attachmentName
-unknown
-Attachment name of the item attachment.
-
-
-EWS.Items.isRead
-String
-The read status of the email.
-
-
-
-Â
-Command Example
-!ews-get-items-from-folder folder-path=Test target-mailbox=test@demistodev.onmicrosoft.com limit=1
-Human Readable Output
-
-
-
-sender
-subject
-hasAttachments
-datetimeReceived
-receivedBy
-author
-toRecipients
-itemId
-
-
-
-
-test2@demistodev.onmicrosoft.com
-Get Attachment Email
-true
-2019-08-11T10:57:37Z
-test@demistodev.onmicrosoft.com
-test2@demistodev.onmicrosoft.com
-test@demistodev.onmicrosoft.com
-AAFSFSFFtlsUQZfBJebinpkUAAABjKMGAACyyVyFtlsUQZfBJebinpkUAAAsfw+jAAA=
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "body": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<style type=\"text/css\" style=\"display:none;\"><!-- P {margin-top:0;margin-bottom:0;} --></style>\r\n</head>\r\n<body dir=\"ltr\">\r\n<div id=\"divtagdefaultwrapper\" style=\"font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;\" dir=\"ltr\">\r\n<p style=\"margin-top:0;margin-bottom:0\">Some text inside email</p>\r\n</div>\r\n</body>\r\n</html>\r\n",
- "itemId": "AAFSFSFFtlsUQZfBJebinpkUAAABjKMGAACyyVyFtlsUQZfBJebinpkUAAAsfw+jAAA=",
- "toRecipients": [
- "test@demistodev.onmicrosoft.com"
- ],
- "datetimeCreated": "2019-08-11T10:57:37Z",
- "datetimeReceived": "2019-08-11T10:57:37Z",
- "author": "test2@demistodev.onmicrosoft.com",
- "hasAttachments": true,
- "size": 21435,
- "subject": "Get Attachment Email",
- "FileAttachments": [
- {
- "attachmentName": "atta1.rtf",
- "attachmentSHA256": "cd81097bcvdiojf3407a00308b48039e31a44a1c4fdnfkdknce36e4f",
- "attachmentType": "FileAttachment",
- "attachmentSize": 535,
- "attachmentId": "AAFSFSFFtlsUQZfBJebinpkUAAABjKMGAACyyVyFtlsUQZfBJebinpkUAAAsfw+jAAABEgAQAEyq1TB2nKBLpKUiFUJ5Geg=",
- "attachmentIsInline": false,
- "attachmentLastModifiedTime": "2019-08-11T11:06:02+00:00",
- "attachmentContentLocation": null,
- "attachmentContentType": "text/rtf",
- "originalItemId": "AAFSFSFFtlsUQZfBJebinpkUAAABjKMGAACyyVyFtlsUQZfBJebinpkUAAAsfw+jAAA=",
- "attachmentContentId": null
- }
- ],
- "headers": [
- {
- "name": "Subject",
- "value": "Get Attachment Email"
- },
- ...
- ],
- "isRead": true,
- "messageId": "<message_id>",
- "receivedBy": "test@demistodev.onmicrosoft.com",
- "datetimeSent": "2019-08-11T10:57:36Z",
- "lastModifiedTime": "2019-08-11T11:13:59Z",
- "mailbox": "test@demistodev.onmicrosoft.com",
- "importance": "Normal",
- "textBody": "Some text inside email\r\n",
- "sender": "test2@demistodev.onmicrosoft.com"
- }
- }
-}
-
-15. Get items
-
-Retrieves items by item ID.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-get-items
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-ids
-A CSV list of item IDs.
-Required
-
-
-target-mailbox
-The mailbox on which to run the command on.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.itemId
-string
-The email item ID.
-
-
-EWS.Items.hasAttachments
-boolean
-Whether the email has attachments.
-
-
-EWS.Items.datetimeReceived
-date
-Received time of the email.
-
-
-EWS.Items.datetimeSent
-date
-Sent time of the email.
-
-
-EWS.Items.headers
-Unknown
-Email headers (list).
-
-
-EWS.Items.sender
-string
-Sender mail address of the email.
-
-
-EWS.Items.subject
-string
-Subject of the email.
-
-
-EWS.Items.textBody
-string
-Body of the email (as text).
-
-
-EWS.Items.size
-number
-Email size.
-
-
-EWS.Items.toRecipients
-Unknown
-Email recipients addresses (list).
-
-
-EWS.Items.receivedBy
-Unknown
-Received by address of the email.
-
-
-EWS.Items.messageId
-string
-Email message ID.
-
-
-EWS.Items.body
-string
-Body of the email (as HTML).
-
-
-EWS.Items.FileAttachments.attachmentId
-unknown
-Attachment ID of the file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentId
-unknown
-Attachment ID of the item attachment.
-
-
-EWS.Items.FileAttachments.attachmentName
-unknown
-Attachment name of the file attachment.
-
-
-EWS.Items.ItemAttachments.attachmentName
-unknown
-Attachment name of the item attachment.
-
-
-EWS.Items.isRead
-String
-The read status of the email.
-
-
-Email.CC
-String
-Email addresses CC'ed to the email.
-
-
-Email.BCC
-String
-Email addresses BCC'ed to the email.
-
-
-Email.To
-String
-The recipient of the email.
-
-
-Email.From
-String
-The sender of the email.
-
-
-Email.Subject
-String
-The subject of the email.
-
-
-Email.Text
-String
-The plain-text version of the email.
-
-
-Email.HTML
-String
-The HTML version of the email.
-
-
-Email.HeadersMap
-String
-The headers of the email.
-
-
-
-Â
-Command Example
-!ews-get-items item-ids=AAMkADQ0NmFkODFkLWQ4MDEtNDFDFZjNTMxNwBGAAAAAAA4kxhFFAfxw+jAAA= target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-Identical outputs to ews-get-items-from-folder
 command.
-16. Move an item to a different mailbox
-
-Moves an item from one mailbox to a different mailbox.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-move-item-between-mailboxes
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-id
-The item ID to move.
-Required
-
-
-destination-folder-path
-The folder in the destination mailbox to which to move the item. You can specify a complex path, for example, "Inbox\Phishing".
-Required
-
-
-destination-mailbox
-The mailbox to which to move the item.
-Required
-
-
-source-mailbox
-The mailbox from which to move the item (conventionally called the "target-mailbox", the target mailbox on which to run the command).
-Optional
-
-
-is-public
-Whether the destination folder is a Public Folder. Default is "False".
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.movedToMailbox
-string
-The mailbox to which the item was moved.
-
-
-EWS.Items.movedToFolder
-string
-The folder to which the item was moved.
-
-
-EWS.Items.action
-string
-The action taken on the item. The value will be "moved".
-
-
-
-Â
-Command Example
-!ews-move-item-between-mailboxes item-id=AAMkAGY3OTQyMzMzLWYxNjktNDE0My05NFSFSyNzBkNABGAAAAAACYCKjWAjq/zTrN6vWSzK4OWAAK2ISFSA= destination-folder-path=Moving destination-mailbox=test@demistodev.onmicrosoft.com source-mailbox=test2@demistodev.onmicrosoft.com
-Human Readable Output
-Item was moved successfully.
-Context Example
-{
- "EWS": {
- "Items": {
- "movedToMailbox": "test@demistodev.onmicrosoft.com",
- "movedToFolder": "Moving"
- }
- }
-}
-
-17. Get a folder
-
-Retrieves a single folder.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-get-folder
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-target-mailbox
-The mailbox on which to apply the search.
-Optional
-
-
-folder-path
-The path of the folder to retrieve. If empty, will retrieve the folder "AllItems".
-Optional
-
-
-is-public
-Whether the folder is a Public Folder. Default is "False".
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Folders.id
-string
-Folder ID.
-
-
-EWS.Folders.name
-string
-Folder name.
-
-
-EWS.Folders.changeKey
-string
-Folder change key.
-
-
-EWS.Folders.totalCount
-number
-Total number of emails in the folder.
-
-
-EWS.Folders.childrenFolderCount
-number
-Number of sub-folders.
-
-
-EWS.Folders.unreadCount
-number
-Number of unread emails in the folder.
-
-
-
-Â
-Command Example
-!ews-get-folder folder-path=demistoEmail target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-changeKey
-childrenFolderCount
-id
-name
-totalCount
-unreadCount
-
-
-
-
-***yFtCdJSH
-0
-AAMkADQ0NmFkODFkLWQ4MDEtNDE4Mi1hN2NlsjflsjfSF=
-demistoEmail
-1
-0
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Folders": {
- "unreadCount": 0,
- "name": "demistoEmail",
- "childrenFolderCount": 0,
- "totalCount": 1,
- "changeKey": "***yFtCdJSH",
- "id": "AAMkADQ0NmFkODFkLWQ4MDEtNDE4Mi1hN2NlsjflsjfSF="
- }
- }
-}
-
-18. Initiate a compliance search
-
-Starts a new compliance search. For additional information about new compliance searches, see the Additional Information section.
-Required Permissions
-You need to be assigned permissions in the Office 365 Security & Compliance Center before you can use these commands. For more information, see Permissions in Office 365 Security & Compliance Center .
-Base Command
-ews-o365-start-compliance-search
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-query
-Query to use to find emails.
-Required
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.ComplianceSearch.Name
-string
-The name of the compliance search.
-
-
-EWS.ComplianceSearch.Status
-string
-The status of the compliance search.
-
-
-
-Â
-Command Example
-!ews-o365-start-compliance-search query="subject:"Wanted Email""
-Human Readable Output
-Search started: DemistoSearch67e67371d0004c46bebfa3219b5a14bf
-Context Example
-{
- "EWS": {
- "ComplianceSearch": {
- "Status": "Starting",
- "Name": "DemistoSearch67e67371d0004c46bebfa3219b5a14bf"
- }
- }
-}
-
-19. Get the status and results of a compliance search
-
-Returns the status and results of a compliance search. For additional information about new compliance searches, see the Additional Information section.
-Required Permissions
-You need to be assigned permissions in the Office 365 Security & Compliance Center before you can use this cmdlet. For more information, see Permissions in Office 365 Security & Compliance Center .
-Base Command
-ews-o365-get-compliance-search
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-search-name
-The name of the compliance search.
-Required
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.ComplianceSearch.Status
-Unknown
-The status of the compliance search.
-
-
-
-Â
-Command Example
-!ews-o365-get-compliance-search search-name=DemistoSearch67e67371d0004c46bebfa3219b5a14bf
-Human Readable Output
-
-
-
-Location
-Item count
-Total size
-
-
-
-
-test@demistodev.onmicrosoft.com
-0
-0
-
-
-...
-Â
-Â
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "ComplianceSearch": {
- "Status": "Completed",
- "Name": "DemistoSearch67e67371d0004c46bebfa3219b5a14bf"
- }
- }
-}
-
-20. Purge compliance search results
-
-Purges the results found in the compliance search. For additional information about new compliance searches, see the Additional Information section.
-Required Permissions
-You need to be assigned permissions in the Office 365 Security & Compliance Center before you can use this cmdlet. For more information, see Permissions in Office 365 Security & Compliance Center .
-Base Command
-ews-o365-purge-compliance-search-results
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-search-name
-The name of the compliance search.
-Required
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.ComplianceSearch.Status
-string
-The status of the compliance search.
-
-
-
-Â
-Command Example
-!ews-o365-purge-compliance-search-results search-name=DemistoSearch67e67371d0004c46bebfa3219b5a14bf
-Human Readable Output
-Search DemistoSearch67e67371d0004c46bebfa3219b5a14bf status: Purging
-Context Example
-{
- "EWS": {
- "ComplianceSearch": {
- "Status": "Purging",
- "Name": "DemistoSearch67e67371d0004c46bebfa3219b5a14bf"
- }
- }
-}
-
-21. Remove a compliance search
-
-Removes the compliance search. For additional information about new compliance searches, see the Additional Information section.
-Required Permissions
-You need to be assigned permissions in the Office 365 Security & Compliance Center before you can use this cmdlet. For more information, see Permissions in Office 365 Security & Compliance Center .
-Base Command
-ews-o365-remove-compliance-search
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-search-name
-The name of the compliance search.
-Required
-
-
-
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.ComplianceSearch.Status
-string
-The status of the compliance search.
-
-
-
-Â
-Command Example
-!ews-o365-remove-compliance-search search-name=DemistoSearch67e67371d0004c46bebfa3219b5a14bf
-Human Readable Output
-Search DemistoSearch67e67371d0004c46bebfa3219b5a14bf status: Removed
-Context Example
-{
- "EWS": {
- "ComplianceSearch": {
- "Status": "Removed",
- "Name": "DemistoSearch67e67371d0004c46bebfa3219b5a14bf"
- }
- }
-}
-
-22. Get the purge status of a compliance search
-
-Checks the status of the purge operation on the compliance search. For additional information about new compliance searches, see the Additional Information section.
-Required Permissions
-You need to be assigned permissions in the Office 365 Security & Compliance Center before you can use this cmdlet. For more information, see Permissions in Office 365 Security & Compliance Center .
-Base Command
-ews-o365-get-compliance-search-purge-status
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-search-name
-The name of the compliance search.
-Required
-
-
-
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.ComplianceSearch.Status
-Unknown
-The status of the compliance search.
-
-
-
-Â
-Command Example
-!ews-o365-get-compliance-search-purge-status search-name=DemistoSearch67e67371d0004c46bebfa3219b5a14bf
-Human Readable Output
-Search DemistoSearch67e67371d0004c46bebfa3219b5a14bf status: Purged
-Context Example
-{
- "EWS": {
- "ComplianceSearch": {
- "Status": "Purged",
- "Name": "DemistoSearch67e67371d0004c46bebfa3219b5a14bf"
- }
- }
-}
-
-23. Get auto-discovery information
-
-Returns the auto-discovery information. Can be used to manually configure the Exchange Server.
-Base Command
-ews-get-autodiscovery-config
-Input
-There are no input arguments for this command.
-Context Output
-There is no context output for this command.
-Command Example
-!ews-get-autodiscovery-config
-Human Readable Output
-
-
-
-api_version
-auth_type
-build
-service_endpoint
-
-
-
-
-Exchange2016
-###
-
-. .****.**
-https://outlook.office365.com/EWS/Exchange.asmx
-
-
-
-Â
-24. Expand a distribution list
-
-Expands a distribution list to display all members. By default, expands only the first layer of the distribution list. If recursive-expansion is "True", the command expands nested distribution lists and returns all members.
-Required Permissions
-Impersonation rights required. In order to perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-expand-group
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-email-address
-Email address of the group to expand.
-Required
-
-
-recursive-expansion
-Whether to enable recursive expansion. Default is "False".
-Optional
-
-
-
-Â
-Context Output
-There is no context output for this command.
-Command Example
-!ews-expand-group email-address="TestPublic" recursive-expansion="False"
-Human Readable Output
-
-
-
-displayName
-mailbox
-mailboxType
-
-
-
-
-John Wick
-john@wick.com
-Mailbox
-
-
-
-Â
-Context Example
-{
- "EWS.ExpandGroup": {
- "name": "TestPublic",
- "members": [
- {
- "mailboxType": "Mailbox",
- "displayName": "John Wick",
- "mailbox": "john@wick.com"
- }
- ]
- }
-}
-
-25. Mark items as read
-
-Marks items as read or unread.
-Required Permissions
-Impersonation rights are required. To perform actions on the target mailbox of other users, the service account must be part of the ApplicationImpersonation role.
-Base Command
-ews-mark-items-as-read
-Input
-
-
-
-Argument Name
-Description
-Required
-
-
-
-
-item-ids
-A CSV list of item IDs.
-Required
-
-
-operation
-How to mark the item. Can be "read" or "unread". Default is "read".
-Optional
-
-
-target-mailbox
-The mailbox on which to run the command. If empty, the command will be applied on the default mailbox.
-Optional
-
-
-
-Â
-Context Output
-
-
-
-Path
-Type
-Description
-
-
-
-
-EWS.Items.action
-String
-The action that was performed on the item.
-
-
-EWS.Items.itemId
-String
-The ID of the item.
-
-
-EWS.Items.messageId
-String
-The message ID of the item.
-
-
-
-Â
-Command Example
-!ews-mark-items-as-read item-ids=AAMkADQ0NFSffU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMnpkUAAAfxw+jAAA= operation=read target-mailbox=test@demistodev.onmicrosoft.com
-Human Readable Output
-
-
-
-action
-itemId
-messageId
-
-
-
-
-marked-as-read
-AAMkADQ0NFSffU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMnpkUAAAfxw+jAAA=
-<message_id>
-
-
-
-Â
-Context Example
-{
- "EWS": {
- "Items": {
- "action": "marked-as-read",
- "itemId": "AAMkADQ0NFSffU3wX3aBwCyyVyFtlsUQZfBJebinpkUAAABjKMnpkUAAAfxw+jAAA= ",
- "messageId": "<message_id>"
- }
- }
-}
-
-
-
-
-### ews-get-items-as-eml
-***
-Retrieves items by item ID and uploads it's content as eml file.
-
-
-#### Base Command
-
-`ews-get-items-as-eml`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| item-id | The item ID of item to upload as and EML file. | Required |
-| target-mailbox | The mailbox in which this email was found. If empty, the default mailbox is used. Otherwise the user might require impersonation rights to this mailbox. | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| File.Size | String | The size of the file. |
-| File.SHA1 | String | The SHA1 hash of the file. |
-| File.SHA256 | String | The SHA256 hash of the file. |
-| File.SHA512 | String | The SHA512 hash of the file. |
-| File.Name | String | The name of the file. |
-| File.SSDeep | String | The SSDeep hash of the file. |
-| File.EntryID | String | EntryID of the file |
-| File.Info | String | Information about the file. |
-| File.Type | String | The file type. |
-| File.MD5 | String | The MD5 hash of the file. |
-| File.Extension | String | The extension of the file. |
-Additional Information
-
-EWS Permissions
-To perform actions on mailboxes of other users, and to execute searches on the Exchange server, you need specific permissions. For a comparison between Delegate and Impersonation permissions, see the Microsoft documentation .
-
-
-
-Permission
-Use Case
-How to Configure
-
-
-
-
-Delegate
-One-to-one relationship between users.
-Read more here .
-
-
-Impersonation
-A single account needs to access multiple mailboxes.
-Read more here .
-
-
-eDiscovery
-Search the Exchange server.
-Read more here .
-
-
-Compliance Search
-Perform searches across mailboxes and get an estimate of the results.
-Read more here .
-
-
-
-Â
-New-Compliance Search
-The EWS v2 integration uses remote ps-session to run commands of compliance search as part of Office 365. To check if your account can connect to Office 365 Security & Compliance Center via powershell, check the following steps . New-Compliance search is a long-running task which has no limitation of searched mailboxes and therefore the suggestion is to use Office 365 Search and Delete
playbook. New-Compliance search returns statistics of matched content search query and doesn't return preview of found emails in contrast to ews-search-mailboxes
 command.
-Troubleshooting
-For troubleshooting information, see the EWS V2 Troubleshooting .
diff --git a/Packs/EWS/Integrations/SecurityAndCompliance/README.md b/Packs/EWS/Integrations/SecurityAndCompliance/README.md
deleted file mode 100644
index dd66f0e7a509..000000000000
--- a/Packs/EWS/Integrations/SecurityAndCompliance/README.md
+++ /dev/null
@@ -1,1122 +0,0 @@
-This integration enables you to manage and interact with Microsoft security and compliance content search. You can manage the security of all your organization's emails, SharePoint sites, OneDrives, etc., by searching for text strings or queries based on attributes of a malicious email. However, you can only perform actions (preview and delete) on emails.
-This integration was integrated and tested with [Security & Compliance Center](https://docs.microsoft.com/en-us/powershell/module/exchange/?view=exchange-ps#policy-and-compliance-content-search).
-
-**Important Note:** Microsoft Office 365 no longer supports Basic Authentication. This version of the Security and Compliance integration will not function correctly beginning January 1st, 2023. Please use O365 Security and Compliance v2 instead.
-
-## Use Cases
-
-* Create / Modify / Get / List / Remove / Trigger a search in the Security & Compliance Center - Content search service.
-* Create / Get / List / Remove search actions in the Security & Compliance Center - Content search service. Supported actions for emails only are Purge (Delete) and Preview.
-
-## Playbooks
-
-* O365 - Security And Compliance - Search And Delete: Creates and starts a compliance search in the Security and Compliance Center to identify emails with similar attributes of a malicious email. If configured, will preview or delete the emails that were located. This playbook uses the following playbooks as sub-playbooks in its workflow.
-* O365 - Security And Compliance - Search: Creates and starts a compliance search in the Security and Compliance Center to identify emails with attributes similar to a malicious email.
-* O365 - Security And Compliance - Search Action - Delete: Deletes emails located by the **O365 SecurityAndCompliance Search** sub-playbook.
-* O365 - Security And Compliance - Search Action - Preview: Provides a preview of the results of emails located by the **O365 SecurityAndCompliance Search** sub-playbook.
-
-
-
-## Permissions in the Security & Compliance Center
-
-To access the Security & Compliance Center, the user account needs to be a global administrator or needs to be assigned the Role Management role (a role is assigned only to the Organization Management role group). The Role Management role allows users to view, create, and modify role groups.
-
-1. Login into the [Security & Compliance Center](https://ps.compliance.protection.outlook.com):
-
-1. From the side menu, click **Permissions**.
-
- ![side-menu](../../doc_imgs/security-and-compliance-side-menu.png)
-
-2. Search for and select the **Data Investigator** role.
-
-3. Click **Edit role group**.
-
- ![roles-edit-1](../../doc_imgs/security-and-compliance-edit-1.png)
-
-4. Click **Choose Members** and click **Edit**. Add the user you intend to be used in the integration:
-
- ![roles-edit-2](../../doc_imgs/security-and-compliance-edit-2.png)
-5. Click **Add**.
- ![roles-edit-3](../../doc_imgs/security-and-compliance-edit-3.png)
-6. Choose which members to add from the displayed list and click **Add**.
-7. Click **Done**.
-
-
-## Configure SecurityAndCompliance on Cortex XSOAR
-
-1. Navigate to **Settings** > **Integrations** > **Servers & Services**.
-
-2. Search for O365 - Security And Compliance - Content Search.
-
-3. Authentication / Authorization methods:
-
- 1. OAuth2.0 authorization (recommended):
-
- 1. Click **Add instance** to create and configure a new integration instance.
-
- | **Parameter** | **Description** | **Required** |
- | ------------- | -------------------------------------------------------- | ------------ |
- | url | Search and Compliance URL | True |
- | credentials | Fill **only** Email (aka UPN), Password should be empty. | False |
- | insecure | Trust any certificate \(not secure\) | False |
-
- 2. Open playground - War-room:
-
- 1. Run the ***!o365-sc-auth-start*** command and follow the instructions. Expected output is:
-
- > ## Security And Compliance - Authorize instructions
- >
- > 1. To sign in, use a web browser to open the page [https://microsoft.com/devicelogin](https://microsoft.com/devicelogin) and enter the code **XXXXXXX** to authenticate.
- > 2. Run the command ***!o365-sc-auth-complete*** command in the War Room.
-
- 2. Test - OAuth2.0 authorization, Run the ***!o365-sc-auth-test*** command.
-
- 2. Basic authentication (Not recommended):
-
- 1. Click **Add instance** to create and configure a new integration instance.
-
- | **Parameter** | **Description** | **Required** |
- | --- | --- | --- |
- | url | Search and Compliance URL | True |
- | credentials | Fill Email (aka UPN) and password | False |
- | insecure | Trust any certificate \(not secure\) | False |
-
- 2. Click **Test** to validate the URLs, token, and connection.
-
-
-
-## Commands
-You can execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook.
-After you successfully execute a command, a DBot message appears in the War Room with the command details.
-
-### o365-sc-auth-start
-***
-OAuth2.0 - Start authorization.
-
-
-#### Base Command
-
-`o365-sc-auth-start`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-auth-start```
-
-#### Human Readable Output
-
->## Security And Compliance - Authorize instructions
->1. To sign in, use a web browser to open the page [https://microsoft.com/devicelogin](https://microsoft.com/devicelogin) and enter the code **XXXXXXX** to authenticate.
->2. Run the ***!o365-sc-auth-complete*** command in the War Room.
-
-
-### o365-sc-auth-complete
-***
-OAuth2.0 - Complete authorization.
-
-
-#### Base Command
-
-`o365-sc-auth-complete`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-auth-complete```
-
-#### Human Readable Output
-
->Your account **successfully** authorized!
-
-
-
-### o365-sc-auth-test
-***
-OAuth2.0 - Test authorization.
-
-
-#### Base Command
-
-`o365-sc-auth-test`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-auth-test```
-
-#### Human Readable Output
-
->**Test ok!**
-
-
-
-### o365-sc-new-search
-***
-Create compliance search in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-new-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. If not specified, will have the prefix "XSOAR-" followed by the GUID e.g., XSOAR-d6228fd0-756b-4e4b-8721-76776df91526. | Required |
-| case | The name of a Core eDiscovery case to associate with the new compliance search. | Optional |
-| kql | Text search string or a query that is formatted using the Keyword Query Language (KQL). [Tips for finding messages to remove using KQL](#tips-for-finding-messages-to-remove)
-| Optional |
-| description | Description of the compliance search. | Optional |
-| allow_not_found_exchange_locations | Whether to include mailboxes other than regular user mailboxes in the compliance search. Default is "false". | Optional |
-| exchange_location | Comma-separated list of mailboxes/distribution groups to include, or you can use the value "All" to include all. | Optional |
-| exchange_location_exclusion | Comma-separated list of mailboxes/distribution groups to exclude when you use the value "All" for the exchange_location parameter. | Optional |
-| public_folder_location | Comma-separated list of public folders to include, or you can use the value "All" to include all. | Optional |
-| share_point_location | Comma-separated list of SharePoint online sites to include. You can identify the sites by their URL value, or you can use the value "All" to include all sites. | Optional |
-| share_point_location_exclusion | Comma-separated list of SharePoint online sites to exclude when you use the value "All" for the share_point_location argument. You can identify the sites by their URL value. | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.Search.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ContentMatchQuery | String | Compliance text search string or a query that is formatted using the Keyword Query Language \(KQL\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedBy | String | Security and compliance search creator. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedTime | Date | Security and compliance search creation time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Description | String | Security and compliance search description. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Errors | String | Security and compliance search errors. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ExchangeLocation | String | Security and compliance search exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Identity | String | Security and compliance search identity. |
-| O365.SecurityAndCompliance.ContentSearch.Search.IsValid | Boolean | Whether the security and compliance search is valid. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Items | Number | The number of security and compliance search scanned items. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobEndTime | Date | Security and compliance search job end time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobId | String | Security and compliance search job ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobRunId | String | Security and compliance search job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobStartTime | Date | Security and compliance search job run start time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LastModifiedTime | Date | Security and compliance search last modification time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LogLevel | String | Security and compliance search Azure log level. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Name | String | Security and compliance search name. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocation | String | Security and compliance search OneDrive locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocationExclusion | String | Security and compliance search OneDrive locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocation | String | Security and compliance search public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocationExclusion | String | Security and compliance search public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunBy | String | Security and compliance search last run by UPN \(Email representation\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunspaceId | String | Security and compliance search run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SharePointLocation | String | Security and compliance search SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Size | Number | Security and compliance search bytes results size. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Status | String | Security and compliance search status. |
-| O365.SecurityAndCompliance.ContentSearch.Search.TenantId | String | Security and compliance search Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-new-search search_name="example" exchange_location="user1@demistodev.onmicrosoft.com,user2@demistodev.onmicrosoft.com" allow_not_found_exchange_locations=true kql="Rodrigo"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "Search": {
- "AllowNotFoundExchangeLocationsEnabled": true,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "ContentMatchQuery": "Rodrigo",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-11-29T07:12:46.5943533Z",
- "Description": "Short description",
- "Errors": null,
- "ExchangeLocation": [
- "test1@onmicrosoft.com",
- "test2@onmicrosoft.com"
- ],
- "ExchangeLocationExclusion": [],
- "Identity": "xxxxx",
- "IsValid": true,
- "Items": 0,
- "JobEndTime": null,
- "JobId": "xxxxx",
- "JobRunId": null,
- "JobStartTime": null,
- "LastModifiedTime": "2020-11-29T07:12:46.5943533Z",
- "LogLevel": "Suppressed",
- "Name": "example",
- "OneDriveLocation": null,
- "OneDriveLocationExclusion": null,
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "RunBy": "",
- "RunspaceId": null,
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Size": 0,
- "Status": "NotStarted",
- "SuccessResults": null,
- "TenantId": "xxxxx"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - New search 'example' created
->| ContentMatchQuery | CreatedBy | Description | LastModifiedTime | Name
->| --- | --- | --- | --- | ---
->| Rodrigo | XSOAR-user | Short description | 11/29/2020 7:12:46 AM | example
-
-
-
-### o365-sc-set-search
-
-***
-Modifies non-running compliance searches in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-set-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-| kql | Modify the text search string or a query that is formatted using the Keyword Query Language (KQL). | Optional |
-| description | Modify the description for the compliance search. | Optional |
-| allow_not_found_exchange_locations | Whether to include mailboxes other than regular user mailboxes in the compliance search. | Optional |
-| add_exchange_location | Comma-separated list of added mailboxes/distribution groups to include, or you can use the value "All" to include all mailboxes. | Optional |
-| add_exchange_location_exclusion | Comma-separated list of added mailboxes/distribution groups to exclude when you use the value "All" for the exchange_location (used in create new compliance search) or the add_exchange_location argument. | Optional |
-| add_public_folder_location | Comma-separated list of added public folders to include, or you can use the value "All" to include all. | Optional |
-| add_share_point_location | Comma-separated list of added SharePoint online sites to include. You identify the sites by their URL value, or you can use the value "All" to include all sites. | Optional |
-| add_share_point_location_exclusion | Comma-separated list of added SharePoint online sites to exclude when you use the value "All" for the exchange_location (used in create new compliance search) argument or the share_point_location argument. You can identify the sites by their URL value. | Optional |
-| remove_exchange_location | Comma-separated list of removed mailboxes/distribution group to include. | Optional |
-| remove_exchange_location_exclusion | Comma-separated list of removed mailboxes/distribution group to exclude when you use the value "All" for the exchange_location (Used in create new compliance search) or the add_exchange_location argument. | Optional |
-| remove_public_folder_location | Comma-separated list of removed public folders to include. | Optional |
-| remove_share_point_location | Comma-separated list of removed SharePoint online sites to include. You can identify the sites by their URL value. | Optional |
-| remove_share_point_location_exclusion | Comma-separated list of removed SharePoint online sites to exclude when you use the value "All" for the exchange_location (Used in create new compliance search) argument or the share_point_location argument. You can identify the sites by their URL value. | Optional |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-set-search search_name="example" remove_exchange_location="test2@demistodev.onmicrosoft.com"```
-
-#### Human Readable Output
-
->Security And Compliance - Search **example** modified!
-
-
-
-### o365-sc-remove-search
-
-***
-Remove compliance search by name from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-remove-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-remove-search search_name="example"```
-
-#### Human Readable Output
-
->Security And Compliance - Search **example** removed!
-
-
-
-### o365-sc-list-search
-
-***
-List compliance searches in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-list-search`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.Search.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ContentMatchQuery | String | Compliance text search string or a query that is formatted using the Keyword Query Language \(KQL\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedBy | String | Security and compliance search creator. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedTime | Date | Security and compliance search creation time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Description | String | Security and compliance search description. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Errors | String | Security and compliance search errors. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ExchangeLocation | String | Security and compliance search exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Identity | String | Security and compliance search identity. |
-| O365.SecurityAndCompliance.ContentSearch.Search.IsValid | Boolean | Whether the security and compliance search is valid. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Items | Number | The number of security and compliance search scanned items. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobEndTime | Date | Security and compliance search job end time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobId | String | Security and compliance search job ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobRunId | String | Security and compliance search job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobStartTime | Date | Security and compliance search job run start time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LastModifiedTime | Date | Security and compliance search last modification time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LogLevel | String | Security and compliance search Azure log level. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Name | String | Security and compliance search name. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocation | String | Security and compliance search OneDrive locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocationExclusion | String | Security and compliance search OneDrive locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocation | String | Security and compliance search public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocationExclusion | String | Security and compliance search public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunBy | String | Security and compliance search last run by UPN \(Email representation\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunspaceId | String | Security and compliance search run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SharePointLocation | String | Security and compliance search SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Size | Number | Security and compliance search bytes results size. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Status | String | Security and compliance search status. |
-| O365.SecurityAndCompliance.ContentSearch.Search.TenantId | String | Security and compliance search Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-list-search```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "Search": [
- {
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "ContentMatchQuery": "subject:test",
- "CreatedBy": "XSOAR-user1",
- "CreatedTime": "2019-08-22T06:43:48.747",
- "Description": "Short description",
- "Errors": null,
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "Items": 0,
- "JobEndTime": "2019-09-05T13:21:11.563",
- "JobId": "xxxx",
- "JobRunId": null,
- "JobStartTime": "2019-09-05T13:20:34.633",
- "LastModifiedTime": "2019-08-22T06:43:48.747",
- "LogLevel": "Suppressed",
- "Name": "example1",
- "OneDriveLocation": null,
- "OneDriveLocationExclusion": null,
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "RunBy": "XSOAR-user1",
- "RunspaceId": null,
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Size": 0,
- "Status": "Completed",
- "SuccessResults": null,
- "TenantId": "xxxx"
- },
- {
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "ContentMatchQuery": "subject:Incident Summary Report",
- "CreatedBy": "XSOAR-user2",
- "CreatedTime": "2020-01-08T00:44:30.94",
- "Description": "Short description",
- "Errors": null,
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "Items": 0,
- "JobEndTime": "2020-01-08T00:45:13.433",
- "JobId": "xxxxx",
- "JobRunId": null,
- "JobStartTime": "2020-01-08T00:44:33.717",
- "LastModifiedTime": "2020-01-08T00:44:30.94",
- "LogLevel": "Suppressed",
- "Name": "example2",
- "OneDriveLocation": null,
- "OneDriveLocationExclusion": null,
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "RunBy": "XSOAR-user2",
- "RunspaceId": null,
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Size": 0,
- "Status": "Completed",
- "SuccessResults": null,
- "TenantId": "xxxxx"
- }
- ]
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - Search configurations
->| CreatedBy | Description | LastModifiedTime | Name | RunBy
->| --- | --- | --- | --- | ---
->| XSOAR-user1 | Short description | 8/22/2019 6:43:48 AM | example1 | XSOAR-user1
->| XSOAR-user2 | Short description | 1/8/2020 12:44:30 AM | example2 | XSOAR-user2
-
-
-### o365-sc-get-search
-***
-Gets compliance search by name from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-get-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-| limit | The maximum number of results to return. If you want to return all requests that match the query, use "-1" for the value of this argument. | Optional |
-| all_results | Whether to include mailboxes which have no results in results entry context. | Optional |
-| export | Whether to export search results as json file to war-room. | Optional |
-| statistics | Show search statistics. Default is "false". | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.Search.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ContentMatchQuery | String | Compliance text search string or a query that is formatted using the Keyword Query Language \(KQL\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedBy | String | Security and compliance search creator. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedTime | Date | Security and compliance search creation time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Description | String | Security and compliance search description. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Errors | String | Security and compliance search errors. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ExchangeLocation | String | Security and compliance search exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Identity | String | Security and compliance search identity. |
-| O365.SecurityAndCompliance.ContentSearch.Search.IsValid | Boolean | Whether the security and compliance search is valid. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Items | Number | Number of security and compliance search scanned items. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobEndTime | Date | Security and compliance search job end time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobId | String | Security and compliance search job ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobRunId | String | Security and compliance search job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobStartTime | Date | Security and compliance search job run start time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LastModifiedTime | Date | Security and compliance search last modification time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LogLevel | String | Security and compliance search the Azure log level. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Name | String | Security and compliance search name. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocation | String | Security and compliance search OneDrive locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocationExclusion | String | Security and compliance search OneDrive locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocation | String | Security and compliance search public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocationExclusion | String | Security and compliance search public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunBy | String | Security and compliance search last run by UPN \(Email representation\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunspaceId | String | Security and compliance search run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SharePointLocation | String | Security and compliance search SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Size | Number | Security and compliance search bytes results size. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Status | String | Security and compliance search status. |
-| O365.SecurityAndCompliance.ContentSearch.Search.TenantId | String | Security and compliance search Tenant ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SuccessResults.Location | String | Security and compliance search result location. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SuccessResults.ItemsCount | Number | The number of security and compliance search results in location. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SuccessResults.Size | Number | The byte size of the security and compliance search results in location. |
-
-
-#### Command Example
-```!o365-sc-get-search search_name="example"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "Search": {
- "Errors": "",
- "AzureBatchFrameworkEnabled": false,
- "TenantId": "xxxxx",
- "SharePointLocationExclusion": null,
- "JobStartTime": "2020-11-29T07:20:59.37",
- "CreatedTime": "2020-11-29T07:18:04.283",
- "OneDriveLocation": null,
- "PublicFolderLocation": null,
- "Status": "Completed",
- "CaseName": "",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "LogLevel": "Suppressed",
- "JobRunId": null,
- "CaseId": null,
- "JobId": "xxxxx",
- "SuccessResults": {
- "ItemsCount": "122303",
- "Location": "user@onmicrosoft.com",
- "Size": "12339007379"
- },
- "LastModifiedTime": "2020-11-29T07:20:43.283",
- "Identity": "1d130723-fe0a-4726-6d2a-08d89437520e",
- "Name": "example",
- "Items": 122303,
- "ExchangeLocation": [
- "user@onmicrosoft.com"
- ],
- "RunBy": "XSOAR-user",
- "Description": "Short description",
- "ExchangeLocationExclusion": [],
- "IsValid": true,
- "PublicFolderLocationExclusion": null,
- "SharePointLocation": null,
- "CreatedBy": "XSOAR-user",
- "JobEndTime": "2020-11-29T07:22:01.99",
- "RunspaceId": null,
- "Size": 12339007379,
- "OneDriveLocationExclusion": null,
- "ContentMatchQuery": "Rodrigo"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - 'example' search
->| CreatedBy | Description | LastModifiedTime | Name | RunBy | Status
->| --- | --- | --- | --- | --- | ---
->| XSOAR-user | Short description | 2020-11-29T07:20:43.283 | example | XSOAR-user | NotStarted
-
-
-### o365-sc-start-search
-***
-Starts stopped, completed, or not started compliance search in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-start-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-start-search search_name="example"```
-
-#### Human Readable Output
-
->Security And Compliance - search **example** started !
-
-### o365-sc-stop-search
-***
-Stop running compliance search in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-stop-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-stop-search search_name="example"```
-
-#### Human Readable Output
-
->Security And Compliance - search **example** stopped !
-
-
-### o365-sc-new-search-action
-***
-After you create a content search using the ***o365-sc-new-search*** command and run it using the ***o365-sc-start-search*** command, you assign a search action to the search using the ***o365-sc-new-search-action*** command.
-
-
-#### Base Command
-
-`o365-sc-new-search-action`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-| action | Search action to perform. Possible values are: "Preview" and "Purge". Default is "Preview". | Optional |
-| purge_type | Purge type. Possible values are: "Soft Delete" and "HardDelete". Default is "SoftDelete". | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Action | String | Security and compliance search action type. Either "Purge" or "Preview". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedBy | String | Security and compliance search action creator. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedTime | Date | Security and compliance search action creation time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Description | String | Security and compliance search action description. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Errors | String | Security and compliance search action errors. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchJobId | String | Security and compliance search action job ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchRunId | String | Security and compliance search action run ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocation | String | Security and compliance search action exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocationExclusion | String | Security and compliance search action exchange locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Identity | String | Security and compliance search action identity. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.IsValid | Boolean | Whether the security and compliance search action is valid. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobEndTime | Date | Security and compliance search action job end time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobId | String | Security and compliance search action job ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobRunId | String | Security and compliance search action job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobStartTime | Date | Security and compliance search action job start time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.LastModifiedTime | Date | Security and compliance search action last modified time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Name | String | Security and compliance search action name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocation | String | Security and compliance search action public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocationExclusion | String | Security and compliance search action public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Retry | Boolean | Whether to retry if the search action failed. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunBy | String | Security and compliance search action run by UPN \(email address\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunspaceId | String | Security and compliance search action run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SearchName | String | Security and compliance search action search name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocation | String | Security and compliance search action SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocationExclusion | String | Security and compliance search action SharePoint locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Status | String | Security and compliance search action status. Either "Started" or "Completed". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.TenantId | String | Security and compliance search action Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-new-search-action search_name="example" action="Preview"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "SearchAction": {
- "Action": "Preview",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-11-29T07:23:50.05",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "xxxxx",
- "EstimateSearchRunId": "xxxxx",
- "ExchangeLocation": [
- "user@onmicrosoft.com"
- ],
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-11-29T07:24:05.76",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-11-29T07:23:50.297",
- "LastModifiedTime": "2020-11-29T07:23:50.05",
- "Name": "example_Preview",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": null,
- "Retry": false,
- "RunBy": "XSOAR-user",
- "RunspaceId": "xxxxx",
- "SearchName": "example",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - search action 'example_Preview' created
->| Action | LastModifiedTime | Name | RunBy | SearchName | Status
->| --- | --- | --- | --- | --- | ---
->| Preview | 11/29/2020 7:23:50 AM | example\_Preview | XSOAR-user | example | Completed
-
-
-### o365-sc-remove-search-action
-***
-Removes compliance search action by search the action name from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-remove-search-action`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_action_name | The name of the compliance search action. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-remove-search-action search_action_name="example_Preview"```
-
-#### Human Readable Output
-
->Security And Compliance - search action **example_Preview** removed!
-
-### o365-sc-list-search-action
-***
-Lists compliance search actions from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-list-search-action`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Action | String | Security and compliance search action type. Either "Purge or "Preview". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedBy | String | Security and compliance search action creator. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedTime | Date | Security and compliance search action creation time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Description | String | Security and compliance search action description. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Errors | String | Security and compliance search action errors. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchJobId | String | Security and compliance search action job ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchRunId | String | Security and compliance search action run ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocation | String | Security and compliance search action exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocationExclusion | String | Security and compliance search action exchange locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Identity | String | Security and compliance search action identity. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.IsValid | Boolean | Whether the security and compliance search action is valid. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobEndTime | Date | Security and compliance search action job end time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobId | String | Security and compliance search action job ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobRunId | String | Security and compliance search action job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobStartTime | Date | Security and compliance search action job start time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.LastModifiedTime | Date | Security and compliance search action last modified time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Name | String | Security and compliance search action name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocation | String | Security and compliance search action public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocationExclusion | String | Security and compliance search action public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Retry | Boolean | Whether to retry if the search action failed. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunBy | String | Security and compliance search action run by UPN \(email address\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunspaceId | String | Security and compliance search action run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SearchName | String | Security and compliance search action search name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocation | String | Security and compliance search action SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocationExclusion | String | Security and compliance search action SharePoint locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Status | String | Security and compliance search action status \(Started/Completed\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.TenantId | String | Security and compliance search action Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-list-search-action```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "SearchAction": [
- {
- "Action": "Preview",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-10-14T13:45:44.14",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "xxxxx",
- "EstimateSearchRunId": "xxxxx",
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-10-14T13:47:00.103",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-10-14T13:45:58.443",
- "LastModifiedTime": "2020-10-14T13:45:44.14",
- "Name": "example_Preview",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": null,
- "Retry": false,
- "RunBy": "XSOAR-user",
- "RunspaceId": "xxxxx",
- "SearchName": "example",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- },
- {
- "Action": "Purge",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user1",
- "CreatedTime": "2020-10-14T13:45:44.14",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "xxxxx",
- "EstimateSearchRunId": "xxxxx",
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-10-14T13:47:00.103",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-10-14T13:45:58.443",
- "LastModifiedTime": "2020-10-14T13:45:44.14",
- "Name": "example_Purge",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": null,
- "Retry": false,
- "RunBy": "XSOAR-user1",
- "RunspaceId": "xxxxx",
- "SearchName": "Rodrigo-diffrent",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- }
- ]
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - search actions
->| Action | JobEndTime | LastModifiedTime | Name | RunBy | SearchName | Status
->| --- | --- | --- | --- | --- | --- | ---
->| Preview | 10/14/2020 1:47:00 PM | 10/14/2020 1:45:44 PM | example_Preview | XSOAR-user | example | Completed
->| Purge | 11/25/2020 10:51:04 AM | 11/25/2020 10:50:37 AM | example\_Purge | XSOAR-user | example | Completed
->
-
-
-### o365-sc-get-search-action
-***
-Gets compliance search action from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-get-search-action`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_action_name | The name of the compliance search action. | Required |
-| limit | The maximum number of results to return. If you want to return all requests that match the query, use "-1" for the value of this argument. | Optional |
-| export | Whether to export search results as json file to war-room. | Optional |
-| results | Whether to print the results in the War Room. Default is "false". | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Action | String | Security and compliance search action type. Either "Purge" or "Preview". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedBy | String | Security and compliance search action creator. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedTime | Date | Security and compliance search action creation time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Description | String | Security and compliance search action description. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Errors | String | Security and compliance search action errors. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchJobId | String | Security and compliance search action job ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchRunId | String | Security and compliance search action run ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocation | String | Security and compliance search action exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocationExclusion | String | Security and compliance search action exchange locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Identity | String | Security and compliance search action identity. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.IsValid | Boolean | Whether the security and compliance search action is valid. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobEndTime | Date | Security and compliance search action job end time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobId | String | Security and compliance search action job ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobRunId | String | Security and compliance search action job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobStartTime | Date | Security and compliance search action job start time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.LastModifiedTime | Date | Security and compliance search action last modified time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Name | String | Security and compliance search action name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocation | String | Security and compliance search action public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocationExclusion | String | Security and compliance search action public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Location | String | Security and compliance search action result location. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.ItemCount | String | Security and compliance search action result item count. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.TotalSize | String | Security and compliance search action result total size. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.FailedCount | String | Security and compliance search action result failed count. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Sender | String | Security and compliance search action result mail sender. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Subject | String | Security and compliance search action result subject. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Type | String | Security and compliance search action result type. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Size | String | Security and compliance search action result size. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.ReceivedTime | Date | Security and compliance search action result received time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.DataLink | String | Security and compliance search action data link. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Retry | Boolean | Whether to retry if the search action failed. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunBy | String | Security and compliance search action run by UPN \(email address\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunspaceId | String | Security and compliance search action run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SearchName | String | Security and compliance search action search name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocation | String | Security and compliance search action SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocationExclusion | String | Security and compliance search action SharePoint locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Status | String | Security and compliance search action status. Either "Started" or "Completed". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.TenantId | String | Security and compliance search action Tenant ID. |
-
-#### Command Example
-```!o365-sc-get-search-action search_action_name="example_Preview"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "SearchAction": {
- "Action": "Preview",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-11-29T07:23:50.05",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "2a967c40-07c3-4903-ed7f-08d89436e9b1",
- "EstimateSearchRunId": "1d130723-fe0a-4726-6d2a-08d89437520e",
- "ExchangeLocation": [
- "user@onmicrosoft.com"
- ],
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-11-29T07:24:05.76",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-11-29T07:23:50.297",
- "LastModifiedTime": "2020-11-29T07:23:50.05",
- "Name": "example_Preview",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": [
- {
- "DataLink": "data/All/xxxx.eml",
- "Location": "user@onmicrosoft.com",
- "ReceivedTime": "11/26/2020 2:59:01 PM",
- "Sender": "Some user",
- "Size": "19683",
- "Subject": "Test1",
- "Type": "Email"
- },
- {
- "DataLink": "data/All/xxxx.eml",
- "Location": "user@onmicrosoft.com",
- "ReceivedTime": "12/26/2020 2:59:01 PM",
- "Sender": "Some user",
- "Size": "20225",
- "Subject": "Test2",
- "Type": "Email"
- },
- ],
- "Retry": false,
- "RunBy": "XSOAR-user",
- "RunspaceId": "xxxxx",
- "SearchName": "example",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - search action 'example_Preview'
->| Action | JobEndTime | LastModifiedTime | Name | RunBy | SearchName | Status
->| --- | --- | --- | --- | --- | --- | ---
->| Preview | 11/29/2020 7:24:05 AM | 11/29/2020 7:23:50 AM | example\_Preview | XSOAR-user | example | Completed
-
-
-## Tips for finding messages to remove
-* Keyword Query Language (KQL)
- * If you know the exact text or phrase used in the subject line of the message, use the Subject property in the search query, e.g., `(subject:give me all ur money)`.
- * If you know that exact date (or date range) of the message, include the Received property in the search query, e.g., `(received:6/13/2021..6/16/2021)`.
- * If you know who sent the message, include the From property in the search query, e.g., `(from:user1@demistodev.onmicrosoft.com)`.
- * For all the available search properties see: [Keyword queries and search conditions for eDiscovery.](https://docs.microsoft.com/en-us/microsoft-365/compliance/keyword-queries-and-search-conditions?view=o365-worldwide)
-* Preview the search results to verify that the search returned only the message (or messages) that you want to delete.
-* Use the search estimate statistics (displayed by using the `o365-sc-get-search` command) to get a count of the total number of emails.
-## Known Limitations
-
-* Security and compliance integrations do not support Security and compliance on-premise.
-* Each security and compliance command creates a PSSession (PowerShell session). The security and compliance PowerShell limits the number of concurrent sessions to 3. Since this affects the behavior of multiple playbooks running concurrently it we recommend that you retry failed tasks when using the integration commands in playbooks.
-* Proxies are not supported due to a Microsoft [limitation](https://github.com/PowerShell/PowerShell/issues/9721).
-* Due to a Microsoft limitation, you can perform a search and purge operation on a maximum of 50,000 mailboxes. To work around this limitation, configure multiple instances of the integration each with different permission filtering so that the number of mailboxes in each instance does not exceed 50,000.
-* A maximum of 10 items per mailbox can be removed at one time, due to a Microsoft [limitiation](https://docs.microsoft.com/en-us/microsoft-365/compliance/search-for-and-delete-messages-in-your-organization?view=o365-worldwide#before-you-begin).
-* For more Microsoft known limitations see [Limits for eDiscovery search](https://docs.microsoft.com/en-us/microsoft-365/compliance/limits-for-content-search?view=o365-worldwide).
\ No newline at end of file
diff --git a/Packs/EWS/Integrations/SecurityAndComplianceV2/README.md b/Packs/EWS/Integrations/SecurityAndComplianceV2/README.md
deleted file mode 100644
index 4c86249d43cb..000000000000
--- a/Packs/EWS/Integrations/SecurityAndComplianceV2/README.md
+++ /dev/null
@@ -1,1058 +0,0 @@
-This integration enables you to manage and interact with Microsoft security and compliance content search. You can manage the security of all your organization's emails, SharePoint sites, OneDrives, etc., by searching for text strings or queries based on attributes of a malicious email. However, you can only perform actions (preview and delete) on emails.
-This integration was integrated and tested with [Security & Compliance Center](https://docs.microsoft.com/en-us/powershell/module/exchange/?view=exchange-ps#policy-and-compliance-content-search).
-
-## Use Cases
-
-* Create / Modify / Get / List / Remove / Trigger a search in the Security & Compliance Center - Content search service.
-* Create / Get / List / Remove search actions in the Security & Compliance Center - Content search service. Supported actions for emails only are Purge (Delete) and Preview.
-
-## Playbooks
-
-* O365 - Security And Compliance - Search And Delete: Creates and starts a compliance search in the Security and Compliance Center to identify emails with similar attributes of a malicious email. If configured, will preview or delete the emails that were located. This playbook uses the following playbooks as sub-playbooks in its workflow.
-* O365 - Security And Compliance - Search: Creates and starts a compliance search in the Security and Compliance Center to identify emails with attributes similar to a malicious email.
-* O365 - Security And Compliance - Search Action - Delete: Deletes emails located by the **O365 SecurityAndCompliance Search** sub-playbook.
-* O365 - Security And Compliance - Search Action - Preview: Provides a preview of the results of emails located by the **O365 SecurityAndCompliance Search** sub-playbook.
-
-
-
-## Permissions in the Security & Compliance Center
-
-### Delegated Authentication
-
-To access the Security & Compliance Center, the user who is configuring the account which will be used in O365 S&C,
-needs to be a global administrator or needs to be assigned the Role Management role (a role is assigned only to the
-Organization Management role group). The Role Management role allows users to view, create, and modify role groups.
-*Clarification:* The account which is used by the integration, does _not_ require Global Administrator permissions.
-
-1. Login into the [Security & Compliance Center](https://ps.compliance.protection.outlook.com):
-
-1. From the side menu, click **Permissions**.
-
- ![side-menu](https://raw.githubusercontent.com/demisto/content/master/Packs/EWS/doc_imgs/security-and-compliance-side-menu.png)
-
-2. Search for and select the **Data Investigator** role.
-
-3. Click **Edit role group**.
-
- ![roles-edit-1](https://raw.githubusercontent.com/demisto/content/master/Packs/EWS/doc_imgs/security-and-compliance-edit-1.png)
-
-4. Click **Choose Members** and click **Edit**. Add the user you intend to be used in the integration:
-
- ![roles-edit-2](https://raw.githubusercontent.com/demisto/content/master/Packs/EWS/doc_imgs/security-and-compliance-edit-2.png)
-5. Click **Add**.
- ![roles-edit-3](https://raw.githubusercontent.com/demisto/content/master/Packs/EWS/doc_imgs/security-and-compliance-edit-3.png)
-6. Choose which members to add from the displayed list and click **Add**.
-7. Click **Done**.
-
-The username and password for the user which you intend to use for the investigation will need to be added to the *UPN/Email* and *Delegated Password* fields of the integration instance configuration.
-
-Certificate Based Authentication supports only certain cmdlets which do not require delegated access. The commands which require delegated access are:
-- ***o365-sc-start-search***
-- ***o365-sc-new-search-action***
-- ***o365-sc-get-search-action***
-
-Please note: The use of Username and Password is not indicative of the use of basic authentication. The PowerShell session uses modern authentication as noted [here](https://learn.microsoft.com/en-us/powershell/exchange/connect-to-scc-powershell?view=exchange-ps#connect-to-security--compliance-powershell-without-a-login-prompt-unattended-scripts).
->The following example also connects without a login prompt, but the credentials are stored locally, so this method is not secure. Consider using this method only for brief testing purposes.
-
-Because the session which the integration uses is containerized, the notification provided by Microsoft is not applicable in this use-case.
-
-### Creating a Certificate
-
-If you are using a linux environment (macOS included), you can run the script [provided here](https://raw.githubusercontent.com/demisto/content/master/Packs/EWS/doc_imgs/create_o365_security_and_compliance_cert.sh) to create the certificates.
-
-If you are using Powershell, please use the script [found here](https://github.com/SharePoint/PnP-Partner-Pack/blob/master/scripts/Create-SelfSignedCertificate.ps1).
-
-### Configuring an App in Azure
-
-Please refer to the documentation [found here](https://learn.microsoft.com/en-us/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps#set-up-app-only-authentication) to set up the app required for this integration.
-
-## Configure SecurityAndCompliance on Cortex XSOAR
-
-1. Navigate to **Settings** > **Integrations** > **Servers & Services**.
-
-2. Search for O365 - Security And Compliance - Content Search.
-
-3. Authentication / Authorization methods:
-
- 1. Certificate Based Authentication:
-
- 1. Click **Add instance** to create and configure a new integration instance.
-
-| **Parameter** | **Description** | **Required** |
-|----------------------|----------------------------------------|--------------|
-| certificate | A pfx certificate encoded in Base64. | False |
-| certificate_password | Password used to sign the certificate. | False |
-
- 2. Click **Test** to validate the URLs, token, and connection.
-
- 2. Delegated Authentication:
-
- 1. Click **Add instance** to create and configure a new integration instance.
-
-| **Parameter** | **Description** | **Required** |
-|----------------|-----------------------------------|--------------|
-| delegated_auth | Fill Email (aka UPN) and password | False |
-
- 2. Click **Test** to validate the credentials and connection.
-
-
-
-## Commands
-You can execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook.
-After you successfully execute a command, a DBot message appears in the War Room with the command details.
-
-### o365-sc-new-search
-***
-Create compliance search in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-new-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. If not specified, will have the prefix "XSOAR-" followed by the GUID e.g., XSOAR-d6228fd0-756b-4e4b-8721-76776df91526. | Required |
-| case | The name of a Core eDiscovery case to associate with the new compliance search. | Optional |
-| kql | Text search string or a query that is formatted using the Keyword Query Language (KQL). [Tips for finding messages to remove using KQL](#tips-for-finding-messages-to-remove)
-| Optional |
-| description | Description of the compliance search. | Optional |
-| allow_not_found_exchange_locations | Whether to include mailboxes other than regular user mailboxes in the compliance search. Default is "false". | Optional |
-| exchange_location | Comma-separated list of mailboxes/distribution groups to include, or you can use the value "All" to include all. | Optional |
-| exchange_location_exclusion | Comma-separated list of mailboxes/distribution groups to exclude when you use the value "All" for the exchange_location parameter. | Optional |
-| public_folder_location | Comma-separated list of public folders to include, or you can use the value "All" to include all. | Optional |
-| share_point_location | Comma-separated list of SharePoint online sites to include. You can identify the sites by their URL value, or you can use the value "All" to include all sites. | Optional |
-| share_point_location_exclusion | Comma-separated list of SharePoint online sites to exclude when you use the value "All" for the share_point_location argument. You can identify the sites by their URL value. | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.Search.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ContentMatchQuery | String | Compliance text search string or a query that is formatted using the Keyword Query Language \(KQL\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedBy | String | Security and compliance search creator. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedTime | Date | Security and compliance search creation time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Description | String | Security and compliance search description. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Errors | String | Security and compliance search errors. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ExchangeLocation | String | Security and compliance search exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Identity | String | Security and compliance search identity. |
-| O365.SecurityAndCompliance.ContentSearch.Search.IsValid | Boolean | Whether the security and compliance search is valid. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Items | Number | The number of security and compliance search scanned items. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobEndTime | Date | Security and compliance search job end time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobId | String | Security and compliance search job ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobRunId | String | Security and compliance search job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobStartTime | Date | Security and compliance search job run start time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LastModifiedTime | Date | Security and compliance search last modification time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LogLevel | String | Security and compliance search Azure log level. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Name | String | Security and compliance search name. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocation | String | Security and compliance search OneDrive locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocationExclusion | String | Security and compliance search OneDrive locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocation | String | Security and compliance search public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocationExclusion | String | Security and compliance search public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunBy | String | Security and compliance search last run by UPN \(Email representation\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunspaceId | String | Security and compliance search run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SharePointLocation | String | Security and compliance search SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Size | Number | Security and compliance search bytes results size. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Status | String | Security and compliance search status. |
-| O365.SecurityAndCompliance.ContentSearch.Search.TenantId | String | Security and compliance search Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-new-search search_name="example" exchange_location="user1@demistodev.onmicrosoft.com,user2@demistodev.onmicrosoft.com" allow_not_found_exchange_locations=true kql="Rodrigo"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "Search": {
- "AllowNotFoundExchangeLocationsEnabled": true,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "ContentMatchQuery": "Rodrigo",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-11-29T07:12:46.5943533Z",
- "Description": "Short description",
- "Errors": null,
- "ExchangeLocation": [
- "test1@onmicrosoft.com",
- "test2@onmicrosoft.com"
- ],
- "ExchangeLocationExclusion": [],
- "Identity": "xxxxx",
- "IsValid": true,
- "Items": 0,
- "JobEndTime": null,
- "JobId": "xxxxx",
- "JobRunId": null,
- "JobStartTime": null,
- "LastModifiedTime": "2020-11-29T07:12:46.5943533Z",
- "LogLevel": "Suppressed",
- "Name": "example",
- "OneDriveLocation": null,
- "OneDriveLocationExclusion": null,
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "RunBy": "",
- "RunspaceId": null,
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Size": 0,
- "Status": "NotStarted",
- "SuccessResults": null,
- "TenantId": "xxxxx"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - New search 'example' created
->| ContentMatchQuery | CreatedBy | Description | LastModifiedTime | Name
->| --- | --- | --- | --- | ---
->| Rodrigo | XSOAR-user | Short description | 11/29/2020 7:12:46 AM | example
-
-
-
-### o365-sc-set-search
-
-***
-Modifies non-running compliance searches in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-set-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-| kql | Modify the text search string or a query that is formatted using the Keyword Query Language (KQL). | Optional |
-| description | Modify the description for the compliance search. | Optional |
-| allow_not_found_exchange_locations | Whether to include mailboxes other than regular user mailboxes in the compliance search. | Optional |
-| add_exchange_location | Comma-separated list of added mailboxes/distribution groups to include, or you can use the value "All" to include all mailboxes. | Optional |
-| add_exchange_location_exclusion | Comma-separated list of added mailboxes/distribution groups to exclude when you use the value "All" for the exchange_location (used in create new compliance search) or the add_exchange_location argument. | Optional |
-| add_public_folder_location | Comma-separated list of added public folders to include, or you can use the value "All" to include all. | Optional |
-| add_share_point_location | Comma-separated list of added SharePoint online sites to include. You identify the sites by their URL value, or you can use the value "All" to include all sites. | Optional |
-| add_share_point_location_exclusion | Comma-separated list of added SharePoint online sites to exclude when you use the value "All" for the exchange_location (used in create new compliance search) argument or the share_point_location argument. You can identify the sites by their URL value. | Optional |
-| remove_exchange_location | Comma-separated list of removed mailboxes/distribution group to include. | Optional |
-| remove_exchange_location_exclusion | Comma-separated list of removed mailboxes/distribution group to exclude when you use the value "All" for the exchange_location (Used in create new compliance search) or the add_exchange_location argument. | Optional |
-| remove_public_folder_location | Comma-separated list of removed public folders to include. | Optional |
-| remove_share_point_location | Comma-separated list of removed SharePoint online sites to include. You can identify the sites by their URL value. | Optional |
-| remove_share_point_location_exclusion | Comma-separated list of removed SharePoint online sites to exclude when you use the value "All" for the exchange_location (Used in create new compliance search) argument or the share_point_location argument. You can identify the sites by their URL value. | Optional |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-set-search search_name="example" remove_exchange_location="test2@demistodev.onmicrosoft.com"```
-
-#### Human Readable Output
-
->Security And Compliance - Search **example** modified!
-
-
-
-### o365-sc-remove-search
-
-***
-Remove compliance search by name from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-remove-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-remove-search search_name="example"```
-
-#### Human Readable Output
-
->Security And Compliance - Search **example** removed!
-
-
-
-### o365-sc-list-search
-
-***
-List compliance searches in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-list-search`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.Search.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ContentMatchQuery | String | Compliance text search string or a query that is formatted using the Keyword Query Language \(KQL\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedBy | String | Security and compliance search creator. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedTime | Date | Security and compliance search creation time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Description | String | Security and compliance search description. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Errors | String | Security and compliance search errors. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ExchangeLocation | String | Security and compliance search exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Identity | String | Security and compliance search identity. |
-| O365.SecurityAndCompliance.ContentSearch.Search.IsValid | Boolean | Whether the security and compliance search is valid. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Items | Number | The number of security and compliance search scanned items. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobEndTime | Date | Security and compliance search job end time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobId | String | Security and compliance search job ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobRunId | String | Security and compliance search job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobStartTime | Date | Security and compliance search job run start time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LastModifiedTime | Date | Security and compliance search last modification time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LogLevel | String | Security and compliance search Azure log level. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Name | String | Security and compliance search name. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocation | String | Security and compliance search OneDrive locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocationExclusion | String | Security and compliance search OneDrive locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocation | String | Security and compliance search public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocationExclusion | String | Security and compliance search public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunBy | String | Security and compliance search last run by UPN \(Email representation\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunspaceId | String | Security and compliance search run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SharePointLocation | String | Security and compliance search SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Size | Number | Security and compliance search bytes results size. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Status | String | Security and compliance search status. |
-| O365.SecurityAndCompliance.ContentSearch.Search.TenantId | String | Security and compliance search Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-list-search```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "Search": [
- {
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "ContentMatchQuery": "subject:test",
- "CreatedBy": "XSOAR-user1",
- "CreatedTime": "2019-08-22T06:43:48.747",
- "Description": "Short description",
- "Errors": null,
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "Items": 0,
- "JobEndTime": "2019-09-05T13:21:11.563",
- "JobId": "xxxx",
- "JobRunId": null,
- "JobStartTime": "2019-09-05T13:20:34.633",
- "LastModifiedTime": "2019-08-22T06:43:48.747",
- "LogLevel": "Suppressed",
- "Name": "example1",
- "OneDriveLocation": null,
- "OneDriveLocationExclusion": null,
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "RunBy": "XSOAR-user1",
- "RunspaceId": null,
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Size": 0,
- "Status": "Completed",
- "SuccessResults": null,
- "TenantId": "xxxx"
- },
- {
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "ContentMatchQuery": "subject:Incident Summary Report",
- "CreatedBy": "XSOAR-user2",
- "CreatedTime": "2020-01-08T00:44:30.94",
- "Description": "Short description",
- "Errors": null,
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "Items": 0,
- "JobEndTime": "2020-01-08T00:45:13.433",
- "JobId": "xxxxx",
- "JobRunId": null,
- "JobStartTime": "2020-01-08T00:44:33.717",
- "LastModifiedTime": "2020-01-08T00:44:30.94",
- "LogLevel": "Suppressed",
- "Name": "example2",
- "OneDriveLocation": null,
- "OneDriveLocationExclusion": null,
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "RunBy": "XSOAR-user2",
- "RunspaceId": null,
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Size": 0,
- "Status": "Completed",
- "SuccessResults": null,
- "TenantId": "xxxxx"
- }
- ]
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - Search configurations
->| CreatedBy | Description | LastModifiedTime | Name | RunBy
->| --- | --- | --- | --- | ---
->| XSOAR-user1 | Short description | 8/22/2019 6:43:48 AM | example1 | XSOAR-user1
->| XSOAR-user2 | Short description | 1/8/2020 12:44:30 AM | example2 | XSOAR-user2
-
-
-### o365-sc-get-search
-***
-Gets compliance search by name from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-get-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-| limit | The maximum number of results to return. If you want to return all requests that match the query, use "-1" for the value of this argument. | Optional |
-| all_results | Whether to include mailboxes which have no results in results entry context. | Optional |
-| export | Whether to export search results as json file to war-room. | Optional |
-| statistics | Show search statistics. Default is "false". | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.Search.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ContentMatchQuery | String | Compliance text search string or a query that is formatted using the Keyword Query Language \(KQL\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedBy | String | Security and compliance search creator. |
-| O365.SecurityAndCompliance.ContentSearch.Search.CreatedTime | Date | Security and compliance search creation time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Description | String | Security and compliance search description. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Errors | String | Security and compliance search errors. |
-| O365.SecurityAndCompliance.ContentSearch.Search.ExchangeLocation | String | Security and compliance search exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Identity | String | Security and compliance search identity. |
-| O365.SecurityAndCompliance.ContentSearch.Search.IsValid | Boolean | Whether the security and compliance search is valid. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Items | Number | Number of security and compliance search scanned items. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobEndTime | Date | Security and compliance search job end time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobId | String | Security and compliance search job ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobRunId | String | Security and compliance search job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.JobStartTime | Date | Security and compliance search job run start time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LastModifiedTime | Date | Security and compliance search last modification time. |
-| O365.SecurityAndCompliance.ContentSearch.Search.LogLevel | String | Security and compliance search the Azure log level. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Name | String | Security and compliance search name. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocation | String | Security and compliance search OneDrive locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.OneDriveLocationExclusion | String | Security and compliance search OneDrive locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocation | String | Security and compliance search public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.PublicFolderLocationExclusion | String | Security and compliance search public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunBy | String | Security and compliance search last run by UPN \(Email representation\). |
-| O365.SecurityAndCompliance.ContentSearch.Search.RunspaceId | String | Security and compliance search run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SharePointLocation | String | Security and compliance search SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Size | Number | Security and compliance search bytes results size. |
-| O365.SecurityAndCompliance.ContentSearch.Search.Status | String | Security and compliance search status. |
-| O365.SecurityAndCompliance.ContentSearch.Search.TenantId | String | Security and compliance search Tenant ID. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SuccessResults.Location | String | Security and compliance search result location. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SuccessResults.ItemsCount | Number | The number of security and compliance search results in location. |
-| O365.SecurityAndCompliance.ContentSearch.Search.SuccessResults.Size | Number | The byte size of the security and compliance search results in location. |
-
-
-#### Command Example
-```!o365-sc-get-search search_name="example"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "Search": {
- "Errors": "",
- "AzureBatchFrameworkEnabled": false,
- "TenantId": "xxxxx",
- "SharePointLocationExclusion": null,
- "JobStartTime": "2020-11-29T07:20:59.37",
- "CreatedTime": "2020-11-29T07:18:04.283",
- "OneDriveLocation": null,
- "PublicFolderLocation": null,
- "Status": "Completed",
- "CaseName": "",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "LogLevel": "Suppressed",
- "JobRunId": null,
- "CaseId": null,
- "JobId": "xxxxx",
- "SuccessResults": {
- "ItemsCount": "122303",
- "Location": "user@onmicrosoft.com",
- "Size": "12339007379"
- },
- "LastModifiedTime": "2020-11-29T07:20:43.283",
- "Identity": "1d130723-fe0a-4726-6d2a-08d89437520e",
- "Name": "example",
- "Items": 122303,
- "ExchangeLocation": [
- "user@onmicrosoft.com"
- ],
- "RunBy": "XSOAR-user",
- "Description": "Short description",
- "ExchangeLocationExclusion": [],
- "IsValid": true,
- "PublicFolderLocationExclusion": null,
- "SharePointLocation": null,
- "CreatedBy": "XSOAR-user",
- "JobEndTime": "2020-11-29T07:22:01.99",
- "RunspaceId": null,
- "Size": 12339007379,
- "OneDriveLocationExclusion": null,
- "ContentMatchQuery": "Rodrigo"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - 'example' search
->| CreatedBy | Description | LastModifiedTime | Name | RunBy | Status
->| --- | --- | --- | --- | --- | ---
->| XSOAR-user | Short description | 2020-11-29T07:20:43.283 | example | XSOAR-user | NotStarted
-
-
-### o365-sc-start-search
-***
-Starts stopped, completed, or not started compliance search in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-start-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-start-search search_name="example"```
-
-#### Human Readable Output
-
->Security And Compliance - search **example** started !
-
-### o365-sc-stop-search
-***
-Stop running compliance search in the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-stop-search`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-stop-search search_name="example"```
-
-#### Human Readable Output
-
->Security And Compliance - search **example** stopped !
-
-
-### o365-sc-new-search-action
-***
-After you create a content search using the ***o365-sc-new-search*** command and run it using the ***o365-sc-start-search*** command, you assign a search action to the search using the ***o365-sc-new-search-action*** command.
-
-
-#### Base Command
-
-`o365-sc-new-search-action`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_name | The name of the compliance search. | Required |
-| action | Search action to perform. Possible values are: "Preview" and "Purge". Default is "Preview". | Optional |
-| purge_type | Purge type. Possible values are: "Soft Delete" and "HardDelete". Default is "SoftDelete". | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Action | String | Security and compliance search action type. Either "Purge" or "Preview". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedBy | String | Security and compliance search action creator. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedTime | Date | Security and compliance search action creation time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Description | String | Security and compliance search action description. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Errors | String | Security and compliance search action errors. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchJobId | String | Security and compliance search action job ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchRunId | String | Security and compliance search action run ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocation | String | Security and compliance search action exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocationExclusion | String | Security and compliance search action exchange locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Identity | String | Security and compliance search action identity. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.IsValid | Boolean | Whether the security and compliance search action is valid. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobEndTime | Date | Security and compliance search action job end time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobId | String | Security and compliance search action job ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobRunId | String | Security and compliance search action job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobStartTime | Date | Security and compliance search action job start time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.LastModifiedTime | Date | Security and compliance search action last modified time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Name | String | Security and compliance search action name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocation | String | Security and compliance search action public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocationExclusion | String | Security and compliance search action public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Retry | Boolean | Whether to retry if the search action failed. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunBy | String | Security and compliance search action run by UPN \(email address\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunspaceId | String | Security and compliance search action run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SearchName | String | Security and compliance search action search name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocation | String | Security and compliance search action SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocationExclusion | String | Security and compliance search action SharePoint locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Status | String | Security and compliance search action status. Either "Started" or "Completed". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.TenantId | String | Security and compliance search action Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-new-search-action search_name="example" action="Preview"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "SearchAction": {
- "Action": "Preview",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-11-29T07:23:50.05",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "xxxxx",
- "EstimateSearchRunId": "xxxxx",
- "ExchangeLocation": [
- "user@onmicrosoft.com"
- ],
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-11-29T07:24:05.76",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-11-29T07:23:50.297",
- "LastModifiedTime": "2020-11-29T07:23:50.05",
- "Name": "example_Preview",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": null,
- "Retry": false,
- "RunBy": "XSOAR-user",
- "RunspaceId": "xxxxx",
- "SearchName": "example",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - search action 'example_Preview' created
->| Action | LastModifiedTime | Name | RunBy | SearchName | Status
->| --- | --- | --- | --- | --- | ---
->| Preview | 11/29/2020 7:23:50 AM | example\_Preview | XSOAR-user | example | Completed
-
-
-### o365-sc-remove-search-action
-***
-Removes compliance search action by search the action name from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-remove-search-action`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_action_name | The name of the compliance search action. | Required |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!o365-sc-remove-search-action search_action_name="example_Preview"```
-
-#### Human Readable Output
-
->Security And Compliance - search action **example_Preview** removed!
-
-### o365-sc-list-search-action
-***
-Lists compliance search actions from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-list-search-action`
-#### Input
-
-There are no input arguments for this command.
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Action | String | Security and compliance search action type. Either "Purge or "Preview". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedBy | String | Security and compliance search action creator. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedTime | Date | Security and compliance search action creation time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Description | String | Security and compliance search action description. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Errors | String | Security and compliance search action errors. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchJobId | String | Security and compliance search action job ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchRunId | String | Security and compliance search action run ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocation | String | Security and compliance search action exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocationExclusion | String | Security and compliance search action exchange locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Identity | String | Security and compliance search action identity. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.IsValid | Boolean | Whether the security and compliance search action is valid. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobEndTime | Date | Security and compliance search action job end time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobId | String | Security and compliance search action job ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobRunId | String | Security and compliance search action job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobStartTime | Date | Security and compliance search action job start time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.LastModifiedTime | Date | Security and compliance search action last modified time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Name | String | Security and compliance search action name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocation | String | Security and compliance search action public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocationExclusion | String | Security and compliance search action public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Retry | Boolean | Whether to retry if the search action failed. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunBy | String | Security and compliance search action run by UPN \(email address\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunspaceId | String | Security and compliance search action run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SearchName | String | Security and compliance search action search name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocation | String | Security and compliance search action SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocationExclusion | String | Security and compliance search action SharePoint locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Status | String | Security and compliance search action status \(Started/Completed\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.TenantId | String | Security and compliance search action Tenant ID. |
-
-
-#### Command Example
-```!o365-sc-list-search-action```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "SearchAction": [
- {
- "Action": "Preview",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-10-14T13:45:44.14",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "xxxxx",
- "EstimateSearchRunId": "xxxxx",
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-10-14T13:47:00.103",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-10-14T13:45:58.443",
- "LastModifiedTime": "2020-10-14T13:45:44.14",
- "Name": "example_Preview",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": null,
- "Retry": false,
- "RunBy": "XSOAR-user",
- "RunspaceId": "xxxxx",
- "SearchName": "example",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- },
- {
- "Action": "Purge",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user1",
- "CreatedTime": "2020-10-14T13:45:44.14",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "xxxxx",
- "EstimateSearchRunId": "xxxxx",
- "ExchangeLocation": null,
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-10-14T13:47:00.103",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-10-14T13:45:58.443",
- "LastModifiedTime": "2020-10-14T13:45:44.14",
- "Name": "example_Purge",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": null,
- "Retry": false,
- "RunBy": "XSOAR-user1",
- "RunspaceId": "xxxxx",
- "SearchName": "Rodrigo-diffrent",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- }
- ]
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - search actions
->| Action | JobEndTime | LastModifiedTime | Name | RunBy | SearchName | Status
->| --- | --- | --- | --- | --- | --- | ---
->| Preview | 10/14/2020 1:47:00 PM | 10/14/2020 1:45:44 PM | example_Preview | XSOAR-user | example | Completed
->| Purge | 11/25/2020 10:51:04 AM | 11/25/2020 10:50:37 AM | example\_Purge | XSOAR-user | example | Completed
->
-
-
-### o365-sc-get-search-action
-***
-Gets compliance search action from the Security & Compliance Center.
-
-
-#### Base Command
-
-`o365-sc-get-search-action`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| search_action_name | The name of the compliance search action. | Required |
-| limit | The maximum number of results to return. If you want to return all requests that match the query, use "-1" for the value of this argument. | Optional |
-| export | Whether to export search results as json file to war-room. | Optional |
-| results | Whether to print the results in the War Room. Default is "false". | Optional |
-
-
-#### Context Output
-
-| **Path** | **Type** | **Description** |
-| --- | --- | --- |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Action | String | Security and compliance search action type. Either "Purge" or "Preview". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AllowNotFoundExchangeLocationsEnabled | Boolean | Whether to include mailboxes other than regular user mailboxes in the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.AzureBatchFrameworkEnabled | Boolean | Whether the Azure Batch Framework is enabled for job processing. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseId | String | Identity of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CaseName | String | Name of a Core eDiscovery case which is associated with the compliance search. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedBy | String | Security and compliance search action creator. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.CreatedTime | Date | Security and compliance search action creation time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Description | String | Security and compliance search action description. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Errors | String | Security and compliance search action errors. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchJobId | String | Security and compliance search action job ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.EstimateSearchRunId | String | Security and compliance search action run ID estimation. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocation | String | Security and compliance search action exchange locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.ExchangeLocationExclusion | String | Security and compliance search action exchange locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Identity | String | Security and compliance search action identity. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.IsValid | Boolean | Whether the security and compliance search action is valid. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobEndTime | Date | Security and compliance search action job end time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobId | String | Security and compliance search action job ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobRunId | String | Security and compliance search action job run ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.JobStartTime | Date | Security and compliance search action job start time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.LastModifiedTime | Date | Security and compliance search action last modified time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Name | String | Security and compliance search action name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocation | String | Security and compliance search action public folder locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.PublicFolderLocationExclusion | String | Security and compliance search action public folder locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Location | String | Security and compliance search action result location. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.ItemCount | String | Security and compliance search action result item count. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.TotalSize | String | Security and compliance search action result total size. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.FailedCount | String | Security and compliance search action result failed count. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Sender | String | Security and compliance search action result mail sender. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Subject | String | Security and compliance search action result subject. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Type | String | Security and compliance search action result type. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.Size | String | Security and compliance search action result size. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.ReceivedTime | Date | Security and compliance search action result received time. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Results.DataLink | String | Security and compliance search action data link. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Retry | Boolean | Whether to retry if the search action failed. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunBy | String | Security and compliance search action run by UPN \(email address\). |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.RunspaceId | String | Security and compliance search action run space ID. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SearchName | String | Security and compliance search action search name. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocation | String | Security and compliance search action SharePoint locations to include. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.SharePointLocationExclusion | String | Security and compliance search action SharePoint locations to exclude. |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.Status | String | Security and compliance search action status. Either "Started" or "Completed". |
-| O365.SecurityAndCompliance.ContentSearch.SearchAction.TenantId | String | Security and compliance search action Tenant ID. |
-
-#### Command Example
-```!o365-sc-get-search-action search_action_name="example_Preview"```
-
-#### Context Example
-```json
-{
- "O365": {
- "SecurityAndCompliance": {
- "ContentSearch": {
- "SearchAction": {
- "Action": "Preview",
- "AllowNotFoundExchangeLocationsEnabled": false,
- "AzureBatchFrameworkEnabled": false,
- "CaseId": null,
- "CaseName": "",
- "CreatedBy": "XSOAR-user",
- "CreatedTime": "2020-11-29T07:23:50.05",
- "Description": "",
- "Errors": "",
- "EstimateSearchJobId": "2a967c40-07c3-4903-ed7f-08d89436e9b1",
- "EstimateSearchRunId": "1d130723-fe0a-4726-6d2a-08d89437520e",
- "ExchangeLocation": [
- "user@onmicrosoft.com"
- ],
- "ExchangeLocationExclusion": null,
- "Identity": "xxxxx",
- "IsValid": true,
- "JobEndTime": "2020-11-29T07:24:05.76",
- "JobId": "xxxxx",
- "JobRunId": "xxxxx",
- "JobStartTime": "2020-11-29T07:23:50.297",
- "LastModifiedTime": "2020-11-29T07:23:50.05",
- "Name": "example_Preview",
- "PublicFolderLocation": null,
- "PublicFolderLocationExclusion": null,
- "Results": [
- {
- "DataLink": "data/All/xxxx.eml",
- "Location": "user@onmicrosoft.com",
- "ReceivedTime": "11/26/2020 2:59:01 PM",
- "Sender": "Some user",
- "Size": "19683",
- "Subject": "Test1",
- "Type": "Email"
- },
- {
- "DataLink": "data/All/xxxx.eml",
- "Location": "user@onmicrosoft.com",
- "ReceivedTime": "12/26/2020 2:59:01 PM",
- "Sender": "Some user",
- "Size": "20225",
- "Subject": "Test2",
- "Type": "Email"
- },
- ],
- "Retry": false,
- "RunBy": "XSOAR-user",
- "RunspaceId": "xxxxx",
- "SearchName": "example",
- "SharePointLocation": null,
- "SharePointLocationExclusion": null,
- "Status": "Completed",
- "TenantId": "xxxxx"
- }
- }
- }
- }
-}
-```
-
-#### Human Readable Output
-
->### Security And Compliance - search action 'example_Preview'
->| Action | JobEndTime | LastModifiedTime | Name | RunBy | SearchName | Status
->| --- | --- | --- | --- | --- | --- | ---
->| Preview | 11/29/2020 7:24:05 AM | 11/29/2020 7:23:50 AM | example\_Preview | XSOAR-user | example | Completed
-
-
-## Tips for finding messages to remove
-* Keyword Query Language (KQL)
- * If you know the exact text or phrase used in the subject line of the message, use the Subject property in the search query, e.g., `(subject:give me all ur money)`.
- * If you know that exact date (or date range) of the message, include the Received property in the search query, e.g., `(received:6/13/2021..6/16/2021)`.
- * If you know who sent the message, include the From property in the search query, e.g., `(from:user1@demistodev.onmicrosoft.com)`.
- * For all the available search properties see: [Keyword queries and search conditions for eDiscovery.](https://docs.microsoft.com/en-us/microsoft-365/compliance/keyword-queries-and-search-conditions?view=o365-worldwide)
-* Preview the search results to verify that the search returned only the message (or messages) that you want to delete.
-* Use the search estimate statistics (displayed by using the `o365-sc-get-search` command) to get a count of the total number of emails.
-## Known Limitations
-
-* Security and compliance integrations do not support Security and compliance on-premise.
-* Each security and compliance command creates an IPS-Session (PowerShell session). The security and compliance PowerShell limits the number of concurrent sessions to 3. Since this affects the behavior of multiple playbooks running concurrently it we recommend that you retry failed tasks when using the integration commands in playbooks.
-* Proxies are not supported due to a Microsoft [limitation](https://github.com/PowerShell/PowerShell/issues/9721).
-* Due to a Microsoft limitation, you can perform a search and purge operation on a maximum of 50,000 mailboxes. To work around this limitation, configure multiple instances of the integration each with different permission filtering so that the number of mailboxes in each instance does not exceed 50,000.
-* A maximum of 10 items per mailbox can be removed at one time, due to a Microsoft [limitiation](https://docs.microsoft.com/en-us/microsoft-365/compliance/search-for-and-delete-messages-in-your-organization?view=o365-worldwide#before-you-begin).
-* For more Microsoft known limitations see [Limits for eDiscovery search](https://docs.microsoft.com/en-us/microsoft-365/compliance/limits-for-content-search?view=o365-worldwide).
diff --git a/Packs/EWS/Integrations/SecurityAndComplianceV2/SecurityAndComplianceV2.ps1 b/Packs/EWS/Integrations/SecurityAndComplianceV2/SecurityAndComplianceV2.ps1
deleted file mode 100644
index 2029d06f1f8f..000000000000
--- a/Packs/EWS/Integrations/SecurityAndComplianceV2/SecurityAndComplianceV2.ps1
+++ /dev/null
@@ -1,1023 +0,0 @@
-. $PSScriptRoot\CommonServerPowerShell.ps1
-
-$script:INTEGRATION_NAME = "Security And Compliance"
-$script:COMMAND_PREFIX = "o365-sc"
-$script:INTEGRATION_ENTRY_CONTEX = "O365.SecurityAndCompliance.ContentSearch"
-$script:SEARCH_ENTRY_CONTEXT = "$script:INTEGRATION_ENTRY_CONTEX.Search(val.Name && val.Name == obj.Name)"
-$script:SEARCH_ACTION_ENTRY_CONTEXT = "$script:INTEGRATION_ENTRY_CONTEX.SearchAction(val.Name && val.Name == obj.Name)"
-
-<# IMPORTANT NOTICE
-# When conencting to ExchangeOnline - only needed command between CreateSession
-# and DisconnectSession and let also the `finally` term to disconnect (it will do nothing if everything is fine).
-# This will reduce the time sessions are opened between Exchange and the server and will create
-# less problems.
-# DO NOT USE ONE FINALLY STATEMENT: we don't know if and when it'll be executed and anyway it the DisconnectSession
-# should be called before returning results to the server.
-#>
-Import-Module ExchangeOnlineManagement
-
-#### HELPER FUNCTIONS ####
-
-function ParseSuccessResults([string]$success_results, [int]$limit, [bool]$all_results) {
- $parsed_success_results = New-Object System.Collections.Generic.List[System.Object]
- if ($success_results) {
- $lines = $success_results.Split([Environment]::NewLine)
-
- if ($limit -ne -1) {
- $limit = ($limit, $lines.Count | Measure-Object -Minimum).Minimum
- } else {
- $limit = $lines.Count
- }
-
- # Results limit
- $results_count = 0
- # Lines iterator
- $lines_scanned = 0
- while ($results_count -lt $limit -and $lines_scanned -lt $lines.Count) {
- if ($lines[$lines_scanned] -match 'Location: (\S+), Item count: (\d+), Total size: (\d+)')
- {
- if ($matches[2] -ne 0 -or $all_results){
- $parsed_success_results.Add(@{
- "Location" = $matches[1]
- "ItemsCount" = $matches[2]
- "Size" = $matches[3]
- })
- $results_count += 1
- }
- }
- $lines_scanned += 1
- }
- }
-
- return $parsed_success_results
- <#
- .DESCRIPTION
- Parse string return in Search PSObject property "SuccessResults"
-
- .PARAMETER success_results
- SuccessResults raw string.
-
- .EXAMPLE
- ParseSuccessResults 'Location: Private mail box, Item count: 8, Total size: 63'
-
- .OUTPUTS
- List of psobject SuccessResults object.
- #>
-}
-
-
-
-function ParseResults([string]$results, [int]$limit = -1, [string]$type = "Preview") {
- if ($type -eq "Preview"){
- $results_matches_preview = (Select-String -AllMatches "\{?Location: (.*); Sender: (.*); Subject: (.*); Type: (.*); Size: (.*); Received Time: (.*); Data Link: (.*)[},]" -InputObject $results).Matches
- $parsed_results = New-Object System.Collections.Generic.List[System.Object]
- foreach ($match in $results_matches_preview)
- {
- if ($parsed_results.Count -ge $limit -and $limit -ne -1){
- break
- }
-
- $parsed_results.Add(@{
- "Location" = $match.Groups[1].Value
- "Sender" = $match.Groups[2].Value
- "Subject" = $match.Groups[3].Value
- "Type" = $match.Groups[4].Value
- "Size" = $match.Groups[5].Value
- "ReceivedTime" = $match.Groups[6].Value
- "DataLink" = $match.Groups[7].Value
- })
- }
- }
- if ($type -eq "Purge"){
- $results_matches_purge = (Select-String -AllMatches "\{?Location: (.*); Item count: (.*); Total size: (.*); Failed count: (.*); [},]" -InputObject $results).Matches
- $parsed_results = New-Object System.Collections.Generic.List[System.Object]
- foreach ($match in $results_matches_purge)
- {
- if ($parsed_results.Count -ge $limit -and $limit -ne -1){
- break
- }
- $parsed_results.Add(@{
- "Location" = $match.Groups[1].Value
- "ItemCount" = $match.Groups[2].Value
- "TotalSize" = $match.Groups[3].Value
- "FailedCount" = $match.Groups[4].Value
- })
- }
- }
-
-
- return $parsed_results
- <#
- .DESCRIPTION
- Parse string return in SearchAction PSObject property "Results"
-
- .PARAMETER success_results
- SuccessResults raw string.
-
- .EXAMPLE
- ParseResults 'Location: Private mail box; Sender: user@microsoft.com; Type: mail; Size: 100; Received Time: 16 August 2010; Data Link: xxxxx,'
-
- .OUTPUTS
- List of psobject Results object.
- #>
-}
-
-function ParseSearchToEntryContext([psobject]$search, [int]$limit = -1, [bool]$all_results = $false) {
- return @{
- "AllowNotFoundExchangeLocationsEnabled" = $search.AllowNotFoundExchangeLocationsEnabled
- "AzureBatchFrameworkEnabled" = $search.AzureBatchFrameworkEnabled
- "CaseId" = $search.CaseId
- "CaseName" = $search.CaseName
- "ContentMatchQuery" = $search.ContentMatchQuery
- "CreatedBy" = $search.CreatedBy
- "CreatedTime" = $search.CreatedTime
- "Description" = $search.Description
- "Errors" = $search.Errors
- "ExchangeLocation" = $search.ExchangeLocation
- "ExchangeLocationExclusion" = $search.ExchangeLocationExclusion
- "Identity" = $search.Identity
- "IsValid" = $search.IsValid
- "Items" = $search.Items
- "JobEndTime" = $search.JobEndTime
- "JobId" = $search.JobId
- "JobRunId" = $searchJobRunId
- "JobStartTime" = $search.JobStartTime
- "LastModifiedTime" = $search.LastModifiedTime
- "LogLevel" = $search.LogLevel
- "Name" = $search.Name
- "OneDriveLocation" = $search.OneDriveLocation
- "OneDriveLocationExclusion" = $search.OneDriveLocationExclusion
- "PublicFolderLocation" = $search.PublicFolderLocation
- "PublicFolderLocationExclusion" = $search.PublicFolderLocationExclusion
- "RunBy" = $search.RunBy
- "RunspaceId" = $search_action.RunspaceId
- "SharePointLocation" = $search.SharePointLocation
- "SharePointLocationExclusion" = $search.SharePointLocationExclusion
- "Size" = $search.Size
- "Status" = $search.Status
- "SuccessResults" = ParseSuccessResults -success_results $search.SuccessResults -limit $limit -all_results $all_results
- "TenantId" = $search.TenantId
- }
- <#
- .DESCRIPTION
- Parse Search raw response PSObject to Entry Context.
-
- .PARAMETER search
- search raw psobject.
-
- .PARAMETER all_results
- Whether to include also not found locations.
-
- .PARAMETER limit
- Limit found items.
-
- .EXAMPLE
- ParseSearchToEntryContext $search
-
- .OUTPUTS
- Search entry context.
-
- .Notes
- 1. Microsoft internal properties: OneDriveLocationExclusion, OneDriveLocation.
- 2. SuccessResults property return as string which should be parsed.
- #>
-}
-
-function ParseSearchActionToEntryContext([psobject]$search_action, [int]$limit = -1) {
- return @{
- "Action" = $search_action.Action
- "AllowNotFoundExchangeLocationsEnabled" = $search_action.AllowNotFoundExchangeLocationsEnabled
- "AzureBatchFrameworkEnabled" = $search_action.AzureBatchFrameworkEnabled
- "CaseId" = $search_action.CaseId
- "CaseName" = $search_action.CaseName
- "CreatedBy" = $search_action.CreatedBy
- "CreatedTime" = $search_action.CreatedTime
- "Description" = $search_action.Description
- "Errors" = $search_action.Errors
- "EstimateSearchJobId" = $search_action.EstimateSearchJobId
- "EstimateSearchRunId" = $search_action.EstimateSearchRunId
- "ExchangeLocation" = $search_action.ExchangeLocation
- "ExchangeLocationExclusion" = $search_action.ExchangeLocationExclusion
- "Identity" = $search_action.Identity
- "IsValid" = $search_action.IsValid
- "JobEndTime" = $search_action.JobEndTime
- "JobId" = $search_action.JobId
- "JobRunId" = $search_action.JobRunId
- "JobStartTime" = $search_action.JobStartTime
- "LastModifiedTime" = $search_action.LastModifiedTime
- "PublicFolderLocation" = $search_action.PublicFolderLocation
- "PublicFolderLocationExclusion" = $search_action.PublicFolderLocationExclusion
- "Retry" = $search_action.Retry
- "RunspaceId" = $search_action.RunspaceId
- "SharePointLocation" = $search_action.SharePointLocation
- "SharePointLocationExclusion" = $search_action.SharePointLocationExclusion
- "Name" = $search_action.Name
- "RunBy" = $search_action.RunBy
- "SearchName" = $search_action.SearchName
- "Status" = $search_action.Status
- "TenantId" = $search_action.TenantId
- "Results" = ParseResults -results $search_action.Results -limit $limit -type $search_action.Action
- }
- <#
- .DESCRIPTION
- Parse SearchAction raw response PSObject to Entry Context.
-
- .PARAMETER search
- SearchAction raw response.
-
- .EXAMPLE
- ParseSearchActionToEntryContext $search_action
-
- .OUTPUTS
- SearchAction entry context.
-
- .Notes
- 1. Microsoft internal properties: OneDriveLocationExclusion, OneDriveLocation.
- 2. Results property return as string which should be parsed.
- #>
-}
-
-#### Security And Compliance client - OAUTH2.0 ####
-[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '', Scope='Class')]
-[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', '', Scope='Class')]
-class SecurityAndComplianceClient {
- [string]$app_id
- [string]$organization
- [SecureString]$certificate_password
- [SecureString]$delegated_password
- [System.Security.Cryptography.X509Certificates.X509Certificate2]$certificate
- [string]$upn
-
- SecurityAndComplianceClient([string]$app_id, [string]$organization, [string]$certificate_password,
- [string]$delegated_password, [string]$certificate, [string]$upn) {
- if ($certificate_password) {
- $this.certificate_password = ConvertTo-SecureString $certificate_password -AsPlainText -Force
- } else {
- $this.certificate_password = $null
- }
-
- if ($delegated_password) {
- $this.delegated_password = ConvertTo-SecureString $delegated_password -AsPlainText -Force
- } else {
- $this.delegated_password = $null
- }
-
- if ($null -ne $certificate) {
- try {
- $ByteArray = [System.Convert]::FromBase64String($certificate)
- $this.certificate = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($ByteArray, $certificate_password)
- } catch {
- throw "Could not decode the certificate. Try to re-enter it"
- }
- }
-
- $this.app_id = $app_id
- $this.organization = $organization
- $this.upn = $upn
- }
-
- CreateSession([string]$CommandName){
- if ($null -eq $this.certificate) {
- ReturnError "Error: For this command, a Certificate is required." | Out-Null
- }
- $cmd_params = @{
- "AppID" = $this.app_id
- "Organization" = $this.organization
- "Certificate" = $this.certificate
- "CommandName" = $CommandName
- }
- Connect-IPPSSession @cmd_params -WarningAction:SilentlyContinue | Out-Null
- }
-
- CreateDelegatedSession(){
- if ($null -eq $this.delegated_password) {
- ReturnError "Error: For this command, delegated access is required." | Out-Null
- }
- $delegated_cred = New-Object System.Management.Automation.PSCredential ($this.upn, $this.delegated_password)
- Connect-IPPSSession -Credential $delegated_cred -CommandName New-ComplianceSearchAction,Start-ComplianceSearch,Get-ComplianceSearchAction -WarningAction:SilentlyContinue | Out-Null
- }
-
- DisconnectSession(){
- Disconnect-ExchangeOnline -Confirm:$false -WarningAction:SilentlyContinue 6>$null | Out-Null
- }
-
- [psobject]NewSearch([string]$search_name, [string]$case, [string]$kql, [string]$description, [bool]$allow_not_found_exchange_locations, [string[]]$exchange_location,
- [string[]]$exchange_location_exclusion, [string[]]$public_folder_location, [string[]]$share_point_location, [string[]]$share_point_location_exclusion) {
-
- # Establish session to remote
- $this.CreateSession("New-ComplianceSearch")
- # Import and Execute command
- $cmd_params = @{
- "Name" = $search_name
- "Case" = $case
- "ContentMatchQuery" = $kql
- "Description" = $description
- "AllowNotFoundExchangeLocationsEnabled" = $allow_not_found_exchange_locations
- "ExchangeLocation" = $exchange_location
- "ExchangeLocationExclusion" = $exchange_location_exclusion
- "PublicFolderLocation" = $public_folder_location
- "SharePointLocation" = $share_point_location
- "SharePointLocationExclusion" = $share_point_location_exclusion
- }
- $response = New-ComplianceSearch @cmd_params
- # Close session to remote
- $this.DisconnectSession()
-
- return $response
- <#
- .DESCRIPTION
- Create compliance search in the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .PARAMETER case
- Name of a Core eDiscovery case to associate the new compliance search with.
-
- .PARAMETER kql
- Text search string or a query that's formatted by using the Keyword Query Language (KQL).
-
- .PARAMETER description
- Optional description for the compliance search.
-
- .PARAMETER allow_not_found_exchange_locations
- Whether to include mailboxes other than regular user mailboxes in the compliance search.
-
- .PARAMETER exchange_location
- Mailboxes to include.
-
- .PARAMETER exchange_location_exclusion
- Mailboxes to exclude when you use the value "All" for the exchange_location parameter.
-
- .PARAMETER public_folder_location
- Whether to include all public folders in the search.
-
- .PARAMETER share_point_location
- SharePoint Online sites to include. You identify the site by its URL value, or you can use the value All to include all sites.
-
- .PARAMETER share_point_location_exclusion
- SharePoint Online sites to exclude when you use the value All for the SharePointLocation parameter. You identify the site by its URL value.
-
- .EXAMPLE
- $client.NewSearch("new-search")
- $client.NewSearch("new-search", "new-search-description")
-
- .OUTPUTS
- psobject - Raw response.
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/new-compliancesearch?view=exchange-ps
- #>
- }
-
- SetSearch([string]$search_name, [string]$kql, [string]$description, [bool]$allow_not_found_exchange_locations, [string[]]$add_exchange_location,
- [string[]]$add_exchange_location_exclusion, [string[]]$add_public_folder_location, [string[]]$add_share_point_location, [string[]]$add_share_point_location_exclusion,
- [string[]]$remove_exchange_location, [string[]]$remove_exchange_location_exclusion, [string[]]$remove_public_folder_location, [string[]]$remove_share_point_location,
- [string[]]$remove_share_point_location_exclusion) {
-
- # Establish session to remote
- $this.CreateSession("Set-ComplianceSearch")
- # Execute command
- $cmd_params = @{
- "Identity" = $search_name
- "ContentMatchQuery" = $kql
- "Description" = $description
- "AllowNotFoundExchangeLocationsEnabled" = $allow_not_found_exchange_locations
- "AddExchangeLocation" = $add_exchange_location
- "AddExchangeLocationExclusion" = $add_exchange_location_exclusion
- "PublicFolderLocation" = $add_public_folder_location
- "AddSharePointLocation" = $add_share_point_location
- "AddSharePointLocationExclusion" = $add_share_point_location_exclusion
- "RemoveExchangeLocation" = $remove_exchange_location
- "RemoveExchangeLocationExclusion" = $remove_exchange_location_exclusion
- "RemovePublicFolderLocation" = $remove_public_folder_location
- "RemoveSharePointLocation" = $remove_share_point_location
- "RemoveSharePointLocationExclusion" = $remove_share_point_location_exclusion
- }
- Set-ComplianceSearch @cmd_params
- # Close session to remote
- $this.DisconnectSession()
- <#
- .DESCRIPTION
- Set compliance search in the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .PARAMETER kql
- Text search string or a query that's formatted by using the Keyword Query Language (KQL).
-
- .PARAMETER description
- Optional description for the compliance search.
-
- .PARAMETER allow_not_found_exchange_locations
- Whether to include mailboxes other than regular user mailboxes in the compliance search.
-
- .PARAMETER add_exchange_location
- Add mailboxes to include.
-
- .PARAMETER add_exchange_location_exclusion
- Add mailboxes to exclude when you use the value "All" for the exchange_location parameter.
-
- .PARAMETER add_public_folder_location
- Add public folders to include.
-
- .PARAMETER add_share_point_location
- Add sharePoint online sites to include. You identify the site by its URL value.
-
- .PARAMETER add_share_point_location_exclusion
- Add sharePoint online sites to exclude when you use the value "All" for the SharePointLocation parameter. You identify the site by its URL value.
-
- .PARAMETER remove_exchange_location
- Remove mailboxes to include.
-
- .PARAMETER remove_exchange_location_exclusion
- Remove mailboxes to exclude when you use the value "All" for the exchange_location parameter.
-
- .PARAMETER remove_public_folder_location
- Remove public folders to include.
-
- .PARAMETER remove_share_point_location
- Remove sharePoint online sites to include. You identify the site by its URL value.
-
- .PARAMETER remove_share_point_location_exclusion
- Remove sharePoint online sites to exclude when you use the value "All" for the exchange_location (Used in create new compliance search) argument or share_point_location argument. You identify the site by its URL value.
-
- .EXAMPLE
- $client.SetSearch("new-search", "new-search-description")
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/set-compliancesearch?view=exchange-ps
- #>
- }
-
- RemoveSearch([string]$search_name) {
- # Establish session to remote
- $this.CreateSession("Remove-ComplianceSearch")
- # Import and Execute command
- Remove-ComplianceSearch -Identity $search_name -Confirm:$false
-
- # Close session to remote
- $this.DisconnectSession()
-
- <#
- .DESCRIPTION
- Remove compliance search by name from the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .EXAMPLE
- $client.RemoveSearch("new-search")
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/remove-compliancesearch?view=exchange-ps
- #>
- }
-
- [array]ListSearch() {
- # Establish session to remote
- $this.CreateSession("Get-ComplianceSearch")
- # Execute command
- $response = Get-ComplianceSearch
-
- # Close session to remote
- $this.DisconnectSession()
-
- return $response
-
- <#
- .DESCRIPTION
- List compliance searches in the Security & Compliance Center.
-
- .EXAMPLE
- $client.ListSearch()
-
- .OUTPUTS
- array - Raw response.
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/get-compliancesearch?view=exchange-ps
- #>
- }
-
- [psobject]GetSearch([string]$search_name) {
- # Establish session to remote
- $this.CreateSession("Get-ComplianceSearch")
- # Import and Execute command
- $response = Get-ComplianceSearch -Identity $search_name
-
- # Close session to remote
- $this.DisconnectSession()
-
- return $response
- <#
- .DESCRIPTION
- Get compliance search by name from the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .EXAMPLE
- $client.GetSearch("new-search")
-
- .OUTPUTS
- psobject - Raw response.
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/get-compliancesearch?view=exchange-ps
- #>
- }
-
- StartSearch([string]$search_name) {
- # Establish session to remote
- $this.CreateDelegatedSession()
- # Execute command
- Start-ComplianceSearch -Identity $search_name -Confirm:$false -Force:$true
-
- # Close session to remote
- $this.DisconnectSession()
- <#
- .DESCRIPTION
- Start stopped, completed or not started compliance search in the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .EXAMPLE
- $client.StartSearch("new-search")
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/start-compliancesearch?view=exchange-ps
- #>
- }
-
- StopSearch([string]$search_name) {
-
- # Establish session to remote
- $this.CreateSession("Stop-ComplianceSearch")
- # Execute command
- Stop-ComplianceSearch -Identity $search_name -Confirm:$false
-
- # Close session to remote
- $this.DisconnectSession()
-
- <#
- .DESCRIPTION
- Stop compliance search by name in the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .EXAMPLE
- $client.StopSearch("new-search")
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/stop-compliancesearch?view=exchange-ps
- #>
- }
-
- [psobject]NewSearchAction([string]$search_name, [string]$action, [string]$purge_type) {
- # Establish session to remote
- $this.CreateDelegatedSession()
- # Execute command
- $cmd_params = @{
- "SearchName" = $search_name
- }
- if ($action -eq "Preview") {
- $cmd_params.Preview = $true
- } elseif ($action -eq "Purge") {
- $cmd_params.Purge = $true
- $cmd_params.PurgeType = $purge_type
- $cmd_params.Confirm = $false
- $cmd_params.Force = $true
- } else {
- throw "New action must include valid action - Preview/Purge"
- }
- $response = New-ComplianceSearchAction @cmd_params
- if (-not $response){
- # Close session to remote
- $this.DisconnectSession()
-
- throw "The search action didn't return any results. Please check the search_name and consider running the o365-sc-start-search command before."
- }
-
- # Close session to remote
- $this.DisconnectSession()
-
- return $response
- <#
- .DESCRIPTION
- Create compliance search action in the Security & Compliance Center.
-
- .PARAMETER search_name
- The name of the compliance search.
-
- .PARAMETER action
- Search action type - Preview (Showing results) / Purge (Delete found emails)
-
- .PARAMETER purge_type
- Used if action type is purge, Search action purge type - SoftDelete (allow recover) / HardDelete (not recoverable).
-
- .EXAMPLE
- $client.NewSearchAction("search-name", "Preview")
- $client.NewSearchAction("search-name", "Purge", "HardDelete")
-
- .OUTPUTS
- psobject - Raw response.
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/new-compliancesearchaction?view=exchange-ps
- #>
- }
-
- RemoveSearchAction([string]$search_action_name) {
- # Establish session to remote
- $this.CreateSession("Remove-ComplianceSearchAction")
- # Execute command
- Remove-ComplianceSearchAction -Identity $search_action_name -Confirm:$false
- # Close session to remote
- $this.DisconnectSession()
-
- <#
- .DESCRIPTION
- Remove compliance search action from the Security & Compliance Center.
-
- .PARAMETER search_action_name
- The name of the compliance search action.
-
- .EXAMPLE
- $client.RemoveSearchAction("search-name")
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/remove-compliancesearchaction?view=exchange-ps
- #>
- }
-
- [array]ListSearchActions() {
- # Establish session to remote
- $this.CreateSession("Get-ComplianceSearchAction")
- # Execute command
- $response = Get-ComplianceSearchAction
-
- # Close session to remote
- $this.DisconnectSession()
-
- return $response
- <#
- .DESCRIPTION
- List all compliance search action in the Security & Compliance Center.
-
- .EXAMPLE
- $client.ListearchAction()
-
- .OUTPUTS
- array - Raw response.
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/get-compliancesearchaction?view=exchange-ps
- #>
- }
-
- [psobject]GetSearchAction([string]$search_action_name) {
- # Establish session to remote
- $this.CreateDelegatedSession()
-
- # Execute command
- $response = Get-ComplianceSearchAction -Identity $search_action_name
-
- # Close session to remote
- $this.DisconnectSession()
- return $response
- <#
- .DESCRIPTION
- Get compliance search action in the Security & Compliance Center.
-
- .PARAMETER search_action_name
- The name of the compliance search action.
-
- .EXAMPLE
- $client.GetSearchAction("search-name")
-
- .OUTPUTS
- psobject - Raw response.
-
- .LINK
- https://docs.microsoft.com/en-us/powershell/module/exchange/get-compliancesearchaction?view=exchange-ps
- #>
- }
-}
-
-#### COMMAND FUNCTIONS ####
-
-function TestModuleCommand ([SecurityAndComplianceClient]$cs_client) {
- $cs_client.ListSearchActions() | Out-Null
-
- $raw_response = $null
- $human_readable = "ok"
- $entry_context = $null
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function NewSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Command arguemnts parsing
- $allow_not_found_exchange_locations = ConvertTo-Boolean $kwargs.allow_not_found_exchange_locations
- $exchange_location = ArgToList $kwargs.exchange_location
- $exchange_location_exclusion = ArgToList $kwargs.exchange_location_exclusion
- $public_folder_location = ArgToList $kwargs.public_folder_location
- $share_point_location = ArgToList $kwargs.share_point_location
- $share_point_location_exclusion = ArgToList $kwargs.share_point_location_exclusion
- if (!$kwargs.search_name -or $kwargs.search_name -eq "") {
- $kwargs.search_name = "XSOAR-$(New-Guid)"
- }
- # Raw response
- $raw_response = $client.NewSearch($kwargs.search_name, $kwargs.case, $kwargs.kql, $kwargs.description, $allow_not_found_exchange_locations,
- $exchange_location, $exchange_location_exclusion, $public_folder_location, $share_point_location, $share_point_location_exclusion)
- # Human readable
- $md_columns = $raw_response | Select-Object -Property Name, Description, CreatedBy, LastModifiedTime, ContentMatchQuery
- $human_readable = TableToMarkdown $md_columns "$script:INTEGRATION_NAME - New search '$($kwargs.search_name)' created"
- # Entry context
- $entry_context = @{
- $script:SEARCH_ENTRY_CONTEXT = ParseSearchToEntryContext $raw_response
- }
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function SetSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Command arguemnts parsing
- if ($kwargs.allow_not_found_exchange_locations) {
- $allow_not_found_exchange_locations = ConvertTo-Boolean $kwargs.allow_not_found_exchange_locations
- }
- $add_exchange_location = ArgToList $kwargs.add_exchange_location
- $add_exchange_location_exclusion = ArgToList $kwargs.add_exchange_location_exclusion
- $add_public_folder_location = ArgToList $kwargs.add_public_folder_location
- $add_share_point_location = ArgToList $kwargs.add_share_point_location
- $add_share_point_location_exclusion = ArgToList $kwargs.add_share_point_location_exclusion
- $remove_exchange_location = ArgToList $kwargs.remove_exchange_location
- $remove_exchange_location_exclusion = ArgToList $kwargs.remove_exchange_location_exclusion
- $remove_public_folder_location = ArgToList $kwargs.remove_public_folder_location
- $remove_share_point_location = ArgToList $kwargs.remove_share_point_location
- $remove_share_point_location_exclusion = ArgToList $kwargs.remove_share_point_location_exclusion
- # Set operation doesn't return any output
- $client.SetSearch($kwargs.search_name, $kwargs.kql, $kwargs.description, $allow_not_found_exchange_locations,
- $add_exchange_location, $add_exchange_location_exclusion, $add_public_folder_location, $add_share_point_location, $add_share_point_location_exclusion,
- $remove_exchange_location, $remove_exchange_location_exclusion, $remove_public_folder_location, $remove_share_point_location, $remove_share_point_location_exclusion)
- # Raw response
- $raw_response = @{}
- # Human readable
- $human_readable = "$script:INTEGRATION_NAME - Search **$($kwargs.search_name)** modified!"
- # Entry context
- $entry_context = @{}
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function RemoveSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Remove operation doesn't return any output
- $client.RemoveSearch($kwargs.search_name)
- # Raw response
- $raw_response = @{}
- # Human readable
- $human_readable = "$script:INTEGRATION_NAME - Search **$($kwargs.search_name)** removed!"
- # Entry context
- $entry_context = @{}
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function ListSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Raw response
- $raw_response = $client.ListSearch()
-
- if ($raw_response.count -eq 0){
- return "#### No compliance searches were retrieved from the Compliance Center.", @{}, $raw_response
- }
-
- # Human readable
- $md_columns = $raw_response | Select-Object -Property Name, Description, CreatedBy, LastModifiedTime, RunBy
- $human_readable = TableToMarkdown $md_columns "$script:INTEGRATION_NAME - Search configurations"
- # Entry context
- $entry_context = @{
- $script:SEARCH_ENTRY_CONTEXT = $raw_response | ForEach-Object {
- ParseSearchToEntryContext $_
- }
- }
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function GetSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Command arguemnts parsing
- $statistics = ConvertTo-Boolean $kwargs.statistics
- $all_results = ConvertTo-Boolean $kwargs.all_results
- $export = ConvertTo-Boolean $kwargs.export
- # Raw response
- $raw_response = $client.GetSearch($kwargs.search_name)
- # Entry context
- $entry_context = @{
- $script:SEARCH_ENTRY_CONTEXT = ParseSearchToEntryContext -search $raw_response -limit $kwargs.limit -all_results $all_results
- }
- # Human readable - Basic info
- $md_columns = $raw_response | Select-Object -Property Name, Description, CreatedBy, LastModifiedTime, RunBy, Status
- $human_readable = TableToMarkdown $md_columns "$script:INTEGRATION_NAME - '$($kwargs.search_name)' search"
- # Human readable - Statistics
- $parsed_results = $entry_context[$script:SEARCH_ENTRY_CONTEXT].SuccessResults
- if ($parsed_results -and $statistics) {
- $human_readable += TableToMarkdown $parsed_results "Search statistics"
- }
- # Results file export
- if ($export) {
- $parsed_results_all = ParseSuccessResults -success_results $raw_response.SuccessResults -limit $kwargs.limit -all_results $all_results
- if ($parsed_results_all.Count -ne 0){
- $file_entry = FileResult "$($kwargs.search_name)_search.json" $($parsed_results_all | ConvertTo-Json) $true
- }
- }
-
- return $human_readable, $entry_context, $raw_response, $file_entry
-}
-
-function StartSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Start operation doesn't return any output
- $client.StartSearch($kwargs.search_name)
- # Raw response
- $raw_response = @{}
- # Human readable
- $human_readable = "$script:INTEGRATION_NAME - search **$($kwargs.search_name)** started !"
- # Entry context
- $entry_context = @{}
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function StopSearchCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Stop operation doesn't return any output
- $client.StopSearch($kwargs.search_name)
- # Raw response
- $raw_response = @{}
- # Human readable
- $human_readable = "$script:INTEGRATION_NAME - search **$($kwargs.search_name)** stopped !"
- # Entry context
- $entry_context = @{}
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function NewSearchActionCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Raw response
- $raw_response = $client.NewSearchAction($kwargs.search_name, $kwargs.action, $kwargs.purge_type)
- # Human readable
- $md_columns = $raw_response | Select-Object -Property Name, SearchName, Action, LastModifiedTime, RunBy, Status
- $human_readable = TableToMarkdown $md_columns "$script:INTEGRATION_NAME - search action '$($raw_response.Name)' created"
- # Entry context
- $entry_context = @{
- $script:SEARCH_ACTION_ENTRY_CONTEXT = ParseSearchActionToEntryContext $raw_response
- }
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function RemoveSearchActionCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Remove operation doesn't return any output
- $client.RemoveSearchAction($kwargs.search_action_name)
- # Raw response
- $raw_response = @{}
- # Human readable
- $human_readable = "$script:INTEGRATION_NAME - search action **$($kwargs.search_action_name)** removed!"
- # Entry context
- $entry_context = @{}
-
- return $human_readable, $entry_context, $raw_response
-}
-
-function GetSearchActionCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Command arguemnts parsing
- $results = ConvertTo-Boolean $kwargs.results
- $export = ConvertTo-Boolean $kwargs.export
- # Raw response
- $raw_response = $client.GetSearchAction($kwargs.search_action_name)
- # Entry context
- $entry_context = @{
- $script:SEARCH_ACTION_ENTRY_CONTEXT = ParseSearchActionToEntryContext $raw_response $kwargs.limit
- }
- # Human readable
- $md_columns = $raw_response | Select-Object -Property Name, SearchName, Action, LastModifiedTime, RunBy, JobEndTime, Status
- $human_readable = TableToMarkdown $md_columns "$script:INTEGRATION_NAME - search action '$($kwargs.search_action_name)'"
- # Human readable - Mail results
- $parsed_results = $entry_context[$script:SEARCH_ACTION_ENTRY_CONTEXT].Results
- if ($parsed_results -and $results) {
- $human_readable += TableToMarkdown $parsed_results "Search action results"
- }
- # Results file export
- if ($export) {
- $parsed_results_all = ParseResults -results $raw_response.Results -limit $kwargs.limit
- if ($parsed_results_all.Count -ne 0){
- $file_entry = FileResult "$($kwargs.search_action_name)_search_action.json" $($parsed_results_all | ConvertTo-Json) $true
- }
- }
- return $human_readable, $entry_context, $raw_response, $file_entry
-}
-
-function ListSearchActionsCommand([SecurityAndComplianceClient]$client, [hashtable]$kwargs) {
- # Raw response
- $raw_response = $client.ListSearchActions()
-
- # Human readable
- $md_columns = $raw_response | Select-Object -Property Name, SearchName, Action, LastModifiedTime, RunBy, JobEndTime, Status
- $human_readable = TableToMarkdown $md_columns "$script:INTEGRATION_NAME - search actions"
- # Entry context
- $entry_context = @{
- $script:SEARCH_ACTION_ENTRY_CONTEXT = $raw_response | ForEach-Object {
- ParseSearchActionToEntryContext $_
- }
- }
-
- return $human_readable, $entry_context, $raw_response
-}
-
-#### INTEGRATION COMMANDS MANAGER ####
-
-function Main {
- $command = $Demisto.GetCommand()
- $command_arguments = $Demisto.Args()
- $integration_params = $Demisto.Params()
-
- try {
- $Demisto.Debug("Command being called is $Command")
-
- $cs_client = [SecurityAndComplianceClient]::new(
- $integration_params.app_id,
- $integration_params.organization,
- $integration_params.certificate_password,
- $integration_params.delegated_auth.password,
- $integration_params.certificate,
- $integration_params.delegated_auth.identifier
- )
-
- # Executing command
- switch ($command) {
- "test-module" {
- ($human_readable, $entry_context, $raw_response) = TestModuleCommand $cs_client
- }
- "$script:COMMAND_PREFIX-new-search" {
- ($human_readable, $entry_context, $raw_response) = NewSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-set-search" {
- ($human_readable, $entry_context, $raw_response) = SetSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-remove-search" {
- ($human_readable, $entry_context, $raw_response) = RemoveSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-list-search" {
- ($human_readable, $entry_context, $raw_response) = ListSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-get-search" {
- ($human_readable, $entry_context, $raw_response, $file_entry) = GetSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-start-search" {
- ($human_readable, $entry_context, $raw_response) = StartSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-stop-search" {
- ($human_readable, $entry_context, $raw_response) = StopSearchCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-new-search-action" {
- ($human_readable, $entry_context, $raw_response) = NewSearchActionCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-remove-search-action" {
- ($human_readable, $entry_context, $raw_response) = RemoveSearchActionCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-list-search-action" {
- ($human_readable, $entry_context, $raw_response) = ListSearchActionsCommand $cs_client $command_arguments
- }
- "$script:COMMAND_PREFIX-get-search-action" {
- ($human_readable, $entry_context, $raw_response, $file_entry) = GetSearchActionCommand $cs_client $command_arguments
- }
- }
- # Return results to Demisto Server
- ReturnOutputs $human_readable $entry_context $raw_response | Out-Null
- if ($file_entry) {
- $Demisto.results($file_entry)
- }
- } catch {
- Disconnect-ExchangeOnline -Confirm:$false -WarningAction:SilentlyContinue 6>$null | Out-Null
- $Demisto.debug("Integration: $script:INTEGRATION_NAME
-Command: $command
-Arguments: $($command_arguments | ConvertTo-Json)
-Error: $($_.Exception.Message)")
- if ($command -ne "test-module") {
- ReturnError "Error:
- Integration: $script:INTEGRATION_NAME
- Command: $command
- Arguments: $($command_arguments | ConvertTo-Json)
- Error: $($_.Exception)" | Out-Null
- } else {
- ReturnError $_.Exception.Message
- }
- }
-}
-
-# Execute Main when not in Tests
-if ($MyInvocation.ScriptName -notlike "*.tests.ps1" -AND -NOT $Test) {
- Main
-}
\ No newline at end of file
diff --git a/Packs/EWS/Integrations/SecurityAndComplianceV2/SecurityAndComplianceV2_description.md b/Packs/EWS/Integrations/SecurityAndComplianceV2/SecurityAndComplianceV2_description.md
deleted file mode 100644
index 9ef3feec0c7f..000000000000
--- a/Packs/EWS/Integrations/SecurityAndComplianceV2/SecurityAndComplianceV2_description.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# O365 - Security And Compliance - Content Search V2
-
-This integration enables you to manage the features that are available in the Security & Compliance Center from XSOAR.
-
-Supported authentication methods:
-- Certificate Based Authentication
-- Delegated Authentication
diff --git a/Packs/EWS/ReleaseNotes/2_0_10.md b/Packs/EWS/ReleaseNotes/2_0_10.md
new file mode 100644
index 000000000000..63600fb05ce2
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_10.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### O365 - Security And Compliance - Content Search v2
+- Updated the documentation to provide a workaround for MFA enabled accounts.
diff --git a/Packs/EWS/ReleaseNotes/2_0_3.md b/Packs/EWS/ReleaseNotes/2_0_3.md
new file mode 100644
index 000000000000..1fbc121cefc0
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_3.md
@@ -0,0 +1,6 @@
+
+#### Integrations
+##### O365 - Security And Compliance - Content Search v2
+- Fixed an issue where Basic Authentication was still used.
+- Added the *Connection URI* and *AzureADAuthorizedEndpointURI Base* parameters to support GCC High and DoD instances.
+- Certificate Based Authentication is no longer the preferred method of authentication.
diff --git a/Packs/EWS/ReleaseNotes/2_0_4.md b/Packs/EWS/ReleaseNotes/2_0_4.md
new file mode 100644
index 000000000000..6c730d96b60e
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_4.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### EWS O365
+- Fixed an issue where in some rare cases, commands would fail with a `'NoneType' object is not subscriptable` message.
diff --git a/Packs/EWS/ReleaseNotes/2_0_5.md b/Packs/EWS/ReleaseNotes/2_0_5.md
new file mode 100644
index 000000000000..26f913869a83
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_5.md
@@ -0,0 +1,4 @@
+
+##### EWS O365
+- Added the **Mark fetched emails as read** parameter to the integration instance configuration.
+- Updated the Docker image to: *demisto/py3ews:1.0.0.42364*.
diff --git a/Packs/EWS/ReleaseNotes/2_0_6.md b/Packs/EWS/ReleaseNotes/2_0_6.md
new file mode 100644
index 000000000000..5a68944319b3
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_6.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### O365 - Security And Compliance - Content Search v2
+- Fixed an issue where the *app_id* and *organization* parameters were required.
diff --git a/Packs/EWS/ReleaseNotes/2_0_7.md b/Packs/EWS/ReleaseNotes/2_0_7.md
new file mode 100644
index 000000000000..1bbb5456a6b7
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_7.md
@@ -0,0 +1,5 @@
+
+#### Integrations
+##### EWS O365
+- Added the *UPN* parameter to the integration instance configuration.
+- Updated the Docker image to: *demisto/py3ews:1.0.0.43044*.
diff --git a/Packs/EWS/ReleaseNotes/2_0_8.md b/Packs/EWS/ReleaseNotes/2_0_8.md
new file mode 100644
index 000000000000..66d4107902d3
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_8.md
@@ -0,0 +1,4 @@
+
+#### Playbooks
+##### Get Original Email - EWS v2
+Fixed an issue in the *Get original email as eml* task that caused an error when the playbook was looped.
diff --git a/Packs/EWS/ReleaseNotes/2_0_9.md b/Packs/EWS/ReleaseNotes/2_0_9.md
new file mode 100644
index 000000000000..7dd44b4ebc6c
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_0_9.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### EWS O365
+- Updated the Docker image to: *demisto/py3ews:1.0.0.45234*.
diff --git a/Packs/EWS/ReleaseNotes/2_1_0.md b/Packs/EWS/ReleaseNotes/2_1_0.md
new file mode 100644
index 000000000000..78f8fd24b642
--- /dev/null
+++ b/Packs/EWS/ReleaseNotes/2_1_0.md
@@ -0,0 +1,8 @@
+
+##### EWS
+- Note: Moved the **EWS V2** integration, along with its related content entities to the **Microsoft Exchange On-premise** pack.
+- Note: Moved the **EWS Extension** integration, along with its related content entities to the **Microsoft Exchange Online** pack.
+- Note: Moved the **EWS Extension EXO PowerShell v2** integration, along with its related content entities to the **Microsoft Exchange Online** pack.
+- Note: Moved the **EWS O365** integration, along with its related content entities to the **Microsoft Exchange Online** pack.
+- Note: Moved the **Security And Compliance** integration, along with its related content entities to the **Microsoft Exchange Online** pack.
+- Note: Moved the **Security And Compliance v2** integration, along with its related content entities to the **Microsoft Exchange Online** pack.
\ No newline at end of file
diff --git a/Packs/EWS/TestPlaybooks/O365-EWS-Extension-Test.yml b/Packs/EWS/TestPlaybooks/O365-EWS-Extension-Test.yml
deleted file mode 100644
index c2f56747ee27..000000000000
--- a/Packs/EWS/TestPlaybooks/O365-EWS-Extension-Test.yml
+++ /dev/null
@@ -1,770 +0,0 @@
-id: O365 - EWS - Extension - Test
-version: -1
-name: O365 - EWS - Extension - Test
-starttaskid: "0"
-tasks:
- "0":
- id: "0"
- taskid: deb9dd1f-c4d8-4517-8f44-175cecfe0f8d
- type: start
- task:
- id: deb9dd1f-c4d8-4517-8f44-175cecfe0f8d
- version: -1
- name: ""
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "11"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 50
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "2":
- id: "2"
- taskid: 98ce2ef3-087f-4b36-8723-028b011e5e98
- type: regular
- task:
- id: 98ce2ef3-087f-4b36-8723-028b011e5e98
- version: -1
- name: Add junk rule
- description: Set junk rules in mailbox.
- script: '|||ews-junk-rules-set'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "3"
- scriptarguments:
- add_blocked_senders_and_domains:
- complex:
- root: inputs.add_conf
- add_trusted_senders_and_domains: {}
- contacts_trusted: {}
- enabled: {}
- mailbox:
- complex:
- root: inputs.mailbox
- remove_blocked_senders_and_domains: {}
- remove_trusted_senders_and_domains: {}
- retry-count:
- simple: "4"
- retry-interval:
- simple: "20"
- trusted_lists_only: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 895
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "3":
- id: "3"
- taskid: 78140002-6dde-4d9b-8c3b-edef3b288985
- type: regular
- task:
- id: 78140002-6dde-4d9b-8c3b-edef3b288985
- version: -1
- name: Get junk rule in mailbox
- description: Get junk rules in mailbox.
- script: '|||ews-junk-rules-get'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "4"
- scriptarguments:
- mailbox:
- complex:
- root: inputs.mailbox
- retry-count:
- simple: "4"
- retry-interval:
- simple: "20"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 1070
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "4":
- id: "4"
- taskid: 441ec1b9-aa64-4f86-8676-3d2339e2eb8a
- type: condition
- task:
- id: 441ec1b9-aa64-4f86-8676-3d2339e2eb8a
- version: -1
- name: Validate junk rule addition
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "5"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isEqualString
- left:
- value:
- complex:
- root: EWS.Rule.Junk
- accessor: BlockedSendersAndDomains
- iscontext: true
- right:
- value:
- simple: test@gmail.com
- view: |-
- {
- "position": {
- "x": 50,
- "y": 1245
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "5":
- id: "5"
- taskid: cd5349b6-37b4-4e29-8d9f-60e1b3b8371d
- type: regular
- task:
- id: cd5349b6-37b4-4e29-8d9f-60e1b3b8371d
- version: -1
- name: Get message trace
- description: |
- You can use this cmdlet to search message data for the last 10 days. If you run this cmdlet without any parameters, only data from the last 48 hours is returned.
- If you enter a start date that is older than 10 days, you will receive an error and the command will return no results.
- This cmdlet returns a maximum of 1000000 results, and will timeout on very large queries. If your query returns too many results, consider splitting it up using smaller start_date and end_date intervals.
- script: '|||ews-message-trace-get'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "6"
- scriptarguments:
- end_date: {}
- from_ip: {}
- message_id: {}
- message_trace_id: {}
- page: {}
- page_size: {}
- recipient_address: {}
- retry-count:
- simple: "4"
- retry-interval:
- simple: "20"
- sender_address: {}
- start_date: {}
- status: {}
- to_ip: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 1420
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "6":
- id: "6"
- taskid: 283369e0-d840-4553-8bf8-6f33adc11623
- type: condition
- task:
- id: 283369e0-d840-4553-8bf8-6f33adc11623
- version: -1
- name: 'Validate message trace '
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "12"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isNotEmpty
- left:
- value:
- complex:
- root: EWS.MessageTrace
- iscontext: true
- view: |-
- {
- "position": {
- "x": 50,
- "y": 1595
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "7":
- id: "7"
- taskid: acbd1c3c-0ca2-4b87-89d5-1778c77b9eaf
- type: title
- task:
- id: acbd1c3c-0ca2-4b87-89d5-1778c77b9eaf
- version: -1
- name: Finished successfully
- type: title
- iscommand: false
- brand: ""
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 3345
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "8":
- id: "8"
- taskid: 9ad78dac-d5b7-4bd2-834c-ac71c15b850f
- type: regular
- task:
- id: 9ad78dac-d5b7-4bd2-834c-ac71c15b850f
- version: -1
- name: Remove junk rule
- description: Set junk rules in mailbox.
- script: '|||ews-junk-rules-set'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "9"
- scriptarguments:
- add_blocked_senders_and_domains: {}
- add_trusted_senders_and_domains: {}
- contacts_trusted: {}
- enabled: {}
- mailbox:
- complex:
- root: inputs.mailbox
- remove_blocked_senders_and_domains:
- complex:
- root: inputs.add_conf
- remove_trusted_senders_and_domains: {}
- retry-count:
- simple: "4"
- retry-interval:
- simple: "20"
- trusted_lists_only: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 370
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "9":
- id: "9"
- taskid: f9cf23ce-f8b6-447e-86d9-2c165b0f35a7
- type: regular
- task:
- id: f9cf23ce-f8b6-447e-86d9-2c165b0f35a7
- version: -1
- name: Get junk rule in mailbox
- description: Get junk rules in mailbox.
- script: '|||ews-junk-rules-get'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "10"
- scriptarguments:
- mailbox:
- complex:
- root: inputs.mailbox
- retry-count:
- simple: "4"
- retry-interval:
- simple: "20"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 545
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "10":
- id: "10"
- taskid: e99cb8ea-d992-42e8-8c13-8fce77af1a52
- type: condition
- task:
- id: e99cb8ea-d992-42e8-8c13-8fce77af1a52
- version: -1
- name: Validate junk rule removal
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "2"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isNotEqualString
- left:
- value:
- complex:
- root: EWS.Rule.Junk
- accessor: BlockedSendersAndDomains
- iscontext: true
- right:
- value:
- simple: test@gmail.com
- view: |-
- {
- "position": {
- "x": 50,
- "y": 720
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "11":
- id: "11"
- taskid: 8bb88cf6-c9fb-401c-89f0-411db79fa3fd
- type: regular
- task:
- id: 8bb88cf6-c9fb-401c-89f0-411db79fa3fd
- version: -1
- name: DeleteContext
- description: Delete field from context
- scriptName: DeleteContext
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "8"
- scriptarguments:
- all:
- simple: "yes"
- index: {}
- key: {}
- keysToKeep: {}
- subplaybook: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 195
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "12":
- id: "12"
- taskid: a25685b8-cf6a-4d58-85cc-ad870be1d0de
- type: regular
- task:
- id: a25685b8-cf6a-4d58-85cc-ad870be1d0de
- version: -1
- name: ews-user-list
- description: Use the ews-user-list command to view existing user objects in
- your organization.
- script: '|||ews-user-list'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "15"
- scriptarguments:
- identity: {}
- limit:
- simple: "1"
- organizational_unit: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 1770
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "13":
- id: "13"
- taskid: 06e0d26d-8cc0-4977-8eb9-567d1896081f
- type: regular
- task:
- id: 06e0d26d-8cc0-4977-8eb9-567d1896081f
- version: -1
- name: ews-federation-configuration-get
- description: Use the ews-federation-configuration-get command to retrieve the
- Exchange organization's federated organization identifier and related details,
- such as federated domains, organization contact and status.
- script: EwsExtension|||ews-federation-configuration-get
- type: regular
- iscommand: true
- brand: EwsExtension
- nexttasks:
- '#none#':
- - "20"
- scriptarguments:
- domain_controller: {}
- identity: {}
- include_extended_domain_info: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2995
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "14":
- id: "14"
- taskid: 2b0f88fb-abd4-4c2e-87a7-59e757fccd34
- type: regular
- task:
- id: 2b0f88fb-abd4-4c2e-87a7-59e757fccd34
- version: -1
- name: ews-federation-trust-get
- description: Use the ews-federation-trust-get command to view the federation
- trust configured for the Exchange organization.
- script: EwsExtension|||ews-federation-trust-get
- type: regular
- iscommand: true
- brand: EwsExtension
- nexttasks:
- '#none#':
- - "19"
- scriptarguments:
- domain_controller: {}
- identity: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2645
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "15":
- id: "15"
- taskid: 41474a6a-45d3-45f2-8c84-3f09f4758cc9
- type: regular
- task:
- id: 41474a6a-45d3-45f2-8c84-3f09f4758cc9
- version: -1
- name: ews-mailbox-audit-bypass-association-list
- description: Use the Get-User command to view existing user objects in your
- organization.
- script: EwsExtension|||ews-mailbox-audit-bypass-association-list
- type: regular
- iscommand: true
- brand: EwsExtension
- nexttasks:
- '#none#':
- - "17"
- scriptarguments:
- domain_controller: {}
- identity:
- complex:
- root: EWS.User
- accessor: Identity
- limit: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 1945
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "16":
- id: "16"
- taskid: 8dbbadfd-04de-4c4c-872b-24b99b23d620
- type: regular
- task:
- id: 8dbbadfd-04de-4c4c-872b-24b99b23d620
- version: -1
- name: ews-remote-domain-get
- description: View the configuration information for the remote domains configured
- in your organization. This command is available only in the Exchange Online
- PowerShell V2 module.
- script: EwsExtension|||ews-remote-domain-get
- type: regular
- iscommand: true
- brand: EwsExtension
- nexttasks:
- '#none#':
- - "18"
- scriptarguments:
- domain_controller: {}
- identity: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2295
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "17":
- id: "17"
- taskid: 25b71132-afec-4142-84a7-dc58da94a00b
- type: condition
- task:
- id: 25b71132-afec-4142-84a7-dc58da94a00b
- version: -1
- name: Validate Output
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "16"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isExists
- left:
- value:
- complex:
- root: EWS.MailboxAuditBypassAssociation
- accessor: Identity
- iscontext: true
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2120
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "18":
- id: "18"
- taskid: c999ea65-4307-4bf2-8412-8c0a5978b00d
- type: condition
- task:
- id: c999ea65-4307-4bf2-8412-8c0a5978b00d
- version: -1
- name: Validate Output
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "14"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isExists
- left:
- value:
- complex:
- root: EWS.RemoteDomain
- accessor: Id
- iscontext: true
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2470
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "19":
- id: "19"
- taskid: 3f3c4702-d5f3-4505-8eaa-cb538f12d4ef
- type: condition
- task:
- id: 3f3c4702-d5f3-4505-8eaa-cb538f12d4ef
- version: -1
- name: Validate Output
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "13"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isExists
- left:
- value:
- complex:
- root: EWS.FederationTrust
- accessor: Id
- iscontext: true
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2820
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- "20":
- id: "20"
- taskid: 926aefe4-87ac-4589-8e62-be63a0c4496d
- type: condition
- task:
- id: 926aefe4-87ac-4589-8e62-be63a0c4496d
- version: -1
- name: Validate Output
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- "yes":
- - "7"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isExists
- left:
- value:
- complex:
- root: EWS.FederationConfiguration
- accessor: Id
- iscontext: true
- view: |-
- {
- "position": {
- "x": 50,
- "y": 3170
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
-view: |-
- {
- "linkLabelsPosition": {},
- "paper": {
- "dimensions": {
- "height": 3360,
- "width": 380,
- "x": 50,
- "y": 50
- }
- }
- }
-inputs:
-- key: mailbox
- value:
- simple: avishai@demistodev.onmicrosoft.com
- required: true
- description: Mail box for testing
- playbookInputQuery: null
-- key: add_conf
- value:
- simple: test@gmail.com
- required: true
- description: Configuration to add when verifying integration.
- playbookInputQuery: null
-outputs: []
-fromversion: 5.5.0
\ No newline at end of file
diff --git a/Packs/EWS/TestPlaybooks/playbook-EWS-Searchmailbox-Test.yml b/Packs/EWS/TestPlaybooks/playbook-EWS-Searchmailbox-Test.yml
deleted file mode 100644
index 4560aab90c70..000000000000
--- a/Packs/EWS/TestPlaybooks/playbook-EWS-Searchmailbox-Test.yml
+++ /dev/null
@@ -1,441 +0,0 @@
-id: EWS search-mailbox test
-version: -1
-name: EWS search-mailbox test
-starttaskid: "0"
-tasks:
- "0":
- id: "0"
- taskid: 03415abd-cd88-4130-8aba-616439621e89
- type: start
- task:
- id: 03415abd-cd88-4130-8aba-616439621e89
- version: -1
- name: ""
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "4"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 50
- }
- }
- note: false
- timertriggers: []
- "1":
- id: "1"
- taskid: af03ade1-d451-4483-82bd-eb3177276f20
- type: regular
- task:
- id: af03ade1-d451-4483-82bd-eb3177276f20
- version: -1
- name: Search Item In All Directories
- script: '|||ews-search-mailbox'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "2"
- scriptarguments:
- folder-path: {}
- is-public: {}
- limit:
- simple: "1"
- query:
- simple: "body:384868fafe3ef9190a8a5e59c5c195c3"
- target-mailbox: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 370
- }
- }
- note: false
- timertriggers: []
- "2":
- id: "2"
- taskid: 932fec69-67a2-41e9-8295-3d49421f1979
- type: condition
- task:
- id: 932fec69-67a2-41e9-8295-3d49421f1979
- version: -1
- name: Verify Context
- type: condition
- iscommand: false
- brand: ""
- nexttasks:
- '#default#':
- - "5"
- "yes":
- - "3"
- separatecontext: false
- conditions:
- - label: "yes"
- condition:
- - - operator: isEqualString
- left:
- value:
- simple: EWS.Items.body
- iscontext: true
- right:
- value:
- simple: 384868fafe3ef9190a8a5e59c5c195c3
- - - operator: isExists
- left:
- value:
- simple: EWS.Items.messageId
- iscontext: true
- - - operator: isExists
- left:
- value:
- simple: EWS.Items.author
- iscontext: true
- - - operator: isExists
- left:
- value:
- simple: EWS.Items.subject
- iscontext: true
- view: |-
- {
- "position": {
- "x": 50,
- "y": 545
- }
- }
- note: false
- timertriggers: []
- "3":
- id: "3"
- taskid: 048f0b73-2c4f-41ea-8351-80e54a1cd4de
- type: title
- task:
- id: 048f0b73-2c4f-41ea-8351-80e54a1cd4de
- version: -1
- name: Done
- type: title
- iscommand: false
- brand: ""
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 2120
- }
- }
- note: false
- timertriggers: []
- "4":
- id: "4"
- taskid: 2ab7b162-9557-4bbb-8461-52ac0cfa12d5
- type: regular
- task:
- id: 2ab7b162-9557-4bbb-8461-52ac0cfa12d5
- version: -1
- name: Delete Context
- scriptName: DeleteContext
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "1"
- scriptarguments:
- all:
- simple: "yes"
- index: {}
- key: {}
- keysToKeep: {}
- subplaybook: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 195
- }
- }
- note: false
- timertriggers: []
- "5":
- id: "5"
- taskid: 54c87061-98b7-4036-8609-e0a0a3f1162b
- type: regular
- task:
- id: 54c87061-98b7-4036-8609-e0a0a3f1162b
- version: -1
- name: Send Email
- script: 'EWSO365|||send-mail'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "6"
- scriptarguments:
- attachIDs: {}
- attachNames: {}
- bcc: {}
- body:
- simple: 384868fafe3ef9190a8a5e59c5c195c3
- cc: {}
- htmlBody: {}
- replyTo: {}
- subject:
- simple: EWS search-mailbox test
- from:
- simple: testbox@demistodev.onmicrosoft.com
- to:
- simple: demistoadmin@demisto.int
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 720
- }
- }
- note: false
- timertriggers: []
- "6":
- id: "6"
- taskid: f0fd4825-7ed9-4842-88e4-7e4f6ca00e68
- type: regular
- task:
- id: f0fd4825-7ed9-4842-88e4-7e4f6ca00e68
- version: -1
- name: Wait For Email
- scriptName: Sleep
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "7"
- scriptarguments:
- seconds:
- simple: "150"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 895
- }
- }
- note: false
- timertriggers: []
- "7":
- id: "7"
- taskid: 9cf2e442-b2d3-4b89-8c5e-79402cca6eb8
- type: regular
- task:
- id: 9cf2e442-b2d3-4b89-8c5e-79402cca6eb8
- version: -1
- name: Search Item In Inbox
- script: '|||ews-search-mailbox'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "9"
- scriptarguments:
- folder-path:
- simple: Inbox
- is-public: {}
- limit:
- simple: "1"
- query:
- simple: "body:384868fafe3ef9190a8a5e59c5c195c3"
- target-mailbox: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 1070
- }
- }
- note: false
- timertriggers: []
- "8":
- id: "8"
- taskid: 25263c73-3dcb-43bc-8413-0446b26a50cc
- type: regular
- task:
- id: 25263c73-3dcb-43bc-8413-0446b26a50cc
- version: -1
- name: Verify Context
- scriptName: VerifyContext
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "3"
- scriptarguments:
- expectedValue: {}
- fields:
- simple: body,messageId,author,subject
- path:
- simple: EWS.Items
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 1945
- }
- }
- note: false
- timertriggers: []
- "9":
- id: "9"
- taskid: cf24db4b-578f-4e34-8e1e-6304940d612d
- type: regular
- task:
- id: cf24db4b-578f-4e34-8e1e-6304940d612d
- version: -1
- name: Move
- script: '|||ews-move-item'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "10"
- scriptarguments:
- is-public: {}
- item-id:
- simple: ${EWS.Items.itemId}
- target-folder-path:
- simple: Inbox/TEST
- target-mailbox: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 1245
- }
- }
- note: false
- timertriggers: []
- "10":
- id: "10"
- taskid: 3464c8b9-df94-4dda-8f77-32fade033f7e
- type: regular
- task:
- id: 3464c8b9-df94-4dda-8f77-32fade033f7e
- version: -1
- name: DeleteContext
- scriptName: DeleteContext
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "12"
- scriptarguments:
- all:
- simple: "yes"
- index: {}
- key: {}
- keysToKeep: {}
- subplaybook: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 1420
- }
- }
- note: false
- timertriggers: []
- "11":
- id: "11"
- taskid: 1b4c6b69-4465-48d7-86d1-d5bbae758d28
- type: regular
- task:
- id: 1b4c6b69-4465-48d7-86d1-d5bbae758d28
- version: -1
- name: Search Item In All Directories
- script: '|||ews-search-mailbox'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "8"
- scriptarguments:
- folder-path: {}
- is-public: {}
- limit:
- simple: "1"
- query:
- simple: "body:384868fafe3ef9190a8a5e59c5c195c3"
- target-mailbox: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 1770
- }
- }
- note: false
- timertriggers: []
- "12":
- id: "12"
- taskid: b27f8993-f022-4a46-8f2c-fdeac4a5f4bf
- type: regular
- task:
- id: b27f8993-f022-4a46-8f2c-fdeac4a5f4bf
- version: -1
- name: Wait
- scriptName: Sleep
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "11"
- scriptarguments:
- seconds:
- simple: "60"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 162.5,
- "y": 1595
- }
- }
- note: false
- timertriggers: []
-view: |-
- {
- "linkLabelsPosition": {
- "2_3_yes": 0.25
- },
- "paper": {
- "dimensions": {
- "height": 2135,
- "width": 492.5,
- "x": 50,
- "y": 50
- }
- }
- }
-inputs: []
-outputs: []
-fromversion: 5.0.0
diff --git a/Packs/EWS/pack_metadata.json b/Packs/EWS/pack_metadata.json
index 42b66ad87342..aba64b3dc611 100644
--- a/Packs/EWS/pack_metadata.json
+++ b/Packs/EWS/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "EWS",
"description": "Exchange Web Services and Office 365 (mail)",
"support": "xsoar",
- "currentVersion": "2.0.2",
+ "currentVersion": "2.1.0",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
@@ -13,6 +13,16 @@
"tags": [],
"useCases": [],
"keywords": [],
+ "dependencies": {
+ "MicrosoftExchangeOnPremise": {
+ "mandatory": true,
+ "display_name": "Microsoft Exchange On-Premise"
+ },
+ "MicrosoftExchangeOnline": {
+ "mandatory": true,
+ "display_name": "Microsoft Exchange Online"
+ }
+ },
"marketplaces": [
"xsoar",
"marketplacev2"
diff --git a/Packs/EWSMailSender/Integrations/EWSMailSender/README.md b/Packs/EWSMailSender/Integrations/EWSMailSender/README.md
deleted file mode 100644
index f93c42d7ae21..000000000000
--- a/Packs/EWSMailSender/Integrations/EWSMailSender/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-Exchange Web Services and Office 365 Email sender.
-## Configure EWS Mail Sender on Cortex XSOAR
-
-1. Navigate to **Settings** > **Integrations** > **Servers & Services**.
-2. Search for EWS Mail Sender.
-3. Click **Add instance** to create and configure a new integration instance.
-
- | **Parameter** | **Description** | **Required** |
- | --- | --- | --- |
- | ewsServer | Exchange URL or Server IP address | True |
- | credentials | Authentication: Email address \(for Office 365\) or DOMAIN\\USERNAME \(e.g. XSOAR.INT\\admin\) | True |
- | defaultServerVersion | Server Version \(2007, 2010, 2010_SP2, 2013, or 2016\) | True |
- | authType | Authentication Type \(NTLM, Basic, or Digest\). For Office 365 use Basic. | True |
- | insecure | Trust any certificate \(not secure\) | False |
- | proxy | Use system proxy settings | False |
- | impersonation | Has impersonation rights | False |
- | mailbox | Sender Mailbox | False |
- | Single engine | If relevant, select the engine that acts as a proxy to the server. Engines are used when you need to access a remote network segments and there are network devices such as proxies, firewalls, etc. that prevent the Cortex XSOAR server from accessing the remote networks. For more information on Cortex XSOAR engines see: https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/engines| False |
-
-4. Click **Test** to validate the URLs, token, and connection.
-
-## Top Use-cases:
-- Send notifications to external users.
-- Send an email asking for a response to be returned as part of a playbook. See [Receiving an email reply](https://xsoar.pan.dev/docs/reference/scripts/email-ask-user)
-
-## Commands
-You can execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook.
-After you successfully execute a command, a DBot message appears in the War Room with the command details.
-### send-mail
-***
-Sends an email using EWS.
-
-#### Base Command
-
-`send-mail`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| to | A CSV list of email addresses for the 'to' field. | Required |
-| cc | A CSV list of email addresses for the 'cc' field. | Optional |
-| bcc | A CSV list of email addresses for the 'bcc' field. | Optional |
-| subject | Subject for the email to be sent. | Required |
-| replyTo | The email address specified in the 'reply to' field. | Optional |
-| body | The contents (body) of the email to send. | Optional |
-| htmlBody | HTML formatted content (body) of the email to be sent. This argument overrides the "body" argument. | Optional |
-| attachIDs | A CSV list of War Room entry IDs that contain files, and are used to attach files to the outgoing email. For example: attachIDs=15@8,19@8. | Optional |
-| attachNames | A CSV list of names of attachments to send. Should be the same number of elements as attachIDs. | Optional |
-| attachCIDs | A CSV list of CIDs to embed attachments within the email itself. | Optional |
-| from_address | The email address from which to reply. | Optional |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!send-mail body="hello this is a test" subject=Hi to=avishai@demistodev.onmicrosoft.com```
-
-#### Human Readable Output
-
->### Sent email
->|attachments|from|subject|to|
->|---|---|---|---|
->| | avishai@demistodev.onmicrosoft.com | Hi | avishai@demistodev.onmicrosoft.com |
-
-
-### reply-mail
-***
-Replies to an email using EWS.
-
-
-#### Base Command
-
-`reply-mail`
-#### Input
-
-| **Argument Name** | **Description** | **Required** |
-| --- | --- | --- |
-| inReplyTo | ID of the item to reply to. | Required |
-| to | A CSV list of email addresses for the 'to' field. | Required |
-| cc | A CSV list of email addresses for the 'cc' field. | Optional |
-| bcc | A CSV list of email addresses for the 'bcc' field. | Optional |
-| subject | Subject for the email to be sent. | Optional |
-| body | The contents (body) of the email to send. | Optional |
-| htmlBody | HTML formatted content (body) of the email to be sent. This argument overrides the "body" argument. | Optional |
-| attachIDs | A CSV list of War Room entry IDs that contain files, and are used to attach files to the outgoing email. For example: attachIDs=15@8,19@8. | Optional |
-| attachNames | A CSV list of names of attachments to send. Should be the same number of elements as attachIDs. | Optional |
-| attachCIDs | A CSV list of CIDs to embed attachments within the email itself. | Optional |
-
-
-#### Context Output
-
-There is no context output for this command.
-
-#### Command Example
-```!reply-mail item_id=AAMkAGY3OTQyMzMzLWYxNjktNDE0My05NmZhLWQ5MGY1YjIyNzBkNABGAAAAAACYCKjWAnXBTrnhgWJCcLX7BwDrxRwRjq/zTrN6vWSzK4OWAAAAAAEMAADrxRwRjq/zTrN6vWSzK4OWAAPYQGFeAAA= body=hello subject=hi to="avishai@demistodev.onmicrosoft.com"```
-
-#### Human Readable Output
-
->### Sent email
->|attachments|from|subject|to|
->|---|---|---|---|
->| | avishai@demistodev.onmicrosoft.com | hi | avishai@demistodev.onmicrosoft.com |
-
diff --git a/Packs/EWSMailSender/ReleaseNotes/1_1_16.md b/Packs/EWSMailSender/ReleaseNotes/1_1_16.md
new file mode 100644
index 000000000000..f5d0f862c83c
--- /dev/null
+++ b/Packs/EWSMailSender/ReleaseNotes/1_1_16.md
@@ -0,0 +1,5 @@
+
+#### Integrations
+##### EWS Mail Sender
+- Added support for sections infrastructure.
+- Updated the Docker image to: *demisto/py3ews:1.0.0.43044*.
diff --git a/Packs/EWSMailSender/ReleaseNotes/1_1_17.md b/Packs/EWSMailSender/ReleaseNotes/1_1_17.md
new file mode 100644
index 000000000000..8818cefa5ce5
--- /dev/null
+++ b/Packs/EWSMailSender/ReleaseNotes/1_1_17.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### EWS Mail Sender
+- Updated the Docker image to: *demisto/py3ews:1.0.0.45234*.
diff --git a/Packs/EWSMailSender/ReleaseNotes/1_1_18.md b/Packs/EWSMailSender/ReleaseNotes/1_1_18.md
new file mode 100644
index 000000000000..6ef31a4667e3
--- /dev/null
+++ b/Packs/EWSMailSender/ReleaseNotes/1_1_18.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### EWS Mail Sender (Deprecated)
+- Updated the Docker image to: *demisto/py3ews:1.0.0.47270*.
diff --git a/Packs/EWSMailSender/ReleaseNotes/1_2_0.md b/Packs/EWSMailSender/ReleaseNotes/1_2_0.md
new file mode 100644
index 000000000000..c1b3595cf80a
--- /dev/null
+++ b/Packs/EWSMailSender/ReleaseNotes/1_2_0.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### EWS Mail Sender (Deprecated)
+- Note: Moved to the **Microsoft Exchange On-Premise** pack.
diff --git a/Packs/EWSMailSender/TestPlaybooks/playbook-EWS-Mail-Sender-Test-2.yml b/Packs/EWSMailSender/TestPlaybooks/playbook-EWS-Mail-Sender-Test-2.yml
deleted file mode 100644
index c61769bf7803..000000000000
--- a/Packs/EWSMailSender/TestPlaybooks/playbook-EWS-Mail-Sender-Test-2.yml
+++ /dev/null
@@ -1,162 +0,0 @@
-id: EWS Mail Sender Test 2
-version: -1
-name: EWS Mail Sender Test 2
-starttaskid: "0"
-tasks:
- "0":
- id: "0"
- taskid: 53e3e9b8-f046-4b6e-8bf1-9e314ec8ddd3
- type: start
- task:
- id: 53e3e9b8-f046-4b6e-8bf1-9e314ec8ddd3
- version: -1
- name: ""
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "1"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 50
- }
- }
- note: false
- timertriggers: []
- "1":
- id: "1"
- taskid: 3d824a33-ccf2-4fb8-88d9-1447cef90aa4
- type: regular
- task:
- id: 3d824a33-ccf2-4fb8-88d9-1447cef90aa4
- version: -1
- name: Delete Context
- scriptName: DeleteContext
- type: regular
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "2"
- scriptarguments:
- all:
- simple: "yes"
- index: {}
- key: {}
- keysToKeep: {}
- subplaybook: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 195
- }
- }
- note: false
- timertriggers: []
- "2":
- id: "2"
- taskid: 510a6b8a-1596-4df8-8313-6d0ad1034731
- type: regular
- task:
- id: 510a6b8a-1596-4df8-8313-6d0ad1034731
- version: -1
- name: Rasterize URL
- script: '|||rasterize'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "3"
- scriptarguments:
- height: {}
- type: {}
- url:
- simple: https://www.google.com
- width: {}
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 370
- }
- }
- note: false
- timertriggers: []
- "3":
- id: "3"
- taskid: dd517ff2-16c6-4fa8-8510-f8d231f4b0ce
- type: playbook
- task:
- id: dd517ff2-16c6-4fa8-8510-f8d231f4b0ce
- version: -1
- name: Send Email To Recipients
- playbookName: Send Email To Recipients
- type: playbook
- iscommand: false
- brand: ""
- nexttasks:
- '#none#':
- - "4"
- scriptarguments:
- attIDs:
- simple: ${InfoFile.EntryID}
- cc: {}
- to:
- simple: buildtests@demisto.int
- separatecontext: true
- loop:
- iscommand: false
- exitCondition: ""
- wait: 1
- view: |-
- {
- "position": {
- "x": 50,
- "y": 545
- }
- }
- note: false
- timertriggers: []
- "4":
- id: "4"
- taskid: e97ec6c4-e790-4487-8736-0ddd30c578b8
- type: title
- task:
- id: e97ec6c4-e790-4487-8736-0ddd30c578b8
- version: -1
- name: Done
- type: title
- iscommand: false
- brand: ""
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 720
- }
- }
- note: false
- timertriggers: []
-view: |-
- {
- "linkLabelsPosition": {},
- "paper": {
- "dimensions": {
- "height": 735,
- "width": 380,
- "x": 50,
- "y": 50
- }
- }
- }
-inputs: []
-outputs: []
-fromversion: 5.0.0
diff --git a/Packs/EWSMailSender/TestPlaybooks/playbook-EWS-Mail-Sender-Test-3.yml b/Packs/EWSMailSender/TestPlaybooks/playbook-EWS-Mail-Sender-Test-3.yml
deleted file mode 100644
index 258b25c73f0a..000000000000
--- a/Packs/EWSMailSender/TestPlaybooks/playbook-EWS-Mail-Sender-Test-3.yml
+++ /dev/null
@@ -1,150 +0,0 @@
-id: EWS Mail Sender Test 3
-version: -1
-name: EWS Mail Sender Test 3
-starttaskid: "0"
-tasks:
- "0":
- id: "0"
- taskid: 58af508d-4279-497c-8bd7-dc890b3e05d2
- type: start
- task:
- id: 58af508d-4279-497c-8bd7-dc890b3e05d2
- version: -1
- name: ""
- iscommand: false
- brand: ""
- description: ''
- nexttasks:
- '#none#':
- - "1"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 50
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- isoversize: false
- isautoswitchedtoquietmode: false
- "1":
- id: "1"
- taskid: b5ce19bb-a341-4d5a-865f-b26aa592cae2
- type: regular
- task:
- id: b5ce19bb-a341-4d5a-865f-b26aa592cae2
- version: -1
- name: Smime encrypt
- description: Encrypts an email message with S/MIME protocol by using a public
- RSA certificate.
- script: '|||smime-encrypt-email-body'
- type: regular
- iscommand: true
- brand: ""
- nexttasks:
- '#none#':
- - "2"
- scriptarguments:
- message:
- simple: "123"
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 195
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- isoversize: false
- isautoswitchedtoquietmode: false
- "2":
- id: "2"
- taskid: 37f83931-00ca-4006-86a6-dbc4bb0f03ce
- type: regular
- task:
- id: 37f83931-00ca-4006-86a6-dbc4bb0f03ce
- version: -1
- name: Send mail
- description: Sends an email using EWS.
- script: EWS Mail Sender|||send-mail
- type: regular
- iscommand: true
- brand: EWS Mail Sender
- nexttasks:
- '#none#':
- - "3"
- scriptarguments:
- raw_message:
- simple: ${SMIME.Encrypted.Message}
- subject:
- simple: EWS Mail Sender Test 3
- to:
- simple: buildtests@demisto.int
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 370
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- isoversize: false
- isautoswitchedtoquietmode: false
- "3":
- id: "3"
- taskid: 9ba3bae1-2228-49f7-8118-b386da331ba8
- type: title
- task:
- id: 9ba3bae1-2228-49f7-8118-b386da331ba8
- version: -1
- name: Done
- type: title
- iscommand: false
- brand: ""
- description: ''
- separatecontext: false
- view: |-
- {
- "position": {
- "x": 50,
- "y": 545
- }
- }
- note: false
- timertriggers: []
- ignoreworker: false
- skipunavailable: false
- quietmode: 0
- isoversize: false
- isautoswitchedtoquietmode: false
-view: |-
- {
- "linkLabelsPosition": {},
- "paper": {
- "dimensions": {
- "height": 560,
- "width": 380,
- "x": 50,
- "y": 50
- }
- }
- }
-inputs: []
-outputs: []
-fromversion: 5.0.0
-description: ''
diff --git a/Packs/EWSMailSender/pack_metadata.json b/Packs/EWSMailSender/pack_metadata.json
index 6cc1820c869a..21e7c424e69e 100644
--- a/Packs/EWSMailSender/pack_metadata.json
+++ b/Packs/EWSMailSender/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "EWS Mail Sender",
"description": "Exchange Web Services and Office 365 Email Sender. Note: this Integration supports Office 365 basic authentication only. If you are using Office 365, we recommend using the EWS O365 Integration instead, which supports modern authentication (oauth2).",
"support": "xsoar",
- "currentVersion": "1.1.15",
+ "currentVersion": "1.2.0",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
@@ -13,6 +13,12 @@
"tags": [],
"useCases": [],
"keywords": [],
+ "dependencies": {
+ "MicrosoftExchangeOnPremise": {
+ "mandatory": true,
+ "display_name": "Microsoft Exchange On-Premise"
+ }
+ },
"marketplaces": [
"xsoar",
"marketplacev2"
diff --git a/Packs/EclecticIQ/.secrets-ignore b/Packs/EclecticIQ/.secrets-ignore
index a3179c91abf8..e82c964422f3 100644
--- a/Packs/EclecticIQ/.secrets-ignore
+++ b/Packs/EclecticIQ/.secrets-ignore
@@ -3,3 +3,9 @@ http://eclecticiq.file.id
http://eclecticiq.ip.id
http://eclecticiq.entity.id
http://eclecticiq.url.id
+https://examples.com
+2001:0db8:85a3:0000:0000:8a2e:0370:7334
+https://example.com
+example@example.com
+001.001.001.001
+https://ic-playground.eclecticiq.com
diff --git a/Packs/EclecticIQ/Author_image.png b/Packs/EclecticIQ/Author_image.png
new file mode 100644
index 000000000000..ef0330c41408
Binary files /dev/null and b/Packs/EclecticIQ/Author_image.png differ
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.py b/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.py
index 548eafea87a3..178d63090ddb 100644
--- a/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.py
+++ b/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.py
@@ -5,9 +5,10 @@
from CommonServerUserPython import *
import json
import requests
+import urllib3
# Disable insecure warnings
-requests.packages.urllib3.disable_warnings()
+urllib3.disable_warnings()
''' GLOBALS/PARAMS '''
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.yml b/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.yml
index 6aa9a51aeef4..ce4656130689 100644
--- a/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.yml
+++ b/Packs/EclecticIQ/Integrations/EclecticIQ/EclecticIQ.yml
@@ -2,9 +2,10 @@ commonfields:
id: EclecticIQ Platform
version: -1
name: EclecticIQ Platform
-display: EclecticIQ Platform
+display: EclecticIQ Platform (Deprecated)
+deprecated: true
category: Data Enrichment & Threat Intelligence
-description: Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships.
+description: Deprecated. No available replacement.
configuration:
- display: Server URL (e.g. https://192.168.0.1)
name: url
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQ/README.md b/Packs/EclecticIQ/Integrations/EclecticIQ/README.md
index 5add41360ff8..de938335ab2f 100644
--- a/Packs/EclecticIQ/Integrations/EclecticIQ/README.md
+++ b/Packs/EclecticIQ/Integrations/EclecticIQ/README.md
@@ -1,6 +1,6 @@
-
Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships. EclecticIQ Platform is used through Cortex XSOAR to get reputation of IOCs and their related entities. This integration was integrated and tested with version 2.3.0-1 of EclecticIQ Platform
+
Deprecated. No available replacement.
Use Cases
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2.py b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2.py
new file mode 100644
index 000000000000..1a42031ff998
--- /dev/null
+++ b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2.py
@@ -0,0 +1,635 @@
+import json
+import re
+import traceback
+from typing import Any, Dict, List, Mapping, Tuple
+import demistomock as demisto
+import urllib3
+from CommonServerPython import *
+
+"""EclecticIQ Integration for Cortex XSOAR."""
+
+# Disable insecure warnings
+urllib3.disable_warnings()
+
+''' CONSTANTS '''
+
+DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
+
+''' CLIENT CLASS '''
+
+
+class Client(BaseClient):
+ def sighting(self, value: str, description: str,
+ title: str, tags: str, type_eiq: str, confidence_level: str) -> Dict[str, Any]:
+ """Create the sighting using the '/entities' API endpoint
+ :param value: sighting value
+ :type value: str
+ :param description: sighting description
+ :type description: str
+ :param title: title for the sighting
+ :type title: str
+ :param tags: sighting tags
+ :type tags: str
+ :param type_eiq: sighting value type
+ :type type_eiq: str
+ :param confidence_level: maliciousness of the value
+ :type confidence_level : ``str``
+ :return: sighting payload
+ :rtype: ``Dict[str, Any]``
+ """
+ sighting_schema: Mapping[str, Any] = {
+ "data": {
+ "data": {
+ "value": "value1",
+ "confidence": "medium",
+ "description": "test_desc",
+ "type": "eclecticiq-sighting",
+ "timestamp": "2022-03-10T05:37:42Z",
+ "title": "title1",
+ "security_control": {
+ "type": "information-source",
+ "identity": {
+ "name": "EclecticIQ Platform App for cortex XSOAR",
+ "type": "identity"
+ },
+ "time": {
+ "type": "time",
+ "start_time": "2022-03-10T05:37:42Z",
+ "start_time_precision": "second"}
+ }
+ },
+ "meta": {"tags": ["XSOAR Alert"], "ingest_time": "2022-03-10T05:37:42Z"}
+ }
+ }
+ sighting_schema["data"]["data"]["value"] = value
+ sighting_schema["data"]["data"]["confidence"] = confidence_level
+ sighting_schema["data"]["data"]["description"] = description
+ sighting_schema["data"]["data"]["title"] = title
+ sighting_schema["data"]["data"]["security_control"]["type"] = type_eiq
+ sighting_schema["data"]["meta"]["tags"] = tags.split(",")
+ sighting_schema["data"]["data"]["timestamp"] = datetime.strftime(
+ datetime.utcnow(), DATE_FORMAT)
+ return self._http_request(
+ method='POST',
+ url_suffix='/entities',
+ data=json.dumps(sighting_schema)
+ )
+
+ def lookup_obs(self, type_eiq: str, value: str) -> Dict[str, Any]:
+ """Get observables using the '/observables' API endpoint.
+ :param type_eiq: observable type
+ :type type_eiq: str
+ :param value: observable value
+ :type value: str
+ :return: observables
+ :rtype: Dict[str, Any]
+ """
+ return self._http_request(
+ method='GET',
+ url_suffix='observables',
+ params={"filter[type]": type_eiq, "filter[value]": value}
+ )
+
+ def fetch_entity(self, id: str) -> Dict[str, Any]:
+ """Get entity details by id.
+ :param id: entity id
+ :type: str
+ :return: id releted entity
+ :rtype: Dict[str, Any]
+ """
+ return self._http_request(
+ method='GET',
+ url_suffix='/entities/{}'.format(id),
+ params={}
+ )
+
+ def get_observable_by_id(self, id: str) -> Dict[str, Any]:
+ """Get observables by id.
+ :param id: observable id
+ :type id: str
+ :return: id related observable
+ :rtype: Dict[str, Any]
+ """
+ return self._http_request(
+ method='GET',
+ url_suffix=f'observables/{id}',
+ params={}
+ )
+
+ def observable(self, type_eiq: str, value: str, maliciousness: str) -> Dict[str, Any]:
+ """Create the observable using the '/observables' API endpoint
+ :param type_eiq: observable type
+ :type type_eiq: str
+ :param value: observable value
+ :type value: str
+ :param maliciousness: maliciousness of the value
+ :type maliciousness: str
+ :return: observable payload
+ :rtype: ``Dict[str, Any]``
+ """
+ body_params: Mapping[str, Any] = {
+ "data": {
+ "meta": {
+ "maliciousness": "Unknown"
+ },
+ "type": "Unknown",
+ "value": "value1"
+ }
+ }
+ body_params["data"]["type"] = type_eiq
+ body_params["data"]["value"] = value
+ body_params["data"]["meta"]["maliciousness"] = maliciousness
+ return self._http_request(
+ method='POST',
+ url_suffix='/observables',
+ data=json.dumps(body_params)
+ )
+
+ def get_user_granted_permissions(self) -> Any:
+ """Get user granted permissions.
+ :param: self
+ :type: str
+ :return: user granted permissions
+ :rtype: Any
+ """
+ response = self._http_request(
+ method='GET',
+ url_suffix='users/self',
+ params={}
+ )
+ data = response.get("data")
+ if data:
+ return data.get("permissions")
+ return {}
+
+ def get_platform_permissions(self) -> Any:
+ """Get platform permissions for user.
+ :param: self
+ :type: str
+ :return: permissions data
+ :rtype: Any
+ """
+ response = self._http_request(
+ method='GET',
+ url_suffix='permissions',
+ params={}
+ )
+ data = response.get("data", {})
+ return data or {}
+
+
+def get_platform_permission_ids(permissions_data: Any) -> List[Any]:
+ """Get permission ids required for user to authenticate.
+ :param feeds: permissions_data
+ :type response: list
+ [{"id": 1, "name": "read history-events"},{"id": 2,"name": "read discovery-rules"}...]
+ :return: List of permission ids
+ [33, 59, 66,78]
+ :rtype: list
+ """
+ wanted_permissions = [
+ "read entitites",
+ "modify entities",
+ "read extracts",
+ "read outgoing-feeds",
+ ]
+ ids_required_for_user = []
+ for value in permissions_data:
+ if value.get("name") in wanted_permissions:
+ ids_required_for_user.append(value.get("id"))
+
+ return ids_required_for_user
+
+
+def authenticate_user(ids_of_user: list, ids_required_for_user: list) -> Tuple[bool, List[int]]:
+ """Get user authentication and missing permission ids .
+ :param ids_of_user: permission ids user have
+ :type ids_of_user: list
+ :param ids_required_for_user: permission ids required for user to authenticate
+ :type ids_required_for_user: list
+ :return: is user authenticated , missing permissions ids
+ :rtype: boolean,list
+ """
+ user_authenticated = False
+ value = list(set(ids_required_for_user).difference(ids_of_user))
+
+ if not value:
+ user_authenticated = True
+ return user_authenticated, value
+
+
+def get_permission_name_from_id(permission_data: Dict, permission_ids: list) -> Any:
+ """Get permission name from permission ids.
+ :param permission_data: permission data
+ :type permission_data: Dict
+ :param permission_ids: permission id for authenticate
+ :type permission_ids: list
+ :return: permissions name
+ :rtype: Any
+ """
+ permissions_name = []
+ for data in permission_data:
+ for permission_id in permission_ids:
+ if data.get("id") == permission_id:
+ permissions_name.append(data.get("name"))
+ return permissions_name
+
+
+def data_ingestion(client: Client) -> Any:
+ """Tests API connectivity and authentication'
+ Returning 'ok' indicates that the integration works like it is supposed to.
+ Connection to the service is successful.
+ Raises exceptions if something goes wrong.
+ :type client: ``Client``
+ :param Client: EclecticIQ client to use
+ :return: 'ok' if test passed, anything else will fail the test.
+ :rtype: ``Any``
+ """
+ try:
+ permissions_of_user = client.get_user_granted_permissions()
+ except Exception:
+ return "Please provide correct URL & API Key."
+
+ permission_ids = []
+ missing_permissions = ""
+ if isinstance(permissions_of_user, list):
+ for permission in permissions_of_user:
+ permission_ids.append(int(permission.split("/")[-1]))
+ try:
+ permissions_data = client.get_platform_permissions()
+ except Exception:
+ return "API Key does not have access to view permissions."
+ if permissions_data:
+ ids_required_for_user = get_platform_permission_ids(
+ permissions_data
+ )
+ user_authenticated, permission_ids = authenticate_user(
+ permission_ids, ids_required_for_user
+ )
+ if not user_authenticated:
+ # check for missing permissions
+ permissions_data = client.get_platform_permissions()
+ missing_permissions = get_permission_name_from_id(
+ permissions_data, permission_ids
+ )
+ else:
+ missing_permissions = "Read Permissions"
+
+ if missing_permissions:
+ return "API Key is missing permissions {}".format(missing_permissions)
+
+ return 'ok'
+
+
+def maliciousness_to_dbotscore(maliciousness) -> int:
+ """Translates EclecticIQ obversable maliciousness confidence level to DBotScore based on given threshold
+ Parameters
+ ----------
+ maliciousness : str
+ EclecticIQ obversable maliciousness confidence level.
+ threshold : str
+ Minimum maliciousness confidence level to consider the IOC malicious.
+ Returns
+ -------
+ number
+ Translated DBot Score
+ """
+ maliciousness_Dictionary = {
+ 'unknown': 0,
+ 'safe': 1,
+ 'low': 2,
+ 'medium': 2,
+ 'high': 3
+ }
+ return maliciousness_Dictionary[maliciousness]
+
+
+def prepare_observable_data(data: Any) -> Dict:
+ """Prepare Observable data to show on UI.
+ :param data: Observable data
+ :type data: Dict
+ :return: Only selected fields Dict
+ :rtype: Dict
+ """
+ new_data = {}
+ new_data["type"] = data.get("type")
+ new_data["value"] = data.get("value")
+ new_data["classification"] = data.get("meta", {}).get("maliciousness")
+ return new_data
+
+
+def get_entity_data(client, data_item: Any) -> List[Any]:
+ """Get entity data to show on UI.
+ :param data_item: Data from lookup obsrvables Dict
+ :type data_item: Any
+ :return: prepared data to show on UI
+ :rtype: List
+ """
+ entity_data_Dict_list = []
+ for item in data_item.get("entities"):
+ entity_data_Dict = {}
+ entity_data = client.fetch_entity(
+ str(item.split("/")[-1])
+ )
+ entity_data = entity_data.get("data")
+ observables = entity_data.get(
+ "observables") if entity_data.get("observables") else []
+ obs_data_list = []
+ for observable in observables:
+ obs_data = client.get_observable_by_id(
+ str(observable.split("/")[-1])
+ )
+ obs_data = obs_data.get("data")
+ append_data = prepare_observable_data(obs_data)
+
+ obs_data_list.append(append_data)
+
+ entity_data_Dict.update(
+ prepare_entity_data(entity_data, obs_data_list))
+ entity_data_Dict_list.append(entity_data_Dict)
+ return entity_data_Dict_list
+
+
+def prepare_entity_data(data: Any, obs_data: Any) -> Dict[Any, Any]:
+ """Prepare entity data to show on UI.
+ :param data: Entity data
+ :type data: Any
+ :param obs_data: Observable data
+ :type data: Any
+ :return: Only selected fields Dict
+ :rtype: Dict
+ """
+ new_data = {}
+ if data.get("data"):
+ new_data["title"] = (
+ data.get("data", {}).get("title") if data.get(
+ "data", {}).get("title") else ""
+ )
+
+ new_data["description"] = (
+ data.get("data", {}).get("description")
+ if data.get("data", {}).get("description")
+ else ""
+ )
+ new_data["confidence"] = (
+ data.get("data", {}).get("confidence")
+ if data.get("data", {}).get("confidence")
+ else ""
+ )
+ new_data["tags"] = (
+ data.get("data", {}).get("tags") if data.get(
+ "data", {}).get("tags") else ""
+ )
+ if data.get("meta"):
+ new_data["threat_start_time"] = (
+ data.get("meta", {}).get("estimated_threat_start_time")
+ if data.get("meta", {}).get("estimated_threat_start_time")
+ else ""
+ )
+ if data.get("data", {}).get("producer"):
+ new_data["source_name"] = (
+ data.get("data", {}).get("producer", {}).get("identity")
+ if data.get("data", {}).get("producer", {}).get("identity")
+ else ""
+ )
+ else:
+ new_data["source_name"] = ""
+ new_data["observables"] = obs_data
+
+ return new_data
+
+
+def validate_type(s_type: str, value: Any) -> Any: # pylint: disable=R0911
+ """Get the type of the observable.
+ :param s_type :observable pattern type
+ :type s_type: str
+ :param value: observable value
+ :type value: Any
+ :return: type of the observable
+ :rtype: Any
+ """
+ if s_type == "ipv4": # pylint: disable=R1705
+ return bool(re.match(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", value))
+ elif s_type == "ipv6":
+ return bool(
+ re.match(
+ r"^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|\
+ ([0-9a-fA-F]{1,4}:){1,7}:|\
+ ([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|\
+ ([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|\
+ ([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|\
+ ([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|\
+ ([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|\
+ [0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|\
+ :((:[0-9a-fA-F]{1,4}){1,7}|:)|\
+ fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|\
+ ::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|\
+ 1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|\
+ 1{0,1}[0-9]){0,1}[0-9])|\
+ ([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|\
+ 1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|\
+ (2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$",
+ value, # pylint: disable=C0301
+ )
+ )
+ elif s_type == "email":
+ return bool(re.match(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]+", value))
+ elif s_type == "uri":
+ return bool(re.match(r"[^\:]+\:\/\/[\S]+", value))
+ elif s_type == "domain":
+ return bool(
+ re.match(
+ r"^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$",
+ value,
+ )
+ )
+ elif s_type == "hash-md5":
+ return bool(re.match(r"^[a-f0-9A-F]{32}$", value))
+ elif s_type == "hash-sha256":
+ return bool(re.match(r"^[a-f0-9A-F]{64}$", value))
+ elif s_type == "hash-sha1":
+ return bool(re.match(r"\b[0-9a-f]{5,40}\b", value))
+ elif s_type == "hash-sha512":
+ return bool(re.match(r"^\w{128}$", value))
+ else:
+ return False
+
+
+def EclecticIQ_lookup_observables(client: Client, args: Any) -> CommandResults:
+ """lookup_observables command: Returns the observable
+ :type client: ``Client``
+ :param Client: EclecticIQ client to use
+ :type args: ``Any``
+ :param args: args {type, value}
+ :return: observable data
+ :rtype: ``CommandResults``
+ """
+ type_eiq = args.get("type")
+ value_eiq = args.get("value")
+ if not validate_type(type_eiq, value_eiq):
+ raise ValueError("Type does not match specified value")
+ response = client.lookup_obs(type_eiq, value_eiq)
+ if response.get("data"):
+ data_item = response["data"]
+ else:
+ return CommandResults(readable_output="No observable data found.")
+ standard_observable_outputs = []
+ final_data = []
+ for observable in data_item:
+ maliciousness = observable.get("meta", {}).get("maliciousness")
+ score = maliciousness_to_dbotscore(maliciousness)
+ standard_observable_output = {
+ 'data': observable
+ }
+ if score == 3:
+ standard_observable_output['Malicious'] = {
+ 'Vendor': 'EclecticIQ',
+ 'Description': 'EclecticIQ maliciousness confidence level: ' + maliciousness
+ }
+ standard_observable_outputs.append(standard_observable_output)
+ dbot_output = {
+ 'Type': observable.get("type"),
+ 'indicator': observable.get("type"),
+ 'Created': observable.get('created_at'),
+ 'LastUpdated': observable.get('last_updated_at'),
+ 'ID': observable.get('id'),
+ 'score': score
+ }
+ context = {
+ 'DBotScore': dbot_output
+ } # type: Dict
+ if observable.get("entities"):
+ entity_data = get_entity_data(client, observable)
+ final_data = entity_data
+ human_readable_title = 'EclecticIQ observable reputation - {}'.format(
+ value_eiq)
+ human_readable = tableToMarkdown(human_readable_title, final_data)
+ context['Entity'] = createContext(
+ data=final_data, removeNull=True)
+ context[outputPaths['ip']] = standard_observable_outputs
+ return CommandResults(
+ readable_output=human_readable,
+ outputs_prefix='EclecticIQ',
+ outputs_key_field='value',
+ outputs=context
+ )
+
+
+def EclecticIQ_create_sighting(client: Client, args: Any) -> CommandResults:
+ """create_sighting command: Returns the sighting data
+ :type client: ``Client``
+ :param Client: EclecticIQ client to use
+ :type args: ``Any``
+ :param args: args {value, description, title, tags, type, confidence_level}
+ :return: sighting data
+ :rtype: ``CommandResults``
+ """
+ value = args.get("value")
+ description = args.get("description")
+ title = args.get("title")
+ tags = args.get("tags")
+ type_eiq = args.get("type")
+ confidence_level = args.get("confidence_level")
+ if not validate_type(type_eiq, value):
+ raise ValueError("Type does not match specified value")
+ response = client.sighting(
+ value, description, title, tags, type_eiq, confidence_level)
+ context = {}
+ output = {'value': value,
+ 'description': description,
+ 'title': title,
+ 'tags': tags,
+ 'Type': type_eiq,
+ 'confidence_level': confidence_level}
+ human_readable_title = '!sighting created for- {}'.format(
+ args.get("value"))
+ human_readable = tableToMarkdown(human_readable_title, t=output)
+ context['Data'] = createContext(
+ data=response, removeNull=True)
+ return CommandResults(
+ readable_output=human_readable,
+ outputs_prefix='Sighting',
+ outputs_key_field='value',
+ outputs=context
+ )
+
+
+def EclecticIQ_create_observable(client: Client, args: Any) -> CommandResults:
+ """create_observable command: Returns the observable data
+ :type client: ``Client``
+ :param Client: EclecticIQ client to use
+ :type args: ``Any``
+ :param args: args {type, value}
+ :return: observable data
+ :rtype: ``CommandResults``
+ """
+ type_eiq = args.get("type")
+ value = args.get("value")
+ maliciousness = args.get("maliciousness")
+ if not validate_type(type_eiq, value):
+ raise ValueError("Type does not match specified value")
+ response = client.observable(type_eiq, value, maliciousness)
+ context = {}
+ output = {'type': type_eiq,
+ 'value': value,
+ 'maliciousness': maliciousness
+ }
+ human_readable_title = "Observables created successfully..!!"
+ human_readable = tableToMarkdown(human_readable_title, t=output)
+ context['Data'] = createContext(
+ data=response, removeNull=True)
+ return CommandResults(
+ readable_output=human_readable,
+ outputs_prefix='Observables',
+ outputs_key_field='value',
+ outputs=context
+ )
+
+
+''' MAIN FUNCTION '''
+
+
+def main() -> None:
+ params = demisto.params()
+ api_key = params.get('apikey', {}).get('password')
+ base_url = params.get('url')
+ verify_certificate = not params.get('insecure', False)
+ proxy = params.get('proxy', False)
+ demisto.debug(f'Command being called is {demisto.command()}')
+ try:
+ headers = {
+ 'Authorization': f'Bearer {api_key}'
+ }
+ client = Client(
+ base_url=base_url,
+ verify=verify_certificate,
+ headers=headers,
+ proxy=proxy)
+
+ if demisto.command() == 'test-module':
+ # This is the call made when pressing the integration Test button.
+ return_results(data_ingestion(client))
+
+ elif demisto.command() == 'EclecticIQ_lookup_observables':
+ return_results(EclecticIQ_lookup_observables(client, demisto.args()))
+
+ elif demisto.command() == 'EclecticIQ_create_sighting':
+ return_results(EclecticIQ_create_sighting(client, demisto.args()))
+
+ elif demisto.command() == 'EclecticIQ_create_observable':
+ return_results(EclecticIQ_create_observable(client, demisto.args()))
+
+ else:
+ raise NotImplementedError(f'{demisto.command()} command is not implemented.')
+
+ # Log exceptions and return errors
+ except Exception as e:
+ demisto.error(traceback.format_exc()) # print the traceback
+ return_error(
+ f'Failed to execute {demisto.command()} command.\nError:\n{str(e)}')
+
+
+''' ENTRY POINT '''
+
+if __name__ in ('__main__', '__builtin__', 'builtins'):
+ main()
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2.yml b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2.yml
new file mode 100644
index 000000000000..13c5f259a9b1
--- /dev/null
+++ b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2.yml
@@ -0,0 +1,176 @@
+commonfields:
+ id: EclecticIQ Platform v2
+ version: -1
+name: EclecticIQ Platform v2
+display: EclecticIQ Platform v2
+category: Data Enrichment & Threat Intelligence
+description: Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships.
+configuration:
+- display: Server URL (e.g. https://ic-playground.eclecticiq.com/api/v1)
+ name: url
+ defaultvalue: "https://ic-playground.eclecticiq.com/api/v1"
+ type: 0
+ required: true
+- display: API Key
+ displaypassword: API Key
+ name: apikey
+ type: 9
+ required: true
+ hiddenusername: true
+- display: Use system proxy settings
+ name: proxy
+ type: 8
+ required: false
+ defaultvalue: "false"
+script:
+ script: ''
+ type: python
+ subtype: python3
+ commands:
+ - name: EclecticIQ_lookup_observables
+ arguments:
+ - name: type
+ required: true
+ description: 'Type of the value to lookup observables from '
+ auto: PREDEFINED
+ predefined:
+ - ipv4
+ - ipv6
+ - domain
+ - uri
+ - email
+ - hash-md5
+ - hash-sha256
+ - hash-sha1
+ - hash-sha512
+ type: textArea
+ - name: value
+ required: true
+ default: true
+ description: Value to search the related observables from EclecticIQ Intelligence Center Platform
+ type: textArea
+ outputs:
+ - contextPath: EclecticIQ.Observables.type
+ description: EclecticIQ Observables type
+ type: string
+ - contextPath: EclecticIQ.Entity.confidence
+ description: EclecticIQ Entity confidence
+ type: string
+ - contextPath: EclecticIQ.Entity.observables
+ description: EclecticIQ Entity related observables
+ type: string
+ - contextPath: EclecticIQ.Entity.threat_start_time
+ description: EclecticIQ Threat start time
+ type: date
+ - contextPath: EclecticIQ.Entity.title
+ description: EclecticIQ Entity Title
+ type: string
+ description: Lookup observables from EclecticIQ Intelligence Center Platform
+ - name: EclecticIQ_create_sighting
+ arguments:
+ - name: value
+ required: true
+ description: ' value for the sighting'
+ type: textArea
+ - name: description
+ required: true
+ description: description about the sighting
+ type: textArea
+ - name: title
+ required: true
+ description: ' Title for the sighting'
+ type: textArea
+ - name: tags
+ required: true
+ default: true
+ description: ' Tag for the sighting'
+ type: textArea
+ - name: type
+ required: true
+ auto: PREDEFINED
+ predefined:
+ - ipv4
+ - ipv6
+ - domain
+ - uri
+ - email
+ - hash-md5
+ - hash-sha256
+ - hash-sha1
+ - hash-sha512
+ description: type for the sighting
+ type: textArea
+ - name: confidence_level
+ required: true
+ auto: PREDEFINED
+ predefined:
+ - low
+ - medium
+ - high
+ - unknown
+ description: severity level of the sighting
+ type: textArea
+ outputs:
+ - contextPath: Sighting.Data.data.type
+ description: Sighting type
+ type: string
+ - contextPath: Sighting.Data.data.tags
+ description: Sighting Tags
+ type: string
+ - contextPath: Sighting.Data.data.title
+ description: Sighting Title
+ type: string
+ - contextPath: Sighting.Data.data.description
+ description: Sighting Description
+ type: string
+ - contextPath: Sighting.Data.data.timestamp
+ description: Sighting timestamp
+ type: string
+ description: 'create sighting in the EclecticIQ Intelligence Center Platform '
+ - name: EclecticIQ_create_observable
+ arguments:
+ - name: type
+ required: true
+ description: Type of the observable
+ auto: PREDEFINED
+ predefined:
+ - ipv4
+ - ipv6
+ - domain
+ - uri
+ - email
+ - hash-md5
+ - hash-sha1
+ - hash-sha256
+ - hash-sha512
+ type: textArea
+ - name: value
+ required: true
+ default: true
+ description: value of the type of observable
+ - name: maliciousness
+ required: true
+ auto: PREDEFINED
+ predefined:
+ - unknown
+ - safe
+ - low
+ - medium
+ - high
+ description: severity level of the type
+ outputs:
+ - contextPath: Observables.Data.data.type
+ description: Observable Type
+ type: string
+ - contextPath: Observables.Data.data.value
+ description: Observable Value
+ type: string
+ - contextPath: Observables.Data.data.maliciousness
+ description: Observable maliciousness
+ type: string
+ description: 'create observable in the EclecticIQ Intelligence Center Platform '
+ runonce: true
+ dockerimage: demisto/python3:3.10.10.48392
+tests:
+- No test - instance issues
+fromversion: 6.5.0
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_description.md b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_description.md
new file mode 100644
index 000000000000..91afacfd02dc
--- /dev/null
+++ b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_description.md
@@ -0,0 +1,39 @@
+#### Integration Author: EclecticIQ
+## EclecticIQ Platform
+* Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships. EclecticIQ Platform is used through Cortex XSOAR to get the reputation of IOCs and their related entities.
+
+## Obtaining EclecticIQ Platform API Credentials
+Configuring the EclecticIQ integration requires API credentials generated in EclecticIQ Platform. It is recommended that a new role be created with just the permissions required for this integration. You can create a new role for this integration by following these steps in EclecticIQ Platform.
+1. Login into the EclecticIQ Platform using the **username** and **password**
+2. Navigate to **Settings** > **User Management**
+3. Click on the **Create User** button
+4. Provide a **name**, **email**, **group** and **user type**
+5. Assign the roles for the user in the **assigned role** field and click **save** button
+6. Navigate to **API token** and click on **add**
+7. Provide the **description** and click on **generate token**.
+
+## Configure EclecticIQ Platform v2 on Cortex XSOAR
+
+1. Navigate to **Settings** > **Integrations** > **Servers & Services**.
+2. Search for EclecticIQ Platform v2
+3. Click **Add instance** to create and configure a new integration instance.
+
+| **Parameter** | **Description** | **Required** |
+| --- | --- | --- |
+| Name | Unique name for this EclecticIQ instance | True |
+| URL | Base URL for EclecticIQ API | True |
+| API Key | API token for authentication | True |
+
+4. Click **Test** to validate the URLs, token, and connection.
+
+### Commands
+* Execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook.
+After you successfully execute a command, a DBot message appears in the War Room with the command details.
+
+1. EclecticIQ_create_observable: create observable in the EclecticIQ Intelligence Center Platform
+2. EclecticIQ_create_sighting: create sighting in the EclecticIQ Intelligence Center Platform
+3. EclecticIQ_lookup_observables: lookup observables from EclecticIQ Intelligence Center Platform
+
+
+
+
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_image.png b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_image.png
new file mode 100644
index 000000000000..ef0330c41408
Binary files /dev/null and b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_image.png differ
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_test.py b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_test.py
new file mode 100644
index 000000000000..3f5a2b7a6c17
--- /dev/null
+++ b/Packs/EclecticIQ/Integrations/EclecticIQv2/EclecticIQv2_test.py
@@ -0,0 +1,1118 @@
+import pytest
+import demistomock as demisto
+from EclecticIQv2 import (
+ Client,
+ EclecticIQ_lookup_observables,
+ EclecticIQ_create_sighting,
+ EclecticIQ_create_observable,
+ get_platform_permission_ids,
+ authenticate_user,
+ get_permission_name_from_id,
+ maliciousness_to_dbotscore,
+ prepare_observable_data,
+ prepare_entity_data,
+ validate_type,
+ get_entity_data,
+ data_ingestion,
+ main
+)
+api_key = "test_api_key"
+proxy = "False"
+Base_url = "https://example.com"
+verify = "False"
+# Mock function for get_user_granted_permissions
+
+
+def get_user_granted_permissions_mock_response(*args, **kwargs):
+ return_value = {'data': {'permissions': 'https://example//permissions/1'}}
+ return return_value
+
+
+# Test cases for get_user_granted_permissions
+
+def test_get_user_granted_permissions(mocker):
+ """Test for get_user_granted_permissions."""
+ mocker.patch("EclecticIQv2.Client._http_request", get_user_granted_permissions_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ response = client.get_user_granted_permissions()
+ assert isinstance(response, str)
+
+# Mock function for get user granted permissions scenario
+
+
+def permissions_mock_response(*args, **kwargs):
+ return_value = {'id': 1}
+ return return_value
+
+# Test cases for get user granted permissions scenario
+
+
+def test_permissions_scenario(mocker):
+ """Test for get_user_granted_permissions."""
+ mocker.patch("EclecticIQv2.Client._http_request", permissions_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ response = client.get_user_granted_permissions()
+ assert isinstance(response, dict)
+
+
+# Mock function for get_user_granted_permissions
+
+
+def get_platform_permissions_mock_response(*args, **kwargs):
+ return_value = {'data': {'id': 1, 'name': 'read history-events'}}
+ return return_value
+
+
+# Test cases for get_platform_permissions
+
+def test_get_platform_permissions(mocker):
+ """Test for get_platform_permissions."""
+ mocker.patch("EclecticIQv2.Client._http_request", get_platform_permissions_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ response = client.get_platform_permissions()
+ assert isinstance(response, dict)
+ assert response == {'id': 1, 'name': 'read history-events'}
+# Mock function for platform permissions
+
+
+def platform_permissions_mock_response(*args, **kwargs):
+ return_value = {'id': 1}
+ return return_value
+# Test cases for platform permission
+
+
+def test_permissions(mocker):
+ """Test for get_platform_permissions."""
+ mocker.patch("EclecticIQv2.Client._http_request", permissions_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ response = client.get_platform_permissions()
+ assert isinstance(response, dict)
+# Mock function for get_observable_by_id
+
+
+def get_observable_by_id_mock_response(*args, **kwargs):
+ return_value = {
+ "data": {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "unknown"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ }
+ return return_value
+
+
+# Test cases for get_observable_by_id
+
+def test_get_observable_by_id(mocker):
+ """Test for get_observable_by_id."""
+ mocker.patch(
+ "EclecticIQv2.Client._http_request",
+ get_observable_by_id_mock_response
+ )
+ client = Client(Base_url, api_key, proxy)
+ response = client.get_observable_by_id(id=7938475)
+ assert isinstance(response, dict)
+
+# Mock function for observable
+
+
+def observable_mock_response(*args, **kwargs):
+ return_value = {
+ "count": 1,
+ "data": [
+ {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "safe"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ ],
+ "limit": 100,
+ "offset": 0,
+ "total_count": 1
+ }
+ return return_value
+
+
+# Test cases for observable
+
+def test_observable(mocker):
+ """Test for observable."""
+ mocker.patch(
+ "EclecticIQv2.Client._http_request",
+ observable_mock_response
+ )
+ client = Client(Base_url, api_key, proxy)
+ response = client.observable(type_eiq="ipv4", value="001.001.001.001", maliciousness="safe")
+ assert isinstance(response, dict)
+ assert response['count'] == 1
+ assert response['offset'] == 0
+
+
+# Mock function for observable
+
+
+def lookup_obs_mock_response(*args, **kwargs):
+ return_value = {
+ "count": 1,
+ "data": [
+ {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "safe"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ ],
+ "limit": 100,
+ "offset": 0,
+ "total_count": 1
+ }
+ return return_value
+
+
+# Test cases for lookup_obs
+
+def test_lookup_obs(mocker):
+ """Test for lookup_obs."""
+ mocker.patch(
+ "EclecticIQv2.Client._http_request", lookup_obs_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ response = client.lookup_obs(type_eiq="ipv4", value="001.001.001.001")
+ assert isinstance(response, dict)
+ assert response['limit'] == 100
+ assert response['count'] == 1
+
+
+# Mock function forsighting
+
+
+def sighting_mock_response(*args, **kwargs):
+ return_value = {
+ "data": {
+ "data": {
+ "confidence": "medium",
+ "description": "test_desc",
+ "type": " EclecticIQ-sighting",
+ "timestamp": "2022-03-10T05:37:42Z",
+ "title": "title1",
+ "security_control": {
+ "type": "information-source",
+ "identity": {
+ "name": " EclecticIQ Platform App for cortex XSOAR",
+ "type": "identity"
+ },
+ "time": {
+ "type": "time",
+ "start_time": "2022-03-10T05:37:42Z",
+ "start_time_precision": "second"
+ }
+ }
+ },
+ "meta": {"tags": ["XSOAR Alert"], "ingest_time": "2022-03-10T05:37:42Z"}
+ }
+ }
+ return return_value
+
+
+# Test cases for sighting
+
+def test_sighting(mocker):
+ """Test for sighting."""
+ mocker.patch(
+ "EclecticIQv2.Client._http_request",
+ sighting_mock_response
+ )
+ client = Client(Base_url, api_key, proxy)
+ response = client.sighting(value="001.001.001.001", description="test_desc", title="title1",
+ tags="XSOAR Alert", type_eiq="ipv4", confidence_level="medium")
+ assert isinstance(response, dict)
+ # print(response)
+ assert response['data']['data']['confidence'] == 'medium'
+ assert response['data']['data']['description'] == 'test_desc'
+ assert response['data']['data']['type'] == ' EclecticIQ-sighting'
+ assert response["data"]["meta"]["tags"] == ['XSOAR Alert']
+ assert response["data"]["data"]["security_control"]["type"] == 'information-source'
+ assert response["data"]["data"]["timestamp"] == '2022-03-10T05:37:42Z'
+# Mock function for fetch_entity
+
+
+def fetch_entity_mock_response(*args, **kwargs):
+ return_value = {
+ "data": {
+ "attachments": [],
+ "created_at": "2022-11-08T04:22:45.250875+00:00",
+ "data": {
+ "confidence": "medium",
+ "description": "test_desc",
+ "id": "{https://example.com} EclecticIQ-sighting-fe5e61a4-5f1c-11ed-8eb2-067b5e23fb5e",
+ "timestamp": "2022-03-10T05:37:42+00:00",
+ "title": "title1"
+ },
+ "datasets": [],
+ "id": "2a06537f-8a3b-4228-96d8-afd7ceefd38a",
+ "incoming_feed": "null",
+ "last_updated_at": "2022-11-08T04:22:44.924888+00:00",
+ "meta": {
+ "attacks": [],
+ "estimated_observed_time": "2022-11-08T04:22:45.250875+00:00",
+ "estimated_threat_end_time": "null",
+ "estimated_threat_start_time": "2022-03-10T05:37:42+00:00",
+ "half_life": 182,
+ "source_reliability": "A",
+ "tags": [
+ "XSOAR Alert"
+ ],
+ "taxonomies": [],
+ "tlp_color": "null"
+ },
+ "observables": {
+ "data": {
+ "maliciousness": "medium",
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }},
+ "outgoing_feeds": [],
+ "relevancy": 0.39634678110477484,
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": " EclecticIQ-sighting"
+ }
+ }
+ return return_value
+
+
+# Test cases for fetch_entity
+
+def test_fetch_entity(mocker):
+ """Test for fetch_entity."""
+ mocker.patch(
+ "EclecticIQv2.Client._http_request",
+ fetch_entity_mock_response
+ )
+ client = Client(Base_url, api_key, proxy)
+ response = client.fetch_entity(id="2a06537f-8a3b-4228-96d8-afd7ceefd38a")
+ assert isinstance(response, dict)
+ assert response['data']['data']['confidence'] == 'medium'
+ assert response['data']['data']['title'] == 'title1'
+ assert response['data']['data']['timestamp'] == "2022-03-10T05:37:42+00:00"
+
+
+# Mock function for get_platform_permission_ids
+
+
+def get_platform_permission_ids_mock_response(*args, **kwargs):
+ return_value = [33, 59, 66, 78]
+ return return_value
+
+
+# Test cases for get_platform_permission_ids
+
+def test_get_platform_permission_ids(mocker):
+ """Test for get_platform_permission_ids."""
+ mocker.patch(
+ "EclecticIQv2.get_platform_permission_ids",
+ get_platform_permission_ids_mock_response
+ )
+ response = get_platform_permission_ids(permissions_data=[{'id': 33, 'name': 'modify entities'}, {
+ 'id': 66, 'name': 'read entities'}, {
+ 'id': 59, 'name': 'read outgoing-feeds'}, {'id': 78, 'name': 'read extracts'}])
+ assert isinstance(response, list)
+ assert response[0] == 33
+ assert response[-1] == 78
+
+
+# Mock function for authenticate_user_positive_response
+
+
+def authenticate_user_mock_positive_response(*args, **kwargs):
+ return_value = (False, ['6', '9', ' ', '8', '5', ',', '7'])
+ return return_value
+
+
+# Test cases for authenticate_user_positive_response
+
+def test_authenticate_user_positive_response(mocker):
+ """Test for authenticate_user."""
+ mocker.patch("EclecticIQv2.authenticate_user", authenticate_user_mock_positive_response)
+ response = authenticate_user(ids_of_user="[33]", ids_required_for_user="[33, 59, 66, 78]")
+ assert isinstance(response, tuple)
+# Mock function for authenticate_user_positive_response
+
+
+def authenticate_user_mock_negative_response(*args, **kwargs):
+ return_value = (True, [])
+ return return_value
+
+
+# Test cases for authenticate_user_negative_response
+def test_authenticate_user_negative_response(mocker):
+ """Test for authenticate_user."""
+ mocker.patch("EclecticIQv2.authenticate_user", authenticate_user_mock_negative_response)
+ response = authenticate_user(ids_of_user="[90]", ids_required_for_user="[9]")
+ assert isinstance(response, tuple)
+
+# Mock function for get_permission_name_from_id
+
+
+def get_permission_name_from_id_mock_response(*args, **kwargs):
+ return_value = ['modify entities', 'read entities', 'read outgoing-feeds', 'read extracts']
+ return return_value
+
+
+# Test cases for get_permission_name_from_id
+
+def test_get_permission_name_from_id(mocker):
+ """Test for get_permission_name_from_id."""
+ mocker.patch(
+ "EclecticIQv2.get_permission_name_from_id",
+ get_permission_name_from_id_mock_response
+ )
+ response = get_permission_name_from_id(permission_data=({'id': 33, 'name': 'modify entities'}, {
+ 'id': 66, 'name': 'read entities'}, {
+ 'id': 59, 'name': 'read outgoing-feeds'}, {'id': 78, 'name': 'read extracts'}), permission_ids=[33, 59, 66, 78])
+ assert isinstance(response, list)
+ assert len(response) == 4
+
+
+# Mock function for maliciousness_to_dbotscore
+
+
+def maliciousness_to_dbotscore_mock_response(*args, **kwargs):
+ return_value = 3
+ return return_value
+
+
+# Test cases for maliciousness_to_dbotscore
+
+def test_maliciousness_to_dbotscore(mocker):
+ """Test for maliciousness_to_dbotscore."""
+ mocker.patch(
+ "EclecticIQv2.maliciousness_to_dbotscore",
+ maliciousness_to_dbotscore_mock_response
+ )
+ response = maliciousness_to_dbotscore(maliciousness="high")
+ assert isinstance(response, int)
+ assert response == 3
+
+# Mock function for prepare_observable_data
+
+
+def prepare_observable_data_mock_response(*args, **kwargs):
+ return_value = {'new_data': {'type': 'ipv4', 'value': '001.001.001.001', 'classification': 'safe'}}
+ return return_value
+
+
+# Test cases for prepare_observable_data
+
+def test_prepare_observable_data(mocker):
+ """Test for prepare_observable_data."""
+ mocker.patch(
+ "EclecticIQv2.prepare_observable_data",
+ prepare_observable_data_mock_response
+ )
+ response = prepare_observable_data(data={
+ "data":
+ {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "safe"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ })
+ assert isinstance(response, dict)
+
+
+# Mock function for prepare_entity_data
+
+
+def prepare_entity_data_mock_response(*args, **kwargs):
+ return_value = {"new_data": {
+ 'title': 'title1',
+ 'description': 'testdesc',
+ 'confidence': 'medium',
+ 'tags': 'Alerts',
+ 'threat_start_time': '2022-03-10T05:37:42Z',
+ 'source_name': 'information-technology',
+ 'observables': {
+ "created_at": "2022-08-24T10:20:09.083527+00:00",
+ "entities": [
+ "https://example//entities/7fec8fc8-a174-4bb8-acc9-3b4e02b95a99"],
+ "id": 7938476,
+ "last_updated_at": "2022-08-24T10:20:08.996741+00:00",
+ "meta": {
+ "maliciousness": "safe"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"],
+ "type": "ipv4",
+ "value": "001.001.001.001"}}}
+ return return_value
+
+
+# Test cases for prepare_entity_data
+
+def test_prepare_entity_data(mocker):
+ """Test for prepare_entity_data."""
+ mocker.patch("EclecticIQv2.prepare_entity_data", prepare_entity_data_mock_response)
+ response = prepare_entity_data(data={
+ "data": {
+ "confidence": "medium",
+ "description": " EclecticIQ",
+ "title": "testcase",
+ "tags": "XSOAR Alert",
+ "producer": {
+ "identity": "information-technology"}},
+ "meta": {
+ "estimated_threat_start_time": "2022-03-10T05:37:42+00:00",
+ "source_reliability": "A",
+ "tlp_color": "null"
+ },
+ "observables": [],
+ "outgoing_feeds": [],
+ "relevancy": 0.39634678110477484}, obs_data={
+ "created_at": "2022-11-09T04:25:49.960811+00:00",
+ "entities": [
+ "https://example//entities/2fa938f2-d1a5-4033-8b3c-8261794c8242"
+ ],
+ "data": {
+ "id": 8936495,
+ "last_updated_at": "2022-11-09T04:25:49.800562+00:00",
+ "meta": {
+ "maliciousness": "medium"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ]},
+ "observables": {
+ "data": {
+ "maliciousness": "medium",
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }}})
+ assert isinstance(response, dict)
+
+# Test cases for prepare_entity_data_scenario
+
+
+def test_prepare_entity_data_scenario(mocker):
+ """Test for prepare_entity_data."""
+ mocker.patch("EclecticIQv2.prepare_entity_data", prepare_entity_data_mock_response)
+ response = prepare_entity_data(data={
+ "data": {
+ "severity": "medium"},
+ "meta": {
+ "source_reliability": "A",
+ "tlp_color": "null"
+ },
+ "observables": [],
+ "outgoing_feeds": [],
+ "relevancy": 0.39634678110477484}, obs_data={
+ "created_at": "2022-11-09T04:25:49.960811+00:00",
+ "entities": [
+ "https://example//entities/2fa938f2-d1a5-4033-8b3c-8261794c8242"
+ ],
+ "data": {
+ "id": 8936495,
+ "last_updated_at": "2022-11-09T04:25:49.800562+00:00",
+ "meta": {
+ "maliciousness": "medium"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ]},
+ "observables": {
+ "data": {
+ "maliciousness": "medium",
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }}})
+ assert isinstance(response, dict)
+# Mock function for validate_type
+
+
+def validate_type_mock_response(*args, **kwargs):
+ return_value = True
+ return return_value
+
+
+# Test cases for validate_type
+
+def test_validate_type(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="hash-sha512", value="3b7fc7cc370707c1df045c35342f3d64ea7076abd84f8a8c046a7cca2b85901|\
+ 689f3cf4bdc1f5fc232a60456cb9d2f48702bf8f8f1064f9bcc7d70edad9f860e")
+ assert isinstance(response, bool)
+# Test cases for validate_type scenario-1
+
+
+def test_validate_scenario_1(mocker):
+ """Test for validate_type."""
+ mocker.patch(
+ "EclecticIQv2.validate_type",
+ validate_type_mock_response
+ )
+ response = validate_type(
+ s_type="hash-sha1",
+ value="2aae6c35c94fcfb415dbe95f408b9ce91ee846ed")
+ assert isinstance(response, bool)
+# Test case for validate_type scenario-2
+
+
+def test_validate_scenario_2(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="hash-sha256", value="ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
+ assert isinstance(response, bool)
+# Test case for validate_type scenario-3
+
+
+def test_validate_scenario_3(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="hash-md5", value="e5dadf6524624f79c3127e247f04b541")
+ assert isinstance(response, bool)
+# Test case for validate_type scenario -4
+
+
+def test_validate_scenario_4(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="domain", value="abcd1.com")
+ assert isinstance(response, bool)
+# Test case for validate_type scenario -5
+
+
+def test_validate_scenario_5(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="uri", value="https://examples.com")
+ assert isinstance(response, bool)
+# Test case for validate_type scenario -6
+
+
+def test_validate_scenario_6(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="email", value="example@example.com")
+ assert isinstance(response, bool)
+# Test case for validate_type scenario -7
+
+
+def test_validate_scenario_7(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_type_mock_response)
+ response = validate_type(s_type="ipv6", value=" 2001:0db8:85a3:0000:0000:8a2e:0370:7334")
+ assert isinstance(response, bool)
+# mock response for validation function
+
+
+def validate_mock_response(*args, **kwargs):
+ return_value = False
+ return return_value
+# Test case for validate_type scenario -8
+
+
+def test_validate_scenario_8(mocker):
+ """Test for validate_type."""
+ mocker.patch("EclecticIQv2.validate_type", validate_mock_response)
+ response = validate_type(s_type="file", value="2001:0000:0000:FEFB")
+ assert isinstance(response, bool)
+
+
+# # Test case for data_ingestion
+def test_data_ingestion(mocker):
+ """Test case for data_ingestion"""
+ mocker.patch("EclecticIQv2.Client.get_user_granted_permissions", user_permissions_mock_response)
+ mocker.patch("EclecticIQv2.Client.get_platform_permissions", get_platform_permissions_mock_response)
+ mocker.patch("EclecticIQv2.get_platform_permission_ids", get_platform_permission_ids_mock_response)
+ mocker.patch("EclecticIQv2.authenticate_user", authenticate_user_mock_positive_response)
+ mocker.patch("EclecticIQv2.get_permission_name_from_id", get_permission_name_from_id_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ result = data_ingestion(client)
+ assert isinstance(result, str)
+# mock response for user pemissions
+
+
+def user_permissions_mock_response(*args, **kwargs):
+ return_value = ['https://example//permissions/1',
+ 'https://example//permissions/2',
+ 'https://example//permissions/3']
+ return return_value
+# Test case for data ingestion scenario
+
+
+def test_data_ingestion_scenario(mocker):
+ """Test case for data_ingestion"""
+ mocker.patch("EclecticIQv2.Client.get_user_granted_permissions", user_permissions_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ with pytest.raises(Exception)as e_info:
+ data_ingestion(client)
+ assert e_info == "API Key does not have access to view permissions."
+# Mock function for platform permissions
+
+
+def platform_mock_response(*args, **kwargs):
+ return_value = ['https://example//permissions/1',
+ 'https://example//permissions/2']
+ return return_value
+# Test cases for data ingestion scenario-1
+
+
+def test_data_ingestion_scenario_1(mocker):
+ """Test case for data_ingestion"""
+ mocker.patch("EclecticIQv2.Client.get_user_granted_permissions", user_permissions_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ result = data_ingestion(client)
+ assert isinstance(result, str)
+# Mock function for get_entity_data
+
+
+def get_entity_mock_response(*args, **kwargs):
+ return_value = {
+ "data": {
+ "attachments": [],
+ "created_at": "2022-11-04T05:13:40.120477+00:00",
+ "data": {
+ "confidence": "medium",
+ "description": "sighting",
+ "id": "{https://example.com} EclecticIQ-sighting-71b48da2-5bff-11ed-ac3f-067b5e23fb5e",
+ "timestamp": "2022-11-04T05:13:39+00:00",
+ "title": "EIQ"
+ },
+ "datasets": [],
+ "id": "13b9d24c-4c38-4c41-9de8-8c2a78b4850b",
+ "incoming_feed": "null",
+ "last_updated_at": "2022-11-04T05:13:40.064917+00:00",
+ "meta": {
+ "attacks": [],
+ "estimated_observed_time": "2022-11-04T05:13:40.120477+00:00",
+ "estimated_threat_end_time": "null",
+ "estimated_threat_start_time": "2022-11-04T05:13:39+00:00",
+ "half_life": 182,
+ "source_reliability": "A",
+ "tags": [
+ "alerts"
+ ],
+ "taxonomies": [],
+ "tlp_color": "null"
+ },
+ "observables": [
+ "https://example//observables/8625571"
+ ],
+ "outgoing_feeds": [],
+ "relevancy": 0.9774081009139535,
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": " EclecticIQ-sighting"
+ }
+ }
+ return return_value
+# # Test cases for get_entity_data
+
+
+def test_get_entity_data(mocker):
+ """Test for get_entity_data."""
+ mocker.patch("EclecticIQv2.Client.fetch_entity", fetch_entity_mock_response)
+ mocker.patch("EclecticIQv2.Client.get_observable_by_id", get_observable_by_id_mock_response)
+ mocker.patch("EclecticIQv2.prepare_observable_data", prepare_observable_data_mock_response)
+ mocker.patch("EclecticIQv2.prepare_entity_data", prepare_entity_data_mock_response)
+ client = Client("https://example/", api_key, proxy)
+ response = get_entity_data(client, data_item={
+ "created_at": "2022-11-09T04:25:49.960811+00:00",
+ "entities": [
+ "https://example//entities/2fa938f2-d1a5-4033-8b3c-8261794c8242"
+ ],
+ "data": {
+ "id": 8936495,
+ "last_updated_at": "2022-11-09T04:25:49.800562+00:00",
+ "meta": {
+ "maliciousness": "medium"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ]},
+ "observables": {
+ "data": {
+ "maliciousness": "medium",
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }}})
+ assert isinstance(response, list)
+
+# Test cases for lookup observables
+
+
+def test_EclecticIQ_lookup_observables(mocker):
+ """Test for lookup observables function."""
+ mocker.patch("EclecticIQv2.Client.lookup_obs", lookup_obs_mock_response)
+ mocker.patch("EclecticIQv2.Client.fetch_entity", fetch_entity_mock_response)
+ mocker.patch("EclecticIQv2.get_entity_data", get_entity_mock_response)
+ mocker.patch("EclecticIQv2.maliciousness_to_dbotscore", maliciousness_to_dbotscore_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "001.001.001.001"}
+ result = EclecticIQ_lookup_observables(client, args)
+ assert result.outputs_prefix == 'EclecticIQ'
+ assert result.outputs_key_field == 'value'
+
+
+# Test cases for lookup observables scenario
+
+
+def test_EclecticIQ_lookup_observables_scenario(mocker):
+ """Test for lookup observables function."""
+ mocker.patch("EclecticIQv2.Client.lookup_obs", lookup_obs_mock_response)
+ mocker.patch("EclecticIQv2.Client.fetch_entity", fetch_entity_mock_response)
+ mocker.patch("EclecticIQv2.maliciousness_to_dbotscore", maliciousness_to_dbotscore_mock_response)
+ mocker.patch("EclecticIQv2.get_entity_data", get_entity_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "24.161"}
+ with pytest.raises(ValueError) as e_info:
+ EclecticIQ_lookup_observables(client, args)
+ assert e_info == "Type does not match specified value"
+
+# mock response for lookup_observables
+
+
+def EclecticIQ_lookup_observables_scenario_mock_response(*args, **kwargs):
+ return_value = {"count": 0, "data": [], "limit": 100, "offset": 0, "total_count": 0}
+ return return_value
+# Test cases for lookup observables scenario-1
+
+
+def test_EclecticIQ_lookup_observables_scenario_1(mocker):
+ """Test for EclecticIQ lookup observables function."""
+ mocker.patch("EclecticIQv2.Client.lookup_obs", EclecticIQ_lookup_observables_scenario_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "001.001.001.001"}
+ result = EclecticIQ_lookup_observables(client, args)
+ assert result.readable_output == "No observable data found."
+# Test cases for create sighting
+
+
+def test_EclecticIQ_create_sighting(mocker):
+ """Test for EclecticIQ create sighting function."""
+ mocker.patch("EclecticIQv2.Client.sighting", sighting_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "001.001.001.001", "title": "EIQ", "tags": "cortex alert",
+ "description": "sighting", "confidence_level": "medium"}
+ result = EclecticIQ_create_sighting(client, args)
+ assert result.outputs_prefix == 'Sighting'
+ assert result.outputs_key_field == 'value'
+
+# Test cases for create sighting scenario
+
+
+def test_EclecticIQ_create_sighting_scenario(mocker):
+ """Test for EclecticIQ create sighting function."""
+ mocker.patch("EclecticIQv2.Client.sighting", sighting_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "1124.161", "title": "EIQ", "tags": "cortex alert",
+ "description": "sighting", "confidence_level": "medium"}
+ with pytest.raises(ValueError) as e_info:
+ EclecticIQ_create_sighting(client, args)
+ assert e_info == "Type does not match specified value"
+
+
+# Test cases for lookup observables
+
+
+def test_EclecticIQ_create_observable(mocker):
+ """Test for create observable function."""
+ mocker.patch("EclecticIQv2.Client.observable", observable_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "001.001.001.001", "maliciousness": "safe"}
+ result = EclecticIQ_create_observable(client, args)
+ assert result.outputs_prefix == 'Observables'
+ assert result.outputs_key_field == 'value'
+
+# Test cases for create observable scenario
+
+
+def test_EclecticIQ_create_observable_scenario(mocker):
+ """Test for create observable function."""
+ mocker.patch("EclecticIQv2.Client.observable", observable_mock_response)
+ client = Client(Base_url, api_key, proxy)
+ args = {"type": "ipv4", "value": "2175.161", "maliciousness": "safe"}
+ with pytest.raises(ValueError) as e_info:
+ EclecticIQ_create_observable(client, args)
+ assert e_info == "Type does not match specified value"
+# Test cases for main function
+
+
+def test_main(mocker):
+ """Test case for main function"""
+ mocker.patch.object(
+ demisto, 'params', return_value={
+ 'url': Base_url,
+ 'apikey': {'password': api_key},
+ }
+ )
+ mocker.patch('EclecticIQv2.EclecticIQ_lookup_observables', return_value={'name': 'test'})
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_sighting')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_observable')
+ mocker.patch.object(
+ demisto, 'command',
+ return_value='test-module'
+ )
+ mocker.patch.object(demisto, 'results')
+ main()
+ assert demisto.results.call_count == 1
+# # Test cases for main scenario
+
+
+def test_main_scenario(mocker):
+ """Test case for main function"""
+ mocker.patch.object(
+ demisto, 'params', return_value={
+ 'url': Base_url,
+ 'apikey': {'password': api_key},
+ 'verify_certificate': verify,
+ 'proxy': proxy
+ }
+ )
+ mocker.patch('EclecticIQv2.data_ingestion', return_value="ok")
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_sighting')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_observable')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_lookup_observables')
+ mocker.patch('EclecticIQv2.Client.lookup_obs', return_value={
+ "count": 1,
+ "data": [
+ {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "safe"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ ],
+ "limit": 100,
+ "offset": 0,
+ "total_count": 1
+ }, autospec=True)
+ mocker.patch("EclecticIQv2.Client.fetch_entity", return_value={
+ "data": {
+ "attachments": [],
+ "created_at": "2022-11-08T04:22:45.250875+00:00",
+ "data": {
+ "confidence": "medium",
+ "description": "test_desc",
+ "id": "{https://example.com} EclecticIQv2 -sighting-fe5e61a4-5f1c-11ed-8eb2-067b5e23fb5e",
+ "timestamp": "2022-03-10T05:37:42+00:00",
+ "title": "title1"
+ },
+ "datasets": [],
+ "id": "2a06537f-8a3b-4228-96d8-afd7ceefd38a",
+ "incoming_feed": "null",
+ "last_updated_at": "2022-11-08T04:22:44.924888+00:00",
+ "meta": {
+ "attacks": [],
+ "estimated_observed_time": "2022-11-08T04:22:45.250875+00:00",
+ "estimated_threat_end_time": "null",
+ "estimated_threat_start_time": "2022-03-10T05:37:42+00:00",
+ "half_life": 182,
+ "source_reliability": "A",
+ "tags": [
+ "XSOAR Alert"
+ ],
+ "taxonomies": [],
+ "tlp_color": "null"
+ },
+ "observables": {
+ "data": {
+ "maliciousness": "medium",
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }},
+ "outgoing_feeds": [],
+ "relevancy": 0.39634678110477484,
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "EclecticIQ-sighting"
+ }
+ })
+ mocker.patch("EclecticIQv2.Client.get_observable_by_id", return_value={
+ "data": {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "unknown"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ })
+ mocker.patch.object(demisto, 'args', return_value={"type": "ipv4", "value": "001.001.001.001"})
+ mocker.patch.object(demisto, 'results')
+ main()
+ assert demisto.results.call_count == 1
+# Test cases for main scenario-1
+
+
+def test_main_scenario_1(mocker):
+ """Test case for main function"""
+ mocker.patch.object(
+ demisto, 'params', return_value={
+ 'url': Base_url,
+ 'apikey': {'password': api_key},
+ 'verify_certificate': verify,
+ 'proxy': proxy
+ }
+ )
+ mocker.patch('EclecticIQv2.data_ingestion', return_value="test")
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_lookup_observables')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_observable')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_sighting')
+ mocker.patch('EclecticIQv2.Client.sighting', return_value={
+ "data": {
+ "data": {
+ "confidence": "medium",
+ "description": "test_desc",
+ "type": "EclecticIQ-sighting",
+ "timestamp": "2022-03-10T05:37:42Z",
+ "title": "title1",
+ "security_control": {
+ "type": "information-source",
+ "identity": {
+ "name": "EclecticIQ Platform App for cortex XSOAR",
+ "type": "identity"
+ },
+ "time": {
+ "type": "time",
+ "start_time": "2022-03-10T05:37:42Z",
+ "start_time_precision": "second"
+ }
+ }
+ },
+ "meta": {"tags": ["XSOAR Alert"], "ingest_time": "2022-03-10T05:37:42Z"}
+ }
+ })
+ mocker.patch.object(demisto, 'args', return_value={"type": "ipv4", "value": "001.001.001.001", "title": "EIQ",
+ "tags": "cortex alert", "description": "sighting",
+ "confidence_level": "medium"})
+ mocker.patch.object(demisto, 'results')
+ main()
+ assert demisto.results.call_count == 1
+# # # Test cases for main scenario-2
+
+
+def test_main_scenario_2(mocker):
+ """Test case for main function"""
+ mocker.patch.object(
+ demisto, 'params', return_value={
+ 'url': Base_url,
+ 'apikey': {'password': api_key},
+ 'verify_certificate': verify,
+ 'proxy': proxy
+ }
+ )
+ mocker.patch('EclecticIQv2.data_ingestion', return_value="test")
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_lookup_observables')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_sighting')
+ mocker.patch.object(demisto, 'command', return_value='EclecticIQ_create_observable')
+ mocker.patch('EclecticIQv2.Client.observable', return_value={
+ "count": 1,
+ "data": [
+ {
+ "created_at": "2022-08-24T10:02:04.609448+00:00",
+ "entities": [
+ "https://example//entities/7fda61ec-852e"
+ ],
+ "id": 7938475,
+ "last_updated_at": "2022-08-24T10:02:04.531505+00:00",
+ "meta": {
+ "maliciousness": "safe"
+ },
+ "sources": [
+ "https://example//sources/9a479225-37d1"
+ ],
+ "type": "ipv4",
+ "value": "001.001.001.001"
+ }
+ ],
+ "limit": 100,
+ "offset": 0,
+ "total_count": 1
+ })
+ mocker.patch.object(demisto, 'args', return_value={"type": "ipv4", "value": "001.001.001.001", "maliciousness": "safe"})
+ mocker.patch.object(demisto, 'results')
+ main()
+ assert demisto.results.call_count == 1
+
+# # Test case for scenario_3
+
+
+def test_main_scenario_3(mocker):
+ """Test cases for main function."""
+ mocker.patch.object(
+ demisto, 'params', return_value={
+ 'url': Base_url,
+ 'apikey': {'password': api_key},
+ 'verify_certificate': verify,
+ 'proxy': proxy
+ }
+ )
+ mocker.patch.object(demisto, 'command', return_value='lookp obserble')
+ mocker.patch.object(demisto, 'error', return_value='Failed to execute command.\nError:\n command is not implemented.')
+ with pytest.raises(SystemExit):
+ main()
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/README.md b/Packs/EclecticIQ/Integrations/EclecticIQv2/README.md
new file mode 100644
index 000000000000..96fe24157580
--- /dev/null
+++ b/Packs/EclecticIQ/Integrations/EclecticIQv2/README.md
@@ -0,0 +1,246 @@
+### EclecticIQ Platform v2
+Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships.
+This integration was integrated and tested with version of EclecticIQ Platform v2
+
+## Configure EclecticIQ Platform v2 on Cortex XSOAR
+
+1. Navigate to **Settings** > **Integrations** > **Servers & Services**.
+2. Search for EclecticIQ Platform v2.
+3. Click **Add instance** to create and configure a new integration instance.
+
+ | **Parameter** | **Required** |
+ | --- | --- |
+ | Server URL (e.g. https://ic-playground.eclecticiq.com/api/v1) | True |
+ | API Key | True |
+ | Use system proxy settings | False |
+
+4. Click **Test** to validate the URLs, token, and connection.
+## Commands
+You can execute these commands from the Cortex XSOAR CLI, as part of an automation, or in a playbook.
+After you successfully execute a command, a DBot message appears in the War Room with the command details.
+### EclecticIQ_lookup_observables
+***
+Lookup observables from EclecticIQ Intelligence Center Platform
+
+
+#### Base Command
+
+`EclecticIQ_lookup_observables`
+#### Input
+
+| **Argument Name** | **Description** | **Required** |
+| --- | --- | --- |
+| type | Type of the value to lookup observables from . Possible values are: ipv4, ipv6, domain, uri, email, hash-md5, hash-sha256, hash-sha1, hash-sha512. | Required |
+| value | Value to search the related observables from EclecticIQ Intelligence Center Platform. | Required |
+
+#### Context Output
+
+| **Path** | **Type** | **Description** |
+| --- | --- | --- |
+| EclecticIQ.Observables.type | string | EclecticIQ Observables type |
+| EclecticIQ.Entity.confidence | string | EclecticIQ Entity confidence |
+| EclecticIQ.Entity.observables | string | EclecticIQ Entity related observables |
+| EclecticIQ.Entity.threat_start_time | date | EclecticIQ Threat start time |
+| EclecticIQ.Entity.title | string | EclecticIQ Entity Title |
+
+#### Command Example
+```!EclecticIQ_lookup_observables type="ipv4" value="001.001.001.001"```
+#### Context Example
+```json
+{
+ "EclecticIQ":{
+ "DBotScore":{
+ "Created":"2022-12-20T12:47:24.531410+00:00",
+ "ID":"9382489",
+ "LastUpdated":"2022-12-20T12:47:24.398456+00:00",
+ "Type":"ipv4",
+ "indicator":"ipv4",
+ "score":3
+ },
+ "Entity":{
+ "confidence":"unknown",
+ "threat_start_time":"2022-12-20T12:47:24.474221+00:00",
+ "title":"sighting",
+ "observables":{
+ "classification":"high",
+ "type":"ipv4",
+ "value":"000.001.001.001",
+ "Malicious":{
+ "Description":"EclectiqIQ maliciousness confidence level: high",
+ "Vendor":"EclectiqIQ"
+ },
+ "data":[
+ {
+ "created_at":"2022-08-24T10:02:04.609448+00:00",
+ "entities":[
+ "https://ic-playground.eclecticiq.com/api/v1/entities/183fa404-ba48-471b-980d-02600fe89a2b"
+ ],
+ "id":7938475,
+ "last_updated_at":"2022-11-23T06:25:55.945630+00:00",
+ "meta":{
+ "maliciousness":"medium"
+ },
+ "sources":[
+ "https://ic-playground.eclecticiq.com/api/v1/sources/9a479225-37d1-4dae-9554-172eeccea193"],
+ "type":"ipv4",
+ "value":"000.001.001.001"
+ }
+ ]
+ }
+ }
+ }
+ }
+```
+##### Human Readable Output
+#### EclecticIQ observable reputation - 001.001.001.001
+|confidence |description| observables| source_name| tags |threat_start_time|title|
+|:-------- |:------- |------|------|---------|--------|------|
+|`low` |creationofsighting| {'type': 'ipv4', 'value': '001.001.001.001, 'classification': 'low'}| | | 2022-08-25T04:50:56+00:00|sighting|
+
+### EclecticIQ_create_sighting
+***
+create sighting in the EclecticIQ Intelligence Center Platform
+
+#### Base Command
+
+`EclecticIQ_create_sighting`
+#### Input
+
+| **Argument Name** | **Description** | **Required** |
+| --- | --- | --- |
+| value | value for the sighting. | Required |
+| description | description about the sighting. | Required |
+| title | Title for the sighting. | Required |
+| tags | Tag for the sighting. | Required |
+| type | type for the sighting. Possible values are: ipv4, ipv6, domain, uri, email, hash-md5, hash-sha256, hash-sha1, hash-sha512. | Required |
+| confidence_level | severity level of the sighting. Possible values are: low, medium, high, unknown. | Required |
+
+
+#### Context Output
+
+| **Path** | **Type** | **Description** |
+| --- | --- | --- |
+| Sighting.Data.data.type | string | Sighting Type |
+| Sighting.Data.data.tags | string | Sighting Tags |
+| Sighting.Data.data.title | string | Sighting Title |
+| Sighting.Data.data.description | string | Sighting Description |
+| Sighting.Data.data.timestamp | string | Sighting timestamp |
+
+#### Command Example
+```!EclecticIQ_create_sighting type="ipv4" value="001.001.001.001" description="sighting creation" title="sighting" tags="Alert" confidence_level="high"```
+
+#### Context Example
+```json
+{
+ "Sighting":{
+ "Data":{
+ "data":{
+ "last_updated_at":"2022-12-28T12:45:05.465825+00:00",
+ "outgoing_feeds":[],
+ "meta":{
+ "estimated_observed_time":"2022-12-28T12:45:05.508090+00:00",
+ "half_life":182,
+ "attacks":[],
+ "estimated_threat_start_time":"2022-12-28T12:45:04+00:00",
+ "taxonomies":[],
+ "estimated_threat_end_time":"null",
+ "source_reliability":"A",
+ "tags":["Alert"],
+ "tlp_color":null
+ },
+ "created_at":"2022-12-28T12:45:05.508090+00:00",
+ "data":{
+ "confidence":"high",
+ "description":"sighting creation",
+ "id":"{https://ic-playground.eclecticiq.com}eclecticiq-sighting-742ad072-86ad-11ed-ad71-067b5e23fb5e",
+ "timestamp":"2022-12-28T12:45:04+00:00",
+ "title":"sighting",
+ "relevancy":1
+ },
+ "observables":[
+ "https://ic-playground.eclecticiq.com/api/v1/observables/9391529"
+ ],
+ "attachments":[],
+ "incoming_feed":null,
+ "sources":[
+ "https://ic-playground.eclecticiq.com/api/v1/sources/9a479225-37d1-4dae-9554-172eeccea193"
+ ],
+ "type":"eclecticiq-sighting",
+ "id":"453d1fb2-d654-4a7a-9654-40556a893640",
+ "datasets":[]
+ }
+ }
+ }
+}
+```
+##### Human Readable Output
+#### !sighting created for- 001.001.001.001
+|confidence |description|
+| :-------- | :------- |
+|`Type` |ipv4 |
+|`confidence_level`| low|
+|`description`| sighting creation|
+|`tags`| Alert|
+|`title`| sighting|
+|`value`| 001.001.001.001|
+
+### EclecticIQ_create_observable
+***
+create observable in the EclecticIQ Intelligence Center Platform
+
+#### Base Command
+
+`EclecticIQ_create_observable`
+#### Input
+
+| **Argument Name** | **Description** | **Required** |
+| --- | --- | --- |
+| type | Type of the observable. Possible values are: ipv4, ipv6, domain, uri, email, hash-md5, hash-sha1, hash-sha256, hash-sha512. | Required |
+| value | value of the type of observable. | Required |
+| maliciousness | severity level of the type. Possible values are: unknown, safe, low, medium, high. | Required |
+
+
+#### Context Output
+
+| **Path** | **Type** | **Description** |
+| --- | --- | --- |
+| Observables.Data.data.type | string | Observable Type |
+| Observables.Data.data.value | string | Observable Value |
+| Observables.Data.data.maliciousness | string | Observable maliciousness |
+
+#### Command Example
+```!EclecticIQ_create_observable type="ipv4" value="001.001.001.001" maliciousness="high"```
+#### Context Example
+```json
+{
+ "Observables":{
+ "Data":{
+ "data":[
+ {
+ "created_at":"2022-12-26T13:16:06.757271+00:00",
+ "entities":[
+ "https://ic-playground.eclecticiq.com/api/v1/entities/3a1cc90b-9cbd-437a-ab0b-7153b1bb275b"
+ ],
+ "id":9389500,
+ "last_updated_at":"2022-12-26T13:16:06.677236+00:00",
+ "meta":{
+ "maliciousness":"low"
+ },
+ "sources":[
+ "https://ic-playground.eclecticiq.com/api/v1/sources/9a479225-37d1-4dae-9554-172eeccea193"
+ ],
+ "type":"ipv4",
+ "value":"001.001.001.001"
+ }
+ ]
+ }
+ }
+}
+```
+##### Human Readable Output
+#### Observables created successfully…!!
+|confidence |description|
+| :-------- | :------- |
+|`maliciousness` |low|
+|`type`| ipv4|
+|`value`| 001.001.001.001|
diff --git a/Packs/EclecticIQ/Integrations/EclecticIQv2/command_examples b/Packs/EclecticIQ/Integrations/EclecticIQv2/command_examples
new file mode 100644
index 000000000000..b9d1d7039904
--- /dev/null
+++ b/Packs/EclecticIQ/Integrations/EclecticIQv2/command_examples
@@ -0,0 +1,8 @@
+!EclecticIQ_create_observable type="ipv4" value="001.001.001.001" maliciousness="high"
+!EclecticIQ_create_sighting type="ipv4" value="001.001.001.001" description="sighting creation" title="sighting" tags="Alert" confidence_level="high"
+!EclecticIQ_lookup_observables type="ipv4" value="001.001.001.001"
+!EclecticIQ_create_observable type="email" value="example@example.com" maliciousness="medium"
+!EclecticIQ_create_sighting type="ipv6" value="2001:0db8:85a3:0000:0000:8a2e:0370:7334" description="sighting creation" title="sighting" tags="Alert" confidence_level="low"
+!EclecticIQ_lookup_observables type="ipv6" value="2001:0db8:85a3:0000:0000:8a2e:0370:7334"
+!EclecticIQ_create_observable type="uri" value="https://examples.com" maliciousness="safe"
+!EclecticIQ_create_sighting type="uri" value="https://examples.com" description="sighting creation" title="sighting" tags="Alert" confidence_level="high"
\ No newline at end of file
diff --git a/Packs/EclecticIQ/README.md b/Packs/EclecticIQ/README.md
index e69de29bb2d1..6cd4cac2cb72 100644
--- a/Packs/EclecticIQ/README.md
+++ b/Packs/EclecticIQ/README.md
@@ -0,0 +1,10 @@
+
+# EclecticIQ Pack
+Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships. EclecticIQ Platform is used through Cortex XSOAR to get the reputation of IOCs and their related entities.
+
+## What does this pack do?
+
+- Provide a functionality to get the lookup observables from the EclecticIQ Platform
+- Provide a functionality to create observables in the EclecticIQ Platform
+- Provide a functionality to create sighting for EclecticIQ data in the EIQ platform
+
diff --git a/Packs/EclecticIQ/ReleaseNotes/2_0_0.md b/Packs/EclecticIQ/ReleaseNotes/2_0_0.md
new file mode 100644
index 000000000000..0923411ae5fb
--- /dev/null
+++ b/Packs/EclecticIQ/ReleaseNotes/2_0_0.md
@@ -0,0 +1,6 @@
+#### Integrations
+##### EclecticIQ Platform v2
+- Added the ***EclecticIQ_lookup_observables*** command to get the observables from the EclecticIQ Intelligence Center Platform.
+- Added the ***EclecticIQ_create_sighting*** command to create sighting for the EIQ data in the EclecticIQ Intelligence Center Platform.
+- Added the ***EclecticIQ_create_observables*** command to create observables for the EIQ data in the EclecticIQ Intelligence Center Platform.
+- Note: Adpoting the package as part of Cortex XSOAR Adopt-a-Pack program.
diff --git a/Packs/EclecticIQ/ReleaseNotes/2_0_1.md b/Packs/EclecticIQ/ReleaseNotes/2_0_1.md
new file mode 100644
index 000000000000..d51ed11165ce
--- /dev/null
+++ b/Packs/EclecticIQ/ReleaseNotes/2_0_1.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### EclecticIQ Platform (Deprecated)
+Deprecated. No available replacement.
diff --git a/Packs/EclecticIQ/ReleaseNotes/2_0_2.md b/Packs/EclecticIQ/ReleaseNotes/2_0_2.md
new file mode 100644
index 000000000000..154736d6b10e
--- /dev/null
+++ b/Packs/EclecticIQ/ReleaseNotes/2_0_2.md
@@ -0,0 +1,4 @@
+#### Integrations
+##### EclecticIQ Platform v2
+- Updated integration parameter.
+- Updated the Docker image to: *demisto/python3:3.10.10.47713*.
diff --git a/Packs/EclecticIQ/ReleaseNotes/2_0_3.md b/Packs/EclecticIQ/ReleaseNotes/2_0_3.md
new file mode 100644
index 000000000000..ba866100e0ab
--- /dev/null
+++ b/Packs/EclecticIQ/ReleaseNotes/2_0_3.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### EclecticIQ Platform v2
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
diff --git a/Packs/EclecticIQ/TestPlaybooks/playbook-EclecticIQTestv2.yml b/Packs/EclecticIQ/TestPlaybooks/playbook-EclecticIQTestv2.yml
new file mode 100644
index 000000000000..2391817ff240
--- /dev/null
+++ b/Packs/EclecticIQ/TestPlaybooks/playbook-EclecticIQTestv2.yml
@@ -0,0 +1,130 @@
+id: 716af962-8b78-4e09-864d-ded6f471342b
+version: 22
+vcShouldKeepItemLegacyProdMachine: false
+name: test
+starttaskid: "0"
+tasks:
+ "0":
+ id: "0"
+ taskid: 469b1f2a-d699-4cc0-8924-2eef1bcdbcae
+ type: start
+ task:
+ id: 469b1f2a-d699-4cc0-8924-2eef1bcdbcae
+ version: -1
+ name: ""
+ iscommand: false
+ brand: ""
+ nexttasks:
+ '#none#':
+ - "1"
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 440,
+ "y": 20
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "1":
+ id: "1"
+ taskid: 984b41c5-91e8-4f09-8372-5bb0c54a4a56
+ type: regular
+ task:
+ id: 984b41c5-91e8-4f09-8372-5bb0c54a4a56
+ version: -1
+ name: EclecticIQ_lookup_observables
+ description: Lookup observables from EclecticIQ Intelligence Center Platform
+ script: EclecticIQ Platform v2|||EclecticIQ_lookup_observables
+ type: regular
+ iscommand: true
+ brand: EclecticIQ
+ nexttasks:
+ '#none#':
+ - "2"
+ scriptarguments:
+ type:
+ simple: ipv4
+ value:
+ simple: ${incident.destinationip}
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 440,
+ "y": 210
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "2":
+ id: "2"
+ taskid: aa235d59-396d-41ee-8697-a0826ce8c0a9
+ type: regular
+ task:
+ id: aa235d59-396d-41ee-8697-a0826ce8c0a9
+ version: -1
+ name: EclecticIQ_create sighting
+ description: 'create sighting in the EclecticIQ Intelligence Center Platform '
+ script: EclecticIQ Platform v2|||EclecticIQ_create_sighting
+ type: regular
+ iscommand: true
+ brand: EclecticIQ
+ scriptarguments:
+ confidence_level:
+ simple: medium
+ description:
+ simple: sighting
+ tags:
+ simple: alerts
+ title:
+ simple: ${EclecticIQ.Entity.title}
+ type:
+ simple: ipv4
+ value:
+ simple: ${incident.destinationip}
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 440,
+ "y": 390
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+view: |-
+ {
+ "linkLabelsPosition": {},
+ "paper": {
+ "dimensions": {
+ "height": 465,
+ "width": 380,
+ "x": 440,
+ "y": 20
+ }
+ }
+ }
+inputs: []
+outputs: []
+quiet: true
+fromversion: 6.5.0
\ No newline at end of file
diff --git a/Packs/EclecticIQ/pack_metadata.json b/Packs/EclecticIQ/pack_metadata.json
index 939822412c7a..7d5e5355472c 100644
--- a/Packs/EclecticIQ/pack_metadata.json
+++ b/Packs/EclecticIQ/pack_metadata.json
@@ -1,12 +1,12 @@
{
"name": "EclecticIQ Platform",
"description": "Threat Intelligence Platform that connects and interprets intelligence data from open sources, commercial suppliers and industry partnerships.",
- "support": "xsoar",
- "currentVersion": "1.0.6",
- "author": "Cortex XSOAR",
- "url": "https://www.paloaltonetworks.com/cortex",
- "email": "",
- "created": "2020-04-14T00:00:00Z",
+ "support": "partner",
+ "currentVersion": "2.0.3",
+ "author": "EclecticIQ",
+ "url": "https://support.eclecticiq.com",
+ "email": "support@eclecticiq.com",
+ "created": "2022-09-02T00:00:00Z",
"categories": [
"Data Enrichment & Threat Intelligence"
],
@@ -17,4 +17,4 @@
"xsoar",
"marketplacev2"
]
-}
\ No newline at end of file
+}
diff --git a/Packs/Elasticsearch/.pack-ignore b/Packs/Elasticsearch/.pack-ignore
index 7b96a9e1ba65..fe89aafb87da 100644
--- a/Packs/Elasticsearch/.pack-ignore
+++ b/Packs/Elasticsearch/.pack-ignore
@@ -2,3 +2,4 @@
ignore=IN126,BA108,BA109
[known_words]
Elasticsearch
+aggregations
\ No newline at end of file
diff --git a/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.py b/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.py
index d55121ee6132..1432ee4eec51 100644
--- a/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.py
+++ b/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.py
@@ -193,6 +193,9 @@ def results_to_context(index, query, base_page, size, total_dict, response, even
'timed_out': response.get('timed_out')
}
+ if aggregations := response.get('aggregations'):
+ search_context['aggregations'] = aggregations
+
hit_headers = [] # type: List
hit_tables = []
if total_dict.get('value') > 0:
@@ -208,7 +211,7 @@ def results_to_context(index, query, base_page, size, total_dict, response, even
hit_headers = ['_id', '_index', '_type', '_score'] + hit_headers
search_context['Results'] = response.get('hits').get('hits')
- meta_headers = ['Query', 'took', 'timed_out', 'total', 'max_score', 'Server', 'Page', 'Size']
+ meta_headers = ['Query', 'took', 'timed_out', 'total', 'max_score', 'Server', 'Page', 'Size', 'aggregations']
return search_context, meta_headers, hit_tables, hit_headers
@@ -261,8 +264,7 @@ def search_command(proxies):
time_field=timestamp_field)
if query_dsl:
-
- response = execute_raw_query(es, query_dsl)
+ response = execute_raw_query(es, query_dsl, index, size, base_page)
else:
que = QueryString(query=query)
@@ -671,15 +673,20 @@ def get_time_range(last_fetch: Union[str, None] = None, time_range_start=FETCH_T
return {'range': {time_field: range_dict}}
-def execute_raw_query(es, raw_query):
+def execute_raw_query(es, raw_query, index=None, size=None, page=None):
try:
raw_query = json.loads(raw_query)
- except Exception as e:
+ if raw_query.get('query'):
+ demisto.debug('query provided already has a query field. Sending as is')
+ body = raw_query
+ else:
+ body = {'query': raw_query}
+ except (ValueError, TypeError) as e:
+ body = {'query': raw_query}
demisto.info(f"unable to convert raw query to dictionary, use it as a string\n{e}")
- body = {"query": raw_query}
- response = es.search(index=FETCH_INDEX, body=body)
- return response
+ requested_index = index or FETCH_INDEX
+ return es.search(index=requested_index, body=body, size=size, from_=page)
def fetch_incidents(proxies):
diff --git a/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.yml b/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.yml
index 1ec556a00133..ae34c609fc3b 100644
--- a/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.yml
+++ b/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2.yml
@@ -1,4 +1,7 @@
category: Database
+sectionOrder:
+- Connect
+- Collect
commonfields:
id: Elasticsearch v2
version: -1
@@ -8,19 +11,25 @@ configuration:
required: true
type: 0
additionalinfo: The Elasticsearch server to which the integration connects. Ensure that the URL includes the correct Elasticsearch port. By default this is 9200.
+ section: Connect
- additionalinfo: Provide Username + Passoword instead of API key + API ID
display: Username for server login
name: credentials
required: false
type: 9
+ section: Connect
- display: Trust any certificate (not secure)
name: insecure
required: false
type: 8
+ section: Connect
+ advanced: true
- display: Use system proxy settings
name: proxy
required: false
type: 8
+ section: Connect
+ advanced: true
- defaultvalue: Elasticsearch
additionalinfo: In some hosted ElasticSearch environments, the standard ElasticSearch client is not supported. If you encounter any related client issues, please consider using the OpenSearch client type.
display: Client type
@@ -30,25 +39,34 @@ configuration:
- OpenSearch
required: false
type: 15
+ section: Connect
+ advanced: true
- display: Index from which to fetch incidents (CSV)
name: fetch_index
required: false
type: 0
+ section: Collect
- display: Query String
name: fetch_query
required: false
type: 0
additionalinfo: The query will be used when fetching incidents. Index time field will be used as a filter in the query.
+ section: Collect
+ advanced: true
- display: Index time field (for sorting sort and limiting data)
name: fetch_time_field
required: false
type: 0
+ section: Collect
+ advanced: true
- display: Raw Query
name: raw_query
required: false
type: 12
additionalinfo: Will override the 'Query String' Lucene syntax string. Results will not be filtered.
hidden: false
+ section: Collect
+ advanced: true
- display: Time field type
defaultvalue: 'Simple-Date'
name: time_method
@@ -58,34 +76,44 @@ configuration:
- Simple-Date
- Timestamp-Seconds
- Timestamp-Milliseconds
+ section: Collect
+ advanced: true
- defaultvalue: 'true'
display: Map JSON fields into labels
name: map_labels
required: false
type: 8
+ section: Collect
+ advanced: true
- defaultvalue: '3 days'
display: First fetch timestamp (
, e.g., 12 hours, 7 days)
name: fetch_time
required: false
type: 0
+ section: Collect
- defaultvalue: '50'
display: The maximum number of results to return per fetch.
name: fetch_size
required: false
type: 0
+ section: Collect
- display: Request timeout (in seconds).
name: timeout
required: false
type: 0
defaultvalue: '60'
+ section: Connect
+ advanced: true
- display: Incident type
name: incidentType
required: false
type: 13
+ section: Connect
- display: Fetch incidents
name: isFetch
required: false
type: 8
+ section: Collect
description: "Search for and analyze data in real time. \n Supports version 6 and later."
display: Elasticsearch v2
name: Elasticsearch v2
@@ -389,7 +417,7 @@ script:
secret: false
- default: false
defaultValue: '100'
- description: The number of documents displayed per page. Can be an integer between "1" and "10,000".
+ description: The number of documents displayed per page. Can be an integer between "1" and "10,000".
isArray: false
name: size
required: false
@@ -453,7 +481,7 @@ script:
- contextPath: Elasticsearch.Search.Size
description: The maximum number of scores that a search can return.
type: Number
- dockerimage: demisto/py3-tools:1.0.0.40313
+ dockerimage: demisto/py3-tools:1.0.0.44868
feed: false
isfetch: true
longRunning: false
diff --git a/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2_test.py b/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2_test.py
index 8da0a50f3be7..4c84246f5ed9 100644
--- a/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2_test.py
+++ b/Packs/Elasticsearch/Integrations/Elasticsearch_v2/Elasticsearch_v2_test.py
@@ -630,7 +630,8 @@ def test_context_creation_es7(params, mocker):
size, total_dict, ES_V7_RESPONSE)
assert str(search_context) == MOCK_ES7_SEARCH_CONTEXT
- assert str(meta_headers) == "['Query', 'took', 'timed_out', 'total', 'max_score', 'Server', 'Page', 'Size']"
+ assert str(meta_headers) == "['Query', 'took', 'timed_out', 'total', 'max_score', " \
+ "'Server', 'Page', 'Size', 'aggregations']"
assert str(hit_tables) == MOCK_ES7_HIT_CONTEXT
assert str(hit_headers) == "['_id', '_index', '_type', '_score', 'Date']"
@@ -650,7 +651,8 @@ def test_context_creation_es6(params, mocker):
size, total_dict, ES_V6_RESPONSE)
assert str(search_context) == MOCK_ES6_SEARCH_CONTEXT
- assert str(meta_headers) == "['Query', 'took', 'timed_out', 'total', 'max_score', 'Server', 'Page', 'Size']"
+ assert str(meta_headers) == "['Query', 'took', 'timed_out', 'total', " \
+ "'max_score', 'Server', 'Page', 'Size', 'aggregations']"
assert str(hit_tables) == MOCK_ES6_HIT_CONTEXT
assert str(hit_headers) == "['_id', '_index', '_type', '_score', 'Date']"
@@ -915,3 +917,51 @@ def json(self):
mocker.patch('Elasticsearch_v2.requests.get', return_value=ResponseMockObject())
result = Elasticsearch_v2.get_mapping_fields_command()
assert result == expected_result
+
+
+def test_search_command_with_query_dsl(mocker):
+ """
+ Given
+ - index to the search command with query_dsl
+
+ When
+ - executing the search command
+
+ Then
+ - make sure that the index is being taken from the command arguments and not from integration parameters
+ - make sure that the size / page arguments are getting called when using query_dsl
+ """
+ import Elasticsearch_v2
+ Elasticsearch_v2.FETCH_INDEX = 'index from parameter'
+ index_from_arg = 'index from arg'
+ mocker.patch.object(
+ demisto, 'args', return_value={'index': index_from_arg, 'query_dsl': 'test', 'size': '5', 'page': '0'}
+ )
+ search_mock = mocker.patch.object(Elasticsearch_v2.Elasticsearch, 'search', return_value=ES_V7_RESPONSE)
+ mocker.patch.object(Elasticsearch_v2.Elasticsearch, '__init__', return_value=None)
+ Elasticsearch_v2.search_command({})
+ assert search_mock.call_args.kwargs['index'] == index_from_arg
+ assert search_mock.call_args.kwargs['size'] == 5
+ assert search_mock.call_args.kwargs['from_'] == 0
+
+
+def test_execute_raw_query(mocker):
+ """
+ Given
+ - index and elastic search objects
+
+ When
+ - executing execute_raw_query function with two response: first an exception and second a correct response.
+
+ Then
+ - make sure that no exception was raised from the function.
+ - make sure the response came back correctly.
+ """
+ import Elasticsearch_v2
+ Elasticsearch_v2.FETCH_INDEX = 'index from parameter'
+ mocker.patch.object(
+ Elasticsearch_v2.Elasticsearch, 'search', return_value=ES_V7_RESPONSE
+ )
+ mocker.patch.object(Elasticsearch_v2.Elasticsearch, '__init__', return_value=None)
+ es = Elasticsearch_v2.elasticsearch_builder({})
+ assert Elasticsearch_v2.execute_raw_query(es, 'dsadf') == ES_V7_RESPONSE
diff --git a/Packs/Elasticsearch/ReleaseNotes/1_3_10.md b/Packs/Elasticsearch/ReleaseNotes/1_3_10.md
new file mode 100644
index 000000000000..4c1584044207
--- /dev/null
+++ b/Packs/Elasticsearch/ReleaseNotes/1_3_10.md
@@ -0,0 +1,4 @@
+#### Integrations
+##### Elasticsearch v2
+- Fixed an issue where in the ***search*** and ***es-search*** commands the *index* argument was ignored when using *query_dsl* argument.
+- Updated the Docker image to: *demisto/py3-tools:1.0.0.42928*.
\ No newline at end of file
diff --git a/Packs/Elasticsearch/ReleaseNotes/1_3_11.md b/Packs/Elasticsearch/ReleaseNotes/1_3_11.md
new file mode 100644
index 000000000000..77afd7fdfb1f
--- /dev/null
+++ b/Packs/Elasticsearch/ReleaseNotes/1_3_11.md
@@ -0,0 +1,6 @@
+#### Integrations
+##### Elasticsearch v2
+- Fixed an issue where in the ***search*** and ***es-search*** commands, the *page* and *size* arguments were ignored when using the *query_dsl* argument.
+- Added support to run any *query_dsl* in the ***search*** and ***es-search*** commands.
+- Added the *aggregations* key to the context of the ***search*** and ***es-search*** commands.
+- Updated the Docker image to: *demisto/py3-tools:1.0.0.44868*.
diff --git a/Packs/Elasticsearch/ReleaseNotes/1_3_12.md b/Packs/Elasticsearch/ReleaseNotes/1_3_12.md
new file mode 100644
index 000000000000..5174be8bfb34
--- /dev/null
+++ b/Packs/Elasticsearch/ReleaseNotes/1_3_12.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### Elasticsearch v2
+- Note: Organized the the integrations' parameters by sections. Relevant for XSIAM and XSOAR 8.1 and above.
\ No newline at end of file
diff --git a/Packs/Elasticsearch/ReleaseNotes/1_3_9.md b/Packs/Elasticsearch/ReleaseNotes/1_3_9.md
new file mode 100644
index 000000000000..449b7ba474af
--- /dev/null
+++ b/Packs/Elasticsearch/ReleaseNotes/1_3_9.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### Elasticsearch v2
+- Updated the Docker image to: *demisto/py3-tools:1.0.0.41700*.
diff --git a/Packs/Elasticsearch/pack_metadata.json b/Packs/Elasticsearch/pack_metadata.json
index ab6719af86e0..062245c58c30 100644
--- a/Packs/Elasticsearch/pack_metadata.json
+++ b/Packs/Elasticsearch/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "Elasticsearch",
"description": "Search for and analyze data in real time. \n Supports version 6 and later.",
"support": "xsoar",
- "currentVersion": "1.3.8",
+ "currentVersion": "1.3.12",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
diff --git a/Packs/EmailCommunication/ReleaseNotes/2_0_4.md b/Packs/EmailCommunication/ReleaseNotes/2_0_4.md
new file mode 100644
index 000000000000..2770ac561664
--- /dev/null
+++ b/Packs/EmailCommunication/ReleaseNotes/2_0_4.md
@@ -0,0 +1,8 @@
+
+#### Scripts
+##### SendEmailReply
+- Using **getIncidents** instead of **GetIncidentsByQuery**
+- Updated the Docker image to: *demisto/python3:3.10.9.45313*.
+##### PreprocessEmail
+- Using **getIncidents** instead of **GetIncidentsByQuery**
+- Updated the Docker image to: *demisto/python3:3.10.9.45313*.
diff --git a/Packs/EmailCommunication/ReleaseNotes/2_0_5.md b/Packs/EmailCommunication/ReleaseNotes/2_0_5.md
new file mode 100644
index 000000000000..d52f4128295f
--- /dev/null
+++ b/Packs/EmailCommunication/ReleaseNotes/2_0_5.md
@@ -0,0 +1,6 @@
+
+#### Scripts
+##### DisplayEmailHtmlThread
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
+##### SendEmailReply
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
diff --git a/Packs/EmailCommunication/ReleaseNotes/2_0_6.md b/Packs/EmailCommunication/ReleaseNotes/2_0_6.md
new file mode 100644
index 000000000000..863521a825b7
--- /dev/null
+++ b/Packs/EmailCommunication/ReleaseNotes/2_0_6.md
@@ -0,0 +1,3 @@
+#### Scripts
+##### SendEmailReply
+- Documentation and metadata improvements.
\ No newline at end of file
diff --git a/Packs/EmailCommunication/Scripts/DisplayEmailHtmlThread/DisplayEmailHtmlThread.yml b/Packs/EmailCommunication/Scripts/DisplayEmailHtmlThread/DisplayEmailHtmlThread.yml
index a2e6608104c1..1e241a95dd35 100644
--- a/Packs/EmailCommunication/Scripts/DisplayEmailHtmlThread/DisplayEmailHtmlThread.yml
+++ b/Packs/EmailCommunication/Scripts/DisplayEmailHtmlThread/DisplayEmailHtmlThread.yml
@@ -13,7 +13,7 @@ enabled: true
scripttarget: 0
subtype: python3
runonce: false
-dockerimage: demisto/python3:3.10.4.30607
+dockerimage: demisto/python3:3.10.10.48392
runas: DBotWeakRole
fromversion: 6.2.0
tests:
diff --git a/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.py b/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.py
index 7ee28be61362..72973a7cf960 100644
--- a/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.py
+++ b/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.py
@@ -149,16 +149,23 @@ def get_incident_by_query(query):
query_time = get_query_window()
query_from_date = str(parse_date_range(query_time)[0])
-
- res = demisto.executeCommand("GetIncidentsByQuery",
- {"query": query, "fromDate": query_from_date, "timeField": "modified",
- "populateFields": "id,status,type,emailsubject"})[0]
+ query += f' modified:>="{query_from_date}"'
+ res = demisto.executeCommand("getIncidents",
+ {"query": query, "populateFields": "id,status,type,emailsubject"})[0]
if is_error(res):
- return_results(ERROR_TEMPLATE.format('GetIncidentsByQuery', res['Contents']))
- raise DemistoException(ERROR_TEMPLATE.format('GetIncidentsByQuery', res['Contents']))
+ return_results(ERROR_TEMPLATE.format('getIncidents', res['Contents']))
+ raise DemistoException(ERROR_TEMPLATE.format('getIncidents', res['Contents']))
+
+ incidents_details = res['Contents']['data']
+ if incidents_details is None:
+ demisto.debug(f'incident was not found. query: {query}')
+ return []
+
+ for inc in incidents_details:
+ if inc.get('CustomFields'):
+ inc['emailsubject'] = inc.get('CustomFields', {}).get('emailsubject')
- incidents_details = json.loads(res['Contents'])
return incidents_details
@@ -239,7 +246,11 @@ def update_latest_message_field(incident_id, item_id):
item_id (str): The email reply ID.
"""
try:
- demisto.executeCommand('setIncident', {'id': incident_id, 'customFields': {'emaillatestmessage': item_id}})
+ demisto.debug(f'update latest message field. incident_id: {incident_id}')
+ res = demisto.executeCommand('setIncident', {'id': incident_id, 'customFields': {'emaillatestmessage': item_id}})
+ if is_error(res):
+ demisto.error(f'Failed to setIncident. Reason: {get_error(res)}')
+ raise DemistoException(f'Failed to setIncident. Reason: {get_error(res)}')
except Exception:
demisto.debug(f'SetIncident Failed.'
f'"emaillatestmessage" field was not updated with {item_id} value for incident: {incident_id}')
@@ -257,11 +268,11 @@ def get_email_related_incident_id(email_related_incident_code, email_original_su
for incident in incidents_details:
if email_original_subject in incident.get('emailsubject', ''):
- return incident.get('id')
+ return str(incident.get('id'))
else:
# If 'emailsubject' doesn't match, check 'EmailThreads' context entries
try:
- incident_context = demisto.executeCommand("getContext", {"id": incident.get('id')})
+ incident_context = demisto.executeCommand("getContext", {"id": str(incident.get('id'))})
incident_email_threads = dict_safe_get(incident_context[0], ['Contents', 'context', 'EmailThreads'])
except Exception as e:
demisto.error(f'Exception while retrieving thread context: {e}')
@@ -272,7 +283,7 @@ def get_email_related_incident_id(email_related_incident_code, email_original_su
search_result = next((i for i, item in enumerate(incident_email_threads) if
email_original_subject in item["EmailSubject"]), None)
if search_result is not None:
- return incident.get('id')
+ return str(incident.get('id'))
def get_unique_code():
diff --git a/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.yml b/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.yml
index 0b9197eb9bc9..a49c3f7c4efe 100644
--- a/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.yml
+++ b/Packs/EmailCommunication/Scripts/PreprocessEmail/PreprocessEmail.yml
@@ -23,7 +23,7 @@ tags:
- email
- preProcessing
type: python
-dockerimage: demisto/python3:3.10.8.37753
+dockerimage: demisto/python3:3.10.9.45313
runas: DBotRole
tests:
- No tests (auto formatted)
diff --git a/Packs/EmailCommunication/Scripts/PreprocessEmail/README.md b/Packs/EmailCommunication/Scripts/PreprocessEmail/README.md
index 5701179622f9..5b24e92fe7a2 100644
--- a/Packs/EmailCommunication/Scripts/PreprocessEmail/README.md
+++ b/Packs/EmailCommunication/Scripts/PreprocessEmail/README.md
@@ -4,8 +4,7 @@ This script checks incoming emails from the incident type. If the emails contain
If you wish to extend this period, navigate to Settings->Advanced->Lists and add a new list with the name `XSOAR - Email Communication Days To Query`. In the `Data` field fill in a single number representing the number of days to query back, for example: 90.
The script is a part of the Email Communication pack.
-
-For more information about the preprocessing rules, please refer to https://xsoar.pan.dev/docs/incidents/incident-pre-processing.
+For more information, see the section about permissions here: [https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations](https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations)
## Script Data
---
diff --git a/Packs/EmailCommunication/Scripts/SendEmailReply/README.md b/Packs/EmailCommunication/Scripts/SendEmailReply/README.md
index 5142e61116ed..3ed657826992 100644
--- a/Packs/EmailCommunication/Scripts/SendEmailReply/README.md
+++ b/Packs/EmailCommunication/Scripts/SendEmailReply/README.md
@@ -16,8 +16,7 @@ The script is a part of the Email Communication pack.
---
This automation runs using the default Limited User role, unless you explicitly change the permissions.
-For more information, see the section about permissions here: [https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/playbooks/automations.html
-](https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/playbooks/automations.html)
+For more information, see the section about permissions here: [https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations](https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations)
## Script Data
---
@@ -42,3 +41,8 @@ For more information, see the section about permissions here: [https://docs.palo
## Outputs
---
There are no outputs for this script.
+
+### Troubleshooting
+Multi-tenant environments should be configured with the Cortex Rest API instance when using this
+automation. Make sure the *Use tenant* parameter (in the Cortex Rest API integration) is checked
+to ensure that API calls are made to the current tenant instead of the master tenant.
diff --git a/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.py b/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.py
index 549177491abf..983fcbf74541 100644
--- a/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.py
+++ b/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.py
@@ -522,13 +522,15 @@ def get_incident_by_query(query):
query_from_date = str(parse_date_range(query_time)[0])
- res = demisto.executeCommand("GetIncidentsByQuery", {"query": query, "fromDate": query_from_date,
- "timeField": "modified", "Contents": "id,status"})[0]
+ query += f' modified:>="{query_from_date}"'
+
+ res = demisto.executeCommand("getIncidents", {"query": query, "populateFields": "id,status"})[0]
if is_error(res):
- return_results(ERROR_TEMPLATE.format('GetIncidentsByQuery', res['Contents']))
- raise DemistoException(ERROR_TEMPLATE.format('GetIncidentsByQuery', res['Contents']))
+ return_results(ERROR_TEMPLATE.format('getIncidents', res['Contents']))
+ raise DemistoException(ERROR_TEMPLATE.format('getIncidents', res['Contents']))
+
+ incidents_details = res['Contents']['data']
- incidents_details = json.loads(res['Contents'])
return incidents_details
@@ -544,7 +546,7 @@ def get_unique_code():
code = f'{random.randrange(1, 10 ** 8):08}'
query = f'emailgeneratedcode: {code}'
incidents_details = get_incident_by_query(query)
- if len(incidents_details) == 0:
+ if incidents_details is None or len(incidents_details) == 0:
code_is_unique = True
return code
diff --git a/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.yml b/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.yml
index 09061ba51acd..7e2091b31434 100644
--- a/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.yml
+++ b/Packs/EmailCommunication/Scripts/SendEmailReply/SendEmailReply.yml
@@ -28,7 +28,7 @@ comment: |-
Send email reply
This automation runs using the default Limited User role, unless you explicitly change the permissions.
For more information, see the section about permissions here:
- https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/playbooks/automations.html
+ https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations
commonfields:
id: SendEmailReply
version: -1
@@ -39,7 +39,7 @@ subtype: python3
system: true
type: python
fromversion: 5.0.0
-dockerimage: demisto/python3:3.10.5.31928
+dockerimage: demisto/python3:3.10.10.48392
tests:
- No tests (auto formatted)
contentitemexportablefields:
diff --git a/Packs/EmailCommunication/pack_metadata.json b/Packs/EmailCommunication/pack_metadata.json
index d051834cd7cd..15fbf1664c8f 100644
--- a/Packs/EmailCommunication/pack_metadata.json
+++ b/Packs/EmailCommunication/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "Email Communication",
"description": "Do you have to send multiple emails to end users? This content pack helps you streamline the process and automate updates, notifications and more.\n",
"support": "xsoar",
- "currentVersion": "2.0.3",
+ "currentVersion": "2.0.6",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"videos": [
@@ -11,7 +11,7 @@
"email": "",
"created": "2020-08-06T08:15:26Z",
"categories": [
- "Utilities"
+ "Email"
],
"tags": [
"Use Case"
@@ -35,4 +35,4 @@
"Email",
"Add"
]
-}
\ No newline at end of file
+}
diff --git a/Packs/EmailRepIO/Integrations/EmailRepIO/EmailRepIO.yml b/Packs/EmailRepIO/Integrations/EmailRepIO/EmailRepIO.yml
index 953bcd884c5d..3e678cec1654 100644
--- a/Packs/EmailRepIO/Integrations/EmailRepIO/EmailRepIO.yml
+++ b/Packs/EmailRepIO/Integrations/EmailRepIO/EmailRepIO.yml
@@ -281,7 +281,7 @@ script:
description: Reports a malicious email address to EmailRepIO. You tag the type of malicious activity associated with the email address. The date of the malicious activity defaults to the current time unless otherwise specified.
execution: false
name: emailrepio-email-address-report
- dockerimage: demisto/python3:3.10.9.40422
+ dockerimage: demisto/python3:3.10.9.42476
feed: false
isfetch: false
longRunning: false
diff --git a/Packs/EmailRepIO/ReleaseNotes/1_0_21.md b/Packs/EmailRepIO/ReleaseNotes/1_0_21.md
new file mode 100644
index 000000000000..d62f64725508
--- /dev/null
+++ b/Packs/EmailRepIO/ReleaseNotes/1_0_21.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### EmailRep.io
+- Updated the Docker image to: *demisto/python3:3.10.9.42476*.
diff --git a/Packs/EmailRepIO/pack_metadata.json b/Packs/EmailRepIO/pack_metadata.json
index 605c7944d7e0..836d4ae4b7ec 100644
--- a/Packs/EmailRepIO/pack_metadata.json
+++ b/Packs/EmailRepIO/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "EmailRepIO",
"description": "Provide email address reputation and reports from EmailRep.io.",
"support": "xsoar",
- "currentVersion": "1.0.20",
+ "currentVersion": "1.0.21",
"author": "Cortex XSOAR",
"url": "https://emailrep.io",
"email": "",
diff --git a/Packs/Envoy/Integrations/EnvoyIAM/EnvoyIAM.yml b/Packs/Envoy/Integrations/EnvoyIAM/EnvoyIAM.yml
index 373e0a55e8fe..9964f7e1e49d 100644
--- a/Packs/Envoy/Integrations/EnvoyIAM/EnvoyIAM.yml
+++ b/Packs/Envoy/Integrations/EnvoyIAM/EnvoyIAM.yml
@@ -1,4 +1,4 @@
-category: Identity and Access Management
+category: Authentication & Identity Management
commonfields:
id: Envoy IAM
version: -1
@@ -253,7 +253,7 @@ script:
description: Retrieves a User Profile schema, which holds all of the user fields within the application. Used for outgoing-mapping through the Get Schema option.
execution: false
name: get-mapping-fields
- dockerimage: demisto/python3:3.10.4.30607
+ dockerimage: demisto/python3:3.10.10.48392
isfetch: false
longRunning: false
longRunningPort: false
diff --git a/Packs/Envoy/ReleaseNotes/1_0_4.md b/Packs/Envoy/ReleaseNotes/1_0_4.md
new file mode 100644
index 000000000000..01de8e0af997
--- /dev/null
+++ b/Packs/Envoy/ReleaseNotes/1_0_4.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### Envoy IAM
+- Updated the IAMApiModule.
diff --git a/Packs/Envoy/ReleaseNotes/1_0_5.md b/Packs/Envoy/ReleaseNotes/1_0_5.md
new file mode 100644
index 000000000000..548e5a475580
--- /dev/null
+++ b/Packs/Envoy/ReleaseNotes/1_0_5.md
@@ -0,0 +1,6 @@
+
+#### Integrations
+
+##### Envoy IAM
+- Updated the pack category to *Authentication & Identity Management*.
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
diff --git a/Packs/Envoy/pack_metadata.json b/Packs/Envoy/pack_metadata.json
index e423e950942c..358aa5a6c6cb 100644
--- a/Packs/Envoy/pack_metadata.json
+++ b/Packs/Envoy/pack_metadata.json
@@ -2,12 +2,12 @@
"name": "Envoy",
"description": "Envoy is offering an enterprise workplace visitor management software platform.",
"support": "xsoar",
- "currentVersion": "1.0.3",
+ "currentVersion": "1.0.5",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
"categories": [
- "Authentication"
+ "Authentication & Identity Management"
],
"tags": [],
"useCases": [],
diff --git a/Packs/Exabeam/Classifiers/classifier-exabeam_mapping.json b/Packs/Exabeam/Classifiers/classifier-exabeam_mapping.json
new file mode 100644
index 000000000000..6f357a07c35c
--- /dev/null
+++ b/Packs/Exabeam/Classifiers/classifier-exabeam_mapping.json
@@ -0,0 +1,58 @@
+{
+ "description": "",
+ "feed": false,
+ "id": "Exabeam mapping",
+ "mapping": {
+ "Exabeam Incident": {
+ "dontMapEventToLabels": true,
+ "internalMapping": {
+ "Close Time": {
+ "simple": "baseFields.closedDate"
+ },
+ "Description": {
+ "simple": "baseFields.description"
+ },
+ "Exabeam Id": {
+ "simple": "incidentId"
+ },
+ "Exabeam Queue": {
+ "simple": "baseFields.queue"
+ },
+ "Item Owner": {
+ "simple": "baseFields.owner"
+ },
+ "Last Update Time": {
+ "simple": "baseFields.updatedAt"
+ },
+ "Source Category": {
+ "simple": "baseFields.incidentType"
+ },
+ "Source Create time": {
+ "simple": "baseFields.createdAt"
+ },
+ "Source Created By": {
+ "simple": "baseFields.createdBy"
+ },
+ "Source Priority": {
+ "simple": "baseFields.priority"
+ },
+ "Source Status": {
+ "simple": "baseFields.status"
+ },
+ "Source Updated by": {
+ "simple": "baseFields.updatedBy"
+ },
+ "Start Time": {
+ "simple": "baseFields.startedDate"
+ },
+ "Title": {
+ "simple": "name"
+ }
+ }
+ }
+ },
+ "name": "Exabeam mapping",
+ "type": "mapping-incoming",
+ "version": -1,
+ "fromVersion": "6.5.0"
+}
\ No newline at end of file
diff --git a/Packs/Exabeam/IncidentFields/incidentfields-exabeamid.json b/Packs/Exabeam/IncidentFields/incidentfields-exabeamid.json
new file mode 100644
index 000000000000..878326de0635
--- /dev/null
+++ b/Packs/Exabeam/IncidentFields/incidentfields-exabeamid.json
@@ -0,0 +1,31 @@
+{
+ "id": "incident_exabeamid",
+ "version": -1,
+ "modified": "2022-11-30T14:33:28.322016+02:00",
+ "name": "Exabeam Id",
+ "ownerOnly": false,
+ "cliName": "exabeamid",
+ "type": "shortText",
+ "closeForm": false,
+ "editForm": true,
+ "required": false,
+ "neverSetAsRequired": false,
+ "isReadOnly": false,
+ "useAsKpi": false,
+ "locked": false,
+ "system": false,
+ "content": true,
+ "group": 0,
+ "hidden": false,
+ "openEnded": false,
+ "associatedTypes": [
+ "Exabeam Incident"
+ ],
+ "associatedToAll": false,
+ "unmapped": false,
+ "unsearchable": true,
+ "caseInsensitive": true,
+ "sla": 0,
+ "threshold": 72,
+ "fromVersion": "6.5.0"
+}
\ No newline at end of file
diff --git a/Packs/Exabeam/IncidentFields/incidentfields-exabeamqueue.json b/Packs/Exabeam/IncidentFields/incidentfields-exabeamqueue.json
new file mode 100644
index 000000000000..43b7b7561ad7
--- /dev/null
+++ b/Packs/Exabeam/IncidentFields/incidentfields-exabeamqueue.json
@@ -0,0 +1,31 @@
+{
+ "id": "incident_exabeamqueue",
+ "version": -1,
+ "modified": "2022-11-30T14:34:16.37085+02:00",
+ "name": "Exabeam Queue",
+ "ownerOnly": false,
+ "cliName": "exabeamqueue",
+ "type": "shortText",
+ "closeForm": false,
+ "editForm": true,
+ "required": false,
+ "neverSetAsRequired": false,
+ "isReadOnly": false,
+ "useAsKpi": false,
+ "locked": false,
+ "system": false,
+ "content": true,
+ "group": 0,
+ "hidden": false,
+ "openEnded": false,
+ "associatedTypes": [
+ "Exabeam Incident"
+ ],
+ "associatedToAll": false,
+ "unmapped": false,
+ "unsearchable": true,
+ "caseInsensitive": true,
+ "sla": 0,
+ "threshold": 72,
+ "fromVersion": "6.5.0"
+}
\ No newline at end of file
diff --git a/Packs/Exabeam/IncidentTypes/Exabeam_Incident.json b/Packs/Exabeam/IncidentTypes/Exabeam_Incident.json
new file mode 100644
index 000000000000..a8babf74b92a
--- /dev/null
+++ b/Packs/Exabeam/IncidentTypes/Exabeam_Incident.json
@@ -0,0 +1,28 @@
+{
+ "id": "Exabeam Incident",
+ "version": -1,
+ "vcShouldIgnore": false,
+ "locked": false,
+ "name": "Exabeam Incident",
+ "prevName": "Exabeam Incident",
+ "color": "#F8E7A5",
+ "hours": 0,
+ "days": 0,
+ "weeks": 0,
+ "hoursR": 0,
+ "daysR": 0,
+ "weeksR": 0,
+ "system": false,
+ "readonly": false,
+ "default": false,
+ "autorun": false,
+ "disabled": false,
+ "reputationCalc": 0,
+ "onChangeRepAlg": 0,
+ "detached": false,
+ "extractSettings": {
+ "mode": "Specific",
+ "fieldCliNameToExtractSettings": {}
+ },
+ "fromVersion": "6.5.0"
+}
\ No newline at end of file
diff --git a/Packs/Exabeam/Integrations/Exabeam/Exabeam.py b/Packs/Exabeam/Integrations/Exabeam/Exabeam.py
index a5ad81391c7d..3d8671121d07 100644
--- a/Packs/Exabeam/Integrations/Exabeam/Exabeam.py
+++ b/Packs/Exabeam/Integrations/Exabeam/Exabeam.py
@@ -6,32 +6,38 @@
import dateparser
import urllib3
-
# disable insecure warnings
urllib3.disable_warnings()
TOKEN_INPUT_IDENTIFIER = '__token'
+DAYS_BACK_FOR_FIRST_QUERY_OF_INCIDENTS = 3
+DATETIME_FORMAT_MILISECONDS = '%Y-%m-%dT%H:%M:%S.%f'
class Client(BaseClient):
"""
Client to use in the Exabeam integration. Overrides BaseClient
"""
+
def __init__(self, base_url: str, username: str, password: str, verify: bool,
- proxy: bool, headers):
+ proxy: bool, headers, api_key: str = '', is_fetch: bool = None):
+ self.validate_authentication_params(username=username, password=password, api_key=api_key, is_fetch=is_fetch)
super().__init__(base_url=f'{base_url}', headers=headers, verify=verify, proxy=proxy)
self.username = username
self.password = password
+ self.api_key = api_key
self.session = requests.Session()
self.session.headers = headers
if not proxy:
self.session.trust_env = False
- if self.username != TOKEN_INPUT_IDENTIFIER:
+ if self.is_token_auth():
+ self.session.headers['ExaAuthToken'] = self.password or self.api_key
+ else:
self._login()
def __del__(self):
- if self.username != TOKEN_INPUT_IDENTIFIER:
+ if not self.is_token_auth():
self._logout()
super().__del__()
@@ -53,6 +59,44 @@ def _logout(self):
except Exception as err:
demisto.debug(f'An error occurred during the logout.\n{str(err)}')
+ def validate_authentication_params(self, username: str = None,
+ password: str = None,
+ api_key: str = None,
+ is_fetch: bool = None):
+ if username == TOKEN_INPUT_IDENTIFIER:
+ if is_fetch:
+ raise ValueError('In order to use the “Fetch Incident†functionality,'
+ ' the username must be provided in the “Username†parameter.\n'
+ ' Please see documentation `Authentication Methods`')
+ if api_key:
+ raise ValueError(f'When specifying {username=}, the API Token must be provieded using in the password field'
+ ' please empty the other field')
+ if not password:
+ raise ValueError('Please insert API Token in the password field'
+ ' or see documentation `Authentication Methods` for another authentication methods')
+ elif not username:
+ if not api_key:
+ raise ValueError('If an API token is not provided, it is mandatory to insert username and password.')
+ if is_fetch:
+ raise ValueError('In order to use the “Fetch Incident†functionality,'
+ ' the username must be provided in the “Username†parameter.\n'
+ ' Please see documentation `Authentication Methods`')
+ else:
+ if not password and not api_key:
+ raise ValueError('Please insert password or API token.')
+ if password and api_key:
+ raise ValueError('Please insert API token OR password and not both.')
+
+ def is_token_auth(self) -> bool:
+
+ if not self.username:
+ return True
+ if self.username == TOKEN_INPUT_IDENTIFIER:
+ return True
+ if self.api_key:
+ return True
+ return False
+
def test_module_request(self):
"""
Performs basic get request to check if the server is reachable.
@@ -694,10 +738,51 @@ def get_notable_sequence_event_types_request(self, asset_sequence_id: str = None
params=params)
return response
+ def get_list_incidents(self, query_params: dict):
+
+ return self._http_request('GET', url_suffix='/ir/api/incident/list',
+ params=query_params)
+
+ def get_single_incident(self, incident_id: str, username: str = None):
+ headers = self._headers | {'EXA_USERNAME': username or self.username}
+ return self._http_request('GET', url_suffix=f'/ir/api/incident/{incident_id}',
+ headers=headers)
+
+ def get_incidents(self, query: dict[str, Any]):
+ headers = self._headers
+ if not self.password:
+ headers = headers | {'EXA_USERNAME': self.username}
+ return self._http_request(
+ 'POST',
+ url_suffix='/ir/api/incidents/search',
+ headers=headers,
+ json_data=query,
+ )
+
''' HELPER FUNCTIONS '''
+def format_single_incident(incident: dict[str, Any]) -> dict[str, Any]:
+ incident_fields = incident.get('fields', {})
+ formatted_incident = {'incidentId': incident.get('incidentId'),
+ 'name': incident.get('name'),
+ 'fields': {
+ 'startedDate': convert_unix_to_date(incident_fields.get('startedDate')),
+ 'closedDate': convert_unix_to_date(incident_fields.get('closedDate')),
+ 'createdAt': convert_unix_to_date(incident_fields.get('createdAt')),
+ 'owner': incident_fields.get('owner'),
+ 'status': incident_fields.get('status'),
+ 'incidentType': incident_fields.get('incidentType'),
+ 'source': incident_fields.get('source'),
+ 'priority': incident_fields.get('priority'),
+ 'queue': incident_fields.get('queue'),
+ 'description': incident_fields.get('description')
+ }}
+
+ return formatted_incident
+
+
def get_query_params_str(params: dict, array_type_params: dict) -> str:
""" Used for API queries that include array type parameters. Passing them in a dictionary won't work
because their keys must be equal which is not possible in python dictionaries, thus we will
@@ -1078,10 +1163,66 @@ def create_context_table_updates_outputs(name: str, raw_response: Dict) -> Tuple
return human_readable, entry_context
+def order_time_as_milisecound_for_fetch(start_time: str, end_time: str) -> Tuple[str, str]:
+
+ start = datetime.strptime(start_time, DATETIME_FORMAT_MILISECONDS)
+ end = datetime.strptime(end_time, DATETIME_FORMAT_MILISECONDS)
+
+ start_unix = convert_date_to_unix(start.strftime(DATETIME_FORMAT_MILISECONDS))
+ end_unix = convert_date_to_unix(end.strftime(DATETIME_FORMAT_MILISECONDS))
+
+ return str(start_unix), str(end_unix)
+
+
+def convert_all_unix_keys_to_date(incident: dict) -> dict:
+ keys = ['createdAt', 'startedDate', 'closedDate', 'updatedAt']
+ if 'baseFields' in incident:
+ for key in keys:
+ if key in incident['baseFields']:
+ incident['baseFields'][key] = convert_unix_to_date(incident['baseFields'][key]).split('.')[0] + 'Z'
+ return incident
+
+
+def build_incident_response_query_params(query: str | None,
+ incident_type: str | None,
+ priority: str | None,
+ status: str | None,
+ limit: int | None,
+ page_size: int | None,
+ page_number: int | None,
+ ) -> dict:
+
+ params: dict[str, Any] = {}
+ if not query:
+ q = ''
+ if incident_type:
+ q += f'incidentType:{incident_type} AND '
+ if priority:
+ q += f'priority:{priority} AND '
+ if status:
+ q += f'status:{status}'
+
+ if q.strip().split(' ')[-1] == 'AND':
+ q = q[:-(len(' AND '))]
+
+ if q:
+ params['query'] = q
+ else:
+ params['query'] = query
+
+ if page_size and page_number:
+ params['offset'] = page_size * page_number
+
+ if limit:
+ params['length'] = limit
+
+ return params
+
+
''' COMMANDS '''
-def test_module(client: Client, *_):
+def test_module(client: Client, args: dict[str, str], params: dict[str, str]):
"""test function
Args:
@@ -1092,7 +1233,6 @@ def test_module(client: Client, *_):
"""
client.test_module_request()
demisto.results('ok')
- return '', None, None
def get_notable_users(client: Client, args: Dict) -> Tuple[str, Dict, Dict]:
@@ -1899,21 +2039,143 @@ def get_notable_sequence_event_types(client: Client, args: Dict[str, str]) -> Tu
return human_readable, entry_context, sequence_event_types_raw_data
+def list_incidents(client: Client, args: dict[str, str]):
+ incident_ids = argToList(args.get('incident_id'))
+ query = args.get('query')
+ incident_type = args.get('incident_type')
+ priority = args.get('priority')
+ status = args.get('status')
+ limit = arg_to_number(args.get('limit', 50))
+ page_size = arg_to_number(args.get('page_size', 25))
+ page_number = arg_to_number(args.get('page_number', 0))
+ username = args.get('username')
+
+ if incident_ids and client.is_token_auth() and not username and not client.username:
+ raise ValueError('The username argument is necessary be for this command if the instance configured by api key')
+
+ incidents = []
+
+ if incident_ids:
+ for incident_id in incident_ids:
+ raw_response = client.get_single_incident(incident_id, username)
+ incidents.append(format_single_incident(raw_response))
+
+ else:
+ if any((query, incident_type, priority, status)):
+ query_params = build_incident_response_query_params(query,
+ incident_type,
+ priority,
+ status,
+ limit,
+ page_size,
+ page_number,
+ )
+ raw_response = client.get_list_incidents(query_params)
+ for incident in raw_response['incidents']:
+ incidents.append(format_single_incident(incident))
+ else:
+ return_error('One of the following params is a must: query, incident_type, priority, status')
+
+ entry_context = {'Exabeam.Incident(val.incidentId && val.incidentId === obj.incidentId)': incidents}
+
+ human_readable = tableToMarkdown('Incidents list:', incidents)
+
+ return human_readable, entry_context, raw_response
+
+
+def fetch_incidents(client: Client, args: dict[str, str]) -> Tuple[list, dict]:
+
+ last_run = demisto.getLastRun()
+ demisto.debug(f"Last run before the fetch run: {last_run}")
+ start_time, end_time = get_fetch_run_time_range(
+ last_run=last_run,
+ first_fetch=args.get('first_fetch', '3 days'),
+ look_back=1,
+ date_format=DATETIME_FORMAT_MILISECONDS,
+ )
+
+ demisto.debug(f"fetching incidents between {start_time=} and {end_time=}")
+ start_time_as_milisecound, end_time_as_milisecound = order_time_as_milisecound_for_fetch(start_time, end_time)
+
+ demisto.debug(f'fetching incidents between {start_time_as_milisecound=}, {end_time_as_milisecound=}')
+
+ incident_type = argToList(args.get('incident_type'))
+ priority = argToList(args.get('priority'))
+ status = argToList(args.get('status'))
+ limit = arg_to_number(args.get('max_fetch', 50))
+ q = {
+ "queryMap": {
+ "status": status,
+ "incidentType": incident_type,
+ "priority": priority,
+ "createdAt": [
+ start_time_as_milisecound,
+ end_time_as_milisecound
+ ],
+ },
+ "sortBy": "createdAt",
+ "sortOrder": "asc",
+ "idOnly": False,
+ "offset": 0,
+ "length": last_run.get('limit') or limit
+ }
+ demisto.debug(f'The query for fetch: {q}')
+
+ resp = client.get_incidents(q)
+ incidents_res: List[dict] = resp.get('incidents', [])
+ demisto.debug(f'Got {len(incidents_res)} incidents from the API, before filtering')
+
+ incidents_filtered = filter_incidents_by_duplicates_and_limit(
+ incidents_res=incidents_res,
+ last_run=last_run,
+ fetch_limit=limit,
+ id_field='incidentId'
+ )
+ demisto.debug(f'After filtering, there are {len(incidents_filtered)} incidents')
+
+ incidents: List[dict] = []
+ for incident in incidents_filtered:
+ incident['createdAt'] = datetime.fromtimestamp(
+ incident.get('baseFields', {}).get('createdAt') / 1000.0).strftime(DATETIME_FORMAT_MILISECONDS)
+ incident = convert_all_unix_keys_to_date(incident)
+ incidents.append({
+ 'Name': incident.get('name'),
+ 'occurred': incident.get('baseFields', {}).get('createdAt'),
+ 'rawJSON': json.dumps(incident)
+ })
+
+ last_run = update_last_run_object(
+ last_run=last_run,
+ incidents=incidents_filtered,
+ fetch_limit=limit,
+ start_fetch_time=start_time,
+ end_fetch_time=end_time,
+ look_back=1,
+ created_time_field='createdAt',
+ id_field='incidentId',
+ date_format=DATETIME_FORMAT_MILISECONDS,
+ increase_last_run_time=True
+ )
+ demisto.debug(f"Last run after the fetch run: {last_run}")
+ return incidents, last_run
+
+
def main():
"""
PARSE AND VALIDATE INTEGRATION PARAMS
"""
- username = demisto.params().get('credentials').get('identifier')
- password = demisto.params().get('credentials').get('password')
- base_url = demisto.params().get('url')
- verify_certificate = not demisto.params().get('insecure', False)
- proxy = demisto.params().get('proxy', False)
+ params = demisto.params()
+ args = demisto.args()
+ username = params.get('credentials', {}).get('identifier')
+ password = params.get('credentials', {}).get('password')
+ api_key = params.get('api_token', {}).get('password')
+ base_url = params.get('url')
+ verify_certificate = not params.get('insecure', False)
+ proxy = params.get('proxy', False)
+ is_fetch = argToBoolean(params.get('isFetch'))
headers = {'Accept': 'application/json', 'Csrf-Token': 'nocheck'}
- if username == TOKEN_INPUT_IDENTIFIER:
- headers['ExaAuthToken'] = password
commands = {
- 'test-module': test_module,
'get-notable-users': get_notable_users,
'exabeam-get-notable-users': get_notable_users,
'get-peer-groups': get_peer_groups,
@@ -1950,16 +2212,23 @@ def main():
'exabeam-get-notable-assets': get_notable_assets,
'exabeam-get-notable-sequence-details': get_notable_sequence_details,
'exabeam-get-notable-session-details': get_notable_session_details,
- 'exabeam-get-sequence-eventtypes': get_notable_sequence_event_types
+ 'exabeam-get-sequence-eventtypes': get_notable_sequence_event_types,
+ 'exabeam-list-incident': list_incidents,
}
try:
client = Client(base_url.rstrip('/'), verify=verify_certificate, username=username,
- password=password, proxy=proxy, headers=headers)
+ password=password, proxy=proxy, headers=headers, api_key=api_key, is_fetch=is_fetch)
command = demisto.command()
LOG(f'Command being called is {command}.')
- if command in commands:
- return_outputs(*commands[command](client, demisto.args())) # type: ignore
+ if command == 'fetch-incidents':
+ incidents, next_run = fetch_incidents(client, params)
+ demisto.setLastRun(next_run)
+ demisto.incidents(incidents)
+ elif command == 'test-module':
+ test_module(client, args, params)
+ elif command in commands:
+ return_outputs(*commands[command](client, args)) # type: ignore
else:
raise NotImplementedError(f'Command "{command}" is not implemented.')
diff --git a/Packs/Exabeam/Integrations/Exabeam/Exabeam.yml b/Packs/Exabeam/Integrations/Exabeam/Exabeam.yml
index 3e9dc82b1eb5..bb5758a9bf6c 100644
--- a/Packs/Exabeam/Integrations/Exabeam/Exabeam.yml
+++ b/Packs/Exabeam/Integrations/Exabeam/Exabeam.yml
@@ -7,12 +7,89 @@ configuration:
name: url
required: true
type: 0
-- additionalinfo: In order to authenticate with a Cluster Authentication Token, insert
- `__token` in the "Username" textbox, and the token itself in the "Password" textbox.
- display: Username
+- display: Username
name: credentials
- required: true
+ required: false
type: 9
+- additionalinfo: Cluster Authentication Token
+ display: Username
+ displaypassword: API Token
+ name: api_token
+ required: false
+ type: 9
+ hiddenusername: true
+- defaultvalue: "generic,abnormalAuth,accountManipulation,accountTampering,ueba,bruteForce,compromisedCredentials,
+ cryptomining,dataAccessAbuse,dataExfiltration,dlp,departedEmployee,dataDestruction,evasion,lateralMovement,alertTriage,
+ malware,phishing,privilegeAbuse,physicalSecurity,privilegeEscalation,privilegedActivity,ransomware,workforceProtection"
+ display: Exabeam Incident Type
+ name: incident_type
+ options:
+ - generic
+ - abnormalAuth
+ - accountManipulation
+ - accountTampering
+ - ueba
+ - bruteForce
+ - compromisedCredentials
+ - cryptomining
+ - dataAccessAbuse
+ - dataExfiltration
+ - dlp
+ - departedEmployee
+ - dataDestruction
+ - evasion
+ - lateralMovement
+ - alertTriage
+ - malware
+ - phishing
+ - privilegeAbuse
+ - physicalSecurity
+ - privilegeEscalation
+ - privilegedActivity
+ - ransomware
+ - workforceProtection
+ required: false
+ type: 16
+- defaultvalue: low,medium,high,critical
+ display: Priority
+ name: priority
+ options:
+ - low
+ - medium
+ - high
+ - critical
+ required: false
+ type: 16
+- defaultvalue: closed,closedFalsePositive,inprogress,new,pending,resolved
+ display: Status
+ name: status
+ options:
+ - closed
+ - closedFalsePositive
+ - inprogress
+ - new
+ - pending
+ - resolved
+ required: false
+ type: 16
+- display: Fetch incidents
+ name: isFetch
+ required: false
+ type: 8
+- defaultvalue: '50'
+ display: Max incidents per fetch
+ name: max_fetch
+ required: false
+ type: 0
+- defaultvalue: 3 days
+ display: First fetch timestamp ( , e.g., 12 hours, 7 days)
+ name: first_fetch
+ required: false
+ type: 0
+- display: Incident type
+ name: incidentType
+ type: 13
+ required: false
- display: Trust any certificate (not secure)
name: insecure
required: false
@@ -21,16 +98,14 @@ configuration:
name: proxy
required: false
type: 8
-description: The Exabeam Security Management Platform provides end-to-end detection,
- User Event Behavioral Analytics, and SOAR.
+description: The Exabeam Security Management Platform provides end-to-end detection, User Event Behavioral Analytics, and SOAR.
display: Exabeam
name: Exabeam
script:
commands:
- arguments:
- default: false
- description: The time period for which to fetch notable users, such as 3 months,
- 2 days, 4 hours, 1 year, and so on.
+ description: The time period for which to fetch notable users, such as 3 months, 2 days, 4 hours, 1 year, and so on.
isArray: true
name: time_period
required: true
@@ -85,8 +160,7 @@ script:
type: Boolean
- arguments:
- default: false
- description: The time period for which to fetch notable users, such as 3 months,
- 2 days, 4 hours, 1 year, and so on.
+ description: The time period for which to fetch notable users, such as 3 months, 2 days, 4 hours, 1 year, and so on.
isArray: true
name: time_period
required: true
@@ -357,15 +431,13 @@ script:
required: true
secret: false
- default: false
- description: The Start time of the time range. For example, 2018-08-01T11:50:16
- or "30 days ago".
+ description: The start time of the time range. For example, 2018-08-01T11:50:16 or "30 days ago".
isArray: false
name: start_time
required: false
secret: false
- default: false
- description: The end time of the time range. For example, 2018-08-01T11:50:16
- or "1 week ago".
+ description: The end time of the time range. For example, 2018-08-01T11:50:16 or "1 week ago".
isArray: false
name: end_time
required: false
@@ -1000,8 +1072,7 @@ script:
description: State of the rule (DefaultExabeam, ModifiedExabeam or CustomerCreated).
type: String
- contextPath: Exabeam.Rule.canSimpleEdit
- description: Whether or not it is possible to use the simple editor on this
- rule.
+ description: Whether or not it is possible to use the simple editor on this rule.
type: Boolean
- arguments:
- default: false
@@ -1099,12 +1170,10 @@ script:
description: Score of the rule.
type: Number
- contextPath: Exabeam.Rule.ruleDef.percentileThreshold
- description: Indicates which observations are considered anomalous based on
- the histogram.
+ description: Indicates which observations are considered anomalous based on the histogram.
type: String
- contextPath: Exabeam.Rule.ruleDef.ruleExpression
- description: A boolean expression that the rule engine uses to determine if
- a particular rule will trigger.
+ description: A boolean expression that the rule engine uses to determine if a particular rule will trigger.
type: String
- contextPath: Exabeam.Rule.ruleDef.dependencyExpression
description: The rule dependency expression.
@@ -1122,8 +1191,7 @@ script:
description: State of the rule (DefaultExabeam, ModifiedExabeam or CustomerCreated).
type: String
- contextPath: Exabeam.Rule.canSimpleEdit
- description: Whether or not it is possible to use the simple editor on this
- rule.
+ description: Whether or not it is possible to use the simple editor on this rule.
type: Boolean
- arguments:
- default: false
@@ -1393,10 +1461,7 @@ script:
required: true
secret: false
- default: false
- description: 'A comma-separated list of records to add, for example: k1,k2.
- If context_table_type argument is set to key_value, every record should be
- in "key:values" format, where "values" is a semi-colon separated list of values.
- For example: k1:v1;v2,k2:v3,k3:,k4:v4.'
+ description: 'A comma-separated list of records to add, for example: k1,k2. If context_table_type argument is set to key_value, every record should be in "key:values" format, where "values" is a semi-colon separated list of values. For example: k1:v1;v2,k2:v3,k3:,k4:v4.'
isArray: false
name: records
required: true
@@ -1454,10 +1519,7 @@ script:
required: false
secret: false
- default: false
- description: 'A comma-separated list of records to update. If context_table_type
- argument is set to key_only, each record should be in the following format:
- id:key. Otherwise it''s a key_value type and then the format of a record is
- id:key:values, where the values are separated by semi-colons.'
+ description: 'A comma-separated list of records to update. If context_table_type argument is set to key_only, each record should be in the following format: id:key. Otherwise it''s a key_value type and then the format of a record is id:key:values, where the values are separated by semi-colons.'
isArray: false
name: records
required: true
@@ -1514,8 +1576,7 @@ script:
required: true
secret: false
- default: false
- description: The ID of context table session. If not specified, a new session
- is created
+ description: The ID of the context table session. If not specified, a new session is created.
isArray: false
name: session_id
required: false
@@ -1548,8 +1609,7 @@ script:
required: false
secret: false
deprecated: false
- description: Add context table records from CSV file in a specific modification
- session.
+ description: Add context table records from CSV file in a specific modification session.
execution: false
name: exabeam-add-context-table-records-from-csv
- arguments:
@@ -1602,8 +1662,7 @@ script:
required: true
secret: false
- default: false
- description: The time period for which to fetch notable users, such as 3 months,
- 2 days, 4 hours, 1 year, and so on.
+ description: The time period for which to fetch notable users, such as 3 months, 2 days, 4 hours, 1 year, and so on.
isArray: true
name: time_period
required: true
@@ -1885,8 +1944,7 @@ script:
required: false
secret: false
deprecated: false
- description: Returns sequence event types for the given asset sequence ID and
- time range.
+ description: Returns sequence event types for the given asset sequence ID and time range.
execution: false
name: exabeam-get-sequence-eventtypes
outputs:
@@ -1902,9 +1960,149 @@ script:
- contextPath: Exabeam.SequenceEventTypes.sequenceId
description: The sequence ID.
type: String
- dockerimage: demisto/python3:3.10.8.39276
- feed: false
- isfetch: false
+ - arguments:
+ - default: false
+ description: The incident ID.
+ isArray: True
+ name: incident_id
+ required: false
+ secret: false
+ - default: false
+ description: |
+ The query string that will be used to filter incidents in Exabeam
+ For example:
+ - simple query: incidentType:generic,
+ - OR query: "status:new OR status:closedFalsePositive",
+ - AND query: "status:new AND priority:high".
+ isArray: false
+ name: query
+ required: false
+ secret: false
+ - default: false
+ auto: PREDEFINED
+ description: Incident type to filter in Exabeam.
+ isArray: false
+ predefined:
+ - "generic"
+ - "abnormalAuth"
+ - "accountManipulation"
+ - "accountTampering"
+ - "ueba"
+ - "bruteForce"
+ - "compromisedCredentials"
+ - "cryptomining"
+ - "dataAccessAbuse"
+ - "dataExfiltration"
+ - "dlp"
+ - "departedEmployee"
+ - "dataDestruction"
+ - "evasion"
+ - "lateralMovement"
+ - "alertTriage"
+ - "malware"
+ - "phishing"
+ - "privilegeAbuse"
+ - "physicalSecurity"
+ - "privilegeEscalation"
+ - "privilegedActivity"
+ - "ransomware"
+ - "workforceProtection"
+ name: incident_type
+ required: false
+ secret: false
+ - default: false
+ auto: PREDEFINED
+ description: Incident priority to filter in Exabeam.
+ isArray: false
+ predefined:
+ - "low"
+ - "medium"
+ - "high"
+ - "critical"
+ name: priority
+ required: false
+ secret: false
+ - default: false
+ auto: PREDEFINED
+ description: Incident status to filter in Exabeam.
+ isArray: false
+ predefined:
+ - "closed"
+ - "closedFalsePositive"
+ - "inprogress"
+ - "new"
+ - "pending"
+ - "resolved"
+ name: status
+ required: false
+ secret: false
+ - default: false
+ description: Number of total results to query. Default is 50.
+ isArray: false
+ name: limit
+ required: false
+ secret: false
+ - default: false
+ description: Specific page to query.
+ isArray: false
+ name: page_number
+ required: false
+ secret: false
+ - default: false
+ description: Number of total results in each page. Default is 25.
+ isArray: false
+ name: page_size
+ required: false
+ secret: false
+ - default: false
+ description: When the instance is configure by an API key, it must be used with the username argument.
+ isArray: false
+ name: username
+ required: false
+ secret: false
+ deprecated: false
+ description: Returns incidents from Exabeam.
+ execution: false
+ name: exabeam-list-incident
+ outputs:
+ - contextPath: Exabeam.incidents.incidentId
+ description: The incident ID.
+ type: String
+ - contextPath: Exabeam.incidents.name
+ description: The incident name.
+ type: String
+ - contextPath: Exabeam.incidents.fields.startedDate
+ description: The starting date of the incident.
+ type: String
+ - contextPath: Exabeam.incidents.fields.closedDate
+ description: The closing date of the incident.
+ type: String
+ - contextPath: Exabeam.incidents.fields.createdAt
+ description: The creation date of the incident.
+ type: String
+ - contextPath: Exabeam.incidents.fields.owner
+ description: The incident owner.
+ type: String
+ - contextPath: Exabeam.incidents.fields.status
+ description: The incident status.
+ type: String
+ - contextPath: Exabeam.incidents.fields.incidentType
+ description: The incident type.
+ type: String
+ - contextPath: Exabeam.incidents.fields.source
+ description: The incident source.
+ type: String
+ - contextPath: Exabeam.incidents.fields.priority
+ description: The incident priority.
+ type: String
+ - contextPath: Exabeam.incidents.fields.queue
+ description: The queue of the incident.
+ type: String
+ - contextPath: Exabeam.incidents.fields.description
+ description: The incident description.
+ type: String
+ dockerimage: demisto/python3:3.10.10.48392
+ isfetch: true
longRunning: false
longRunningPort: false
runonce: false
diff --git a/Packs/Exabeam/Integrations/Exabeam/Exabeam_description.md b/Packs/Exabeam/Integrations/Exabeam/Exabeam_description.md
index ced0c28c037e..e8d33c0e592b 100644
--- a/Packs/Exabeam/Integrations/Exabeam/Exabeam_description.md
+++ b/Packs/Exabeam/Integrations/Exabeam/Exabeam_description.md
@@ -1,9 +1,11 @@
The Exabeam Security Management Platform provides end-to-end detection, User Event Behavioral Analytics and SOAR.
### Authentication Methods
-
-In addition to the User Credentials authentication method, **Exabeam Cloud** users can authenticate using a **Cluster Authentication Token**. To authenticate with a Cluster Authentication Token, insert `__token` in the "Username" parameter, and the token itself in the "Password" parameter.
-
+There are 2 authentication methods:
+ - **API Token** - API token should be entered in the “API Token†parameter. In order to use the “Fetch Incident†functionality in this integration, the username must be provided also in the “Username†parameter.
+ - **Basic Authentication** - Providing Username and password in the corrsponding parameters in the configuration. This method also allows fetching incidents.
+ - ***Deprecated***:
+ API Key entered in the “password†parameter and `__token` in the username parameter. This method won’t allow fetching incidents.
### Generate a Cluster Authentication Token
diff --git a/Packs/Exabeam/Integrations/Exabeam/Exabeam_test.py b/Packs/Exabeam/Integrations/Exabeam/Exabeam_test.py
index d46ae2838f12..90163bd36a6c 100644
--- a/Packs/Exabeam/Integrations/Exabeam/Exabeam_test.py
+++ b/Packs/Exabeam/Integrations/Exabeam/Exabeam_test.py
@@ -2,15 +2,17 @@
from Exabeam import Client, contents_append_notable_user_info, contents_user_info, get_peer_groups, \
get_user_labels, get_watchlist, get_asset_data, get_session_info_by_id, get_rules_model_definition, \
parse_context_table_records_list, get_notable_assets, get_notable_session_details, get_notable_sequence_details, \
- get_notable_sequence_event_types, delete_context_table_records
+ get_notable_sequence_event_types, delete_context_table_records, list_incidents, convert_all_unix_keys_to_date, \
+ fetch_incidents, build_incident_response_query_params
from test_data.response_constants import RESPONSE_PEER_GROUPS, RESPONSE_USER_LABELS, RESPONSE_WATCHLISTS, \
RESPONSE_ASSET_DATA, RESPONSE_SESSION_INFO, RESPONSE_MODEL_DATA, RESPONSE_NOTABLE_ASSET_DATA, \
- RESPONSE_NOTABLE_SESSION_DETAILS, RESPONSE_NOTABLE_SEQUENCE_DETAILS, RESPONSE_NOTABLE_SEQUENCE_EVENTS,\
- DELETE_RECORD_RESPONSE
+ RESPONSE_NOTABLE_SESSION_DETAILS, RESPONSE_NOTABLE_SEQUENCE_DETAILS, RESPONSE_NOTABLE_SEQUENCE_EVENTS, \
+ DELETE_RECORD_RESPONSE, RESPONSE_INCIDENT_LIST
from test_data.result_constants import EXPECTED_PEER_GROUPS, EXPECTED_USER_LABELS, EXPECTED_WATCHLISTS, \
EXPECTED_ASSET_DATA, EXPECTED_SESSION_INFO, EXPECTED_MODEL_DATA, EXPECTED_NOTABLE_ASSET_DATA, \
EXPECTED_NOTABLE_SESSION_DETAILS, EXPECTED_NOTABLE_SEQUENCE_DETAILS, EXPECTED_NOTABLE_SEQUENCE_EVENTS, \
- EXPECTED_RESULT_AFTER_RECORD_DELETION
+ EXPECTED_RESULT_AFTER_RECORD_DELETION, EXPECTED_INCIDENT_LIST
+from test_data.response_incidents import INCIDENTS, EXPECTED_INCIDENTS, EXPECTED_LAST_RUN, EXPECTED_CALL_ARGS
def test_contents_append_notable_user_info():
@@ -105,7 +107,8 @@ def test_contents_user_info():
(get_notable_sequence_event_types, {'limit': 9, 'page': 0}, RESPONSE_NOTABLE_SEQUENCE_EVENTS,
EXPECTED_NOTABLE_SEQUENCE_EVENTS),
(delete_context_table_records, {"records": "test_key", "context_table_name": "test_table"},
- DELETE_RECORD_RESPONSE, EXPECTED_RESULT_AFTER_RECORD_DELETION)
+ DELETE_RECORD_RESPONSE, EXPECTED_RESULT_AFTER_RECORD_DELETION),
+ (list_incidents, {'limit': 1, 'status': 'new'}, RESPONSE_INCIDENT_LIST, EXPECTED_INCIDENT_LIST)
]) # noqa: E124
def test_commands(command, args, response, expected_result, mocker):
import requests
@@ -183,3 +186,271 @@ def test_get_notable_session_details_command_empty_sessions(mocker):
headers={})
human_readable, entry_context, session_details_raw_data = get_notable_session_details(client, {'limit': '1'})
assert human_readable == 'No results found.'
+
+
+@pytest.mark.parametrize(
+ 'args, expected_results',
+ [
+ (
+ {
+ 'query': None,
+ 'incident_type': 'generic',
+ 'status': 'new',
+ 'priority': 'low',
+ 'limit': 3,
+ 'page_size': 25,
+ 'page_number': 0,
+ },
+ {
+ 'query': 'incidentType:generic AND priority:low AND status:new',
+ 'length': 3,
+ 'offset': 0,
+ }
+ ),
+ (
+ {
+ 'query': None,
+ 'incident_type': 'generic',
+ 'status': None,
+ 'priority': 'low',
+ 'limit': 3,
+ 'page_size': 25,
+ 'page_number': 0,
+ },
+ {
+ 'query': 'incidentType:generic AND priority:low',
+ 'length': 3,
+ 'offset': 0,
+ }
+ ),
+ (
+ {
+ 'query': None,
+ 'incident_type': None,
+ 'status': None,
+ 'priority': None,
+ 'limit': 3,
+ 'page_size': 25,
+ 'page_number': 0,
+ },
+ {
+ 'length': 3,
+ 'offset': 0,
+ }
+ ),
+ (
+ {
+ 'query': 'incidentType:generic OR priority:low',
+ 'incident_type': 'malware',
+ 'status': None,
+ 'priority': 'medium',
+ 'limit': 6,
+ 'page_size': 25,
+ 'page_number': 1,
+ },
+ {
+ 'query': 'incidentType:generic OR priority:low',
+ 'length': 6,
+ 'offset': 25,
+ }
+ ),
+ ]
+)
+def test_build_incident_response_query_params(args, expected_results):
+
+ results = build_incident_response_query_params(**args)
+
+ for key in results:
+ assert results[key] == expected_results[key]
+
+
+@pytest.mark.parametrize(
+ 'incident, expected_results',
+ [
+ (
+ {
+ 'id': 123,
+ 'baseFields': {
+ 'createdAt': 1670420803000,
+ 'startedDate': 1670421189876,
+ 'closedDate': 1671421199904,
+ 'updatedAt': 1670421199904,
+ }
+ },
+ {
+ 'createdAt': '2022-12-07T13:46:43Z',
+ 'startedDate': '2022-12-07T13:53:09Z',
+ 'closedDate': '2022-12-19T03:39:59Z',
+ 'updatedAt': '2022-12-07T13:53:19Z',
+ }
+ ),
+ (
+ {
+ 'id': 123,
+ 'baseFields': {
+ 'createdAt': 1670420803000,
+ 'startedDate': 1670421189876,
+ 'updatedAt': 1670421199904,
+ }
+ },
+ {
+ 'createdAt': '2022-12-07T13:46:43Z',
+ 'startedDate': '2022-12-07T13:53:09Z',
+ 'updatedAt': '2022-12-07T13:53:19Z',
+ }
+ )
+ ]
+)
+def test_convert_all_unix_keys_to_date(incident, expected_results):
+
+ results = convert_all_unix_keys_to_date(incident)
+
+ for key in expected_results:
+ assert results['baseFields'][key] == expected_results[key]
+
+
+@pytest.mark.parametrize(
+ 'params, incidents, expected_incidents, expected_last_run',
+ [
+ (
+ {'max_fetch': 3, 'incident_type': 'generic,abnormalAuth', 'status': 'new', 'priority': 'medium'},
+ INCIDENTS,
+ EXPECTED_INCIDENTS,
+ EXPECTED_LAST_RUN,
+ )
+ ]
+)
+def test_fetch_incdents(mocker, params, incidents, expected_incidents, expected_last_run):
+
+ mocker.patch.object(Client, '_login', return_value=None)
+ client = Client(base_url='https://example.com', username='test_user', password='1234', verify=False, proxy=False,
+ headers={})
+ request_get_incidents = mocker.patch.object(client, 'get_incidents', return_value=incidents)
+ mocker.patch('Exabeam.demisto.getLastRun', return_value={})
+ mocker.patch('Exabeam.get_fetch_run_time_range', return_value=("2022-12-22T13:53:05.195302", "2022-12-25T13:53:05.145561"))
+ results, last_run = fetch_incidents(client, params)
+
+ for i in range(len(results)):
+ assert results[i]['Name'] == expected_incidents['first_fetch'][i]['name']
+ assert results[i]['occurred'] == expected_incidents['first_fetch'][i]['baseFields']['createdAt']
+
+ assert last_run['limit'] == expected_last_run['first_fetch']['limit']
+ assert last_run['time'] == expected_last_run['first_fetch']['time']
+ for id_ in expected_last_run['first_fetch']['found_incident_ids']:
+ assert id_ in last_run['found_incident_ids']
+
+ assert EXPECTED_CALL_ARGS == request_get_incidents.call_args_list[0][0][0]
+ mocker.patch('Exabeam.demisto.getLastRun', return_value=last_run)
+ results, last_run = fetch_incidents(client, params)
+
+ for i in range(len(results)):
+ assert results[i]['Name'] == expected_incidents['second_fetch'][i]['name']
+ assert results[i]['occurred'] == expected_incidents['second_fetch'][i]['baseFields']['createdAt']
+
+ assert last_run['limit'] == expected_last_run['second_fetch']['limit']
+ assert last_run['time'] == expected_last_run['second_fetch']['time']
+ for id_ in expected_last_run['second_fetch']['found_incident_ids']:
+ assert id_ in last_run['found_incident_ids']
+
+ mocker.patch('Exabeam.demisto.getLastRun', return_value=last_run)
+ results, last_run = fetch_incidents(client, params)
+
+ for i in range(len(results)):
+ assert results[i]['Name'] == expected_incidents['third_fetch'][i]['name']
+ assert results[i]['occurred'] == expected_incidents['third_fetch'][i]['baseFields']['createdAt']
+
+ assert last_run['limit'] == expected_last_run['third_fetch']['limit']
+ assert last_run['time'] == expected_last_run['third_fetch']['time']
+ for id_ in expected_last_run['third_fetch']['found_incident_ids']:
+ assert id_ in last_run['found_incident_ids']
+
+
+@pytest.mark.parametrize(
+ 'args, expected_results',
+ [
+ (
+ {
+ 'username': '__token',
+ 'password': None,
+ 'api_token': 'test',
+ 'is_fetch': False,
+ },
+ "When specifying username='__token', the API Token must be provieded using in the password field"
+ " please empty the other field"
+ ),
+ (
+ {
+ 'username': '__token',
+ 'password': 'test',
+ 'api_token': None,
+ 'is_fetch': True,
+ },
+ 'In order to use the “Fetch Incident†functionality,'
+ ' the username must be provided in the “Username†parameter.\n'
+ ' Please see documentation `Authentication Methods`'
+ ),
+ (
+ {
+ 'username': '__token',
+ 'password': None,
+ 'api_token': None,
+ 'is_fetch': False,
+ },
+ 'Please insert API Token in the password field'
+ ' or see documentation `Authentication Methods` for another authentication methods'
+ ),
+ (
+ {
+ 'username': None,
+ 'password': None,
+ 'api_token': None,
+ 'is_fetch': False,
+ },
+ "If an API token is not provided, it is mandatory to insert username and password."
+ ),
+ (
+ {
+ 'username': None,
+ 'password': None,
+ 'api_token': 'test',
+ 'is_fetch': True,
+ },
+ 'In order to use the “Fetch Incident†functionality,'
+ ' the username must be provided in the “Username†parameter.\n'
+ ' Please see documentation `Authentication Methods`'
+ ),
+ (
+ {
+ 'username': 'test',
+ 'password': None,
+ 'api_token': None,
+ 'is_fetch': True,
+ },
+ 'Please insert password or API token.'
+ ),
+ (
+ {
+ 'username': 'test',
+ 'password': 'test',
+ 'api_token': 'test',
+ 'is_fetch': True,
+ },
+ 'Please insert API token OR password and not both.'
+ ),
+ ]
+)
+def test_validate_authentication_params(mocker, args, expected_results):
+
+ mocker.patch.object(Client, 'is_token_auth', return_value=True)
+
+ with pytest.raises(ValueError) as err:
+ Client(base_url='test',
+ username=args['username'],
+ password=args['password'],
+ verify=False,
+ proxy=False,
+ headers={},
+ api_key=args['api_token'],
+ is_fetch=args['is_fetch'])
+
+ assert str(err.value) == expected_results
diff --git a/Packs/Exabeam/Integrations/Exabeam/README.md b/Packs/Exabeam/Integrations/Exabeam/README.md
index 7197a3398e90..00af81e5532d 100644
--- a/Packs/Exabeam/Integrations/Exabeam/README.md
+++ b/Packs/Exabeam/Integrations/Exabeam/README.md
@@ -2,13 +2,15 @@ The Exabeam Security Management Platform provides end-to-end detection, User Eve
This integration was integrated and tested with version 53.5 of Exabeam.
### Authentication Methods
-
-In addition to the User Credentials authentication method, **Exabeam Cloud** users can authenticate using a **Cluster Authentication Token**. To authenticate with a Cluster Authentication Token, insert `__token` in the "Username" parameter, and the token itself in the "Password" parameter.
-
+There are 2 authentication methods:
+ - **API Token** - API token should be entered in the “API Token†parameter. In order to use the “Fetch Incident†functionality in this integration, the username must be provided also in the “Username†parameter.
+ - **Basic Authentication** - Providing username and password in the corresponding parameters in the configuration. This method also allows fetching incidents.
+ - ***Deprecated***:
+ API Key entered in the “password†parameter and `__token` in the username parameter. This method won’t allow fetching incidents.
### Generate a Cluster Authentication Token
-1. Navigate to Settings > Admin Operations > Cluster Authentication Token.
+1. Navigate to **Settings** > **Admin Operations** > **Cluster Authentication Token**.
2. At the Cluster Authentication Token menu, click the blue `+` button.
@@ -27,7 +29,16 @@ For additional information, refer to [Exabeam Administration Guide](https://docs
| **Parameter** | **Description** | **Required** |
| --- | --- | --- |
| Server URL (e.g https://100.24.16.156:8484) | | True |
- | Username | In order to authenticate with a Cluster Authentication Token, insert \`__token\` in the "Username" textbox, and the token itself in the "Password" textbox. | True |
+ | Username | | False |
+ | Password | | False |
+ | API Token | Cluster Authentication Token | False |
+ | Exabeam Incident Type | Incident type to filter in Exabeam. Possible values are: generic, abnormalAuth, accountManipulation, accountTampering, ueba, bruteForce, compromisedCredentials, cryptomining, dataAccessAbuse, dataExfiltration, dlp, departedEmployee, dataDestruction, evasion, lateralMovement, alertTriage, malware, phishing, privilegeAbuse, physicalSecurity, privilegeEscalation, privilegedActivity, ransomware, workforceProtection. | False |
+ | Priority | Incident priority to filter in Exabeam. Possible values are: low, medium, high, critical. | False |
+ | Status | Incident status to filter in Exabeam. Possible values are: closed, closedFalsePositive, inprogress, new, pending, resolved. | False |
+ | Fetch incidents | | False |
+ | Max incidents per fetch | | False |
+ | First fetch timestamp (<number> <time unit>, e.g., 12 hours, 7 days) | | False |
+ | Incident type | | False |
| Trust any certificate (not secure) | | False |
| Use system proxy settings | | False |
@@ -516,7 +527,7 @@ Gets next events for a given asset.
| --- | --- | --- |
| asset_id | ID of the asset. | Required |
| event_time | The event time, e.g. "2 years ago" or "2019-02-27". | Required |
-| number_of_events | Preffered number of events. Default is 50. | Optional |
+| number_of_events | Preferred number of events. Default is 50. | Optional |
| anomaly_only | Whether to return only anomaly events. Possible values are: true, false. Default is false. | Optional |
| event_types | A comma-separated list of event types. | Optional |
| event_types_operator | Whether or not to include the specified event types. Possible values are: include, exclude. Default is exclude. | Optional |
@@ -870,7 +881,7 @@ Gets the assets of a specified watchlist according to a keyword.
| --- | --- | --- |
| keyword | A keyword to search. | Required |
| watchlist_id | The watchlist ID. | Required |
-| limit | Maximum nmber of results to retrieve. Default is 30. | Optional |
+| limit | Maximum number of results to retrieve. Default is 30. | Optional |
| is_exclusive | Whether or not the item is exclusive on watchlist. Possible values are: true, false. Default is false. | Optional |
| search_by_ip | Whether or not to search the item by its IP. Possible values are: true, false. Default is false. | Optional |
@@ -1319,3 +1330,46 @@ Returns sequence event types for the given asset sequence ID and time range.
#### Command Example
```!exabeam-get-sequence-eventtypes asset_sequence_id=asset_sequence_id search_str="search_str"```
+
+
+### exabeam-list-incident
+***
+Returns incidents from Exabeam.
+
+#### Base Command
+
+`exabeam-list-incident`
+#### Input
+
+| **Argument Name** | **Description** | **Required** |
+|-------------------|----------------------------------------------------------------------------| --- |
+| incident_id | The incident ID. | Optional |
+| query | Query string which is a combination of incident type, priority and status. | Optional |
+| incident_type | Incident type to filter in Exabeam. | Optional |
+| priority | Incident priority to filter in Exabeam. | Optional |
+| status | Incident status to filter in Exabeam. | Optional |
+| limit | Maximum number of rules to retrieve. Default is 50. | Optional |
+| page_size | Number of total results in each page. Default is 25. | Optional |
+| page_number | Specific page to query. | Optional |
+| username | When the instance is configure by an API key, it must be used with the username argument. | Optional |
+
+
+#### Context Output
+
+| **Path** | **Type** | **Description** |
+|---------------------------------------| --- |----------------------------------|
+| Exabeam.incidents.incidentId | String | The ID of the incident. |
+| Exabeam.incidents.name | String | The name of the incident. |
+| Exabeam.incidents.fields.startedDate | Date | The starting date of the incident. |
+| Exabeam.incidents.fields.closedDate | Date | The ending date of the incident. |
+| Exabeam.incidents.fields.createdAt | Date | The creation date of the incident. |
+| Exabeam.incidents.fields.owner | String | The incident owner. |
+| Exabeam.incidents.fields.status | String | The incident status. |
+| Exabeam.incidents.fields.incidentType | String | The incident type. |
+| Exabeam.incidents.fields.source | String | The incident source. |
+| Exabeam.incidents.fields.priority | String | The incident priority. |
+| Exabeam.incidents.fields.queue | String | The incident queue. |
+| Exabeam.incidents.fields.description | String | The incident description. |
+
+#### Command Example
+```!exabeam-list-incident priority=high```
diff --git a/Packs/Exabeam/Integrations/Exabeam/test_data/response_constants.py b/Packs/Exabeam/Integrations/Exabeam/test_data/response_constants.py
index 1c344aad8538..2157c5a8aac5 100644
--- a/Packs/Exabeam/Integrations/Exabeam/test_data/response_constants.py
+++ b/Packs/Exabeam/Integrations/Exabeam/test_data/response_constants.py
@@ -233,3 +233,14 @@
'record': {'key': '', 'id': 'test_key'}
}],
'metadata': {'createdSize': 0, 'updatedSize': 0, 'removedSize': 1, 'duplicates': []}}
+
+
+RESPONSE_INCIDENT_LIST = {'totalCount': 341, 'offset': 0, 'count': 1, 'maxCount': 10000,
+ 'incidents': [{'incidentId': 'SOC-19', 'name': 'phil: Notable AA Session',
+ 'fields': {'updatedAt': 1608020359407, 'priority': 'medium',
+ 'source': 'Exabeam AA', 'queue': '1', 'startedDate': 1607999470130,
+ 'incidentType': ['generic', 'ueba'], 'status': 'new',
+ 'createdAt': 1608020359194, 'createdBy': 'admin',
+ 'owner': 'unassigned', 'vendor': 'Exabeam', 'updatedBy': 'admin',
+ 'restrictTo': None, 'sourceId': 'phil-20201215023110'}}]}
+
diff --git a/Packs/Exabeam/Integrations/Exabeam/test_data/response_incidents.py b/Packs/Exabeam/Integrations/Exabeam/test_data/response_incidents.py
new file mode 100644
index 000000000000..dc603a4cb1a5
--- /dev/null
+++ b/Packs/Exabeam/Integrations/Exabeam/test_data/response_incidents.py
@@ -0,0 +1,418 @@
+INCIDENTS = {
+ "totalCount": 23,
+ "offset": 0,
+ "count": 23,
+ "maxCount": 10000,
+ "incidents": [
+ {
+ "incidentId": "SOC-402",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670420803000,
+ "createdAt": 1670421189876,
+ "createdBy": "admin",
+ "updatedAt": 1670421199904,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-403",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670421787000,
+ "createdAt": 1670422094457,
+ "createdBy": "admin",
+ "updatedAt": 1670422101646,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-404",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670422364000,
+ "createdAt": 1670422689455,
+ "createdBy": "admin",
+ "updatedAt": 1670422697329,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-405",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670422846000,
+ "createdAt": 1670423294446,
+ "createdBy": "admin",
+ "updatedAt": 1670423301789,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-406",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670486326000,
+ "createdAt": 1670486609451,
+ "createdBy": "admin",
+ "updatedAt": 1670486615032,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-407",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670487741000,
+ "createdAt": 1670488109448,
+ "createdBy": "admin",
+ "updatedAt": 1670488119700,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-408",
+ "name": "Exabeam Alert Create a new TestService using cmdexe found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670487755000,
+ "createdAt": 1670488109588,
+ "createdBy": "admin",
+ "updatedAt": 1670488120487,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-409",
+ "name": "Exabeam Alert ENCODEDECODE A FILE USING CERTUTIL TOOL found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670487753000,
+ "createdAt": 1670488109713,
+ "createdBy": "admin",
+ "updatedAt": 1670488121356,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-410",
+ "name": "Exabeam Alert User Create or Delete found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670488527000,
+ "createdAt": 1670488709459,
+ "createdBy": "admin",
+ "updatedAt": 1670488727692,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-411",
+ "name": "Exabeam Alert Active Service Discovery via Net Tool found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670488515000,
+ "createdAt": 1670488709610,
+ "createdBy": "admin",
+ "updatedAt": 1670488728528,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-412",
+ "name": "Exabeam Alert EXECUTE POWERSHELL DOWNLOADSTRING METHOD found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670488526000,
+ "createdAt": 1670488709736,
+ "createdBy": "admin",
+ "updatedAt": 1670488729348,
+ "updatedBy": "system",
+ },
+ },
+ {
+ "incidentId": "SOC-413",
+ "name": "Exabeam Alert GATHER CREDENTIALS USING MIMIKATZ TOOL found",
+ "baseFields": {
+ "incidentType": ["ueba"],
+ "owner": "unassigned",
+ "queue": "1",
+ "priority": "medium",
+ "status": "new",
+ "startedDate": 1670488535000,
+ "createdAt": 1670488709864,
+ "createdBy": "admin",
+ "updatedAt": 1670488730162,
+ "updatedBy": "system",
+ },
+ },
+ ],
+}
+
+EXPECTED_INCIDENTS = {
+ 'first_fetch': [
+ {
+ 'incidentId': 'SOC-402',
+ 'name': 'Exabeam Alert Active Service Discovery via Net Tool found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-07T13:46:43Z',
+ 'createdAt': '2022-12-07T13:53:09Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-07T13:53:19Z',
+ 'updatedBy': 'system'
+ }
+ },
+ {
+ 'incidentId': 'SOC-403',
+ 'name': 'Exabeam Alert Active Service Discovery via Net Tool found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-07T14:03:07Z',
+ 'createdAt': '2022-12-07T14:08:14Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-07T14:08:21Z',
+ 'updatedBy': 'system'
+ }
+ },
+ {
+ 'incidentId': 'SOC-404',
+ 'name': 'Exabeam Alert Active Service Discovery via Net Tool found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-07T14:12:44Z',
+ 'createdAt': '2022-12-07T14:18:09Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-07T14:18:17Z',
+ 'updatedBy': 'system'
+ }
+ }],
+ 'second_fetch': [
+ {
+ 'incidentId': 'SOC-405',
+ 'name': 'Exabeam Alert Active Service Discovery via Net Tool found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-07T14:20:46Z',
+ 'createdAt': '2022-12-07T14:28:14Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-07T14:28:21Z',
+ 'updatedBy': 'system'
+ }
+ },
+ {
+ 'incidentId': 'SOC-406',
+ 'name': 'Exabeam Alert Active Service Discovery via Net Tool found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-08T07:58:46Z',
+ 'createdAt': '2022-12-08T08:03:29Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-08T08:03:35Z',
+ 'updatedBy': 'system'
+ }
+ },
+ {
+ 'incidentId': 'SOC-407',
+ 'name': 'Exabeam Alert Active Service Discovery via Net Tool found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-08T08:22:21Z',
+ 'createdAt': '2022-12-08T08:28:29Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-08T08:28:39Z',
+ 'updatedBy': 'system'
+ }
+ }],
+ 'third_fetch': [
+ {
+ 'incidentId': 'SOC-408',
+ 'name': 'Exabeam Alert Create a new TestService using cmdexe found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-08T08:22:35Z',
+ 'createdAt': '2022-12-08T08:28:29Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-08T08:28:40Z',
+ 'updatedBy': 'system'
+ }
+ },
+ {
+ 'incidentId': 'SOC-409',
+ 'name': 'Exabeam Alert ENCODEDECODE A FILE USING CERTUTIL TOOL found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-08T08:22:33Z',
+ 'createdAt': '2022-12-08T08:28:29Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-08T08:28:41Z',
+ 'updatedBy': 'system'
+ }
+ },
+ {
+ 'incidentId': 'SOC-410',
+ 'name': 'Exabeam Alert User Create or Delete found',
+ 'baseFields': {
+ 'incidentType': [
+ 'ueba'
+ ],
+ 'owner': 'unassigned',
+ 'queue': '1',
+ 'priority': 'medium',
+ 'status': 'new',
+ 'startedDate': '2022-12-08T08:35:27Z',
+ 'createdAt': '2022-12-08T08:38:29Z',
+ 'createdBy': 'admin',
+ 'updatedAt': '2022-12-08T08:38:47Z',
+ 'updatedBy': 'system'
+ }
+ }],
+}
+
+EXPECTED_LAST_RUN = {
+ 'first_fetch': {
+ 'limit': 6,
+ 'time': '2022-12-22T13:53:05.195302',
+ 'found_incident_ids': {
+ 'SOC-402': '',
+ 'SOC-403': '',
+ 'SOC-404': '',
+ }
+ },
+ 'second_fetch': {
+ 'limit': 9,
+ 'time': '2022-12-22T13:53:05.195302',
+ 'found_incident_ids': {
+ 'SOC-405': '',
+ 'SOC-406': '',
+ 'SOC-407': '',
+ }
+ },
+ 'third_fetch': {
+ 'limit': 12,
+ 'time': '2022-12-22T13:53:05.195302',
+ 'found_incident_ids': {
+ 'SOC-408': '',
+ 'SOC-409': '',
+ 'SOC-410': '',
+ }
+ },
+}
+
+EXPECTED_CALL_ARGS = {
+ 'queryMap': {
+ 'status': ['new'],
+ 'incidentType': [
+ 'generic', 'abnormalAuth'
+ ],
+ 'priority': [
+ 'medium'
+ ],
+ 'createdAt': [
+ '1671717185195', '1671976385145'
+ ]
+ },
+ 'sortBy': 'createdAt',
+ 'sortOrder': 'asc',
+ 'idOnly': False,
+ 'offset': 0,
+ 'length': 3
+}
diff --git a/Packs/Exabeam/Integrations/Exabeam/test_data/result_constants.py b/Packs/Exabeam/Integrations/Exabeam/test_data/result_constants.py
index 72d9bec3c448..98f17d040d3e 100644
--- a/Packs/Exabeam/Integrations/Exabeam/test_data/result_constants.py
+++ b/Packs/Exabeam/Integrations/Exabeam/test_data/result_constants.py
@@ -194,3 +194,11 @@
'record': {'key': '', 'id': 'test_key'}
}]
}
+
+EXPECTED_INCIDENT_LIST = {'Exabeam.Incident(val.incidentId && val.incidentId === obj.incidentId)':
+ [{'incidentId': 'SOC-19', 'name': 'phil: Notable AA Session',
+ 'fields': {'startedDate': '2020-12-15T02:31:10.130000', 'closedDate': None,
+ 'createdAt': '2020-12-15T08:19:19.194000', 'owner': 'unassigned',
+ 'status': 'new', 'incidentType': ['generic', 'ueba'],
+ 'source': 'Exabeam AA', 'priority': 'medium', 'queue': '1',
+ 'description': None}}]}
diff --git a/Packs/Exabeam/ReleaseNotes/2_2_0.md b/Packs/Exabeam/ReleaseNotes/2_2_0.md
new file mode 100644
index 000000000000..94ab8757e3ed
--- /dev/null
+++ b/Packs/Exabeam/ReleaseNotes/2_2_0.md
@@ -0,0 +1,18 @@
+
+#### Integrations
+##### Exabeam
+- Updated the Docker image to: *demisto/python3:3.10.9.42008*.
+- Added the ***fetch-incidents*** command.
+- Added the ***exabeam-list-incidents*** command.
+
+
+#### Mappers
+##### New: Exabeam mapping
+Added the new **Exabeam mapping** mapper.
+
+#### Incident Fields
+- **Exabeam Id**
+- **Exabeam Queue**
+
+#### Incident Types
+- **Exabeam Incident**
diff --git a/Packs/Exabeam/ReleaseNotes/2_2_1.md b/Packs/Exabeam/ReleaseNotes/2_2_1.md
new file mode 100644
index 000000000000..a73cc7f19c64
--- /dev/null
+++ b/Packs/Exabeam/ReleaseNotes/2_2_1.md
@@ -0,0 +1,7 @@
+
+#### Integrations
+##### Exabeam
+- Updated the Docker image to: *demisto/python3:3.10.9.45313*.
+- Fixed an issue where ***fetch-incidents*** failed when using with api key.
+- Added a *API Token* parameter, when using with api key insert in this parameter.
+- Updated the configuration description for `Authentication Methods`.
diff --git a/Packs/Exabeam/ReleaseNotes/2_2_2.md b/Packs/Exabeam/ReleaseNotes/2_2_2.md
new file mode 100644
index 000000000000..9677159e998c
--- /dev/null
+++ b/Packs/Exabeam/ReleaseNotes/2_2_2.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### Exabeam
+- Fixed an issue where the authentication failed with existing token configuration.
\ No newline at end of file
diff --git a/Packs/Exabeam/ReleaseNotes/2_2_3.md b/Packs/Exabeam/ReleaseNotes/2_2_3.md
new file mode 100644
index 000000000000..a100a6303084
--- /dev/null
+++ b/Packs/Exabeam/ReleaseNotes/2_2_3.md
@@ -0,0 +1,4 @@
+#### Integrations
+##### Exabeam
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
+- Fixed an issue where the fetch-incidents command did not fetch incidents automatically.
\ No newline at end of file
diff --git a/Packs/Exabeam/pack_metadata.json b/Packs/Exabeam/pack_metadata.json
index 584b0ff116b9..514541afbc7d 100644
--- a/Packs/Exabeam/pack_metadata.json
+++ b/Packs/Exabeam/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "Exabeam",
"description": "The Exabeam Security Management Platform provides end-to-end detection, User Event Behavioral Analytics, and SOAR.",
"support": "xsoar",
- "currentVersion": "2.1.9",
+ "currentVersion": "2.2.3",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
diff --git a/Packs/ExceedLMS/ReleaseNotes/1_0_5.md b/Packs/ExceedLMS/ReleaseNotes/1_0_5.md
new file mode 100644
index 000000000000..0cc064a3fdca
--- /dev/null
+++ b/Packs/ExceedLMS/ReleaseNotes/1_0_5.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### ExceedLMS IAM
+- Updated the IAMApiModule.
diff --git a/Packs/ExceedLMS/pack_metadata.json b/Packs/ExceedLMS/pack_metadata.json
index 9fea6d45e517..979cb1cc0e94 100644
--- a/Packs/ExceedLMS/pack_metadata.json
+++ b/Packs/ExceedLMS/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "Exceed LMS",
"description": "A specialized LMS and Phishing Simulator created to manage security awareness content for small, medium and large enterprise organizations.",
"support": "xsoar",
- "currentVersion": "1.0.4",
+ "currentVersion": "1.0.5",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
diff --git a/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/Exchange2016_Compliance.yml b/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/Exchange2016_Compliance.yml
index b9365fc82ba2..e18ac0a5cf93 100644
--- a/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/Exchange2016_Compliance.yml
+++ b/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/Exchange2016_Compliance.yml
@@ -1,10 +1,11 @@
commonfields:
id: Exchange 2016 Compliance Search
version: -1
+deprecated: true
name: Exchange 2016 Compliance Search
-display: Exchange 2016 Compliance Search
-category: Messaging
-description: Exchange Server 2016 Compliance Search enables you to search for and delete an email message from all mailboxes in your organization.
+display: Exchange 2016 Compliance Search (Deprecated)
+category: Messaging and Conferencing
+description: Deprecated. Use EWS V2 instead.
configuration:
- display: DOMAIN\USERNAME (e.g., DEMISTO.INT\admin)
name: credentials
diff --git a/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/README.md b/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/README.md
index b3c1ecbfe2aa..a6520ce39e4a 100644
--- a/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/README.md
+++ b/Packs/Exchange2016_Compliance/Integrations/Exchange2016_Compliance/README.md
@@ -1,5 +1,8 @@
+
Deprecated, use EWS V2 instead.
+
+
Use this integration to run and manage compliance searches on your Exchange 2016 Server.
diff --git a/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_6.md b/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_6.md
new file mode 100644
index 000000000000..f0a10e58ab4b
--- /dev/null
+++ b/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_6.md
@@ -0,0 +1,3 @@
+#### Integrations
+##### Exchange 2016 Compliance Search (Deprecated)
+-Note: Deprecated. Use the **EWS V2** integration instead.
\ No newline at end of file
diff --git a/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_7.md b/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_7.md
new file mode 100644
index 000000000000..b93cc807ee86
--- /dev/null
+++ b/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_7.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### Exchange 2016 Compliance Search (Deprecated)
+Updated the integration category to *Messaging and Conferencing*.
diff --git a/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_8.md b/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_8.md
new file mode 100644
index 000000000000..adc37fc63e55
--- /dev/null
+++ b/Packs/Exchange2016_Compliance/ReleaseNotes/1_0_8.md
@@ -0,0 +1,3 @@
+##### Exchange2016_Compliance
+
+- Documentation and metadata improvements.
\ No newline at end of file
diff --git a/Packs/Exchange2016_Compliance/pack_metadata.json b/Packs/Exchange2016_Compliance/pack_metadata.json
index 9b3791ff6bf1..e88dc67e0741 100644
--- a/Packs/Exchange2016_Compliance/pack_metadata.json
+++ b/Packs/Exchange2016_Compliance/pack_metadata.json
@@ -2,13 +2,13 @@
"name": "Exchange 2016 Compliance Search",
"description": "Exchange Server 2016 Compliance Search enables you to search for and delete an email message from all mailboxes in your organization.",
"support": "xsoar",
- "currentVersion": "1.0.5",
+ "currentVersion": "1.0.8",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
"created": "2020-04-14T00:00:00Z",
"categories": [
- "IT Services"
+ "Messaging and Conferencing"
],
"tags": [
"Use Case"
diff --git a/Packs/ExifRead/.pack-ignore b/Packs/ExifRead/.pack-ignore
index e69de29bb2d1..9e4bcbab3345 100644
--- a/Packs/ExifRead/.pack-ignore
+++ b/Packs/ExifRead/.pack-ignore
@@ -0,0 +1,2 @@
+[file:1_0_4.md]
+ignore=RN113, RN114
\ No newline at end of file
diff --git a/Packs/ExifRead/ReleaseNotes/1_0_4.md b/Packs/ExifRead/ReleaseNotes/1_0_4.md
new file mode 100644
index 000000000000..cb221348e879
--- /dev/null
+++ b/Packs/ExifRead/ReleaseNotes/1_0_4.md
@@ -0,0 +1,4 @@
+
+#### Scripts
+##### ExifRead
+- Updated the Docker image to: *demisto/py3-tools:1.0.0.45198*.
\ No newline at end of file
diff --git a/Packs/ExifRead/ReleaseNotes/1_0_5.json b/Packs/ExifRead/ReleaseNotes/1_0_5.json
new file mode 100644
index 000000000000..392ac4799192
--- /dev/null
+++ b/Packs/ExifRead/ReleaseNotes/1_0_5.json
@@ -0,0 +1 @@
+{"breakingChanges":true,"breakingChangesNotes":"The script ExifRead moved to *CommonScripts* pack. Make sure to update the *CommonScripts* pack to the latest version in order to use the script."}
\ No newline at end of file
diff --git a/Packs/ExifRead/ReleaseNotes/1_0_5.md b/Packs/ExifRead/ReleaseNotes/1_0_5.md
new file mode 100644
index 000000000000..f451d4c06813
--- /dev/null
+++ b/Packs/ExifRead/ReleaseNotes/1_0_5.md
@@ -0,0 +1,4 @@
+
+#### Scripts
+##### ExifRead
+- Note: Moved to the *CommonScripts* pack.
\ No newline at end of file
diff --git a/Packs/ExifRead/pack_metadata.json b/Packs/ExifRead/pack_metadata.json
index b89c87ffaa44..fbce81eb723a 100644
--- a/Packs/ExifRead/pack_metadata.json
+++ b/Packs/ExifRead/pack_metadata.json
@@ -1,8 +1,8 @@
{
- "name": "ExifRead",
- "description": "Read image files metadata and provide Exif tags.",
+ "name": "ExifRead (deprecated)",
+ "description": "Deprecated. Use from CommonScripts instead.",
"support": "xsoar",
- "currentVersion": "1.0.3",
+ "currentVersion": "1.0.5",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
@@ -16,5 +16,6 @@
"marketplaces": [
"xsoar",
"marketplacev2"
- ]
+ ],
+ "hidden": true
}
\ No newline at end of file
diff --git a/Packs/Expanse/.pack-ignore b/Packs/Expanse/.pack-ignore
index 49b4fb41047b..7747e02e2aff 100644
--- a/Packs/Expanse/.pack-ignore
+++ b/Packs/Expanse/.pack-ignore
@@ -11,4 +11,7 @@ ignore=RM102,RM104
ignore=BA101
[file:layoutscontainer-Expanse_Behavior.json]
-ignore=BA101
\ No newline at end of file
+ignore=BA101
+
+[file:Expanse_image.png]
+ignore=IM111
\ No newline at end of file
diff --git a/Packs/ExpanseV2/.pack-ignore b/Packs/ExpanseV2/.pack-ignore
index fdcb3001a471..072cc3718a18 100644
--- a/Packs/ExpanseV2/.pack-ignore
+++ b/Packs/ExpanseV2/.pack-ignore
@@ -15,12 +15,6 @@ ignore=IF100
[file:incidentfield-Expanse_Issue_Type.json]
ignore=IF100
-[file:ExpanseV2.yml]
-ignore=IN145
-
-[file:FeedExpanse.yml]
-ignore=IN145
-
[file:ExpanseV2_image.png]
ignore=IM111
diff --git a/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.py b/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.py
index c8350eb6627b..f5bbf53f3978 100644
--- a/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.py
+++ b/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.py
@@ -394,7 +394,8 @@ def manage_asset_tags(self, asset_type: str, operation_type: str, asset_id: str,
return self._http_request(
method='POST',
url_suffix=f'/v2/{endpoint_base}/tag-assignments/bulk',
- json_data=data
+ json_data=data,
+ retries=3
)
def manage_asset_pocs(self, asset_type: str, operation_type: str, asset_id: str, poc_ids: List[str]) -> Dict[str, Any]:
@@ -2551,7 +2552,7 @@ def main() -> None:
params = demisto.params()
args = demisto.args()
command = demisto.command()
- api_key = params.get("apikey")
+ api_key = params.get('credentials', {}).get('password', '') or params.get("apikey", '')
base_url = urljoin(params.get("url", "").rstrip("/"), "/api")
verify_certificate = not params.get("insecure", False)
proxy = params.get("proxy", False)
diff --git a/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.yml b/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.yml
index 7a53d8bb2ae3..f498cc38eebb 100644
--- a/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.yml
+++ b/Packs/ExpanseV2/Integrations/ExpanseV2/ExpanseV2.yml
@@ -1,4 +1,7 @@
category: Data Enrichment & Threat Intelligence
+sectionOrder:
+- Connect
+- Collect
commonfields:
id: ExpanseV2
version: -1
@@ -8,37 +11,51 @@ configuration:
name: url
required: true
type: 0
-- additionalinfo: Xpanse API Key to use to connect.
- display: API Key
+- name: credentials
+ type: 9
+ displaypassword: API Key
+ hiddenusername: true
+ section: Connect
+- display: API Key
name: apikey
- required: true
type: 4
+ additionalinfo: Xpanse API Key to use to connect.
+ hidden: true
+ section: Connect
- display: Trust any certificate (not secure)
name: insecure
required: false
type: 8
+ section: Connect
+ advanced: true
- display: Use system proxy settings
name: proxy
required: false
type: 8
+ section: Connect
+ advanced: true
- display: Fetch incidents
name: isFetch
required: false
type: 8
+ section: Collect
- display: Incident type
name: incidentType
required: false
type: 13
+ section: Connect
- defaultvalue: '10'
display: Maximum number of incidents per fetch
name: max_fetch
required: false
type: 0
+ section: Collect
- defaultvalue: 3 days
display: First fetch time
name: first_fetch
required: false
type: 0
+ section: Collect
- display: Fetch Xpanse issues with Priority
name: priority
options:
@@ -48,6 +65,8 @@ configuration:
- Critical
required: false
type: 16
+ section: Collect
+ advanced: true
- defaultvalue: Active
display: Fetch Xpanse issues with Activity Status
name: activity_status
@@ -56,6 +75,8 @@ configuration:
- Inactive
required: false
type: 16
+ section: Collect
+ advanced: true
- display: Fetch Xpanse issues with Progress Status
name: progress_status
options:
@@ -66,18 +87,26 @@ configuration:
- Resolved
required: false
type: 16
+ section: Collect
+ advanced: true
- display: Fetch issues with Business Units (comma separated string)
name: business_unit
required: false
type: 0
+ section: Collect
+ advanced: true
- display: Fetch issues with Tags (comma separated string)
name: tag
required: false
type: 0
+ section: Collect
+ advanced: true
- display: Fetch issue with Types (comma separated string)
name: issue_type
required: false
type: 0
+ section: Collect
+ advanced: true
- display: Fetch Xpanse issues with Cloud Management Status
name: cloud_management_status
options:
@@ -86,6 +115,8 @@ configuration:
- UnmanagedCloud
required: false
type: 16
+ section: Collect
+ advanced: true
- defaultvalue: None
display: Incident Mirroring Direction
hidden: false
@@ -97,27 +128,30 @@ configuration:
- Both
required: false
type: 15
+ section: Collect
- defaultvalue: 'false'
display: Sync Incident Owners
hidden: false
name: sync_owners
required: false
type: 8
-- additionalinfo: Assign these XSOAR tags (comma separated list) to the incoming comments
- mirrored from the Xpanse Issue (must be different from the sync_tags to prevent
- loops).
+ section: Collect
+ advanced: true
+- additionalinfo: Assign these XSOAR tags (comma separated list) to the incoming comments mirrored from the Xpanse Issue (must be different from the sync_tags to prevent loops).
defaultvalue: FromExpanse
display: Tag(s) for mirrored comments
name: incoming_tags
required: false
type: 0
-- additionalinfo: Mirror XSOAR entries with these XSOAR tags (comma separate list)
- to the corresponding Xpanse Issue as comments (must be different from the incoming_tags
- to prevent loops).
+ section: Collect
+ advanced: true
+- additionalinfo: Mirror XSOAR entries with these XSOAR tags (comma separate list) to the corresponding Xpanse Issue as comments (must be different from the incoming_tags to prevent loops).
display: Mirror out Entries with tag(s)
name: sync_tags
required: false
type: 0
+ section: Collect
+ advanced: true
- additionalinfo: Reliability of the source providing the intelligence data.
defaultvalue: B - Usually reliable
display: Source Reliability
@@ -132,6 +166,7 @@ configuration:
- F - Reliability cannot be judged
required: false
type: 15
+ section: Collect
- defaultvalue: indicatorType
name: feedExpirationPolicy
display: ''
@@ -142,15 +177,16 @@ configuration:
- suddenDeath
required: false
type: 17
+ section: Collect
+ advanced: true
- defaultvalue: '20160'
name: feedExpirationInterval
display: ''
required: false
type: 1
-description: The Xpanse integration for Cortex XSOAR leverages the Expander API
- to create incidents from Xpanse issues. It also leverages Xpanse's unparalleled
- view of the Internet to enrich IPs, domains and certificates using information from
- assets discovered by Xpanse Expander and risky flows detected by Xpanse Behavior.
+ section: Collect
+ advanced: true
+description: The Xpanse integration for Cortex XSOAR leverages the Expander API to create incidents from Xpanse issues. It also leverages Xpanse's unparalleled view of the Internet to enrich IPs, domains and certificates using information from assets discovered by Xpanse Expander and risky flows detected by Xpanse Behavior.
display: Cortex Xpanse
name: ExpanseV2
script:
@@ -195,8 +231,7 @@ script:
description: Description for asset reference reason
type: String
- contextPath: Expanse.Service.businessUnits.id
- description: The internal Xpanse ID for the business unit the affected asset
- belongs to
+ description: The internal Xpanse ID for the business unit the affected asset belongs to
type: String
- contextPath: Expanse.Service.businessUnits.name
description: The name of the business unit the affected asset belongs to
@@ -527,88 +562,74 @@ script:
required: false
secret: false
- default: false
- description: Returns only results whose contents match the given query. Query
- can be any generic string (ex. telnet).
+ description: Returns only results whose contents match the given query. Query can be any generic string (ex. telnet).
isArray: false
name: content_search
required: false
secret: false
- default: false
- description: Returns only results that were found on the given providers (comma
- separated string).
+ description: Returns only results that were found on the given providers (comma separated string).
isArray: true
name: provider
required: false
secret: false
- default: false
- description: Returns only results with a business unit whose name falls in the
- provided list (comma separated string).
+ description: Returns only results with a business unit whose name falls in the provided list (comma separated string).
isArray: true
name: business_unit
required: false
secret: false
- default: false
- description: Returns only results whose service type name (or classification
- ID) matches one of the given types (comma separated string).
+ description: Returns only results whose service type name (or classification ID) matches one of the given types (comma separated string).
isArray: true
name: service_type
required: false
secret: false
- default: false
- description: Returns results whose identifier includes an IP matching the query.
- Search for results in a given IP/CIDR block using a single IP (d.d.d.d), a
- dashed IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR
- (d.d.), or a wildcard (d.d.*.d).
+ description: Returns results whose identifier includes an IP matching the query. Search for results in a given IP/CIDR block using a single IP (d.d.d.d), a dashed IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR (d.d.), or a wildcard (d.d.*.d).
isArray: false
name: inet_search
required: false
secret: false
- default: false
- description: Returns results whose identifier includes a domain matching the
- query.
+ description: Returns results whose identifier includes a domain matching the query.
isArray: false
name: domain_search
required: false
secret: false
- default: false
- description: Returns only results whose identifier includes one of the given
- port numbers (comma separated list).
+ description: Returns only results whose identifier includes one of the given port numbers (comma separated list).
isArray: true
name: port_number
required: false
secret: false
- default: false
- description: Returns only results whose discovery type matches one of the given
- values (comma separated string, options are 'ColocatedOnIp', 'DirectlyDiscovered').
+ description: Returns only results whose discovery type matches one of the given values (comma separated string, options are 'ColocatedOnIp', 'DirectlyDiscovered').
isArray: true
name: discovery_type
required: false
secret: false
- default: false
- description: Returns only results whose country code matches one of the given
- ISO-3166 two character country codes (comma separated list).
+ description: Returns only results whose country code matches one of the given ISO-3166 two character country codes (comma separated list).
isArray: true
name: country_code
required: false
secret: false
- default: false
- description: Returns only results whose activity status matches one of the given
- values. (comma separated string, options are 'Active', 'Inactive').
+ description: Returns only results whose activity status matches one of the given values. (comma separated string, options are 'Active', 'Inactive').
isArray: true
name: activity_status
required: false
secret: false
- default: false
- description: Returns only results that are associated with the provided tag
- names (comma separated string).
+ description: Returns only results that are associated with the provided tag names (comma separated string).
isArray: true
name: tag
required: false
secret: false
- auto: PREDEFINED
default: false
- description: Returns only results whose cloud management status is the following:(comma-separated
- string, options are 'NotApplicable', 'ManagedCloud', 'UnmanagedCloud').
+ description: Returns only results whose cloud management status is the following:(comma-separated string, options are 'NotApplicable', 'ManagedCloud', 'UnmanagedCloud').
isArray: true
name: cloud_management_status
predefined:
@@ -665,8 +686,7 @@ script:
description: Description for asset reference reason
type: String
- contextPath: Expanse.Service.businessUnits.id
- description: The internal Xpanse ID for the business unit the affected asset
- belongs to
+ description: The internal Xpanse ID for the business unit the affected asset belongs to
type: String
- contextPath: Expanse.Service.businessUnits.name
description: The name of the business unit the affected asset belongs to
@@ -1003,76 +1023,62 @@ script:
required: false
secret: false
- default: false
- description: Returns only results that were found on the given providers (comma
- separated string).
+ description: Returns only results that were found on the given providers (comma separated string).
isArray: true
name: provider
required: false
secret: false
- default: false
- description: Returns only results with a business unit whose name falls in the
- provided list (comma separated string).
+ description: Returns only results with a business unit whose name falls in the provided list (comma separated string).
isArray: true
name: business_unit
required: false
secret: false
- default: false
- description: Returns only results whose assignee's username matches one of the
- given usernames. Use "Unassigned" to fetch issues that are not assigned to
- any user.
+ description: Returns only results whose assignee's username matches one of the given usernames. Use "Unassigned" to fetch issues that are not assigned to any user.
isArray: true
name: assignee
required: false
secret: false
- default: false
- description: Returns only results whose issue type name matches one of the given
- types (comma separated string).
+ description: Returns only results whose issue type name matches one of the given types (comma separated string).
isArray: true
name: issue_type
required: false
secret: false
- default: false
- description: Returns results whose identifier includes an IP matching the query.
- Search for results in a given IP/CIDR block using a single IP (d.d.d.d), a
- dashed IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR
- (d.d.), or a wildcard (d.d.*.d).
+ description: Returns results whose identifier includes an IP matching the query. Search for results in a given IP/CIDR block using a single IP (d.d.d.d), a dashed IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR (d.d.), or a wildcard (d.d.*.d).
isArray: false
name: inet_search
required: false
secret: false
- default: false
- description: Returns results whose identifier includes a domain matching the
- query.
+ description: Returns results whose identifier includes a domain matching the query.
isArray: false
name: domain_search
required: false
secret: false
- default: false
- description: Returns only results whose identifier includes one of the given
- port numbers (comma separated list).
+ description: Returns only results whose identifier includes one of the given port numbers (comma separated list).
isArray: true
name: port_number
required: false
secret: false
- default: false
- description: Returns only results whose priority matches one of the given values
- (comma separated string, options are 'Low', 'Medium', 'High', 'Critical').
+ description: Returns only results whose priority matches one of the given values (comma separated string, options are 'Low', 'Medium', 'High', 'Critical').
isArray: true
name: priority
required: false
secret: false
- default: false
- description: Returns only results whose progress status matches one of the given
- values (comma separated string, options are 'New', 'Investigating', 'InProgress',
- 'AcceptableRisk', 'Resolved').
+ description: Returns only results whose progress status matches one of the given values (comma separated string, options are 'New', 'Investigating', 'InProgress', 'AcceptableRisk', 'Resolved').
isArray: true
name: progress_status
required: false
secret: false
- auto: PREDEFINED
default: false
- description: Returns only results whose activity status matches one of the given
- values.
+ description: Returns only results whose activity status matches one of the given values.
isArray: true
name: activity_status
predefined:
@@ -1081,44 +1087,38 @@ script:
required: false
secret: false
- default: false
- description: Returns only results that are associated with the provided tag
- names (comma separated string).
+ description: Returns only results that are associated with the provided tag names (comma separated string).
isArray: true
name: tag
required: false
secret: false
- default: false
- description: Returns only results created before the provided timestamp (ISO8601
- format YYYY-MM-DDTHH:MM:SSZ).
+ description: Returns only results created before the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ).
isArray: false
name: created_before
required: false
secret: false
- default: false
- description: Returns only results created after the provided timestamp (ISO8601
- format YYYY-MM-DDTHH:MM:SSZ).
+ description: Returns only results created after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ).
isArray: false
name: created_after
required: false
secret: false
- default: false
- description: Returns only results modified before the provided timestamp (ISO8601
- format YYYY-MM-DDTHH:MM:SSZ).
+ description: Returns only results modified before the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ).
isArray: false
name: modified_before
required: false
secret: false
- default: false
- description: Returns only results modified after the provided timestamp (ISO8601
- format YYYY-MM-DDTHH:MM:SSZ).
+ description: Returns only results modified after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ).
isArray: false
name: modified_after
required: false
secret: false
- auto: PREDEFINED
default: false
- description: Returns only results whose cloud management status is the following.
- (comma separated string, options are 'NotApplicable', 'ManagedCloud', 'UnmanagedCloud').
+ description: Returns only results whose cloud management status is the following. (comma separated string, options are 'NotApplicable', 'ManagedCloud', 'UnmanagedCloud').
isArray: true
name: cloud_management_status
predefined:
@@ -1180,8 +1180,7 @@ script:
description: The username of the user that has been assigned to the issue
type: String
- contextPath: Expanse.Issue.businessUnits.id
- description: The internal Xpanse ID for the business unit the affected asset
- belongs to
+ description: The internal Xpanse ID for the business unit the affected asset belongs to
type: String
- contextPath: Expanse.Issue.businessUnits.name
description: The name of the business unit the affected asset belongs to
@@ -1322,8 +1321,7 @@ script:
description: The issuer in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.issuerAlternativeNames
- description: The issuer alternative names in the certificate in the initial
- observation
+ description: The issuer alternative names in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.issuerCountry
description: The issuer country in the certificate in the initial observation
@@ -1383,8 +1381,7 @@ script:
description: The subject in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.subjectAlternativeNames
- description: The subject alternative names in the certificate in the initial
- observation
+ description: The subject alternative names in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.subjectCountry
description: The subject country in the certificate in the initial observation
@@ -1492,8 +1489,7 @@ script:
description: The name of the issue type
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.formattedIssuerOrg
- description: The formatted issuer org in the certificate in the most recent
- observation
+ description: The formatted issuer org in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.id
description: The Internal Xpanse certificate ID in the most recent observation
@@ -1502,8 +1498,7 @@ script:
description: The issuer in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.issuerAlternativeNames
- description: The issuer alternative names in the certificate in the most recent
- observation
+ description: The issuer alternative names in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.issuerCountry
description: The issuer country in the certificate in the most recent observation
@@ -1539,8 +1534,7 @@ script:
description: The public key in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeyAlgorithm
- description: The public key algorithm in the certificate in the most recent
- observation
+ description: The public key algorithm in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeyBits
description: The public key bits in the certificate in the most recent observation
@@ -1549,8 +1543,7 @@ script:
description: The public key modulus in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeyRsaExponent
- description: The public key RSA exponent in the certificate in the most recent
- observation
+ description: The public key RSA exponent in the certificate in the most recent observation
type: Number
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeySpki
description: The public key Spki in the certificate in the most recent observation
@@ -1565,8 +1558,7 @@ script:
description: The subject in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.subjectAlternativeNames
- description: The subject alternative names in the certificate in the most recent
- observation
+ description: The subject alternative names in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.subjectCountry
description: The subject country in the certificate in the most recent observation
@@ -1590,12 +1582,10 @@ script:
description: The subject state in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.validNotAfter
- description: The valid not after date in the certificate in the most recent
- observation
+ description: The valid not after date in the certificate in the most recent observation
type: Date
- contextPath: Expanse.Issue.latestEvidence.certificate.validNotBefore
- description: The valid not before date in the certificate in the most recent
- observation
+ description: The valid not before date in the certificate in the most recent observation
type: Date
- contextPath: Expanse.Issue.latestEvidence.certificate.version
description: The version in the certificate in the most recent observation
@@ -1692,15 +1682,13 @@ script:
required: true
secret: false
- default: false
- description: Update types to retrieve (comma separated string. Valid options
- are 'Assignee', 'Comment', 'Priority', 'ProgressStatus', 'ActivityStatus')
+ description: Update types to retrieve (comma separated string. Valid options are 'Assignee', 'Comment', 'Priority', 'ProgressStatus', 'ActivityStatus')
isArray: false
name: update_types
required: false
secret: false
- default: false
- description: Returns only updates created after the provided timestamp (ISO8601
- format YYYY-MM-DDTHH:MM:SSZ).
+ description: Returns only updates created after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ).
isArray: false
name: created_after
required: false
@@ -1729,8 +1717,7 @@ script:
description: The previous value of the field that was updated
type: String
- contextPath: Expanse.IssueUpdate.updateType
- description: The type of update that occurred, valid types are ProgressStatus,
- ActivityStatus, Priority, Assignee, and Comment
+ description: The type of update that occurred, valid types are ProgressStatus, ActivityStatus, Priority, Assignee, and Comment
type: String
- contextPath: Expanse.IssueUpdate.user.username
description: The username of the user who made the update
@@ -1746,8 +1733,7 @@ script:
required: true
secret: false
- default: false
- description: Returns only comments created after the provided timestamp (ISO8601
- format YYYY-MM-DDTHH:MM:SSZ).
+ description: Returns only comments created after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ).
isArray: false
name: created_after
required: false
@@ -1770,8 +1756,7 @@ script:
description: The previous value of the field that was updated
type: String
- contextPath: Expanse.IssueComment.updateType
- description: The type of update that occurred, valid types are ProgressStatus,
- ActivityStatus, Priority, Assignee, and Comment
+ description: The type of update that occurred, valid types are ProgressStatus, ActivityStatus, Priority, Assignee, and Comment
type: String
- contextPath: Expanse.IssueComment.user.username
description: The username of the user who made the update
@@ -1823,8 +1808,7 @@ script:
description: The previous value of the field that was updated
type: String
- contextPath: Expanse.IssueUpdate.updateType
- description: The type of update that occurred, valid types are ProgressStatus,
- ActivityStatus, Priority, Assignee, and Comment
+ description: The type of update that occurred, valid types are ProgressStatus, ActivityStatus, Priority, Assignee, and Comment
type: String
- contextPath: Expanse.IssueUpdate.user.username
description: The username of the user who made the update
@@ -1869,8 +1853,7 @@ script:
description: The username of the user that has been assigned to the issue
type: String
- contextPath: Expanse.Issue.businessUnits.id
- description: The internal Xpanse ID for the business unit the affected asset
- belongs to
+ description: The internal Xpanse ID for the business unit the affected asset belongs to
type: String
- contextPath: Expanse.Issue.businessUnits.name
description: The name of the business unit the affected asset belongs to
@@ -2011,8 +1994,7 @@ script:
description: The issuer in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.issuerAlternativeNames
- description: The issuer alternative names in the certificate in the initial
- observation
+ description: The issuer alternative names in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.issuerCountry
description: The issuer country in the certificate in the initial observation
@@ -2072,8 +2054,7 @@ script:
description: The subject in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.subjectAlternativeNames
- description: The subject alternative names in the certificate in the initial
- observation
+ description: The subject alternative names in the certificate in the initial observation
type: String
- contextPath: Expanse.Issue.initialEvidence.certificate.subjectCountry
description: The subject country in the certificate in the initial observation
@@ -2181,8 +2162,7 @@ script:
description: The name of the issue type
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.formattedIssuerOrg
- description: The formatted issuer org in the certificate in the most recent
- observation
+ description: The formatted issuer org in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.id
description: The Internal Xpanse certificate ID in the most recent observation
@@ -2191,8 +2171,7 @@ script:
description: The issuer in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.issuerAlternativeNames
- description: The issuer alternative names in the certificate in the most recent
- observation
+ description: The issuer alternative names in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.issuerCountry
description: The issuer country in the certificate in the most recent observation
@@ -2228,8 +2207,7 @@ script:
description: The public key in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeyAlgorithm
- description: The public key algorithm in the certificate in the most recent
- observation
+ description: The public key algorithm in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeyBits
description: The public key bits in the certificate in the most recent observation
@@ -2238,8 +2216,7 @@ script:
description: The public key modulus in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeyRsaExponent
- description: The public key RSA exponent in the certificate in the most recent
- observation
+ description: The public key RSA exponent in the certificate in the most recent observation
type: Number
- contextPath: Expanse.Issue.latestEvidence.certificate.publicKeySpki
description: The public key Spki in the certificate in the most recent observation
@@ -2254,8 +2231,7 @@ script:
description: The subject in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.subjectAlternativeNames
- description: The subject alternative names in the certificate in the most recent
- observation
+ description: The subject alternative names in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.subjectCountry
description: The subject country in the certificate in the most recent observation
@@ -2279,12 +2255,10 @@ script:
description: The subject state in the certificate in the most recent observation
type: String
- contextPath: Expanse.Issue.latestEvidence.certificate.validNotAfter
- description: The valid not after date in the certificate in the most recent
- observation
+ description: The valid not after date in the certificate in the most recent observation
type: Date
- contextPath: Expanse.Issue.latestEvidence.certificate.validNotBefore
- description: The valid not before date in the certificate in the most recent
- observation
+ description: The valid not before date in the certificate in the most recent observation
type: Date
- contextPath: Expanse.Issue.latestEvidence.certificate.version
description: The version in the certificate in the most recent observation
@@ -2465,8 +2439,7 @@ script:
required: false
secret: false
- default: false
- description: Phone number of Point of Contact. Should be a numeric string (ex.
- 15551234567)
+ description: Phone number of Point of Contact. Should be a numeric string (ex. 15551234567)
isArray: false
name: phone
required: false
@@ -2526,17 +2499,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to assign to the asset (comma separated string).
- If used in combination with 'poc_emails' the lists of pocs are merged. At
- least one poc ID or poc email must be provided.
+ description: IDs of the pocs to assign to the asset (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Email Addresses of the pocs to assign to the asset (comma separated
- string). If used in combination with 'pocs' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: Email Addresses of the pocs to assign to the asset (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2565,17 +2534,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to unassign from the asset (comma separated string).
- If used in combination with 'poc_emails' the lists of pocs are merged. At
- least one poc ID or poc email must be provided.
+ description: IDs of the pocs to unassign from the asset (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Names of the pocs to unassign from the asset (comma separated string).
- If used in combination with 'pocs' the lists of pocs are merged. At least
- one poc ID or poc email must be provided.
+ description: Names of the pocs to unassign from the asset (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2592,17 +2557,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to assign to the IP range (comma separated string).
- If used in combination with 'poc_emails' the lists of pocs are merged. At
- least one poc ID or poc email must be provided.
+ description: IDs of the pocs to assign to the IP range (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Emails of the pocs to assign to the IP range (comma separated string).
- If used in combination with 'pocs' the lists of pocs are merged. At least
- one poc ID or poc email must be provided.
+ description: Emails of the pocs to assign to the IP range (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2619,17 +2580,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to unassign from the IP range (comma separated
- string). If used in combination with 'poc_emails' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: IDs of the pocs to unassign from the IP range (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Names of the pocs to unassign from the IP range (comma separated
- string). If used in combination with 'pocs' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: Names of the pocs to unassign from the IP range (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2646,17 +2603,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to assign to the certificate (comma separated string).
- If used in combination with 'poc_emails' the lists of pocs are merged. At
- least one poc ID or poc email must be provided.
+ description: IDs of the pocs to assign to the certificate (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Emails of the pocs to assign to the certificate (comma separated
- string). If used in combination with 'pocs' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: Emails of the pocs to assign to the certificate (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2673,17 +2626,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to unassign from the certificate (comma separated
- string). If used in combination with 'poc_emails' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: IDs of the pocs to unassign from the certificate (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Emails of the pocs to unassign from the certificate (comma separated
- string). If used in combination with 'pocs' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: Emails of the pocs to unassign from the certificate (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2700,17 +2649,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to assign to the domain (comma separated string).
- If used in combination with 'poc_emails' the lists of pocs are merged. At
- least one poc ID or poc email must be provided.
+ description: IDs of the pocs to assign to the domain (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Emails of the pocs to assign to the domain (comma separated string).
- If used in combination with 'pocs' the lists of pocs are merged. At least
- one poc ID or poc email must be provided.
+ description: Emails of the pocs to assign to the domain (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2727,17 +2672,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the pocs to unassign from the domain (comma separated string).
- If used in combination with 'poc_emails' the lists of pocs are merged. At
- least one poc ID or poc email must be provided.
+ description: IDs of the pocs to unassign from the domain (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: pocs
required: false
secret: false
- default: false
- description: Emails of the pocs to unassign from the domain (comma separated
- string). If used in combination with 'pocs' the lists of pocs are merged.
- At least one poc ID or poc email must be provided.
+ description: Emails of the pocs to unassign from the domain (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. At least one poc ID or poc email must be provided.
isArray: true
name: poc_emails
required: false
@@ -2799,15 +2740,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to assign to the asset (comma separated string).
- If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to assign to the asset (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to assign to the asset (comma separated string).
- If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to assign to the asset (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2836,15 +2775,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to unassign from the asset (comma separated string).
- If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to unassign from the asset (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to unassign from the asset (comma separated string).
- If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to unassign from the asset (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2861,15 +2798,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to assign to the IP range (comma separated string).
- If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to assign to the IP range (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to assign to the IP range (comma separated string).
- If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to assign to the IP range (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2886,15 +2821,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to unassign from the IP range (comma separated
- string). If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to unassign from the IP range (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to unassign from the IP range (comma separated
- string). If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to unassign from the IP range (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2911,15 +2844,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to assign to the certificate (comma separated string).
- If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to assign to the certificate (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to assign to the certificate (comma separated
- string). If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to assign to the certificate (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2936,15 +2867,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to unassign from the certificate (comma separated
- string). If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to unassign from the certificate (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to unassign from the certificate (comma separated
- string). If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to unassign from the certificate (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2961,15 +2890,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to assign to the domain (comma separated string).
- If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to assign to the domain (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to assign to the domain (comma separated string).
- If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to assign to the domain (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -2986,15 +2913,13 @@ script:
required: true
secret: false
- default: false
- description: IDs of the tags to unassign from the domain (comma separated string).
- If used in combination with 'tag_names' the lists of tags are merged.
+ description: IDs of the tags to unassign from the domain (comma separated string). If used in combination with 'tag_names' the lists of tags are merged.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Names of the tags to unassign from the domain (comma separated
- string). If used in combination with 'tags' the lists of tags are merged.
+ description: Names of the tags to unassign from the domain (comma separated string). If used in combination with 'tags' the lists of tags are merged.
isArray: true
name: tag_names
required: false
@@ -3044,45 +2969,37 @@ script:
type: String
- arguments:
- default: false
- description: Asset ID of the Xpanse IP range to retrieve. If provided, other
- search parameters are ignored.
+ description: Asset ID of the Xpanse IP range to retrieve. If provided, other search parameters are ignored.
isArray: false
name: id
required: false
secret: false
- default: false
- description: Returns only results whose Business Unit's ID falls in the provided
- list. (comma separated string). Cannot be used with the 'business_unit_names'
- argument.
+ description: Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_unit_names' argument.
isArray: true
name: business_units
required: false
secret: false
- default: false
- description: Returns only results whose Business Unit's ID falls in the provided
- list. (comma separated string). Cannot be used with the 'business_units' argument.
+ description: Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_units' argument.
isArray: true
name: business_unit_names
required: false
secret: false
- default: false
- description: Search for given IP/CIDR block using a single IP (d.d.d.d), a dashed
- IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR (d.d.),
- or a wildcard (d.d.*.d).
+ description: Search for given IP/CIDR block using a single IP (d.d.d.d), a dashed IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR (d.d.), or a wildcard (d.d.*.d).
isArray: false
name: inet
required: false
secret: false
- default: false
- description: Returns only results whose Tag ID falls in the provided list. (comma
- separated string). Cannot be used with the 'tag_names' argument.
+ description: Returns only results whose Tag ID falls in the provided list. (comma separated string). Cannot be used with the 'tag_names' argument.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: Returns only results whose Tag name falls in the provided list.
- (comma separated string). Cannot be used with the 'tags' argument.
+ description: Returns only results whose Tag name falls in the provided list. (comma separated string). Cannot be used with the 'tags' argument.
isArray: true
name: tag_names
required: false
@@ -3090,9 +3007,7 @@ script:
- auto: PREDEFINED
default: false
defaultValue: none
- description: Include "none" or any of the following options in the response
- (comma separated) - annotations, severityCounts, attributionReasons, relatedRegistrationInformation,
- locationInformation
+ description: Include "none" or any of the following options in the response (comma separated) - annotations, severityCounts, attributionReasons, relatedRegistrationInformation, locationInformation
isArray: false
name: include
predefined:
@@ -3169,8 +3084,7 @@ script:
description: The number of IP addresses in the IP range
type: Number
- contextPath: Expanse.IPRange.rangeType
- description: If the IP range is Xpanse-generated parent range or a customer-generated
- custom range
+ description: If the IP range is Xpanse-generated parent range or a customer-generated custom range
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.country
description: The country within the IP range registration information
@@ -3191,68 +3105,52 @@ script:
description: The parent handle within the IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.address
- description: The address within the registry entities of the IP range registration
- information
+ description: The address within the registry entities of the IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.email
- description: The email within the registry entities of the e IP range registration
- information
+ description: The email within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.events.action
- description: The events action within the registry entities of the e IP range
- registration information
+ description: The events action within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.events.actor
- description: The events actor within the registry entities of the e IP range
- registration information
+ description: The events actor within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.events.date
- description: The events date within the registry entities of the e IP range
- registration information
+ description: The events date within the registry entities of the e IP range registration information
type: Date
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.firstRegistered
- description: The first registered date within the registry entities of the e
- IP range registration information
+ description: The first registered date within the registry entities of the e IP range registration information
type: Date
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.formattedName
- description: The formatted name within the registry entities of the e IP range
- registration information
+ description: The formatted name within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.handle
- description: The handle within the registry entities of the e IP range registration
- information
+ description: The handle within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.id
- description: The ID within the registry entities of the e IP range registration
- information
+ description: The ID within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.lastChanged
- description: The last changed date within the registry entities of the e IP
- range registration information
+ description: The last changed date within the registry entities of the e IP range registration information
type: Date
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.org
- description: The org within the registry entities of the e IP range registration
- information
+ description: The org within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.phone
- description: The phone number within the registry entities of the e IP range
- registration information
+ description: The phone number within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.relatedEntityHandles
- description: The related entity handles within the registry entities of the
- e IP range registration information
+ description: The related entity handles within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.remarks
- description: The remarks within the registry entities of the e IP range registration
- information
+ description: The remarks within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.roles
- description: The roles within the registry entities of the e IP range registration
- information
+ description: The roles within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.statuses
- description: The statuses within the registry entities of the e IP range registration
- information
+ description: The statuses within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.remarks
description: The remarks within the IP range registration information
@@ -3267,8 +3165,7 @@ script:
description: The Whois server within the IP range registration information
type: String
- contextPath: Expanse.IPRange.responsiveIpCount
- description: The number of IPs responsive on the public Internet within the
- IP range
+ description: The number of IPs responsive on the public Internet within the IP range
type: Number
- contextPath: Expanse.IPRange.severityCounts.count
description: The number of exposures observed on the IP range
@@ -3290,8 +3187,7 @@ script:
type: String
- arguments:
- default: false
- description: Domain name to retrieve (exact match). If provided, other search
- parameters are ignored.
+ description: Domain name to retrieve (exact match). If provided, other search parameters are ignored.
isArray: false
name: domain
required: false
@@ -3326,8 +3222,7 @@ script:
secret: false
- auto: PREDEFINED
default: false
- description: Retrieve only domains with or without an active service discovered
- by Xpanse.
+ description: Retrieve only domains with or without an active service discovered by Xpanse.
isArray: false
name: has_active_service
predefined:
@@ -3337,8 +3232,7 @@ script:
secret: false
- auto: PREDEFINED
default: false
- description: Retrieve only domains with or without cloud resources discovered
- by Xpanse.
+ description: Retrieve only domains with or without cloud resources discovered by Xpanse.
isArray: false
name: has_related_cloud_resources
predefined:
@@ -3347,44 +3241,37 @@ script:
required: false
secret: false
- default: false
- description: Returns only results whose Tag ID falls in the provided list. (comma
- separated string). Cannot be used with the 'tag_names' argument.
+ description: Returns only results whose Tag ID falls in the provided list. (comma separated string). Cannot be used with the 'tag_names' argument.
isArray: false
name: tags
required: false
secret: false
- default: false
- description: Returns only results whose Tag name falls in the provided list.
- (comma separated string). Cannot be used with the 'tags' argument.
+ description: Returns only results whose Tag name falls in the provided list. (comma separated string). Cannot be used with the 'tags' argument.
isArray: false
name: tag_names
required: false
secret: false
- default: false
- description: Returns only results whose Business Unit's ID falls in the provided
- list. (comma separated string). Cannot be used with the 'business_unit_names'
- argument.
+ description: Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_unit_names' argument.
isArray: false
name: business_units
required: false
secret: false
- default: false
- description: Returns only results whose Business Unit's name falls in the provided
- list. (comma separated string). Cannot be used with the 'business_units' argument.
+ description: Returns only results whose Business Unit's name falls in the provided list. (comma separated string). Cannot be used with the 'business_units' argument.
isArray: false
name: business_unit_names
required: false
secret: false
- default: false
- description: Returns only results whose Provider's ID falls in the provided
- list. (comma separated string). Cannot be used with the 'provider_names' argument.
+ description: Returns only results whose Provider's ID falls in the provided list. (comma separated string). Cannot be used with the 'provider_names' argument.
isArray: false
name: providers
required: false
secret: false
- default: false
- description: Returns only results whose Provider's name falls in the provided
- list. (comma separated string). Cannot be used with the 'providers' argument.
+ description: Returns only results whose Provider's name falls in the provided list. (comma separated string). Cannot be used with the 'providers' argument.
isArray: false
name: provider_names
required: false
@@ -3416,19 +3303,16 @@ script:
description: Business Units that the domain has been assigned to
type: String
- contextPath: Expanse.Domain.businessUnits.tenantId
- description: Tenant ID for business Units that the domain has been assigned
- to
+ description: Tenant ID for business Units that the domain has been assigned to
type: String
- contextPath: Expanse.Domain.dateAdded
description: The date that the domain was added to the Expander instance
type: Date
- contextPath: Expanse.Domain.details.recentIps.assetKey
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.assetType
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.businessUnits.id
description: Business Units for the recent IPs that the domain resolved to
@@ -3437,48 +3321,37 @@ script:
description: Business Units for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.businessUnits.tenantId
- description: Tenant information for business Units that the recent IPs that
- the domain resolved to
+ description: Tenant information for business Units that the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.commonName
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.domain
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.ip
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.lastObserved
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: Date
- contextPath: Expanse.Domain.details.recentIps.provider.id
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.provider.name
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.tenant.id
- description: Tenant information for the recent IPs that the domain resolved
- to
+ description: Tenant information for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.tenant.name
- description: Tenant information for the recent IPs that the domain resolved
- to
+ description: Tenant information for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.tenant.tenantId
- description: Tenant information for the recent IPs that the domain resolved
- to
+ description: Tenant information for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.type
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.dnsResolutionStatus
description: Latest DNS resolution status
@@ -3487,8 +3360,7 @@ script:
description: The date that the domain was first observed
type: Date
- contextPath: Expanse.Domain.hasLinkedCloudResources
- description: Whether the domain has any linked cloud resources associated with
- it
+ description: Whether the domain has any linked cloud resources associated with it
type: Boolean
- contextPath: Expanse.Domain.id
description: Internal Xpanse ID for Domain
@@ -3521,12 +3393,10 @@ script:
description: Sub-domain metadata
type: Date
- contextPath: Expanse.Domain.providers.id
- description: Information about the hosting provider of the IP the domain resolves
- to
+ description: Information about the hosting provider of the IP the domain resolves to
type: String
- contextPath: Expanse.Domain.providers.name
- description: Information about the hosting provider of the IP the domain resolves
- to
+ description: Information about the hosting provider of the IP the domain resolves to
type: String
- contextPath: Expanse.Domain.serviceStatus
description: Detected service statuses for the domain
@@ -3619,8 +3489,7 @@ script:
description: The registrant organization in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrant.phoneExtension
- description: The registrant phone extension in the Whois information for the
- domain
+ description: The registrant phone extension in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrant.phoneNumber
description: The registrant phone number in the Whois information for the domain
@@ -3638,12 +3507,10 @@ script:
description: The registrant street in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrar.abuseContactEmail
- description: The registrar abuse contact email in the Whois information for
- the domain
+ description: The registrar abuse contact email in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrar.abuseContactPhone
- description: The registrar abuse contact phone in the Whois information for
- the domain''
+ description: The registrar abuse contact phone in the Whois information for the domain''
type: String
- contextPath: Expanse.Domain.whois.registrar.formattedName
description: The registrar formatted name Whois information for the domain
@@ -3655,8 +3522,7 @@ script:
description: The registrar name in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrar.registrationExpirationDate
- description: The registrar registration expiration date in the Whois information
- for the domain
+ description: The registrar registration expiration date in the Whois information for the domain
type: Date
- contextPath: Expanse.Domain.whois.registrar.url
description: The registrar URL in the Whois information for the domain
@@ -3734,8 +3600,7 @@ script:
description: Business Units that the cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.businessUnits.tenantId
- description: Tenant information businessUnits that the cloud resource as been
- assigned to
+ description: Tenant information businessUnits that the cloud resource as been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.dateAdded
description: The date that the cloud resource was added to the Expander instance
@@ -3783,64 +3648,49 @@ script:
description: Additional details for the cloud resource linked to the domain
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.assetKey
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.assetType
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.businessUnits.id
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.businessUnits.name
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.businessUnits.tenantId
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.commonName
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.domain
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.ip
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.lastObserved
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: Date
- contextPath: Expanse.Domain.details.cloudResources.recentIps.provider.id
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.provider.name
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.tenant.id
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.tenant.name
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.tenant.tenantId
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.type
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.annotations.note
description: Customer provided annotation details for a domain
@@ -3867,8 +3717,7 @@ script:
description: The total number of engines that checked the indicator.
type: Number
- contextPath: Domain.PositiveDetections
- description: The number of engines that positively detected the indicator as
- malicious.
+ description: The number of engines that positively detected the indicator as malicious.
type: Number
- contextPath: Domain.CreationDate
description: The date that the domain was created.
@@ -3980,10 +3829,7 @@ script:
type: Number
- arguments:
- default: false
- description: The common name of the certificate to search domains for. Fuzzy
- matching is done on this name, however query times can grow quite large when
- searching for short strings. Ex. "*.myhost.com" is a better search term than
- "host".
+ description: The common name of the certificate to search domains for. Fuzzy matching is done on this name, however query times can grow quite large when searching for short strings. Ex. "*.myhost.com" is a better search term than "host".
isArray: false
name: common_name
required: false
@@ -4007,8 +3853,7 @@ script:
required: false
secret: false
deprecated: false
- description: Returns all the Xpanse domains which have been seen with the specified
- certificate or IP address.
+ description: Returns all the Xpanse domains which have been seen with the specified certificate or IP address.
execution: false
name: expanse-get-associated-domains
outputs:
@@ -4038,22 +3883,19 @@ script:
type: Number
- arguments:
- default: false
- description: MD5 Hash of the certificate. If provided, other search parameters
- are ignored.
+ description: MD5 Hash of the certificate. If provided, other search parameters are ignored.
isArray: false
name: md5_hash
required: false
secret: false
- default: false
- description: Last date the domain was observed by Xpanse (Format is YYYY-MM-DD),
- to be used with domain argument.
+ description: Last date the domain was observed by Xpanse (Format is YYYY-MM-DD), to be used with domain argument.
isArray: false
name: last_observed_date
required: false
secret: false
- default: false
- description: Search for certificates with the specified substring in common
- name.
+ description: Search for certificates with the specified substring in common name.
isArray: false
name: search
required: false
@@ -4076,8 +3918,7 @@ script:
secret: false
- auto: PREDEFINED
default: false
- description: Retrieve only certificates with or without an active service discovered
- by Xpanse.
+ description: Retrieve only certificates with or without an active service discovered by Xpanse.
isArray: false
name: has_active_service
predefined:
@@ -4087,8 +3928,7 @@ script:
secret: false
- auto: PREDEFINED
default: false
- description: Retrieve only certificates with or without cloud resources discovered
- by Xpanse.
+ description: Retrieve only certificates with or without cloud resources discovered by Xpanse.
isArray: false
name: has_related_cloud_resources
predefined:
@@ -4097,44 +3937,37 @@ script:
required: false
secret: false
- default: false
- description: Returns only results whose Tag ID falls in the provided list. (comma
- separated string). Cannot be used with the 'tag_names' argument.
+ description: Returns only results whose Tag ID falls in the provided list. (comma separated string). Cannot be used with the 'tag_names' argument.
isArray: false
name: tags
required: false
secret: false
- default: false
- description: Returns only results whose Tag name falls in the provided list.
- (comma separated string). Cannot be used with the 'tags' argument.
+ description: Returns only results whose Tag name falls in the provided list. (comma separated string). Cannot be used with the 'tags' argument.
isArray: false
name: tag_names
required: false
secret: false
- default: false
- description: Returns only results whose Business Unit's ID falls in the provided
- list. (comma separated string). Cannot be used with the 'business_unit_names'
- argument.
+ description: Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_unit_names' argument.
isArray: false
name: business_units
required: false
secret: false
- default: false
- description: Returns only results whose Business Unit's name falls in the provided
- list. (comma separated string). Cannot be used with the 'business_units' argument.
+ description: Returns only results whose Business Unit's name falls in the provided list. (comma separated string). Cannot be used with the 'business_units' argument.
isArray: false
name: business_unit_names
required: false
secret: false
- default: false
- description: Returns only results whose Provider's ID falls in the provided
- list. (comma separated string). Cannot be used with the 'provider_names' argument.
+ description: Returns only results whose Provider's ID falls in the provided list. (comma separated string). Cannot be used with the 'provider_names' argument.
isArray: false
name: providers
required: false
secret: false
- default: false
- description: Returns only results whose Provider's name falls in the provided
- list. (comma separated string). Cannot be used with the 'providers' argument.
+ description: Returns only results whose Provider's name falls in the provided list. (comma separated string). Cannot be used with the 'providers' argument.
isArray: false
name: provider_names
required: false
@@ -4166,8 +3999,7 @@ script:
description: Business Units that the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.businessUnits.tenantId
- description: Tenant information for business units that the certificate has
- been assigned to
+ description: Tenant information for business units that the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.certificate.formattedIssuerOrg
description: The formatted issuer org in the certificate
@@ -4290,16 +4122,13 @@ script:
description: Additional details for the recent IPs linked to the certificate
type: String
- contextPath: Expanse.Certificate.details.recentIps.businessUnits.id
- description: Business Units that the recent IPs linked to the certificate has
- been assigned to
+ description: Business Units that the recent IPs linked to the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.details.recentIps.businessUnits.name
- description: Business Units that the recent IPs linked to the certificate has
- been assigned to
+ description: Business Units that the recent IPs linked to the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.details.recentIps.businessUnits.tenantId
- description: Tenant information for business Units that the recent IPs linked
- to the certificate has been assigned to
+ description: Tenant information for business Units that the recent IPs linked to the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.details.recentIps.commonName
description: Additional details for the recent IPs linked to the certificate
@@ -4335,8 +4164,7 @@ script:
description: The date that the certificate was first observed
type: Date
- contextPath: Expanse.Certificate.hasLinkedCloudResources
- description: Whether the certificate has any linked cloud resources associated
- with it
+ description: Whether the certificate has any linked cloud resources associated with it
type: Boolean
- contextPath: Expanse.Certificate.id
description: Internal Xpanse ID for Certificate
@@ -4384,8 +4212,7 @@ script:
description: Business Units that the cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.businessUnits.tenantId
- description: Tenant information businessUnits that the cloud resource as been
- assigned to
+ description: Tenant information businessUnits that the cloud resource as been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.dateAdded
description: The date that the cloud resource was added to the Expander instance
@@ -4433,64 +4260,49 @@ script:
description: Additional details for the cloud resource linked to the certificate
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.assetKey
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.assetType
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.businessUnits.id
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.businessUnits.name
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.businessUnits.tenantId
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.commonName
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.domain
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.ip
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.lastObserved
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: Date
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.provider.id
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.provider.name
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.tenant.id
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.tenant.name
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.tenant.tenantId
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.type
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.annotations.note
description: Customer provided annotation details for a certificate
@@ -4631,8 +4443,7 @@ script:
description: Business Units that the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.businessUnits.tenantId
- description: Tenant information for business units that the certificate has
- been assigned to
+ description: Tenant information for business units that the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.certificate.formattedIssuerOrg
description: The formatted issuer org in the certificate
@@ -4755,16 +4566,13 @@ script:
description: Additional details for the recent IPs linked to the certificate
type: String
- contextPath: Expanse.Certificate.details.recentIps.businessUnits.id
- description: Business Units that the recent IPs linked to the certificate has
- been assigned to
+ description: Business Units that the recent IPs linked to the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.details.recentIps.businessUnits.name
- description: Business Units that the recent IPs linked to the certificate has
- been assigned to
+ description: Business Units that the recent IPs linked to the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.details.recentIps.businessUnits.tenantId
- description: Tenant information for business Units that the recent IPs linked
- to the certificate has been assigned to
+ description: Tenant information for business Units that the recent IPs linked to the certificate has been assigned to
type: String
- contextPath: Expanse.Certificate.details.recentIps.commonName
description: Additional details for the recent IPs linked to the certificate
@@ -4800,8 +4608,7 @@ script:
description: The date that the certificate was first observed
type: Date
- contextPath: Expanse.Certificate.hasLinkedCloudResources
- description: Whether the certificate has any linked cloud resources associated
- with it
+ description: Whether the certificate has any linked cloud resources associated with it
type: Boolean
- contextPath: Expanse.Certificate.id
description: Internal Xpanse ID for Certificate
@@ -4849,8 +4656,7 @@ script:
description: Business Units that the cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.businessUnits.tenantId
- description: Tenant information businessUnits that the cloud resource as been
- assigned to
+ description: Tenant information businessUnits that the cloud resource as been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.dateAdded
description: The date that the cloud resource was added to the Expander instance
@@ -4898,64 +4704,49 @@ script:
description: Additional details for the cloud resource linked to the certificate
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.assetKey
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.assetType
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.businessUnits.id
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.businessUnits.name
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.businessUnits.tenantId
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.commonName
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.domain
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.ip
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.lastObserved
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: Date
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.provider.id
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.provider.name
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.tenant.id
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.tenant.name
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.tenant.tenantId
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.recentIps.type
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Certificate.details.cloudResources.annotations.note
description: Customer provided annotation details for a certificate
@@ -5054,8 +4845,7 @@ script:
required: false
secret: false
- default: false
- description: Last date the cloud resource was observed by Xpanse (Format is
- YYYY-MM-DD).
+ description: Last date the cloud resource was observed by Xpanse (Format is YYYY-MM-DD).
isArray: false
name: last_observed_date
required: false
@@ -5073,57 +4863,49 @@ script:
required: false
secret: false
- default: false
- description: A search string of provider IDs to find cloud resources hosted
- by specific providers.
+ description: A search string of provider IDs to find cloud resources hosted by specific providers.
isArray: true
name: providers
required: false
secret: false
- default: false
- description: A search string of provider names to find cloud resources hosted
- by specific providers.
+ description: A search string of provider names to find cloud resources hosted by specific providers.
isArray: true
name: provider_names
required: false
secret: false
- default: false
- description: A search string of business unit IDs to find cloud resources belonging
- to a specific business unit.
+ description: A search string of business unit IDs to find cloud resources belonging to a specific business unit.
isArray: true
name: business_units
required: false
secret: false
- default: false
- description: A search string of business unit names to find cloud resources
- belonging to a specific business unit.
+ description: A search string of business unit names to find cloud resources belonging to a specific business unit.
isArray: true
name: business_unit_names
required: false
secret: false
- default: false
- description: A search string of tag IDs to find cloud resources that have been
- assigned a specific tag.
+ description: A search string of tag IDs to find cloud resources that have been assigned a specific tag.
isArray: true
name: tags
required: false
secret: false
- default: false
- description: A search string of tag names to find cloud resources that have
- been assigned a specific tag.
+ description: A search string of tag names to find cloud resources that have been assigned a specific tag.
isArray: true
name: tag_names
required: false
secret: false
- default: false
- description: A search string of asset types to find cloud resources of a specific
- type.
+ description: A search string of asset types to find cloud resources of a specific type.
isArray: true
name: types
required: false
secret: false
- default: false
- description: A search string of regions to find cloud resources that are hosted
- in a specific region.
+ description: A search string of regions to find cloud resources that are hosted in a specific region.
isArray: true
name: regions
required: false
@@ -5155,15 +4937,13 @@ script:
description: Note metadata on the cloud resource.
type: String
- contextPath: Expanse.CloudResource.businessUnits.id
- description: The internal ID of the business unit that the cloud resource belongs
- to.
+ description: The internal ID of the business unit that the cloud resource belongs to.
type: String
- contextPath: Expanse.CloudResource.businessUnits.name
description: The name of the business unit that the cloud resource belongs to.
type: String
- contextPath: Expanse.CloudResource.businessUnits.tenantId
- description: The internal tenant ID of the business unit that the cloud resource
- belongs to.
+ description: The internal tenant ID of the business unit that the cloud resource belongs to.
type: String
- contextPath: Expanse.CloudResource.dateAdded
description: The date that the cloud resource was added.
@@ -5259,15 +5039,13 @@ script:
description: Note metadata on the cloud resource.
type: String
- contextPath: Expanse.CloudResource.businessUnits.id
- description: The internal ID of the business unit that the cloud resource belongs
- to.
+ description: The internal ID of the business unit that the cloud resource belongs to.
type: String
- contextPath: Expanse.CloudResource.businessUnits.name
description: The name of the business unit that the cloud resource belongs to.
type: String
- contextPath: Expanse.CloudResource.businessUnits.tenantId
- description: The internal tenant ID of the business unit that the cloud resource
- belongs to.
+ description: The internal tenant ID of the business unit that the cloud resource belongs to.
type: String
- contextPath: Expanse.CloudResource.dateAdded
description: The date that the cloud resource was added.
@@ -5343,8 +5121,7 @@ script:
required: false
secret: false
- default: false
- description: Filter by internal IP range. Supported formats a.b.c.d, a.b.c.d/e,
- a.b.c.d-a.b.c.d, a., a.*
+ description: Filter by internal IP range. Supported formats a.b.c.d, a.b.c.d/e, a.b.c.d-a.b.c.d, a., a.*
isArray: false
name: internal_ip_range
required: false
@@ -5415,8 +5192,7 @@ script:
description: The internal port of the communication involved in the risky flow
type: Number
- contextPath: Expanse.RiskyFlow.internalTags.ipRange
- description: Any tags associated with with the internal asset involved in the
- risky flow
+ description: Any tags associated with with the internal asset involved in the risky flow
type: String
- contextPath: Expanse.RiskyFlow.observationTimestamp
description: The timestamp when the risky flow took place
@@ -5425,8 +5201,7 @@ script:
description: The protocol of the risky flow
type: String
- contextPath: Expanse.RiskyFlow.riskRule.additionalDataFields
- description: Additional data fields associated with the risk rule for the risky
- flow
+ description: Additional data fields associated with the risk rule for the risky flow
type: String
- contextPath: Expanse.RiskyFlow.riskRule.description
description: The risk rule description for the risky flow
@@ -5444,8 +5219,7 @@ script:
description: The internal domains associated with the risky flow
type: String
- contextPath: Expanse.RiskyFlow.internalExposureTypes
- description: The known exposure types associated with the asset involved in
- the risky flow
+ description: The known exposure types associated with the asset involved in the risky flow
type: String
- arguments:
- default: false
@@ -5514,19 +5288,16 @@ script:
description: Business Units that the domain has been assigned to
type: String
- contextPath: Expanse.Domain.businessUnits.tenantId
- description: Tenant ID for business Units that the domain has been assigned
- to
+ description: Tenant ID for business Units that the domain has been assigned to
type: String
- contextPath: Expanse.Domain.dateAdded
description: The date that the domain was added to the Expander instance
type: Date
- contextPath: Expanse.Domain.details.recentIps.assetKey
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.assetType
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.businessUnits.id
description: Business Units for the recent IPs that the domain resolved to
@@ -5535,48 +5306,37 @@ script:
description: Business Units for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.businessUnits.tenantId
- description: Tenant information for business Units that the recent IPs that
- the domain resolved to
+ description: Tenant information for business Units that the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.commonName
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.domain
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.ip
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.lastObserved
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: Date
- contextPath: Expanse.Domain.details.recentIps.provider.id
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.provider.name
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.tenant.id
- description: Tenant information for the recent IPs that the domain resolved
- to
+ description: Tenant information for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.tenant.name
- description: Tenant information for the recent IPs that the domain resolved
- to
+ description: Tenant information for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.tenant.tenantId
- description: Tenant information for the recent IPs that the domain resolved
- to
+ description: Tenant information for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.details.recentIps.type
- description: Additional details for the recent IPs that the domain resolved
- to
+ description: Additional details for the recent IPs that the domain resolved to
type: String
- contextPath: Expanse.Domain.dnsResolutionStatus
description: Latest DNS resolution status
@@ -5585,8 +5345,7 @@ script:
description: The date that the domain was first observed
type: Date
- contextPath: Expanse.Domain.hasLinkedCloudResources
- description: Whether the domain has any linked cloud resources associated with
- it
+ description: Whether the domain has any linked cloud resources associated with it
type: Boolean
- contextPath: Expanse.Domain.id
description: Internal Xpanse ID for Domain
@@ -5619,12 +5378,10 @@ script:
description: Sub-domain metadata
type: Date
- contextPath: Expanse.Domain.providers.id
- description: Information about the hosting provider of the IP the domain resolves
- to
+ description: Information about the hosting provider of the IP the domain resolves to
type: String
- contextPath: Expanse.Domain.providers.name
- description: Information about the hosting provider of the IP the domain resolves
- to
+ description: Information about the hosting provider of the IP the domain resolves to
type: String
- contextPath: Expanse.Domain.serviceStatus
description: Detected service statuses for the domain
@@ -5717,8 +5474,7 @@ script:
description: The registrant organization in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrant.phoneExtension
- description: The registrant phone extension in the Whois information for the
- domain
+ description: The registrant phone extension in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrant.phoneNumber
description: The registrant phone number in the Whois information for the domain
@@ -5736,12 +5492,10 @@ script:
description: The registrant street in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrar.abuseContactEmail
- description: The registrar abuse contact email in the Whois information for
- the domain
+ description: The registrar abuse contact email in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrar.abuseContactPhone
- description: The registrar abuse contact phone in the Whois information for
- the domain''
+ description: The registrar abuse contact phone in the Whois information for the domain''
type: String
- contextPath: Expanse.Domain.whois.registrar.formattedName
description: The registrar formatted name Whois information for the domain
@@ -5753,8 +5507,7 @@ script:
description: The registrar name in the Whois information for the domain
type: String
- contextPath: Expanse.Domain.whois.registrar.registrationExpirationDate
- description: The registrar registration expiration date in the Whois information
- for the domain
+ description: The registrar registration expiration date in the Whois information for the domain
type: Date
- contextPath: Expanse.Domain.whois.registrar.url
description: The registrar URL in the Whois information for the domain
@@ -5832,8 +5585,7 @@ script:
description: Business Units that the cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.businessUnits.tenantId
- description: Tenant information businessUnits that the cloud resource as been
- assigned to
+ description: Tenant information businessUnits that the cloud resource as been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.dateAdded
description: The date that the cloud resource was added to the Expander instance
@@ -5881,64 +5633,49 @@ script:
description: Additional details for the cloud resource linked to the domain
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.assetKey
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.assetType
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.businessUnits.id
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.businessUnits.name
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.businessUnits.tenantId
- description: Business Units that the recent IPs linked to the linked cloud resource
- has been assigned to
+ description: Business Units that the recent IPs linked to the linked cloud resource has been assigned to
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.commonName
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.domain
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.ip
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.lastObserved
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: Date
- contextPath: Expanse.Domain.details.cloudResources.recentIps.provider.id
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.provider.name
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.tenant.id
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.tenant.name
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.tenant.tenantId
- description: Tenant information for the recent IPs linked to the linked cloud
- resource
+ description: Tenant information for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.recentIps.type
- description: Additional details for the recent IPs linked to the linked cloud
- resource
+ description: Additional details for the recent IPs linked to the linked cloud resource
type: String
- contextPath: Expanse.Domain.details.cloudResources.annotations.note
description: Customer provided annotation details for a domain
@@ -5965,8 +5702,7 @@ script:
description: The total number of engines that checked the indicator.
type: Number
- contextPath: Domain.PositiveDetections
- description: The number of engines that positively detected the indicator as
- malicious.
+ description: The number of engines that positively detected the indicator as malicious.
type: Number
- contextPath: Domain.CreationDate
description: The date that the domain was created.
@@ -6098,8 +5834,7 @@ script:
description: The type of asset
type: String
- contextPath: Expanse.IP.businessUnits.id
- description: The internal Xpanse ID for the business unit the asset belongs
- to
+ description: The internal Xpanse ID for the business unit the asset belongs to
type: String
- contextPath: Expanse.IP.businessUnits.name
description: The name of the business unit the asset belongs to
@@ -6144,8 +5879,7 @@ script:
description: The hostname that is mapped to this IP address.
type: String
- contextPath: IP.Geo.Location
- description: 'The geolocation where the IP address is located, in the format:
- latitude:longitude.'
+ description: 'The geolocation where the IP address is located, in the format: latitude:longitude.'
type: String
- contextPath: IP.Geo.Country
description: The country in which the IP address is located.
@@ -6157,8 +5891,7 @@ script:
description: The total number of engines that checked the indicator.
type: Number
- contextPath: IP.PositiveDetections
- description: The number of engines that positively detected the indicator as
- malicious.
+ description: The number of engines that positively detected the indicator as malicious.
type: Number
- contextPath: IP.Malicious.Vendor
description: The vendor reporting the IP address as malicious.
@@ -6187,9 +5920,7 @@ script:
secret: false
- default: false
defaultValue: severityCounts,annotations,attributionReasons,relatedRegistrationInformation,locationInformation
- description: Include "none" or any of the following options (comma separated)
- - annotations, severityCounts, attributionReasons, relatedRegistrationInformation,
- locationInformation
+ description: Include "none" or any of the following options (comma separated) - annotations, severityCounts, attributionReasons, relatedRegistrationInformation, locationInformation
isArray: false
name: include
required: false
@@ -6254,8 +5985,7 @@ script:
description: The number of IP addresses in the IP range
type: Number
- contextPath: Expanse.IPRange.rangeType
- description: If the IP range is Xpanse-generated parent range or a customer-generated
- custom range
+ description: If the IP range is Xpanse-generated parent range or a customer-generated custom range
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.country
description: The country within the IP range registration information
@@ -6276,68 +6006,52 @@ script:
description: The parent handle within the IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.address
- description: The address within the registry entities of the IP range registration
- information
+ description: The address within the registry entities of the IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.email
- description: The email within the registry entities of the e IP range registration
- information
+ description: The email within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.events.action
- description: The events action within the registry entities of the e IP range
- registration information
+ description: The events action within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.events.actor
- description: The events actor within the registry entities of the e IP range
- registration information
+ description: The events actor within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.events.date
- description: The events date within the registry entities of the e IP range
- registration information
+ description: The events date within the registry entities of the e IP range registration information
type: Date
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.firstRegistered
- description: The first registered date within the registry entities of the e
- IP range registration information
+ description: The first registered date within the registry entities of the e IP range registration information
type: Date
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.formattedName
- description: The formatted name within the registry entities of the e IP range
- registration information
+ description: The formatted name within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.handle
- description: The handle within the registry entities of the e IP range registration
- information
+ description: The handle within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.id
- description: The ID within the registry entities of the e IP range registration
- information
+ description: The ID within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.lastChanged
- description: The last changed date within the registry entities of the e IP
- range registration information
+ description: The last changed date within the registry entities of the e IP range registration information
type: Date
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.org
- description: The org within the registry entities of the e IP range registration
- information
+ description: The org within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.phone
- description: The phone number within the registry entities of the e IP range
- registration information
+ description: The phone number within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.relatedEntityHandles
- description: The related entity handles within the registry entities of the
- e IP range registration information
+ description: The related entity handles within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.remarks
- description: The remarks within the registry entities of the e IP range registration
- information
+ description: The remarks within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.roles
- description: The roles within the registry entities of the e IP range registration
- information
+ description: The roles within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.registryEntities.statuses
- description: The statuses within the registry entities of the e IP range registration
- information
+ description: The statuses within the registry entities of the e IP range registration information
type: String
- contextPath: Expanse.IPRange.relatedRegistrationInformation.remarks
description: The remarks within the IP range registration information
@@ -6352,8 +6066,7 @@ script:
description: The Whois server within the IP range registration information
type: String
- contextPath: Expanse.IPRange.responsiveIpCount
- description: The number of IPs responsive on the public Internet within the
- IP range
+ description: The number of IPs responsive on the public Internet within the IP range
type: Number
- contextPath: Expanse.IPRange.severityCounts.count
description: The number of exposures observed on the IP range
@@ -6375,9 +6088,7 @@ script:
type: String
- arguments:
- default: true
- description: The certificate common name. Fuzzy matching is done on this name,
- however query times can grow quite large when searching for short strings.
- Ex. "*.myhost.com" is a better search term than "host"
+ description: The certificate common name. Fuzzy matching is done on this name, however query times can grow quite large when searching for short strings. Ex. "*.myhost.com" is a better search term than "host"
isArray: false
name: common_name
required: true
@@ -6399,7 +6110,7 @@ script:
- contextPath: Expanse.IPDomains.DomainList
description: An array of domain objects. This is truncated at 50.
type: Unknown
- dockerimage: demisto/python3:3.10.8.37233
+ dockerimage: demisto/python3:3.10.10.48392
feed: false
isfetch: true
longRunning: false
diff --git a/Packs/ExpanseV2/Integrations/ExpanseV2/README.md b/Packs/ExpanseV2/Integrations/ExpanseV2/README.md
index 79be3da4ffd2..55610ca1c021 100644
--- a/Packs/ExpanseV2/Integrations/ExpanseV2/README.md
+++ b/Packs/ExpanseV2/Integrations/ExpanseV2/README.md
@@ -1,12 +1,12 @@
-The Cortex Xpanse (previously **Expanse v2**) integration for Cortex XSOAR leverages the Expander API to create incidents from Expanse issues. It also leverages Expanse's unparalleled view of the Internet to enrich IPs, domains and certificates using information from assets discovered by Expanse Expander and risky flow detected by Expanse Behavior.
+The Cortex Xpanse (previously **Expanse v2**) integration for Cortex XSOAR leverages the Expander API to create incidents from Xpanse issues. It also leverages Xpanse's unparalleled view of the Internet to enrich IPs, domains and certificates using information from assets discovered by Cortex Xpanse Expander.
-This integration was developed and tested with Expanse Expander and Behavior.
+This integration was developed and tested with Xpanse Expander.
Cortex Xpanse is a Palo Alto Networks company.
Supported Cortex XSOAR versions: 6.0.0 and later.
-## Configure ExpanseV2 on Cortex XSOAR
+## Configure Cortex Xpanse on Cortex XSOAR
1. Navigate to **Settings** > **Integrations** > **Servers & Services**.
2. Search for Cortex Xpanse.
@@ -22,9 +22,9 @@ Supported Cortex XSOAR versions: 6.0.0 and later.
| incidentType | Incident type | False |
| max_fetch | Maximum number of incidents per fetch | False |
| first_fetch | First fetch time | False |
- | priority | Fetch Expanse issues with Priority | False |
- | activity_status | Fetch Expanse issues with Activity Status | False |
- | progress_status | Fetch Expanse issues with Progress Status | False |
+ | priority | Fetch Xpanse issues with Priority | False |
+ | activity_status | Fetch Xpanse issues with Activity Status | False |
+ | progress_status | Fetch Xpanse issues with Progress Status | False |
| business_unit | Fetch issues with Business Units \(comma separated string\) | False |
| tag | Fetch issues with Tags \(comma separated string\) | False |
| issue_type | Fetch issue with Types \(comma separated string\) | False |
@@ -74,18 +74,18 @@ Retrieve issues
| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Expanse.Issue.activityStatus | String | Activity status of issue, whether the issue is active or inactive |
-| Expanse.Issue.annotations.tags.id | String | The Internal Expanse tag id of the customer added tag |
+| Expanse.Issue.annotations.tags.id | String | The Internal Xpanse tag id of the customer added tag |
| Expanse.Issue.annotations.tags.name | String | The tag name of the customer added tag |
-| Expanse.Issue.assets.assetKey | String | Key used to access the asset in the respective Expanse asset API |
+| Expanse.Issue.assets.assetKey | String | Key used to access the asset in the respective Xpanse asset API |
| Expanse.Issue.assets.assetType | String | The type of asset the issue primarily relates to |
| Expanse.Issue.assets.displayName | String | A friendly name for the asset |
-| Expanse.Issue.assets.id | String | Internal Expanse ID the asset |
+| Expanse.Issue.assets.id | String | Internal Xpanse ID the asset |
| Expanse.Issue.assigneeUsername | String | The username of the user that has been assigned to the issue |
-| Expanse.Issue.businessUnits.id | String | The internal Expanse ID for the business unit the affected asset belongs to |
+| Expanse.Issue.businessUnits.id | String | The internal Xpanse ID for the business unit the affected asset belongs to |
| Expanse.Issue.businessUnits.name | String | The name of the business unit the affected asset belongs to |
| Expanse.Issue.category | String | The general category of the issue |
| Expanse.Issue.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate |
-| Expanse.Issue.certificate.id | String | The Internal Expanse certificate ID |
+| Expanse.Issue.certificate.id | String | The Internal Xpanse certificate ID |
| Expanse.Issue.certificate.issuer | String | The issuer in the certificate |
| Expanse.Issue.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate |
| Expanse.Issue.certificate.issuerCountry | String | The issuer country in the certificate |
@@ -123,10 +123,10 @@ Retrieve issues
| Expanse.Issue.created | Date | When the issue instance was created |
| Expanse.Issue.domain | String | Domain name of the issue |
| Expanse.Issue.headline | String | A brief summary of the issue |
-| Expanse.Issue.helpText | String | Why Expanse this type of issue should be avoided |
-| Expanse.Issue.id | String | The internal Expanse ID of the issue |
+| Expanse.Issue.helpText | String | Why Xpanse this type of issue should be avoided |
+| Expanse.Issue.id | String | The internal Xpanse ID of the issue |
| Expanse.Issue.initialEvidence.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate in the initial observation |
-| Expanse.Issue.initialEvidence.certificate.id | String | The Internal Expanse certificate ID in the initial observation |
+| Expanse.Issue.initialEvidence.certificate.id | String | The Internal Xpanse certificate ID in the initial observation |
| Expanse.Issue.initialEvidence.certificate.issuer | String | The issuer in the certificate in the initial observation |
| Expanse.Issue.initialEvidence.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate in the initial observation |
| Expanse.Issue.initialEvidence.certificate.issuerCountry | String | The issuer country in the certificate in the initial observation |
@@ -185,7 +185,7 @@ Retrieve issues
| Expanse.Issue.issueType.id | String | The ID of the issue type |
| Expanse.Issue.issueType.name | String | The name of the issue type |
| Expanse.Issue.latestEvidence.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate in the most recent observation |
-| Expanse.Issue.latestEvidence.certificate.id | String | The Internal Expanse certificate ID in the most recent observation |
+| Expanse.Issue.latestEvidence.certificate.id | String | The Internal Xpanse certificate ID in the most recent observation |
| Expanse.Issue.latestEvidence.certificate.issuer | String | The issuer in the certificate in the most recent observation |
| Expanse.Issue.latestEvidence.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate in the most recent observation |
| Expanse.Issue.latestEvidence.certificate.issuerCountry | String | The issuer country in the certificate in the most recent observation |
@@ -601,7 +601,7 @@ Retrieve issues
### expanse-get-issue-updates
***
-Retrieve updates for an Expanse issue.
+Retrieve updates for an Xpanse issue.
#### Base Command
@@ -611,7 +611,7 @@ Retrieve updates for an Expanse issue.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| issue_id | Expanse issue ID to retrieve updates for. | Required |
+| issue_id | Xpanse issue ID to retrieve updates for. | Required |
| update_types | Update types to retrieve (comma separated string. Valid options are 'Assignee', 'Comment', 'Priority', 'ProgressStatus', 'ActivityStatus'). | Optional |
| created_after | Returns only updates created after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ). | Optional |
| limit | Maximum number of results to retrieve. | Optional |
@@ -686,7 +686,7 @@ Retrieve issue comments (subset of updates)
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| issue_id | Expanse issue ID to retrieve updates for. | Required |
+| issue_id | Xpanse issue ID to retrieve updates for. | Required |
| created_after | Returns only comments created after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ). | Optional |
@@ -825,7 +825,7 @@ Retrieve issue comments (subset of updates)
### expanse-update-issue
***
-Update a property of an Expanse issue.
+Update a property of an Xpanse issue.
#### Base Command
@@ -835,7 +835,7 @@ Update a property of an Expanse issue.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| issue_id | Expanse issue ID to update. | Required |
+| issue_id | Xpanse issue ID to update. | Required |
| update_type | Type of update. Possible values are: Assignee, Comment, Priority, ProgressStatus. | Required |
| value | Updated value. | Required |
@@ -885,7 +885,7 @@ Update a property of an Expanse issue.
### expanse-get-issue
***
-Retrieve Expanse issue by issue ID.
+Retrieve Xpanse issue by issue ID.
#### Base Command
@@ -895,7 +895,7 @@ Retrieve Expanse issue by issue ID.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| issue_id | ID of the Expanse issue to retrieve. | Required |
+| issue_id | ID of the Xpanse issue to retrieve. | Required |
#### Context Output
@@ -903,18 +903,18 @@ Retrieve Expanse issue by issue ID.
| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Expanse.Issue.activityStatus | String | Activity status of issue, whether the issue is active or inactive |
-| Expanse.Issue.annotations.tags.id | String | The Internal Expanse tag id of the customer added tag |
+| Expanse.Issue.annotations.tags.id | String | The Internal Xpanse tag id of the customer added tag |
| Expanse.Issue.annotations.tags.name | String | The tag name of the customer added tag |
-| Expanse.Issue.assets.assetKey | String | Key used to access the asset in the respective Expanse asset API |
+| Expanse.Issue.assets.assetKey | String | Key used to access the asset in the respective Xpanse asset API |
| Expanse.Issue.assets.assetType | String | The type of asset the issue primarily relates to |
| Expanse.Issue.assets.displayName | String | A friendly name for the asset |
-| Expanse.Issue.assets.id | String | Internal Expanse ID the asset |
+| Expanse.Issue.assets.id | String | Internal Xpanse ID the asset |
| Expanse.Issue.assigneeUsername | String | The username of the user that has been assigned to the issue |
-| Expanse.Issue.businessUnits.id | String | The internal Expanse ID for the business unit the affected asset belongs to |
+| Expanse.Issue.businessUnits.id | String | The internal Xpanse ID for the business unit the affected asset belongs to |
| Expanse.Issue.businessUnits.name | String | The name of the business unit the affected asset belongs to |
| Expanse.Issue.category | String | The general category of the issue |
| Expanse.Issue.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate |
-| Expanse.Issue.certificate.id | String | The Internal Expanse certificate ID |
+| Expanse.Issue.certificate.id | String | The Internal Xpanse certificate ID |
| Expanse.Issue.certificate.issuer | String | The issuer in the certificate |
| Expanse.Issue.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate |
| Expanse.Issue.certificate.issuerCountry | String | The issuer country in the certificate |
@@ -952,10 +952,10 @@ Retrieve Expanse issue by issue ID.
| Expanse.Issue.created | Date | When the issue instance was created |
| Expanse.Issue.domain | String | Domain name of the issue |
| Expanse.Issue.headline | String | A brief summary of the issue |
-| Expanse.Issue.helpText | String | Why Expanse this type of issue should be avoided |
-| Expanse.Issue.id | String | The internal Expanse ID of the issue |
+| Expanse.Issue.helpText | String | Why Xpanse this type of issue should be avoided |
+| Expanse.Issue.id | String | The internal Xpanse ID of the issue |
| Expanse.Issue.initialEvidence.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate in the initial observation |
-| Expanse.Issue.initialEvidence.certificate.id | String | The Internal Expanse certificate ID in the initial observation |
+| Expanse.Issue.initialEvidence.certificate.id | String | The Internal Xpanse certificate ID in the initial observation |
| Expanse.Issue.initialEvidence.certificate.issuer | String | The issuer in the certificate in the initial observation |
| Expanse.Issue.initialEvidence.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate in the initial observation |
| Expanse.Issue.initialEvidence.certificate.issuerCountry | String | The issuer country in the certificate in the initial observation |
@@ -1014,7 +1014,7 @@ Retrieve Expanse issue by issue ID.
| Expanse.Issue.issueType.id | String | The ID of the issue type |
| Expanse.Issue.issueType.name | String | The name of the issue type |
| Expanse.Issue.latestEvidence.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate in the most recent observation |
-| Expanse.Issue.latestEvidence.certificate.id | String | The Internal Expanse certificate ID in the most recent observation |
+| Expanse.Issue.latestEvidence.certificate.id | String | The Internal Xpanse certificate ID in the most recent observation |
| Expanse.Issue.latestEvidence.certificate.issuer | String | The issuer in the certificate in the most recent observation |
| Expanse.Issue.latestEvidence.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate in the most recent observation |
| Expanse.Issue.latestEvidence.certificate.issuerCountry | String | The issuer country in the certificate in the most recent observation |
@@ -1429,7 +1429,7 @@ Retrieve Expanse issue by issue ID.
### expanse-get-service
***
-Retrieve Expanse issue by service ID.
+Retrieve Xpanse issue by service ID.
#### Base Command
@@ -1439,7 +1439,7 @@ Retrieve Expanse issue by service ID.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| service_id | ID of the Expanse service to retrieve. | Required |
+| service_id | ID of the Xpanse service to retrieve. | Required |
#### Context Output
@@ -1447,21 +1447,21 @@ Retrieve Expanse issue by service ID.
| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Expanse.Service.activityStatus | String | Activity status of service, whether the service is active or inactive |
-| Expanse.Service.annotations.tags.id | String | The Internal Expanse tag id of the customer added tag |
+| Expanse.Service.annotations.tags.id | String | The Internal Xpanse tag id of the customer added tag |
| Expanse.Service.annotations.tags.name | String | The tag name of the customer added tag |
-| Expanse.Service.assets.assetKey | String | Key used to access the asset in the respective Expanse asset API |
+| Expanse.Service.assets.assetKey | String | Key used to access the asset in the respective Xpanse asset API |
| Expanse.Service.assets.assetType | String | The type of asset the issue primarily relates to |
| Expanse.Service.assets.displayName | String | A friendly name for the asset |
-| Expanse.Service.assets.id | String | Internal Expanse ID the asset |
+| Expanse.Service.assets.id | String | Internal Xpanse ID the asset |
| Expanse.Service.assets.referenceReason.id | String | ID for asset reference type |
| Expanse.Service.assets.referenceReason.name | String | Description for asset reference reason |
-| Expanse.Service.businessUnits.id | String | The internal Expanse ID for the business unit the affected asset belongs to |
+| Expanse.Service.businessUnits.id | String | The internal Xpanse ID for the business unit the affected asset belongs to |
| Expanse.Service.businessUnits.name | String | The name of the business unit the affected asset belongs to |
| Expanse.Service.certificates.assetId | String | Internal Asset ID of certificate |
| Expanse.Service.certificates.firstObserved | Date | First observation of certificate |
| Expanse.Service.certificates.lastObserved | Date | Most recent observation of certificate |
| Expanse.Service.certificates.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate |
-| Expanse.Service.certificates.certificate.id | String | The Internal Expanse certificate ID |
+| Expanse.Service.certificates.certificate.id | String | The Internal Xpanse certificate ID |
| Expanse.Service.certificates.certificate.issuer | String | The issuer in the certificate |
| Expanse.Service.certificates.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate |
| Expanse.Service.certificates.certificate.issuerCountry | String | The issuer country in the certificate |
@@ -1542,7 +1542,7 @@ Retrieve Expanse issue by service ID.
| Expanse.Service.domain.lastObserved | Date | The last observation of a domain related to the service |
| Expanse.Service.discoveryInfo.type | String | Whether the service was directly discovered or colocated |
| Expanse.Service.firstObserved | Date | First observation of the service |
-| Expanse.Service.id | String | The internal Expanse ID of the service |
+| Expanse.Service.id | String | The internal Xpanse ID of the service |
| Expanse.Service.ips.assetId | String | The Internal Asset ID of the ip related to the service |
| Expanse.Service.ips.firstObserved | Date | First observation of the ip related to the service |
| Expanse.Service.ips.geolocation.city | String | Geolocation city of the ip related to the service |
@@ -1699,21 +1699,21 @@ Retrieve services
| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Expanse.Service.activityStatus | String | Activity status of service, whether the service is active or inactive |
-| Expanse.Service.annotations.tags.id | String | The Internal Expanse tag id of the customer added tag |
+| Expanse.Service.annotations.tags.id | String | The Internal Xpanse tag id of the customer added tag |
| Expanse.Service.annotations.tags.name | String | The tag name of the customer added tag |
-| Expanse.Service.assets.assetKey | String | Key used to access the asset in the respective Expanse asset API |
+| Expanse.Service.assets.assetKey | String | Key used to access the asset in the respective Xpanse asset API |
| Expanse.Service.assets.assetType | String | The type of asset the issue primarily relates to |
| Expanse.Service.assets.displayName | String | A friendly name for the asset |
-| Expanse.Service.assets.id | String | Internal Expanse ID the asset |
+| Expanse.Service.assets.id | String | Internal Xpanse ID the asset |
| Expanse.Service.assets.referenceReason.id | String | ID for asset reference type |
| Expanse.Service.assets.referenceReason.name | String | Description for asset reference reason |
-| Expanse.Service.businessUnits.id | String | The internal Expanse ID for the business unit the affected asset belongs to |
+| Expanse.Service.businessUnits.id | String | The internal Xpanse ID for the business unit the affected asset belongs to |
| Expanse.Service.businessUnits.name | String | The name of the business unit the affected asset belongs to |
| Expanse.Service.certificates.assetId | String | Internal Asset ID of certificate |
| Expanse.Service.certificates.firstObserved | Date | First observation of certificate |
| Expanse.Service.certificates.lastObserved | Date | Most recent observation of certificate |
| Expanse.Service.certificates.certificate.formattedIssuerOrg | String | The formatted issuer org in the certificate |
-| Expanse.Service.certificates.certificate.id | String | The Internal Expanse certificate ID |
+| Expanse.Service.certificates.certificate.id | String | The Internal Xpanse certificate ID |
| Expanse.Service.certificates.certificate.issuer | String | The issuer in the certificate |
| Expanse.Service.certificates.certificate.issuerAlternativeNames | String | The issuer alternative names in the certificate |
| Expanse.Service.certificates.certificate.issuerCountry | String | The issuer country in the certificate |
@@ -1794,7 +1794,7 @@ Retrieve services
| Expanse.Service.domain.lastObserved | Date | The last observation of a domain related to the service |
| Expanse.Service.discoveryInfo.type | String | Whether the service was directly discovered or colocated |
| Expanse.Service.firstObserved | Date | First observation of the service |
-| Expanse.Service.id | String | The internal Expanse ID of the service |
+| Expanse.Service.id | String | The internal Xpanse ID of the service |
| Expanse.Service.ips.assetId | String | The Internal Asset ID of the ip related to the service |
| Expanse.Service.ips.firstObserved | Date | First observation of the ip related to the service |
| Expanse.Service.ips.geolocation.city | String | Geolocation city of the ip related to the service |
@@ -1976,7 +1976,7 @@ Retrieve services
### expanse-list-pocs
***
-List available Point of Contacts from Expanse.
+List available Point of Contacts from Xpanse.
#### Base Command
@@ -2034,7 +2034,7 @@ List available Point of Contacts from Expanse.
### expanse-create-poc
***
-Create a new Point of Contact in Expanse.
+Create a new Point of Contact in Xpanse.
#### Base Command
@@ -2076,7 +2076,7 @@ Create a new Point of Contact in Expanse.
### expanse-assign-pocs-to-asset
***
-Assign Point of Contacts to an Expanse asset.
+Assign Point of Contacts to an Xpanse asset.
#### Base Command
@@ -2086,7 +2086,7 @@ Assign Point of Contacts to an Expanse asset.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| asset_type | Type of Expanse asset to assign the poc to. Possible values are: IpRange, Certificate, Domain. | Required |
+| asset_type | Type of Xpanse asset to assign the poc to. Possible values are: IpRange, Certificate, Domain. | Required |
| asset_id | ID of the asset to assign the poc to. | Required |
| pocs | IDs of the pocs to assign to the asset (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. | Optional |
| poc_emails | Email Addresses of the pocs to assign to the asset (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. | Optional |
@@ -2107,7 +2107,7 @@ Assign Point of Contacts to an Expanse asset.
### expanse-unassign-pocs-from-asset
***
-Unassign Point of Contacts from an Expanse Asset.
+Unassign Point of Contacts from an Xpanse Asset.
#### Base Command
@@ -2117,7 +2117,7 @@ Unassign Point of Contacts from an Expanse Asset.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| asset_type | Type of Expanse asset to unassign the pocs from. Possible values are: IpRange, Certificate, Domain. | Required |
+| asset_type | Type of Xpanse asset to unassign the pocs from. Possible values are: IpRange, Certificate, Domain. | Required |
| asset_id | ID of the asset to unassign the pocs from. | Required |
| pocs | IDs of the pocs to unassign from the asset (comma separated string). If used in combination with 'poc_emails' the lists of pocs are merged. | Optional |
| poc_emails | Names of the pocs to unassign from the asset (comma separated string). If used in combination with 'pocs' the lists of pocs are merged. | Optional |
@@ -2138,7 +2138,7 @@ Unassign Point of Contacts from an Expanse Asset.
### expanse-assign-pocs-to-iprange
***
-Assign Point of Contacts to an Expanse IP range.
+Assign Point of Contacts to an Xpanse IP range.
#### Base Command
@@ -2168,7 +2168,7 @@ Assign Point of Contacts to an Expanse IP range.
### expanse-unassign-pocs-from-iprange
***
-Unassign Point of Contacts from an Expanse IP range.
+Unassign Point of Contacts from an Xpanse IP range.
#### Base Command
@@ -2198,7 +2198,7 @@ Unassign Point of Contacts from an Expanse IP range.
### expanse-assign-pocs-to-certificate
***
-Assign pocs to an Expanse certificate.
+Assign pocs to an Xpanse certificate.
#### Base Command
@@ -2228,7 +2228,7 @@ Assign pocs to an Expanse certificate.
### expanse-unassign-pocs-from-certificate
***
-Unassign pocs from an Expanse certificate.
+Unassign pocs from an Xpanse certificate.
#### Base Command
@@ -2258,7 +2258,7 @@ Unassign pocs from an Expanse certificate.
### expanse-assign-pocs-to-domain
***
-Assign pocs to an Expanse domain.
+Assign pocs to an Xpanse domain.
#### Base Command
@@ -2288,7 +2288,7 @@ Assign pocs to an Expanse domain.
### expanse-unassign-pocs-from-domain
***
-Unassign pocs from an Expanse domain.
+Unassign pocs from an Xpanse domain.
#### Base Command
@@ -2319,7 +2319,7 @@ Unassign pocs from an Expanse domain.
### expanse-list-businessunits
***
-List available business units from Expanse.
+List available business units from Xpanse.
#### Base Command
@@ -2372,7 +2372,7 @@ List available business units from Expanse.
### expanse-list-providers
***
-List available providers from Expanse.
+List available providers from Xpanse.
#### Base Command
@@ -2445,7 +2445,7 @@ List available tags from Expanse.
| Expanse.Tag.created | Date | The date in which the tag was first created |
| Expanse.Tag.description | String | The description associated with the tag |
| Expanse.Tag.disabled | Boolean | If the tag should be hidden as a tag option in the Expander UI |
-| Expanse.Tag.id | String | The Expanse ID for the tag |
+| Expanse.Tag.id | String | The Xpanse ID for the tag |
| Expanse.Tag.modified | Date | The date in which metadata about the tag was last modified |
| Expanse.Tag.name | String | The display name for the tag |
| Expanse.Tag.tenantId | String | The tenant ID associated with the tag |
@@ -2493,7 +2493,7 @@ List available tags from Expanse.
### expanse-assign-tags-to-asset
***
-Assign tags to an Expanse asset.
+Assign tags to an Xpanse asset.
#### Base Command
@@ -2503,7 +2503,7 @@ Assign tags to an Expanse asset.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| asset_type | Type of Expanse asset to assign the tag to. Possible values are: IpRange, Certificate, Domain. | Required |
+| asset_type | Type of Xpanse asset to assign the tag to. Possible values are: IpRange, Certificate, Domain. | Required |
| asset_id | ID of the asset to assign the tags to. | Required |
| tags | IDs of the tags to assign to the asset (comma separated string). If used in combination with 'tag_names' the lists of tags are merged. | Optional |
| tag_names | Names of the tags to assign to the asset (comma separated string). If used in combination with 'tags' the lists of tags are merged. | Optional |
@@ -2529,7 +2529,7 @@ Assign tags to an Expanse asset.
### expanse-unassign-tags-from-asset
***
-Unassign tags from an Expanse Asset.
+Unassign tags from an Xpanse Asset.
#### Base Command
@@ -2539,7 +2539,7 @@ Unassign tags from an Expanse Asset.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| asset_type | Type of Expanse asset to unassign the tags from. Possible values are: IpRange, Certificate, Domain. | Required |
+| asset_type | Type of Xpanse asset to unassign the tags from. Possible values are: IpRange, Certificate, Domain. | Required |
| asset_id | ID of the asset to unassign the tags from. | Required |
| tags | IDs of the tags to unassign from the asset (comma separated string). If used in combination with 'tag_names' the lists of tags are merged. | Optional |
| tag_names | Names of the tags to unassign from the asset (comma separated string). If used in combination with 'tags' the lists of tags are merged. | Optional |
@@ -2565,7 +2565,7 @@ Unassign tags from an Expanse Asset.
### expanse-assign-tags-to-iprange
***
-Assign tags to an Expanse IP range.
+Assign tags to an Xpanse IP range.
#### Base Command
@@ -2600,7 +2600,7 @@ Assign tags to an Expanse IP range.
### expanse-unassign-tags-from-iprange
***
-Unassign tags from an Expanse IP range.
+Unassign tags from an Xpanse IP range.
#### Base Command
@@ -2635,7 +2635,7 @@ Unassign tags from an Expanse IP range.
### expanse-assign-tags-to-certificate
***
-Assign tags to an Expanse certificate.
+Assign tags to an Xpanse certificate.
#### Base Command
@@ -2670,7 +2670,7 @@ Assign tags to an Expanse certificate.
### expanse-unassign-tags-from-certificate
***
-Unassign tags from an Expanse certificate.
+Unassign tags from an Xpanse certificate.
#### Base Command
@@ -2705,7 +2705,7 @@ Unassign tags from an Expanse certificate.
### expanse-assign-tags-to-domain
***
-Assign tags to an Expanse domain.
+Assign tags to an Xpanse domain.
#### Base Command
@@ -2740,7 +2740,7 @@ Assign tags to an Expanse domain.
### expanse-unassign-tags-from-domain
***
-Unassign tags from an Expanse domain.
+Unassign tags from an Xpanse domain.
#### Base Command
@@ -2775,7 +2775,7 @@ Unassign tags from an Expanse domain.
### expanse-create-tag
***
-Create a new tag in Expanse.
+Create a new tag in Xpanse.
#### Base Command
@@ -2796,7 +2796,7 @@ Create a new tag in Expanse.
| Expanse.Tag.created | Date | The date in which the tag was first created |
| Expanse.Tag.description | String | The description associated with the tag |
| Expanse.Tag.disabled | Boolean | If the tag should be hidden as a tag option in the Expander UI |
-| Expanse.Tag.id | String | The Expanse ID for the tag |
+| Expanse.Tag.id | String | The Xpanse ID for the tag |
| Expanse.Tag.modified | Date | The date in which metadata about the tag was last modified |
| Expanse.Tag.name | String | The display name for the tag |
| Expanse.Tag.tenantId | String | The tenant ID associated with the tag |
@@ -2816,7 +2816,7 @@ Create a new tag in Expanse.
### expanse-get-iprange
***
-Retrieve Expanse IP ranges by asset id or search parameters.
+Retrieve Xpanse IP ranges by asset id or search parameters.
#### Base Command
@@ -2826,7 +2826,7 @@ Retrieve Expanse IP ranges by asset id or search parameters.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| id | Asset ID of the Expanse IP range to retrieve. If provided, other search parameters are ignored. | Optional |
+| id | Asset ID of the Xpanse IP range to retrieve. If provided, other search parameters are ignored. | Optional |
| business_units | Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_unit_names' argument. | Optional |
| business_unit_names | Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_units' argument. | Optional |
| inet | Search for given IP/CIDR block using a single IP (d.d.d.d), a dashed IP range (d.d.d.d-d.d.d.d), a CIDR block (d.d.d.d/m), a partial CIDR (d.d.), or a wildcard (d.d.*.d). | Optional |
@@ -2848,7 +2848,7 @@ Retrieve Expanse IP ranges by asset id or search parameters.
| Expanse.IPRange.businessUnits.id | String | Business Units that the IP range has been assigned to |
| Expanse.IPRange.businessUnits.name | String | Business Units that the IP range has been assigned to |
| Expanse.IPRange.created | Date | The date that the IP range was added to the Expander instance |
-| Expanse.IPRange.id | String | Internal Expanse ID for the IP Range |
+| Expanse.IPRange.id | String | Internal Xpanse ID for the IP Range |
| Expanse.IPRange.ipVersion | String | The IP version of the IP range |
| Expanse.IPRange.locationInformation.geolocation.city | String | The IP range geolocation |
| Expanse.IPRange.locationInformation.geolocation.countryCode | String | The IP range geolocation |
@@ -2859,7 +2859,7 @@ Retrieve Expanse IP ranges by asset id or search parameters.
| Expanse.IPRange.modified | Date | The date on which the IP range was last ingested into Expander |
| Expanse.IPRange.rangeIntroduced | Date | The date that the IP range was added to the Expander instance |
| Expanse.IPRange.rangeSize | Number | The number of IP addresses in the IP range |
-| Expanse.IPRange.rangeType | String | If the IP range is Expanse-generated parent range or a customer-generated custom range |
+| Expanse.IPRange.rangeType | String | If the IP range is Xpanse-generated parent range or a customer-generated custom range |
| Expanse.IPRange.relatedRegistrationInformation.country | String | The country within the IP range registration information |
| Expanse.IPRange.relatedRegistrationInformation.endAddress | String | The end address within the IP range registration information |
| Expanse.IPRange.relatedRegistrationInformation.handle | String | The handle within the IP range registration information |
@@ -2942,7 +2942,7 @@ Retrieve Expanse IP ranges by asset id or search parameters.
### expanse-get-domain
***
-Retrieve Expanse domains by domain name or search parameters.
+Retrieve Xpanse domains by domain name or search parameters.
#### Base Command
@@ -2953,12 +2953,12 @@ Retrieve Expanse domains by domain name or search parameters.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
| domain | Domain name to retrieve (exact match). If provided, other search parameters are ignored. | Optional |
-| last_observed_date | Last date the domain was observed by Expanse (Format is YYYY-MM-DD). | Optional |
+| last_observed_date | Last date the domain was observed by Xpanse (Format is YYYY-MM-DD). | Optional |
| search | Search domain names that match the specified substring. | Optional |
| limit | Maximum number of entries to retrieve. | Optional |
| has_dns_resolution | Retrieve only domains with or without DNS resolution. Possible values are: true, false. | Optional |
-| has_active_service | Retrieve only domains with or without an active service discovered by Expanse. Possible values are: true, false. | Optional |
-| has_related_cloud_resources | Retrieve only domains with or without cloud resources discovered by Expanse. Possible values are: true, false. | Optional |
+| has_active_service | Retrieve only domains with or without an active service discovered by Xpanse. Possible values are: true, false. | Optional |
+| has_related_cloud_resources | Retrieve only domains with or without cloud resources discovered by Xpanse. Possible values are: true, false. | Optional |
| tags | Returns only results whose Tag ID falls in the provided list. (comma separated string). Cannot be used with the 'tag_names' argument. | Optional |
| tag_names | Returns only results whose Tag name falls in the provided list. (comma separated string). Cannot be used with the 'tags' argument. | Optional |
| business_units | Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_unit_names' argument. | Optional |
@@ -2998,7 +2998,7 @@ Retrieve Expanse domains by domain name or search parameters.
| Expanse.Domain.dnsResolutionStatus | String | Latest DNS resolution status |
| Expanse.Domain.firstObserved | Date | The date that the domain was first observed |
| Expanse.Domain.hasLinkedCloudResources | Boolean | Whether the domain has any linked cloud resources associated with it |
-| Expanse.Domain.id | String | Internal Expanse ID for Domain |
+| Expanse.Domain.id | String | Internal Xpanse ID for Domain |
| Expanse.Domain.domain | String | The domain value |
| Expanse.Domain.isCollapsed | Boolean | Whether or not the subdomains of the domain are collapsed |
| Expanse.Domain.isPaidLevelDomain | Boolean | Whether or not the domain is a PLD |
@@ -3376,7 +3376,7 @@ Retrieve Expanse domains by domain name or search parameters.
### expanse-get-associated-domains
***
-Returns all the Expanse domains which have been seen with the specified certificate or IP address.
+Returns all the Xpanse domains which have been seen with the specified certificate or IP address.
#### Base Command
@@ -3398,7 +3398,7 @@ Returns all the Expanse domains which have been seen with the specified certific
| --- | --- | --- |
| Expanse.AssociatedDomain.name | String | Name of the domain. |
| Expanse.AssociatedDomain.IP | String | IP Address the domain resolved to. |
-| Expanse.AssociatedDomain.certificate | String | Expanse ID of the certificate associated to this domain. |
+| Expanse.AssociatedDomain.certificate | String | Xpanse ID of the certificate associated to this domain. |
| Domain.Name | String | The domain name, for example: "google.com". |
| DBotScore.Indicator | String | The indicator that was tested. |
| DBotScore.Type | String | The indicator type. |
@@ -3443,7 +3443,7 @@ Returns all the Expanse domains which have been seen with the specified certific
### expanse-get-certificate
***
-Retrieve Expanse certificates by MD5 hash or search parameters.
+Retrieve Xpanse certificates by MD5 hash or search parameters.
#### Base Command
@@ -3454,12 +3454,12 @@ Retrieve Expanse certificates by MD5 hash or search parameters.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
| md5_hash | MD5 Hash of the certificate. If provided, other search parameters are ignored. | Optional |
-| last_observed_date | Last date the domain was observed by Expanse (Format is YYYY-MM-DD), to be used with domain argument. | Optional |
+| last_observed_date | Last date the domain was observed by Xpanse (Format is YYYY-MM-DD), to be used with domain argument. | Optional |
| search | Search for certificates with the specified substring in common name. | Optional |
| limit | Maximum number of entries to retrieve. | Optional |
| has_certificate_advertisement | Retrieve only certificates actively/not actively advertised. Possible values are: true, false. | Optional |
-| has_active_service | Retrieve only certificates with or without an active service discovered by Expanse. Possible values are: true, false. | Optional |
-| has_related_cloud_resources | Retrieve only certificates with or without cloud resources discovered by Expanse. Possible values are: true, false. | Optional |
+| has_active_service | Retrieve only certificates with or without an active service discovered by Xpanse. Possible values are: true, false. | Optional |
+| has_related_cloud_resources | Retrieve only certificates with or without cloud resources discovered by Xpanse. Possible values are: true, false. | Optional |
| tags | Returns only results whose Tag ID falls in the provided list. (comma separated string). Cannot be used with the 'tag_names' argument. | Optional |
| tag_names | Returns only results whose Tag name falls in the provided list. (comma separated string). Cannot be used with the 'tags' argument. | Optional |
| business_units | Returns only results whose Business Unit's ID falls in the provided list. (comma separated string). Cannot be used with the 'business_unit_names' argument. | Optional |
@@ -3535,9 +3535,9 @@ Retrieve Expanse certificates by MD5 hash or search parameters.
| Expanse.Certificate.details.recentIps.type | String | Additional details for the recent IPs linked to the certificate |
| Expanse.Certificate.firstObserved | Date | The date that the certificate was first observed |
| Expanse.Certificate.hasLinkedCloudResources | Boolean | Whether the certificate has any linked cloud resources associated with it |
-| Expanse.Certificate.id | String | Internal Expanse ID for Certificate |
+| Expanse.Certificate.id | String | Internal Xpanse ID for Certificate |
| Expanse.Certificate.lastObserved | Date | The date that the certificate was most recently observed |
-| Expanse.Certificate.properties | String | Expanse tagged properties of the certificate |
+| Expanse.Certificate.properties | String | Xpanse tagged properties of the certificate |
| Expanse.Certificate.providers.id | String | The Provider information for the certificate |
| Expanse.Certificate.providers.name | String | The Provider information for the certificate |
| Expanse.Certificate.serviceStatus | String | Detected service statuses for the certificate |
@@ -3746,7 +3746,7 @@ This field includes the Common Name of the certificate.
### certificate
***
-Provides data enrichment for an X509 Certificate from Expanse.
+Provides data enrichment for an X509 Certificate from Xpanse.
#### Base Command
@@ -3756,8 +3756,8 @@ Provides data enrichment for an X509 Certificate from Expanse.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
-| certificate | MD5, SHA-1, SHA-256 or SHA-512 hash of the certificate to enrich.
If MD5 is given, the command will check directly with Expanse API otherwise
the script looks first for an indicator with the given hash to retrieve the
corresponding MD5 hash.
. | Optional |
-| set_expanse_fields | If set to true, the command updates the Expanse custom fields of the indicator.
Only if an indicator already exists.
. Possible values are: true, false. | Optional |
+| certificate | MD5, SHA-1, SHA-256 or SHA-512 hash of the certificate to enrich.
If MD5 is given, the command will check directly with Xpanse API otherwise
the script looks first for an indicator with the given hash to retrieve the
corresponding MD5 hash.
. | Optional |
+| set_expanse_fields | If set to true, the command updates the Xpanse custom fields of the indicator.
Only if an indicator already exists.
. Possible values are: true, false. | Optional |
#### Context Output
@@ -3827,9 +3827,9 @@ Provides data enrichment for an X509 Certificate from Expanse.
| Expanse.Certificate.details.recentIps.type | String | Additional details for the recent IPs linked to the certificate |
| Expanse.Certificate.firstObserved | Date | The date that the certificate was first observed |
| Expanse.Certificate.hasLinkedCloudResources | Boolean | Whether the certificate has any linked cloud resources associated with it |
-| Expanse.Certificate.id | String | Internal Expanse ID for Certificate |
+| Expanse.Certificate.id | String | Internal Xpanse ID for Certificate |
| Expanse.Certificate.lastObserved | Date | The date that the certificate was most recently observed |
-| Expanse.Certificate.properties | String | Expanse tagged properties of the certificate |
+| Expanse.Certificate.properties | String | Xpanse tagged properties of the certificate |
| Expanse.Certificate.providers.id | String | The Provider information for the certificate |
| Expanse.Certificate.providers.name | String | The Provider information for the certificate |
| Expanse.Certificate.serviceStatus | String | Detected service statuses for the certificate |
@@ -4046,7 +4046,7 @@ This field includes the Common Name of the certificate.
### expanse-get-cloud-resources
***
-Retrieve Cloud Resource assets from Expanse.
+Retrieve Cloud Resource assets from Xpanse.
#### Base Command
@@ -4057,7 +4057,7 @@ Retrieve Cloud Resource assets from Expanse.
| **Argument Name** | **Description** | **Required** |
| --- | --- | --- |
| limit | Maximum number of cloud resources to retrieve. | Optional |
-| last_observed_date | Last date the cloud resource was observed by Expanse. (Format is YYYY-MM-DD). | Optional |
+| last_observed_date | Last date the cloud resource was observed by Xpanse. (Format is YYYY-MM-DD). | Optional |
| domain | A domain search string to find related cloud resources. | Optional |
| ip | An IP search string to find related cloud resources. | Optional |
| providers | A search string of provider IDs to find cloud resources hosted by specific providers. | Optional |
@@ -4180,7 +4180,7 @@ Retrieve Cloud Resource assets from Expanse.
### expanse-get-cloud-resource
***
-Retrieve a specified cloud resource from Expanse.
+Retrieve a specified cloud resource from Xpanse.
#### Base Command
@@ -4300,7 +4300,7 @@ Retrieve a specified cloud resource from Expanse.
### expanse-get-risky-flows
***
-(Deprecated) Retrieve risky flows detected by Expanse Behavior.
+(Deprecated) Retrieve risky flows detected by Xpanse Behavior.
#### Base Command
@@ -4325,7 +4325,7 @@ Retrieve a specified cloud resource from Expanse.
| Expanse.RiskyFlow.acked | Boolean | Whether the risky flow was acked |
| Expanse.RiskyFlow.businessUnit.id | String | The business unit id of the asset involved in the risky flow |
| Expanse.RiskyFlow.businessUnit.name | String | The business unit name of the asset involved in the risky flow |
-| Expanse.RiskyFlow.created | Date | The timestamp when the risky flow was found and created by Expanse |
+| Expanse.RiskyFlow.created | Date | The timestamp when the risky flow was found and created by Xpanse |
| Expanse.RiskyFlow.externalAddress | String | The external IPv4 address involved in the risky flow |
| Expanse.RiskyFlow.externalCountryCode | String | The external country code of the IPv4 involved in the risky flow |
| Expanse.RiskyFlow.externalCountryCodes | String | The external country codes of the IPv4 involved in the risky flow |
@@ -4405,7 +4405,7 @@ Retrieve a specified cloud resource from Expanse.
### expanse-list-risk-rules
***
-(Deprecated) List risk rules from Expanse Behavior
+(Deprecated) List risk rules from Xpanse Behavior
#### Base Command
@@ -4537,7 +4537,7 @@ Provides data enrichment for domains.
| Expanse.Domain.dnsResolutionStatus | String | Latest DNS resolution status |
| Expanse.Domain.firstObserved | Date | The date that the domain was first observed |
| Expanse.Domain.hasLinkedCloudResources | Boolean | Whether the domain has any linked cloud resources associated with it |
-| Expanse.Domain.id | String | Internal Expanse ID for Domain |
+| Expanse.Domain.id | String | Internal Xpanse ID for Domain |
| Expanse.Domain.domain | String | The domain value |
| Expanse.Domain.isCollapsed | Boolean | Whether or not the subdomains of the domain are collapsed |
| Expanse.Domain.isPaidLevelDomain | Boolean | Whether or not the domain is a PLD |
@@ -4941,9 +4941,9 @@ Provides data enrichment for IPs.
| **Path** | **Type** | **Description** |
| --- | --- | --- |
| Expanse.IP.ip | String | The IPv4 address of the asset |
-| Expanse.IP.assetKey | String | Key used to access the asset in the respective Expanse asset API |
+| Expanse.IP.assetKey | String | Key used to access the asset in the respective Xpanse asset API |
| Expanse.IP.assetType | String | The type of asset |
-| Expanse.IP.businessUnits.id | String | The internal Expanse ID for the business unit the asset belongs to |
+| Expanse.IP.businessUnits.id | String | The internal Xpanse ID for the business unit the asset belongs to |
| Expanse.IP.businessUnits.name | String | The name of the business unit the asset belongs to |
| Expanse.IP.businessUnits.tenantId | String | The ID of the tenant that the asset belongs to |
| Expanse.IP.commonName | String | The certificate common name of the asset |
@@ -4951,7 +4951,7 @@ Provides data enrichment for IPs.
| Expanse.IP.lastObserved | Date | The last observed IPv4 address of the asset |
| Expanse.IP.provider.id | String | The ID of the provider the asset was detected on |
| Expanse.IP.provider.name | String | The name of the provider the asset was detected on |
-| Expanse.IP.tenant.id | String | The internal Expanse ID of the tenant that the asset belongs to |
+| Expanse.IP.tenant.id | String | The internal Xpanse ID of the tenant that the asset belongs to |
| Expanse.IP.tenant.name | String | The name of the tenant that the asset belongs to |
| Expanse.IP.tenant.tenantId | String | The ID of the tenant that the asset belongs to |
| Expanse.IP.type | String | The type of asset that the IPv4 address relates to |
@@ -5027,7 +5027,7 @@ Provides data enrichment for IPs.
### cidr
***
-Provides data enrichment for CIDR blocks using Expanse IP Range.
+Provides data enrichment for CIDR blocks using Xpanse IP Range.
#### Base Command
@@ -5052,7 +5052,7 @@ Provides data enrichment for CIDR blocks using Expanse IP Range.
| Expanse.IPRange.businessUnits.id | String | Business Units that the IP range has been assigned to |
| Expanse.IPRange.businessUnits.name | String | Business Units that the IP range has been assigned to |
| Expanse.IPRange.created | Date | The date that the IP range was added to the Expander instance |
-| Expanse.IPRange.id | String | Internal Expanse ID for the IP Range |
+| Expanse.IPRange.id | String | Internal Xpanse ID for the IP Range |
| Expanse.IPRange.ipVersion | String | The IP version of the IP range |
| Expanse.IPRange.locationInformation.geolocation.city | String | The IP range geolocation |
| Expanse.IPRange.locationInformation.geolocation.countryCode | String | The IP range geolocation |
@@ -5063,7 +5063,7 @@ Provides data enrichment for CIDR blocks using Expanse IP Range.
| Expanse.IPRange.modified | Date | The date on which the IP range was last ingested into Expander |
| Expanse.IPRange.rangeIntroduced | Date | The date that the IP range was added to the Expander instance |
| Expanse.IPRange.rangeSize | Number | The number of IP addresses in the IP range |
-| Expanse.IPRange.rangeType | String | If the IP range is Expanse-generated parent range or a customer-generated custom range |
+| Expanse.IPRange.rangeType | String | If the IP range is Xpanse-generated parent range or a customer-generated custom range |
| Expanse.IPRange.relatedRegistrationInformation.country | String | The country within the IP range registration information |
| Expanse.IPRange.relatedRegistrationInformation.endAddress | String | The end address within the IP range registration information |
| Expanse.IPRange.relatedRegistrationInformation.handle | String | The handle within the IP range registration information |
diff --git a/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.py b/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.py
index feb033b9bb69..0f89e403f120 100644
--- a/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.py
+++ b/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.py
@@ -641,7 +641,7 @@ def main() -> None:
params = demisto.params()
command = demisto.command()
- api_key = params.get("apikey")
+ api_key = params.get('credentials', {}).get('password', '') or params.get("apikey", '')
base_url = urljoin(params["url"], "/api")
verify_certificate = not params.get("insecure", False)
proxy = params.get("proxy", False)
diff --git a/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.yml b/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.yml
index 8416f5f4e37e..93bd83822c83 100644
--- a/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.yml
+++ b/Packs/ExpanseV2/Integrations/FeedExpanse/FeedExpanse.yml
@@ -11,11 +11,15 @@ configuration:
name: url
required: true
type: 0
+- name: credentials
+ type: 9
+ displaypassword: API Key
+ hiddenusername: true
- display: API Key
- additionalinfo: The API Key to use for connection
name: apikey
- required: true
type: 4
+ additionalinfo: The API Key to use for connection
+ hidden: true
- display: Trust any certificate (not secure)
name: insecure
required: false
@@ -35,40 +39,38 @@ configuration:
required: false
type: 0
- defaultvalue: '7'
- display: Retrieve indicators observed in the last specified number of days
name: min_last_observed
+ display: 'Retrieve indicators observed in the last specified number of days'
required: false
type: 0
-- defaultvalue: suddenDeath
- name: feedExpirationPolicy
+- defaultvalue: 'suddenDeath'
display: ''
+ name: feedExpirationPolicy
+ required: false
+ type: 17
options:
- never
- interval
- indicatorType
- suddenDeath
- required: false
- type: 17
- defaultvalue: '20160'
display: ''
name: feedExpirationInterval
required: false
type: 1
-- defaultvalue: '720'
- display: Feed Fetch Interval
+- display: Feed Fetch Interval
name: feedFetchInterval
required: false
type: 19
-- additionalinfo: When selected, the exclusion list is ignored for indicators from this feed. This means that if an indicator from this feed is on the exclusion list, the indicator might still be added to the system.
- display: Bypass exclusion list
+ defaultvalue: '720'
+- display: Bypass exclusion list
name: feedBypassExclusionList
- required: false
type: 8
-- display: Source Reliability
+ required: false
+ additionalinfo: When selected, the exclusion list is ignored for indicators from this feed. This means that if an indicator from this feed is on the exclusion list, the indicator might still be added to the system.
+- additionalinfo: Reliability of the source providing the intelligence data
+ display: Source Reliability
name: feedReliability
- defaultvalue: F - Reliability cannot be judged
- type: 15
- required: true
options:
- A - Completely reliable
- B - Usually reliable
@@ -76,17 +78,19 @@ configuration:
- D - Not usually reliable
- E - Unreliable
- F - Reliability cannot be judged
- additionalinfo: Reliability of the source providing the intelligence data
+ required: true
+ type: 15
+ defaultvalue: F - Reliability cannot be judged
- additionalinfo: Indicators from this integration instance will be marked with this reputation
display: Indicator Reputation
name: feedReputation
+ required: false
+ type: 18
options:
- None
- Good
- Suspicious
- Bad
- required: false
- type: 18
- additionalinfo: Supports CSV values.
display: Tags
name: feedTags
@@ -152,7 +156,7 @@ script:
script: '-'
type: python
subtype: python3
- dockerimage: demisto/python3:3.10.8.37233
+ dockerimage: demisto/python3:3.10.10.48392
fromversion: 6.0.0
tests:
- Feed Expanse Test
diff --git a/Packs/ExpanseV2/README.md b/Packs/ExpanseV2/README.md
index 229a08370864..8c5d535cdff3 100644
--- a/Packs/ExpanseV2/README.md
+++ b/Packs/ExpanseV2/README.md
@@ -1,28 +1,30 @@
-The Cortex Xpanse pack for Cortex XSOAR provides full coverage of the Expanse Expander and Behavior product capabilities to allow SOCs to automate the defense of their company's attack surface. The integrations included in the pack enable fetching and mirroring of Expanse Issues into Cortex XSOAR incidents, and ingestion of indicators (IPs, domains, and certificates) referring to the corporate network perimeter as discovered by Expanse, a Palo Alto Networks company.
+> **Note**: This Pack, is intended for use with Cortex Xpanse Expander v1, for customers utilizing Expander 2.X (i.e. Active ASM) with Cortex XSOAR, please utilize the [Cortex Xpanse](https://cortex.marketplace.pan.dev/marketplace/details/CortexXpanse/) pack.
+
+The Cortex Xpanse pack for Cortex XSOAR provides full coverage of the Cortex Xpanse Expander v1 product and allows SOCs to automate the defense of their company's attack surface. The integrations included in the pack enable fetching and mirroring of Cortex Xpanse Issues into Cortex XSOAR incidents, and ingestion of indicators (IPs, domains, and certificates) referring to the corporate network perimeter as discovered by Cortex Xpanse, a Palo Alto Networks company.
Through a powerful set of playbooks, analysts can correlate the discovered information with data provided from internal security systems (Palo Alto Networks Cortex Data Lake, Prisma Cloud, and Panorama, Active Directory, Splunk SIEM, etc.) to help pinpoint the right owners of assets and automate remediation.
> **Note**: This Pack, as well as its previously named **Expanse v2** Integration, were renamed to **Cortex Xpanse**. All other content items are still named the same.
##### What does this pack do?
-- Provides the **Cortex Xpanse** integration (for Expanse Expander and Behavior), which allows XSOAR to collect Expanse Issues and bi-directionally mirror them. Several commands are available to search, tag, and update issues and assets in Expanse. The integration also supports the services API.
+- Provides the **Cortex Xpanse** integration (for Cortex Xpanse Expander), which allows XSOAR to collect Xpanse Issues and bi-directionally mirror them. Several commands are available to search, tag, and update issues and assets in Expander. The integration also supports the services API.
- Provides a feed integration named **Expanse Expander Feed**, which is compatible with the Cortex XSOAR Threat Intel Management capabilities to retrieve and store discovered assets (IPs, IP ranges, domains, certificates) in Cortex XSOAR for analysis and correlation.
- Provides an **Expanse Issue** incident type with dedicated fields and layouts.
-- Provides a rich set of playbooks and sub-playbooks that handle the investigation and remediation of Expanse Issues.
-- Provides dashboards that display the network perimeter as discovered by Expanse and the status of Expanse Issues.
+- Provides a rich set of playbooks and sub-playbooks that handle the investigation and remediation of Xpanse Issues.
+- Provides dashboards that display the network perimeter as discovered by Xpanse and the status of Xpanse Issues.
##### How to use this pack?
-- After the Expanse API key is added in the **Expanse v2** integration and the parameters are set, the Expanse issues will start getting mapped to the Expanse incident type and the **Handle Expanse Incident** playbook will automatically be launched.
+- After the Xpanse API key is added in the **Cortex Xpanse** integration and the parameters are set, the Xpanse issues will start getting mapped to the Expanse incident type and the **Handle Expanse Incident** playbook will automatically be launched.
- If you are only interested in enrichment and attribution, you can use the **Handle Expanse Incident - Attribution Only** playbook instead, by assigning it to the **Expanse Issue** incident type.
- This pack also includes a generic playbook called **Xpanse Incident Handling - Generic**. In order to use it, configure the instance without any classifier and choose **Xpanse Issue - Generic** as the incident type.
##### Screenshots
-- **Expanse Incidents Dashboard**: The main dashboard for all the Expanse incidents.
+- **Expanse Incidents Dashboard**: The main dashboard for all the Xpanse incidents.
![Expanse Incidents Dashboard](https://raw.githubusercontent.com/demisto/content/b8efd3c2e9409b02b9c4b1873ff3e783524c5104/Packs/ExpanseV2/doc_files/Expanse_Incidents_Dashboard.png)
-- **Expanse Incident Layout**: The included default layout for Expanse incidents.
+- **Expanse Incident Layout**: The included default layout for Xpanse incidents.
![Expanse Incident Layout](https://raw.githubusercontent.com/demisto/content/b8efd3c2e9409b02b9c4b1873ff3e783524c5104/Packs/ExpanseV2/doc_files/Expanse_Incident_Layout.png)
@@ -36,4 +38,4 @@ Through a powerful set of playbooks, analysts can correlate the discovered infor
##### Video
-[![Expanse and Cortex XSOAR](https://img.youtube.com/vi/I3Vj-f5VGMk/0.jpg)](https://www.youtube.com/watch?v=I3Vj-f5VGMk)
+[![Expanse and Cortex XSOAR](https://img.youtube.com/vi/I3Vj-f5VGMk/0.jpg)](https://www.youtube.com/watch?v=I3Vj-f5VGMk)
\ No newline at end of file
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_24.md b/Packs/ExpanseV2/ReleaseNotes/1_10_24.md
new file mode 100644
index 000000000000..d0a3a9f6d21b
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_24.md
@@ -0,0 +1,5 @@
+#### Integrations
+##### Cortex Xpanse
+- Updated the Docker image to: *demisto/python3:3.10.9.42476*.
+##### Expanse Expander Feed
+- Updated the Docker image to: *demisto/python3:3.10.9.42476*.
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_25.md b/Packs/ExpanseV2/ReleaseNotes/1_10_25.md
new file mode 100644
index 000000000000..9dce98e3b0b5
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_25.md
@@ -0,0 +1,4 @@
+
+#### Integrations
+##### Cortex Xpanse
+- Fixed an issue where the ***expanse-unassign-tags-from-asset*** would occasionally time out.
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_26.md b/Packs/ExpanseV2/ReleaseNotes/1_10_26.md
new file mode 100644
index 000000000000..c970ecf1efea
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_26.md
@@ -0,0 +1,6 @@
+
+#### Integrations
+##### Cortex Xpanse
+- Added the *API Key* integration parameter to support credentials fetching object.
+##### Expanse Expander Feed
+- Added the *API Key* integration parameter to support credentials fetching object.
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_27.md b/Packs/ExpanseV2/ReleaseNotes/1_10_27.md
new file mode 100644
index 000000000000..5d3ff011d633
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_27.md
@@ -0,0 +1,5 @@
+
+
+#### Integrations
+##### Cortex Xpanse
+- Added support for sections infrastructure.
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_28.md b/Packs/ExpanseV2/ReleaseNotes/1_10_28.md
new file mode 100644
index 000000000000..388486a0f31f
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_28.md
@@ -0,0 +1,4 @@
+
+#### Scripts
+##### ExpanseGenerateIssueMapWidgetScript
+- Updated the Docker image to: *demisto/chromium:1.0.0.46586*.
\ No newline at end of file
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_29.md b/Packs/ExpanseV2/ReleaseNotes/1_10_29.md
new file mode 100644
index 000000000000..eb648d341b72
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_29.md
@@ -0,0 +1,4 @@
+
+#### Scripts
+##### ExpanseGenerateIssueMapWidgetScript
+- Updated the Docker image to: *demisto/chromium:1.0.0.48560*.
\ No newline at end of file
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_30.md b/Packs/ExpanseV2/ReleaseNotes/1_10_30.md
new file mode 100644
index 000000000000..18286bb76218
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_30.md
@@ -0,0 +1,5 @@
+#### Integrations
+##### Cortex Xpanse
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
+##### Expanse Expander Feed
+- Updated the Docker image to: *demisto/python3:3.10.10.48392*.
diff --git a/Packs/ExpanseV2/ReleaseNotes/1_10_31.md b/Packs/ExpanseV2/ReleaseNotes/1_10_31.md
new file mode 100644
index 000000000000..ea64792fc792
--- /dev/null
+++ b/Packs/ExpanseV2/ReleaseNotes/1_10_31.md
@@ -0,0 +1,4 @@
+#### Scripts
+##### ExpanseGenerateIssueMapWidgetScript
+- Updated the Docker image to: *demisto/chromium:1.0.0.49453*.
+- Documentation and metadata improvements.
\ No newline at end of file
diff --git a/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/ExpanseGenerateIssueMapWidgetScript.yml b/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/ExpanseGenerateIssueMapWidgetScript.yml
index 8896211811e8..7a2acbbf2d9d 100644
--- a/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/ExpanseGenerateIssueMapWidgetScript.yml
+++ b/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/ExpanseGenerateIssueMapWidgetScript.yml
@@ -17,11 +17,11 @@ comment: |-
This automation runs using the default Limited User role, unless you explicitly change the permissions.
For more information, see the section about permissions here:
- https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/playbooks/automations.html
+ https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations
commonfields:
id: ExpanseGenerateIssueMapWidgetScript
version: -1
-dockerimage: demisto/chromium:1.0.0.41207
+dockerimage: demisto/chromium:1.0.0.49453
enabled: true
name: ExpanseGenerateIssueMapWidgetScript
runonce: false
diff --git a/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/README.md b/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/README.md
index ddc3ed4516d7..98d229a22b6c 100644
--- a/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/README.md
+++ b/Packs/ExpanseV2/Scripts/ExpanseGenerateIssueMapWidgetScript/README.md
@@ -4,8 +4,7 @@ This widget script generates a map of the Open Expanse Issue Incidents with prov
---
This automation runs using the default Limited User role, unless you explicitly change the permissions.
-For more information, see the section about permissions here: [https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/playbooks/automations.html
-](https://docs.paloaltonetworks.com/cortex/cortex-xsoar/6-2/cortex-xsoar-admin/playbooks/automations.html)
+For more information, see the section about permissions here: [https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations](https://docs-cortex.paloaltonetworks.com/r/Cortex-XSOAR/6.10/Cortex-XSOAR-Administrator-Guide/Automations)
## Script Data
---
diff --git a/Packs/ExpanseV2/TestPlaybooks/playbook-ExpanseV2_Test.yml b/Packs/ExpanseV2/TestPlaybooks/playbook-ExpanseV2_Test.yml
index 8e054a1506d2..f133524932fe 100644
--- a/Packs/ExpanseV2/TestPlaybooks/playbook-ExpanseV2_Test.yml
+++ b/Packs/ExpanseV2/TestPlaybooks/playbook-ExpanseV2_Test.yml
@@ -17,6 +17,7 @@ tasks:
'#none#':
- "1"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -50,6 +51,7 @@ tasks:
all:
simple: "yes"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -87,6 +89,7 @@ tasks:
sort:
simple: -created
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -103,10 +106,10 @@ tasks:
isautoswitchedtoquietmode: false
"3":
id: "3"
- taskid: c90f72f1-7309-4317-8446-9ca268022ab7
+ taskid: d78de052-e7c8-40e8-888a-77d34443407b
type: condition
task:
- id: c90f72f1-7309-4317-8446-9ca268022ab7
+ id: d78de052-e7c8-40e8-888a-77d34443407b
version: -1
name: Verify Outputs
type: condition
@@ -124,25 +127,27 @@ tasks:
value:
simple: Expanse.Issue.activityStatus
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.assetKey
+ simple: Expanse.Issue.assets.[0].assetKey
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.assetType
+ simple: Expanse.Issue.assets.[0].assetType
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.displayName
+ simple: Expanse.Issue.assets.[0].displayName
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.id
+ simple: Expanse.Issue.assets.[0].id
iscontext: true
- - operator: isNotEmpty
left:
@@ -152,17 +157,12 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.businessUnits.id
- iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Issue.businessUnits.name
+ simple: Expanse.Issue.businessUnits.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.category
+ simple: Expanse.Issue.businessUnits.[0].name
iscontext: true
- - operator: isNotEmpty
left:
@@ -237,13 +237,14 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.providers.id
+ simple: Expanse.Issue.providers.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.providers.name
+ simple: Expanse.Issue.providers.[0].name
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -285,6 +286,7 @@ tasks:
update_types:
simple: Comment,ProgressStatus
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -358,6 +360,7 @@ tasks:
right:
value:
simple: InProgress
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -395,6 +398,7 @@ tasks:
complex:
root: ExpanseIssueID
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -460,6 +464,7 @@ tasks:
right:
value:
simple: XSOAR Test Playbook Comment
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -498,6 +503,7 @@ tasks:
value:
simple: XSOAR Test Playbook Comment
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -565,6 +571,7 @@ tasks:
value:
simple: Expanse.IssueUpdate.value
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -599,6 +606,7 @@ tasks:
complex:
root: ExpanseIssueID
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -615,10 +623,10 @@ tasks:
isautoswitchedtoquietmode: false
"11":
id: "11"
- taskid: 756872f7-4598-49aa-8fd5-c79716122d3d
+ taskid: a6c96a34-71f4-4caf-8bf9-7355133e297c
type: condition
task:
- id: 756872f7-4598-49aa-8fd5-c79716122d3d
+ id: a6c96a34-71f4-4caf-8bf9-7355133e297c
version: -1
name: Verify Outputs
type: condition
@@ -636,25 +644,27 @@ tasks:
value:
simple: Expanse.Issue.activityStatus
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.assetKey
+ simple: Expanse.Issue.assets.[0].assetKey
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.assetType
+ simple: Expanse.Issue.assets.[0].assetType
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.displayName
+ simple: Expanse.Issue.assets.[0].displayName
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.assets.id
+ simple: Expanse.Issue.assets.[0].id
iscontext: true
- - operator: isNotEmpty
left:
@@ -664,17 +674,12 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.businessUnits.id
+ simple: Expanse.Issue.businessUnits.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.businessUnits.name
- iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Issue.category
+ simple: Expanse.Issue.businessUnits.[0].name
iscontext: true
- - operator: isNotEmpty
left:
@@ -757,13 +762,14 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.providers.id
+ simple: Expanse.Issue.providers.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Issue.providers.name
+ simple: Expanse.Issue.providers.[0].name
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -797,6 +803,7 @@ tasks:
limit:
simple: "5"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -839,6 +846,7 @@ tasks:
value:
simple: Expanse.BusinessUnit.name
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -872,6 +880,7 @@ tasks:
limit:
simple: "5"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -914,6 +923,7 @@ tasks:
value:
simple: Expanse.Provider.name
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -947,6 +957,7 @@ tasks:
limit:
simple: "100"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -963,10 +974,10 @@ tasks:
isautoswitchedtoquietmode: false
"17":
id: "17"
- taskid: c653733f-cc34-4f4e-88e3-e1e649943532
+ taskid: 1fd09ec1-5ef4-41b5-877a-566d39564e4f
type: condition
task:
- id: c653733f-cc34-4f4e-88e3-e1e649943532
+ id: 1fd09ec1-5ef4-41b5-877a-566d39564e4f
version: -1
name: Verify Outputs
type: condition
@@ -982,36 +993,31 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Tag.created
+ simple: Expanse.Tag.[0].created
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Tag.description
+ simple: Expanse.Tag.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Tag.id
+ simple: Expanse.Tag.[0].modified
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Tag.modified
+ simple: Expanse.Tag.[0].name
iscontext: true
- - - operator: isEqualString
- left:
- value:
- simple: Expanse.Tag.name
- iscontext: true
- right:
- value:
- simple: xsoar-test-pb-tag
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Tag.tenantId
+ simple: Expanse.Tag.[0].tenantId
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1028,10 +1034,10 @@ tasks:
isautoswitchedtoquietmode: false
"18":
id: "18"
- taskid: 7b98a7d7-0348-484f-8cb6-3be95250d771
+ taskid: 07987d4d-9ba8-4905-82e6-00e7558b0516
type: regular
task:
- id: 7b98a7d7-0348-484f-8cb6-3be95250d771
+ id: 07987d4d-9ba8-4905-82e6-00e7558b0516
version: -1
name: expanse-assign-tags-to-asset
script: '|||expanse-assign-tags-to-asset'
@@ -1058,9 +1064,10 @@ tasks:
iscontext: true
right:
value:
- simple: xsoar-test-pb-tag
+ simple: tagcreatedbyxsoar
accessor: id
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1077,10 +1084,10 @@ tasks:
isautoswitchedtoquietmode: false
"19":
id: "19"
- taskid: 3213f7ff-e598-4987-85d8-f43f35aae533
+ taskid: 2a0ec089-c530-471a-892e-ec5f9bf1275d
type: regular
task:
- id: 3213f7ff-e598-4987-85d8-f43f35aae533
+ id: 2a0ec089-c530-471a-892e-ec5f9bf1275d
version: -1
name: expanse-unassign-tags-from-asset
script: '|||expanse-unassign-tags-from-asset'
@@ -1107,9 +1114,10 @@ tasks:
iscontext: true
right:
value:
- simple: xsoar-test-pb-tag
+ simple: tagcreatedbyxsoar
accessor: id
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1146,6 +1154,7 @@ tasks:
tag_names:
simple: xsoar-test-pb-tag
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1162,10 +1171,10 @@ tasks:
isautoswitchedtoquietmode: false
"21":
id: "21"
- taskid: 936c51ad-a79e-4e8a-89ce-aa61371bdac7
+ taskid: c9da69b1-0b5c-4385-879a-2450505c27a0
type: regular
task:
- id: 936c51ad-a79e-4e8a-89ce-aa61371bdac7
+ id: c9da69b1-0b5c-4385-879a-2450505c27a0
version: -1
name: expanse-unassign-tags-from-iprange
script: '|||expanse-unassign-tags-from-iprange'
@@ -1180,8 +1189,9 @@ tasks:
complex:
root: ExpanseIPRangeID
tag_names:
- simple: xsoar-test-pb-tag
+ simple: tagcreatedbyxsoar
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1218,6 +1228,7 @@ tasks:
tag_names:
simple: xsoar-test-pb-tag
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1254,6 +1265,7 @@ tasks:
tag_names:
simple: xsoar-test-pb-tag
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1290,6 +1302,7 @@ tasks:
tag_names:
simple: xsoar-test-pb-tag
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1326,6 +1339,7 @@ tasks:
tag_names:
simple: xsoar-test-pb-tag
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1361,6 +1375,7 @@ tasks:
name:
simple: xsoar-test-pb-tag
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1394,6 +1409,7 @@ tasks:
limit:
simple: "1"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1510,6 +1526,7 @@ tasks:
value:
simple: DBotScore.Indicator
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1543,6 +1560,7 @@ tasks:
limit:
simple: "1"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1559,10 +1577,10 @@ tasks:
isautoswitchedtoquietmode: false
"31":
id: "31"
- taskid: 0221372e-5eff-4958-8edf-6e7a39a8a7c1
+ taskid: 1e9a6a83-591f-434d-8260-28e32dc04442
type: condition
task:
- id: 0221372e-5eff-4958-8edf-6e7a39a8a7c1
+ id: 1e9a6a83-591f-434d-8260-28e32dc04442
version: -1
name: Verify Outputs
type: condition
@@ -1578,17 +1596,19 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.businessUnits.id
+ simple: Expanse.Domain.businessUnits.[0].id
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.businessUnits.name
+ simple: Expanse.Domain.businessUnits.[0].name
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.businessUnits.tenantId
+ simple: Expanse.Domain.businessUnits.[0].tenantId
iscontext: true
- - operator: isNotEmpty
left:
@@ -1605,11 +1625,6 @@ tasks:
value:
simple: Expanse.Domain.domain
iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Domain.firstObserved
- iscontext: true
- - operator: isNotEmpty
left:
value:
@@ -1618,22 +1633,12 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.lastObserved
+ simple: Expanse.Domain.providers.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.lastSampledIp
- iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Domain.providers.id
- iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Domain.providers.name
+ simple: Expanse.Domain.providers.[0].name
iscontext: true
- - operator: isNotEmpty
left:
@@ -1675,11 +1680,6 @@ tasks:
value:
simple: Domain.CreationDate
iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Domain.UpdatedDate
- iscontext: true
- - operator: isNotEmpty
left:
value:
@@ -1695,11 +1695,6 @@ tasks:
value:
simple: Domain.NameServers
iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Domain.Organization
- iscontext: true
- - operator: isNotEmpty
left:
value:
@@ -1708,7 +1703,7 @@ tasks:
- - operator: inList
left:
value:
- simple: DBotScore.Type
+ simple: DBotScore.[1].Type
iscontext: true
right:
value:
@@ -1716,7 +1711,7 @@ tasks:
- - operator: isEqualString
left:
value:
- simple: DBotScore.Vendor
+ simple: DBotScore.[1].Vendor
iscontext: true
right:
value:
@@ -1724,11 +1719,12 @@ tasks:
- - operator: isEqualNumber
left:
value:
- simple: DBotScore.Score
+ simple: DBotScore.[1].Score
iscontext: true
right:
value:
simple: "0"
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1762,6 +1758,7 @@ tasks:
limit:
simple: "1"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -1778,10 +1775,10 @@ tasks:
isautoswitchedtoquietmode: false
"35":
id: "35"
- taskid: c48f97ba-33f2-4f66-8d9d-f049baf1b63b
+ taskid: f7af4ee8-9dfa-4a4d-80ce-e7b07c757f01
type: condition
task:
- id: c48f97ba-33f2-4f66-8d9d-f049baf1b63b
+ id: f7af4ee8-9dfa-4a4d-80ce-e7b07c757f01
version: -1
name: Verify Outputs
type: condition
@@ -2033,6 +2030,7 @@ tasks:
right:
value:
simple: certificate
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2069,6 +2067,7 @@ tasks:
set_expanse_fields:
simple: "false"
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2085,10 +2084,10 @@ tasks:
isautoswitchedtoquietmode: false
"37":
id: "37"
- taskid: fc6bc026-0e1c-4ff9-882e-28fb75d47d1b
+ taskid: 3c6c6a4f-f468-4e23-80c3-a7cfcc84ae13
type: condition
task:
- id: fc6bc026-0e1c-4ff9-882e-28fb75d47d1b
+ id: 3c6c6a4f-f468-4e23-80c3-a7cfcc84ae13
version: -1
name: Verify Outputs
type: condition
@@ -2104,17 +2103,19 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Certificate.businessUnits.id
+ simple: Expanse.Certificate.businessUnits.[0].id
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Certificate.businessUnits.name
+ simple: Expanse.Certificate.businessUnits.[0].name
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Certificate.businessUnits.tenantId
+ simple: Expanse.Certificate.businessUnits.[0].tenantId
iscontext: true
- - operator: isNotEmpty
left:
@@ -2194,7 +2195,7 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Certificate.certificateAdvertisementStatus
+ simple: Expanse.Certificate.certificateAdvertisementStatus.[0]
iscontext: true
- - operator: isNotEmpty
left:
@@ -2224,12 +2225,12 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Certificate.providers.id
+ simple: Expanse.Certificate.providers.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Certificate.providers.name
+ simple: Expanse.Certificate.providers.[0].name
iscontext: true
- - operator: isNotEmpty
left:
@@ -2254,7 +2255,7 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Certificate.Name
+ simple: Certificate.Name.[0]
iscontext: true
- - operator: isNotEmpty
left:
@@ -2355,14 +2356,7 @@ tasks:
right:
value:
simple: certificate
- - - operator: isEqualString
- left:
- value:
- simple: Expanse.Certificate.annotations.tags.name
- iscontext: true
- right:
- value:
- simple: xsoar-test-pb-tag
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2397,6 +2391,7 @@ tasks:
complex:
root: ExpanseDomainName
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2413,10 +2408,10 @@ tasks:
isautoswitchedtoquietmode: false
"43":
id: "43"
- taskid: 437d757d-cd6b-4427-8b1d-7337680a9e77
+ taskid: 8e223c80-a248-4a7d-810a-bf6729310e8f
type: condition
task:
- id: 437d757d-cd6b-4427-8b1d-7337680a9e77
+ id: 8e223c80-a248-4a7d-810a-bf6729310e8f
version: -1
name: Verify Outputs
type: condition
@@ -2432,17 +2427,19 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.businessUnits.id
+ simple: Expanse.Domain.businessUnits.[0].id
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.businessUnits.name
+ simple: Expanse.Domain.businessUnits.[0].name
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.businessUnits.tenantId
+ simple: Expanse.Domain.businessUnits.[0].tenantId
iscontext: true
- - operator: isNotEmpty
left:
@@ -2464,11 +2461,6 @@ tasks:
complex:
root: ExpanseDomainName
iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Domain.firstObserved
- iscontext: true
- - operator: isEqualString
left:
value:
@@ -2482,22 +2474,12 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.lastObserved
- iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Domain.lastSampledIp
- iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Expanse.Domain.providers.id
+ simple: Expanse.Domain.providers.[0].id
iscontext: true
- - operator: isNotEmpty
left:
value:
- simple: Expanse.Domain.providers.name
+ simple: Expanse.Domain.providers.[0].name
iscontext: true
- - operator: isNotEmpty
left:
@@ -2544,11 +2526,6 @@ tasks:
value:
simple: Domain.CreationDate
iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Domain.UpdatedDate
- iscontext: true
- - operator: isNotEmpty
left:
value:
@@ -2564,11 +2541,6 @@ tasks:
value:
simple: Domain.NameServers
iscontext: true
- - - operator: isNotEmpty
- left:
- value:
- simple: Domain.Organization
- iscontext: true
- - operator: isEqualString
left:
value:
@@ -2603,6 +2575,7 @@ tasks:
right:
value:
simple: "0"
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2639,6 +2612,7 @@ tasks:
include:
simple: severityCounts,annotations
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2655,10 +2629,10 @@ tasks:
isautoswitchedtoquietmode: false
"47":
id: "47"
- taskid: e02619b4-cb89-454b-834b-684e74053217
+ taskid: 2708ec5f-ad7d-41f7-8a0f-a475f497dd45
type: condition
task:
- id: e02619b4-cb89-454b-834b-684e74053217
+ id: 2708ec5f-ad7d-41f7-8a0f-a475f497dd45
version: -1
name: Verify Outputs
type: condition
@@ -2674,12 +2648,14 @@ tasks:
- - operator: isNotEmpty
left:
value:
- simple: Expanse.IPRange.businessUnits.id
+ simple: Expanse.IPRange.businessUnits.[0].id
iscontext: true
+ right:
+ value: {}
- - operator: isNotEmpty
left:
value:
- simple: Expanse.IPRange.businessUnits.name
+ simple: Expanse.IPRange.businessUnits.[0].name
iscontext: true
- - operator: isEqualString
left:
@@ -2760,21 +2736,12 @@ tasks:
- - operator: isEqualString
left:
value:
- simple: DBotScore.Type
+ simple: DBotScore.Type.[0]
iscontext: true
right:
value:
simple: cidr
- - - operator: isEqualString
- left:
- value:
- complex:
- root: Expanse.IPRange.annotations.tags
- accessor: name
- iscontext: true
- right:
- value:
- simple: xsoar-test-pb-tag
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2801,11 +2768,12 @@ tasks:
iscommand: false
brand: ""
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
"x": 50,
- "y": 10340
+ "y": 10345
}
}
note: false
@@ -2839,6 +2807,7 @@ tasks:
root: Expanse.Issue
accessor: id
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2877,6 +2846,7 @@ tasks:
value:
simple: InProgress
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2915,6 +2885,7 @@ tasks:
root: Expanse.Issue
accessor: progressStatus
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2951,6 +2922,7 @@ tasks:
key:
simple: Expanse.Issue
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -2990,6 +2962,7 @@ tasks:
complex:
root: ExpanseIssueProgressStatus
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3030,6 +3003,7 @@ tasks:
root: Expanse.IPRange
accessor: id
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3066,6 +3040,7 @@ tasks:
keysToKeep:
simple: ExpanseIPRangeID,ExpanseIPRangeCIDR,Expanse.Tag,ExpanseIssueIP
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3106,6 +3081,7 @@ tasks:
root: Expanse.IPRange
accessor: cidr
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3146,6 +3122,7 @@ tasks:
root: Expanse.Certificate
accessor: id
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3186,6 +3163,7 @@ tasks:
root: Certificate
accessor: MD5
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3222,6 +3200,7 @@ tasks:
keysToKeep:
simple: ExpanseCertificateID,ExpanseCertificateMD5,ExpanseCertificateSHA256,ExpanseIssueIP
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3262,6 +3241,7 @@ tasks:
root: Certificate
accessor: SHA256
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3302,6 +3282,7 @@ tasks:
root: Expanse.Domain
accessor: id
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3342,6 +3323,7 @@ tasks:
root: Domain
accessor: Name
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3378,6 +3360,7 @@ tasks:
keysToKeep:
simple: ExpanseDomainID,ExpanseDomainName,ExpanseIssueIP
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3416,6 +3399,7 @@ tasks:
root: Expanse.Issue
accessor: ip
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3454,6 +3438,7 @@ tasks:
root: Expanse.Issue
accessor: created
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3488,6 +3473,7 @@ tasks:
common_name:
simple: ${inputs.common_name}
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
@@ -3519,25 +3505,15 @@ tasks:
'#none#':
- "68"
scriptarguments:
- business_unit_names: {}
- business_units: {}
- domain: {}
- ip: {}
- last_observed_date: {}
limit:
simple: "1"
- provider_names: {}
- providers: {}
- regions: {}
- tag_names: {}
- tags: {}
- types: {}
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
"x": 50,
- "y": 9990
+ "y": 9995
}
}
note: false
@@ -3545,6 +3521,8 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
"68":
id: "68"
taskid: 468baed7-35f8-4f1a-89d4-0d66d00488ae
@@ -3568,11 +3546,12 @@ tasks:
value:
simple: Expanse.CloudResource
iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
"x": 50,
- "y": 10150
+ "y": 10170
}
}
note: false
@@ -3580,12 +3559,15 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+system: true
view: |-
{
"linkLabelsPosition": {},
"paper": {
"dimensions": {
- "height": 10330,
+ "height": 10360,
"width": 380,
"x": 50,
"y": 50
diff --git a/Packs/ExpanseV2/TestPlaybooks/playbook-Feed_Expanse_Test.yml b/Packs/ExpanseV2/TestPlaybooks/playbook-Feed_Expanse_Test.yml
index 9f15c003f9fe..c56d918d0ecb 100644
--- a/Packs/ExpanseV2/TestPlaybooks/playbook-Feed_Expanse_Test.yml
+++ b/Packs/ExpanseV2/TestPlaybooks/playbook-Feed_Expanse_Test.yml
@@ -6,10 +6,10 @@ starttaskid: "0"
tasks:
"0":
id: "0"
- taskid: fe73b563-e450-4e03-886c-e3df93ea1cea
+ taskid: 10d1bdb4-18c6-434b-86dc-def518691ce8
type: start
task:
- id: fe73b563-e450-4e03-886c-e3df93ea1cea
+ id: 10d1bdb4-18c6-434b-86dc-def518691ce8
version: -1
name: ""
iscommand: false
@@ -22,7 +22,7 @@ tasks:
view: |-
{
"position": {
- "x": 450,
+ "x": 725,
"y": 50
}
}
@@ -31,12 +31,15 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
+ continueonerrortype: ""
+ isoversize: false
+ isautoswitchedtoquietmode: false
"1":
id: "1"
- taskid: 7747cfc8-2afe-492e-844e-64853c5dbf55
+ taskid: e08734c0-c0ae-4562-8778-8df350915a79
type: regular
task:
- id: 7747cfc8-2afe-492e-844e-64853c5dbf55
+ id: e08734c0-c0ae-4562-8778-8df350915a79
version: -1
name: DeleteContext
description: Delete field from context
@@ -46,20 +49,16 @@ tasks:
brand: ""
nexttasks:
'#none#':
- - "2"
+ - "17"
scriptarguments:
all:
simple: "yes"
- index: {}
- key: {}
- keysToKeep: {}
- subplaybook: {}
separatecontext: false
view: |-
{
"position": {
- "x": 450,
- "y": 230
+ "x": 725,
+ "y": 195
}
}
note: false
@@ -67,14 +66,17 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
+ continueonerrortype: ""
+ isoversize: false
+ isautoswitchedtoquietmode: false
"2":
id: "2"
- taskid: dfdc1bec-7705-4fd1-8a15-5b1506bdc5ac
+ taskid: 9d925c51-6337-4f92-8ae5-227239ac83dc
type: regular
task:
- id: dfdc1bec-7705-4fd1-8a15-5b1506bdc5ac
+ id: 9d925c51-6337-4f92-8ae5-227239ac83dc
version: -1
- name: FeedExpanse Get Indicators
+ name: FeedExpanse Get Indicator IP
description: Retrieve discovered IPs/IP Ranges/Domains/Certificates as indicators
script: '|||feedexpanse-get-indicators'
type: regular
@@ -82,22 +84,52 @@ tasks:
brand: ""
nexttasks:
'#none#':
- - "3"
+ - "9"
scriptarguments:
- certificate: {}
- domain: {}
+ certificate:
+ simple: "no"
+ domain:
+ simple: "no"
extend-context:
simple: Indicator=.
- ip: {}
- iprange: {}
+ iprange:
+ simple: "no"
max_indicators:
simple: "1"
separatecontext: false
view: |-
{
"position": {
- "x": 450,
- "y": 410
+ "x": 50,
+ "y": 515
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ continueonerrortype: ""
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "4":
+ id: "4"
+ taskid: 27b58833-42f9-4e01-8e93-b4a044cbf4ed
+ type: title
+ task:
+ id: 27b58833-42f9-4e01-8e93-b4a044cbf4ed
+ version: -1
+ name: Are there any indicators?
+ type: title
+ iscommand: false
+ brand: ""
+ description: ''
+ separatecontext: false
+ view: |-
+ {
+ "position": {
+ "x": 725,
+ "y": 1040
}
}
note: false
@@ -105,15 +137,65 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
- "3":
- id: "3"
- taskid: 6a084d19-4509-44bd-8b36-496971c17a24
+ nexttasks:
+ '#none#':
+ - "21"
+ continueonerrortype: ""
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "9":
+ id: "9"
+ taskid: 82c8144d-7b5e-4d25-8fc5-1b6a7cb83f51
type: condition
task:
- id: 6a084d19-4509-44bd-8b36-496971c17a24
+ id: 82c8144d-7b5e-4d25-8fc5-1b6a7cb83f51
version: -1
- name: Check Indicators
- description: Check if the retrieved indicators are correct.
+ name: Is there IP indicator
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ '#default#':
+ - "4"
+ "yes":
+ - "10"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
+ - - operator: isEqualString
+ left:
+ value:
+ complex:
+ root: Indicator
+ accessor: type
+ iscontext: true
+ right:
+ value:
+ simple: IP
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 50,
+ "y": 690
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "10":
+ id: "10"
+ taskid: d376e5d9-e8ae-4b26-8eb1-99a2ac41ffc8
+ type: condition
+ task:
+ id: d376e5d9-e8ae-4b26-8eb1-99a2ac41ffc8
+ version: -1
+ name: Check Indicator IP
type: condition
iscommand: false
brand: ""
@@ -137,11 +219,148 @@ tasks:
iscontext: true
right:
value:
- simple: CIDR
+ simple: IP
iscontext: true
right:
value:
simple: "1"
+ - - operator: isExists
+ left:
+ value:
+ complex:
+ root: Indicator
+ filters:
+ - - operator: isEqualString
+ left:
+ value:
+ simple: Indicator.type
+ iscontext: true
+ right:
+ value:
+ simple: IP
+ accessor: fields
+ iscontext: true
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 162.5,
+ "y": 865
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "11":
+ id: "11"
+ taskid: e1f38cb3-c103-4dff-840b-63a62751d2ed
+ type: regular
+ task:
+ id: e1f38cb3-c103-4dff-840b-63a62751d2ed
+ version: -1
+ name: FeedExpanse Get Indicator Domain
+ description: Retrieve discovered IPs/IP Ranges/Domains/Certificates as indicators
+ script: '|||feedexpanse-get-indicators'
+ type: regular
+ iscommand: true
+ brand: ""
+ nexttasks:
+ '#none#':
+ - "12"
+ scriptarguments:
+ certificate:
+ simple: "no"
+ extend-context:
+ simple: Indicator=.
+ ip:
+ simple: "no"
+ iprange:
+ simple: "no"
+ max_indicators:
+ simple: "1"
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 500,
+ "y": 515
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "12":
+ id: "12"
+ taskid: e1bf3b90-3af8-4314-80d8-1fe026fd3997
+ type: condition
+ task:
+ id: e1bf3b90-3af8-4314-80d8-1fe026fd3997
+ version: -1
+ name: Is there Domain indicator
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ '#default#':
+ - "4"
+ "yes":
+ - "13"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
+ - - operator: isEqualString
+ left:
+ value:
+ complex:
+ root: Indicator
+ accessor: type
+ iscontext: true
+ right:
+ value:
+ simple: Domain
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 500,
+ "y": 690
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "13":
+ id: "13"
+ taskid: fd2ba00d-6b4f-4803-8f0f-845aa000995e
+ type: condition
+ task:
+ id: fd2ba00d-6b4f-4803-8f0f-845aa000995e
+ version: -1
+ name: Check Indicator Domain
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ "yes":
+ - "4"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
- - operator: hasLength
left:
value:
@@ -160,6 +379,143 @@ tasks:
right:
value:
simple: "1"
+ - - operator: isExists
+ left:
+ value:
+ complex:
+ root: Indicator
+ filters:
+ - - operator: inList
+ left:
+ value:
+ simple: Indicator.type
+ iscontext: true
+ right:
+ value:
+ simple: Domain,DomainGlob
+ accessor: fields
+ iscontext: true
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 612.5,
+ "y": 865
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "14":
+ id: "14"
+ taskid: de90b879-7bf2-4ad5-895d-9afe684a9022
+ type: regular
+ task:
+ id: de90b879-7bf2-4ad5-895d-9afe684a9022
+ version: -1
+ name: FeedExpanse Get Indicator CIDR
+ description: Retrieve discovered IPs/IP Ranges/Domains/Certificates as indicators
+ script: '|||feedexpanse-get-indicators'
+ type: regular
+ iscommand: true
+ brand: ""
+ nexttasks:
+ '#none#':
+ - "15"
+ scriptarguments:
+ certificate:
+ simple: "no"
+ domain:
+ simple: "no"
+ extend-context:
+ simple: Indicator=.
+ ip:
+ simple: "no"
+ max_indicators:
+ simple: "1"
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 950,
+ "y": 515
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "15":
+ id: "15"
+ taskid: 65ebffbe-0dbe-45cb-8d48-8c4367edc346
+ type: condition
+ task:
+ id: 65ebffbe-0dbe-45cb-8d48-8c4367edc346
+ version: -1
+ name: Is there CIDR indicator
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ '#default#':
+ - "4"
+ "yes":
+ - "16"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
+ - - operator: isEqualString
+ left:
+ value:
+ complex:
+ root: Indicator
+ accessor: type
+ iscontext: true
+ right:
+ value:
+ simple: CIDR
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 950,
+ "y": 690
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "16":
+ id: "16"
+ taskid: 060cfb85-3a90-4f25-8797-8136dd6c5ed6
+ type: condition
+ task:
+ id: 060cfb85-3a90-4f25-8797-8136dd6c5ed6
+ version: -1
+ name: Check Indicator CIDR
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ "yes":
+ - "4"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
- - operator: hasLength
left:
value:
@@ -173,24 +529,222 @@ tasks:
iscontext: true
right:
value:
- simple: Certificate
+ simple: CIDR
iscontext: true
right:
value:
simple: "1"
+ - - operator: isExists
+ left:
+ value:
+ complex:
+ root: Indicator
+ filters:
+ - - operator: isEqualString
+ left:
+ value:
+ simple: Indicator.type
+ iscontext: true
+ right:
+ value:
+ simple: CIDR
+ accessor: fields
+ iscontext: true
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 1062.5,
+ "y": 865
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "17":
+ id: "17"
+ taskid: 80b7af28-96b3-4612-8707-d233d97a188d
+ type: title
+ task:
+ id: 80b7af28-96b3-4612-8707-d233d97a188d
+ version: -1
+ name: Get Indicators
+ type: title
+ iscommand: false
+ brand: ""
+ description: ''
+ nexttasks:
+ '#none#':
+ - "2"
+ - "11"
+ - "14"
+ - "18"
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 725,
+ "y": 370
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "18":
+ id: "18"
+ taskid: f1fb618e-b6f1-44fe-8c2d-0a7dcfe845f8
+ type: regular
+ task:
+ id: f1fb618e-b6f1-44fe-8c2d-0a7dcfe845f8
+ version: -1
+ name: FeedExpanse Get Indicator Certificate
+ description: Retrieve discovered IPs/IP Ranges/Domains/Certificates as indicators
+ script: '|||feedexpanse-get-indicators'
+ type: regular
+ iscommand: true
+ brand: ""
+ nexttasks:
+ '#none#':
+ - "19"
+ scriptarguments:
+ domain:
+ simple: "no"
+ extend-context:
+ simple: Indicator=.
+ ip:
+ simple: "no"
+ iprange:
+ simple: "no"
+ max_indicators:
+ simple: "1"
+ separatecontext: false
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 1400,
+ "y": 515
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "19":
+ id: "19"
+ taskid: 0577335b-9575-4cae-866f-2d320d969fcc
+ type: condition
+ task:
+ id: 0577335b-9575-4cae-866f-2d320d969fcc
+ version: -1
+ name: Is there Certificate indicator
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ '#default#':
+ - "4"
+ "yes":
+ - "20"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
+ - - operator: isEqualString
+ left:
+ value:
+ complex:
+ root: Indicator
+ accessor: type
+ iscontext: true
+ right:
+ value:
+ simple: Certificate
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 1400,
+ "y": 690
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "20":
+ id: "20"
+ taskid: adf839fc-fd25-47c3-8b29-79cccbacf764
+ type: condition
+ task:
+ id: adf839fc-fd25-47c3-8b29-79cccbacf764
+ version: -1
+ name: Check Indicator IP
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ "yes":
+ - "4"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
- - operator: hasLength
left:
value:
- simple: Indicator
+ complex:
+ root: Indicator
+ filters:
+ - - operator: isEqualString
+ left:
+ value:
+ simple: Indicator.type
+ iscontext: true
+ right:
+ value:
+ simple: Certificate
iscontext: true
right:
value:
- simple: "3"
+ simple: "1"
+ - - operator: isExists
+ left:
+ value:
+ complex:
+ root: Indicator
+ filters:
+ - - operator: isEqualString
+ left:
+ value:
+ simple: Indicator.type
+ iscontext: true
+ right:
+ value:
+ simple: Certificate
+ accessor: fields
+ iscontext: true
+ continueonerrortype: ""
view: |-
{
"position": {
- "x": 450,
- "y": 590
+ "x": 1512.5,
+ "y": 865
}
}
note: false
@@ -198,12 +752,54 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
- "4":
- id: "4"
- taskid: 10bbb801-099b-49aa-8f41-51efd523c48f
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "21":
+ id: "21"
+ taskid: 6b5b0b25-7a32-4848-8135-aa59fda4f2b9
+ type: condition
+ task:
+ id: 6b5b0b25-7a32-4848-8135-aa59fda4f2b9
+ version: -1
+ name: Are there any indicators?
+ type: condition
+ iscommand: false
+ brand: ""
+ nexttasks:
+ "yes":
+ - "22"
+ separatecontext: false
+ conditions:
+ - label: "yes"
+ condition:
+ - - operator: isExists
+ left:
+ value:
+ complex:
+ root: Indicator
+ accessor: type
+ iscontext: true
+ continueonerrortype: ""
+ view: |-
+ {
+ "position": {
+ "x": 725,
+ "y": 1185
+ }
+ }
+ note: false
+ timertriggers: []
+ ignoreworker: false
+ skipunavailable: false
+ quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
+ "22":
+ id: "22"
+ taskid: a86c7999-df1e-4105-80cf-ec64b1dec314
type: title
task:
- id: 10bbb801-099b-49aa-8f41-51efd523c48f
+ id: a86c7999-df1e-4105-80cf-ec64b1dec314
version: -1
name: Done
type: title
@@ -211,11 +807,12 @@ tasks:
brand: ""
description: ''
separatecontext: false
+ continueonerrortype: ""
view: |-
{
"position": {
- "x": 450,
- "y": 780
+ "x": 725,
+ "y": 1360
}
}
note: false
@@ -223,14 +820,16 @@ tasks:
ignoreworker: false
skipunavailable: false
quietmode: 0
+ isoversize: false
+ isautoswitchedtoquietmode: false
view: |-
{
"linkLabelsPosition": {},
"paper": {
"dimensions": {
- "height": 795,
- "width": 380,
- "x": 450,
+ "height": 1375,
+ "width": 1842.5,
+ "x": 50,
"y": 50
}
}
diff --git a/Packs/ExpanseV2/pack_metadata.json b/Packs/ExpanseV2/pack_metadata.json
index 1b767eca44d5..ddc5e4fc0ca6 100644
--- a/Packs/ExpanseV2/pack_metadata.json
+++ b/Packs/ExpanseV2/pack_metadata.json
@@ -2,7 +2,7 @@
"name": "Cortex Xpanse by Palo Alto Networks",
"description": "Automate Attack Surface Management to identify Internet assets and quickly remediate misconfigurations with Expanse, a Palo Alto Networks company.",
"support": "xsoar",
- "currentVersion": "1.10.23",
+ "currentVersion": "1.10.31",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
diff --git a/Packs/ExportToXLSX/.pack-ignore b/Packs/ExportToXLSX/.pack-ignore
index 292f78c949fc..7f434839bcc3 100644
--- a/Packs/ExportToXLSX/.pack-ignore
+++ b/Packs/ExportToXLSX/.pack-ignore
@@ -1,3 +1,6 @@
[file:pack_metadata.json]
-ignore=PA129
\ No newline at end of file
+ignore=PA129
+
+[file:1_0_2.md]
+ignore=RN113,RN114
\ No newline at end of file
diff --git a/Packs/ExportToXLSX/ReleaseNotes/1_0_2.json b/Packs/ExportToXLSX/ReleaseNotes/1_0_2.json
new file mode 100644
index 000000000000..b1854d434cf7
--- /dev/null
+++ b/Packs/ExportToXLSX/ReleaseNotes/1_0_2.json
@@ -0,0 +1 @@
+{"breakingChanges":true,"breakingChangesNotes":"The script ExportToXLSX moved to *CommonScripts* pack. Make sure to update the *CommonScripts* pack to the latest version in order to use the script."}
\ No newline at end of file
diff --git a/Packs/ExportToXLSX/ReleaseNotes/1_0_2.md b/Packs/ExportToXLSX/ReleaseNotes/1_0_2.md
new file mode 100644
index 000000000000..df1a04f5da62
--- /dev/null
+++ b/Packs/ExportToXLSX/ReleaseNotes/1_0_2.md
@@ -0,0 +1,3 @@
+#### Scripts
+##### ExportToXLSX
+- Moved to the *CommonScripts* pack.
\ No newline at end of file
diff --git a/Packs/ExportToXLSX/Scripts/ExportToXLSX/ExportToXLSX_test.py b/Packs/ExportToXLSX/Scripts/ExportToXLSX/ExportToXLSX_test.py
deleted file mode 100644
index 0603123a4226..000000000000
--- a/Packs/ExportToXLSX/Scripts/ExportToXLSX/ExportToXLSX_test.py
+++ /dev/null
@@ -1,80 +0,0 @@
-from ExportToXLSX import parse_data
-
-DATA_INPUT_SINGLE_DICT = {"key1": "val1", "key2": "val2"}
-DATA_INPUT_MULTIPLE_DICTS = '{\"key1\":\"val1\",\"key2\":\"val2\"},{\"key1\":\"val3\",\"key2\":\"val4\"}'
-
-
-def test_parse_data_single_item_no_error():
- """ Unit test
- Given
- - parse_data help method
- - inputs:
- data : a single dictionary
- sheets: a list of one sheet name
- When
- - the data is valid
- - the sheets number is valid
- Then
- Validate the content of the response
- """
- parsed_data = parse_data(data=DATA_INPUT_SINGLE_DICT, sheets=['sheet1'])
- assert isinstance(parsed_data, list)
- assert len(parsed_data) == 1
-
-
-def test_parse_data_single_item_with_error():
- """ Unit test
- Given
- - parse_data help method
- - inputs:
- data : comma-separated string represented dictionaries
- sheets: a list of two sheet names
- When
- - the data is valid
- - the sheets number is not valid (should be equal to the number of dicts in 'data')
- Then
- Validate the method raises a Value error
- """
- try:
- parse_data(data=DATA_INPUT_SINGLE_DICT, sheets=['sheet1', 'sheets2'])
- assert False
- except ValueError as err:
- assert 'Number of sheet names should be equal to the number of data items.' in err.args[0]
-
-
-def test_parse_data_multiple_items_no_error():
- """ Unit test
- Given
- - parse_data help method
- - inputs:
- data : comma-separated string represented dictionaries
- sheets: a list of two sheet names
- When
- - the data is valid
- - the sheets number is valid
- Then
- Validate the content of the response
- """
- parsed_data = parse_data(data=DATA_INPUT_MULTIPLE_DICTS, sheets=['sheet1', 'sheet2'])
- assert isinstance(parsed_data, list)
- assert len(parsed_data) == 2
-
-
-def test_parse_data_multiple_items_with_error():
- """ Unit test
- Given
- - parse_data help method
- - inputs:
- data : comma-separated string represented dictionaries
- sheets: a list of one sheet names
- When
- - the data is valid
- - the sheets number is not valid ( should be equal to the number of dicts in 'data')
- Then
- Validate the method raises a Value error
- """
- try:
- parse_data(data=DATA_INPUT_MULTIPLE_DICTS, sheets=['sheet1'])
- assert False
- except ValueError as err:
- assert 'Number of sheet names should be equal to the number of data items.' in err.args[0]
diff --git a/Packs/ExportToXLSX/pack_metadata.json b/Packs/ExportToXLSX/pack_metadata.json
index 35fd294f774e..c11553e5e84a 100644
--- a/Packs/ExportToXLSX/pack_metadata.json
+++ b/Packs/ExportToXLSX/pack_metadata.json
@@ -1,8 +1,8 @@
{
- "name": "ExportToXLSX",
- "description": "Export context data to an xlsx file.",
+ "name": "ExportToXLSX (Deprecated)",
+ "description": "Deprecated. Use from CommonScripts instead.",
"support": "xsoar",
- "currentVersion": "1.0.1",
+ "currentVersion": "1.0.2",
"author": "Cortex XSOAR",
"url": "https://www.paloaltonetworks.com/cortex",
"email": "",
@@ -16,5 +16,6 @@
"marketplaces": [
"xsoar",
"marketplacev2"
- ]
+ ],
+ "hidden": true
}
\ No newline at end of file
diff --git a/Packs/ExtFilter/.pack-ignore b/Packs/ExtFilter/.pack-ignore
index 7a0cef1e2f45..8a38f9ae57a4 100644
--- a/Packs/ExtFilter/.pack-ignore
+++ b/Packs/ExtFilter/.pack-ignore
@@ -2,6 +2,7 @@
ignore=RM106
[file:pack_metadata.json]
ignore=PA129
-
+[file:1_1_13.md]
+ignore=RN113,RN114
[known_words]
lhs
\ No newline at end of file
diff --git a/Packs/ExtFilter/ReleaseNotes/1_1_13.json b/Packs/ExtFilter/ReleaseNotes/1_1_13.json
new file mode 100644
index 000000000000..547666d36478
--- /dev/null
+++ b/Packs/ExtFilter/ReleaseNotes/1_1_13.json
@@ -0,0 +1,4 @@
+{
+ "breakingChanges":true,
+ "breakingChangesNotes":"The script ExtFilter moved to *CommunityCommonScripts* pack. Make sure to install the *CommunityCommonScripts* pack in order to use this script."
+}
\ No newline at end of file
diff --git a/Packs/ExtFilter/ReleaseNotes/1_1_13.md b/Packs/ExtFilter/ReleaseNotes/1_1_13.md
new file mode 100644
index 000000000000..a39e221eccd3
--- /dev/null
+++ b/Packs/ExtFilter/ReleaseNotes/1_1_13.md
@@ -0,0 +1,4 @@
+
+#### Scripts
+##### ExtFilter
+- Deprecated. Use the Community Common Scripts pack instead.
\ No newline at end of file
diff --git a/Packs/ExtFilter/Scripts/ExtFilter/README.md b/Packs/ExtFilter/Scripts/ExtFilter/README.md
deleted file mode 100644
index 29582aefda45..000000000000
--- a/Packs/ExtFilter/Scripts/ExtFilter/README.md
+++ /dev/null
@@ -1,9023 +0,0 @@
-Filter values with complex conditions.
-You can make filters with comlex and combination conditions for the context data at any level of the tree.
-
----
-## Script Data
-
-| **Name** | **Description** |
-| --- | --- |
-| Script Type | python |
-| Tags | transformer, entirelist, general |
-
-
----
-## Inputs
-
-| **Argument Name** | **Description** |
-| --- | --- |
-| value | The value to filter/transform. |
-| operator | The operation name to filter/transform. |
-| filter | The filter. |
-| ctx_demisto | Enable to access the context data |
-| ctx_inputs | Enable to access the input parameters to sub playbooks and use `${inputs.}` |
-| ctx_lists | Enable to access the `list` data and use `${list.}` |
-| ctx_incident | Enable to access the incident context and use `${incident.}` |
-
-
----
-## Filter Syntax for `expressions`, `conditions` and `transformers`
-
- primitive-expression ::=
:
-
- dict-expression ::= SET OF primitive-expression
-
- array-expression ::= ARRAY OF ( dict-expression | array-expression | "not" expressions | "or" expressions | "and" expressions )
-
- expressions ::= dict-expression | array-expression
-
- primitive-condition ::= : expressions
-
- condition ::= SET OF primitive-condition
-
- array-condition ::= ARRAY OF condition
-
- conditions ::= condition | array-condition
-
- transformers ::= dict-expression | ARRAY OF dict-expression
-
-
-#### dict-expression
-
- `and` logical operator for each expression.
-
- e.g.
-
- `( ends with ".exe") && ( starts with "x")`
-
- {
- "ends with" : ".exe",
- "starts with": "x"
- }
-
-
-#### array-expression
-
- Logical operations for each expression. `and` by default.
-
- e.g.
-
-
- `( ends with ".exe") && ( starts with "x")`
-
- [
- {"ends with" : ".exe"},
- "and",
- {"starts with": "x"}
- ]
-
- or
-
- [
- {"ends with" : ".exe"},
- {"starts with": "x"}
- ]
-
-
- `( ends with ".exe") || ( starts with "x")`
-
- [
- {"ends with" : ".exe"},
- "or",
- {"starts with": "x"}
- ]
-
-
- `not ( ends with ".exe")`
-
- [
- "not",
- {"ends with" : ".exe"}
- ]
-
-
- `(( ends with ".exe") || ( ends with ".pdf")) and ( starts with "x")`
-
- [
- [
- {"ends with" : ".exe"},
- "or",
- {"ends with" : ".pdf"}
- ],
- "and",
- {"starts with": "x"}
- ]
-
-
-#### condition
-
- Evaluates child nodes of each dictionary element.
-
- e.g.
-
- `.Domain ends with ".com"`
-
- {
- "Domain": {
- "ends with" : ".com"
- }
- }
-
-
- `(.Domain ends with ".com") && (.IP starts with "192.168.")`
-
- {
- "Domain": {
- "ends with" : ".com"
- },
- "IP": {
- "starts with" : "192.168."
- }
- }
-
-#### array-condition
-
- Logical operations for each condition. `and` by default.
-
- e.g.
-
- `(.Domain ends with ".com") || (.IP starts with "192.168.")`
-
- [
- {
- "Domain": {
- "ends with" : ".com"
- }
- }
- "or",
- {
- "IP": {
- "starts with" : "192.168."
- }
- }
- ]
-
-
- `not ((.Domain ends with ".com") || (.IP starts with "192.168."))`
-
- [
- "not",
- [
- {
- "Domain": {
- "ends with" : ".com"
- }
- }
- "or",
- {
- "IP": {
- "starts with" : "192.168."
- }
- }
- ]
- ]
-
-
-#### transformers
-
- Run each transformer in order.
-
- e.g.
-
- `base64: encode -> digest`
-
- [
- {"base64: encode": {}},
- {"digest": {"algorithm": "sha1"}}
- ]
-
-
- `base64: encode -> digest` (Python 3.7 or above)
-
- {
- "base64: encode": {},
- "digest": {"algorithm": "sha1"}
- }
-
- **Note:**
- The order depends on python runtime in a `dict-expression`. Python 3.6 or less doesn't guarantee dictionary keys order.
-
-
----
-## DT (Demisto Transform Language)
-
- In filters written in JSON like `expressions`, `conditions`, `transformers` or ``, you can set values with DT expressions for keys and values.
- When you use DT, you must set `ctx_demisto`, `ctx_inputs`, `ctx_lists` and `ctx_incident` of the parameters for the data to which DT accesses.
-
-| *Parameter* | *Data Source* | *Value* | *Description* |
-| --- | --- | --- | --- |
-| ctx_demisto | From Previous Tasks | . | Enable to access the context data |
-| ctx_inputs | From Previous Tasks | inputs | Enable to access the input parameters to sub playbooks and use `${inputs.}` |
-| ctx_lists | From Previous Tasks | list | Enable to access the `list` data and use `${list.}` |
-| ctx_incident | From Previous Tasks | incident | Enable to access the incident context and use `${incident.}` |
-
- *NOTE:* `${list.}` doesn't work in XSOAR 6.0 in transformer.
-
- `local` prefix (`${local.}`) and `.` prefix (`${..}`) can be available for additional DT references.
- `${local}` refers the root value of the target, and `${local.}` refers the value property located at the relateve path to the root.
- `${..}` refers the current value of the target, and `${.}` refers the value property located at the relateve path to the current value.