From ceac094185f2fbb1e3d49b2c4c6aefc577183306 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Sun, 18 Feb 2024 13:38:22 +0000 Subject: [PATCH 01/62] Initial commit of Gem integration --- Packs/Gem/.pack-ignore | 0 Packs/Gem/.secrets-ignore | 0 Packs/Gem/Author_image.png | 0 Packs/Gem/Integrations/Gem/Gem.py | 171 ++++++++++++++++++ Packs/Gem/Integrations/Gem/Gem.yml | 47 +++++ Packs/Gem/Integrations/Gem/Gem_description.md | 8 + Packs/Gem/Integrations/Gem/Gem_image.png | Bin 0 -> 2507 bytes Packs/Gem/Integrations/Gem/Gem_test.py | 42 +++++ Packs/Gem/Integrations/Gem/README.md | 5 + Packs/Gem/Integrations/Gem/command_examples | 0 .../Gem/test_data/baseintegration-dummy.json | 3 + Packs/Gem/README.md | 0 Packs/Gem/pack_metadata.json | 26 +++ 13 files changed, 302 insertions(+) create mode 100644 Packs/Gem/.pack-ignore create mode 100644 Packs/Gem/.secrets-ignore create mode 100644 Packs/Gem/Author_image.png create mode 100644 Packs/Gem/Integrations/Gem/Gem.py create mode 100644 Packs/Gem/Integrations/Gem/Gem.yml create mode 100644 Packs/Gem/Integrations/Gem/Gem_description.md create mode 100644 Packs/Gem/Integrations/Gem/Gem_image.png create mode 100644 Packs/Gem/Integrations/Gem/Gem_test.py create mode 100644 Packs/Gem/Integrations/Gem/README.md create mode 100644 Packs/Gem/Integrations/Gem/command_examples create mode 100644 Packs/Gem/Integrations/Gem/test_data/baseintegration-dummy.json create mode 100644 Packs/Gem/README.md create mode 100644 Packs/Gem/pack_metadata.json diff --git a/Packs/Gem/.pack-ignore b/Packs/Gem/.pack-ignore new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Packs/Gem/.secrets-ignore b/Packs/Gem/.secrets-ignore new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Packs/Gem/Author_image.png b/Packs/Gem/Author_image.png new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py new file mode 100644 index 000000000000..0f60ca990ec6 --- /dev/null +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -0,0 +1,171 @@ +import demistomock as demisto # noqa: F401 +from CommonServerPython import * # noqa: F401 +"""Base Integration for Cortex XSOAR (aka Demisto) + +This is an empty Integration with some basic structure according +to the code conventions. + +MAKE SURE YOU REVIEW/REPLACE ALL THE COMMENTS MARKED AS "TODO" + +Developer Documentation: https://xsoar.pan.dev/docs/welcome +Code Conventions: https://xsoar.pan.dev/docs/integrations/code-conventions +Linting: https://xsoar.pan.dev/docs/integrations/linting + +This is an empty structure file. Check an example at; +https://github.com/demisto/content/blob/master/Packs/HelloWorld/Integrations/HelloWorld/HelloWorld.py + +""" + +from CommonServerUserPython import * # noqa + +import urllib3 +from typing import Dict, Any + +# Disable insecure warnings +urllib3.disable_warnings() + + +''' CONSTANTS ''' + +DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ' # ISO8601 format with UTC, default in XSOAR + +''' CLIENT CLASS ''' + + +class Client(BaseClient): + """Client class to interact with the service API + + This Client implements API calls, and does not contain any XSOAR logic. + Should only do requests and return data. + It inherits from BaseClient defined in CommonServer Python. + Most calls use _http_request() that handles proxy, SSL verification, etc. + For this implementation, no special attributes defined + """ + + # TODO: REMOVE the following dummy function: + def baseintegration_dummy(self, dummy: str) -> Dict[str, str]: + """Returns a simple python dict with the information provided + in the input (dummy). + + :type dummy: ``str`` + :param dummy: string to add in the dummy dict that is returned + + :return: dict as {"dummy": dummy} + :rtype: ``str`` + """ + + return {"dummy": dummy} + # TODO: ADD HERE THE FUNCTIONS TO INTERACT WITH YOUR PRODUCT API + + +''' HELPER FUNCTIONS ''' + +# TODO: ADD HERE ANY HELPER FUNCTION YOU MIGHT NEED (if any) + +''' COMMAND FUNCTIONS ''' + + +def test_module(client: Client) -> str: + """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: client to use + + :return: 'ok' if test passed, anything else will fail the test. + :rtype: ``str`` + """ + + message: str = '' + try: + # TODO: ADD HERE some code to test connectivity and authentication to your service. + # This should validate all the inputs given in the integration configuration panel, + # either manually or by using an API that uses them. + message = 'ok' + except DemistoException as e: + if 'Forbidden' in str(e) or 'Authorization' in str(e): # TODO: make sure you capture authentication errors + message = 'Authorization Error: make sure API Key is correctly set' + else: + raise e + return message + + +# TODO: REMOVE the following dummy command function +def baseintegration_dummy_command(client: Client, args: Dict[str, Any]) -> CommandResults: + + dummy = args.get('dummy', None) + if not dummy: + raise ValueError('dummy not specified') + + # Call the Client function and get the raw response + result = client.baseintegration_dummy(dummy) + + return CommandResults( + outputs_prefix='BaseIntegration', + outputs_key_field='', + outputs=result, + ) +# TODO: ADD additional command functions that translate XSOAR inputs/outputs to Client + + +''' MAIN FUNCTION ''' + + +def main() -> None: + """main function, parses params and runs command functions + + :return: + :rtype: + """ + + # TODO: make sure you properly handle authentication + # api_key = demisto.params().get('credentials', {}).get('password') + + # get the service API url + base_url = urljoin(demisto.params()['url'], '/api/v1') + + # if your Client class inherits from BaseClient, SSL verification is + # handled out of the box by it, just pass ``verify_certificate`` to + # the Client constructor + verify_certificate = not demisto.params().get('insecure', False) + + # if your Client class inherits from BaseClient, system proxy is handled + # out of the box by it, just pass ``proxy`` to the Client constructor + proxy = demisto.params().get('proxy', False) + + demisto.debug(f'Command being called is {demisto.command()}') + try: + + # TODO: Make sure you add the proper headers for authentication + # (i.e. "Authorization": {api key}) + headers: Dict = {} + + 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. + result = test_module(client) + return_results(result) + + # TODO: REMOVE the following dummy command case: + elif demisto.command() == 'baseintegration-dummy': + return_results(baseintegration_dummy_command(client, demisto.args())) + # TODO: ADD command cases for the commands you will implement + + # Log exceptions and return errors + except Exception as e: + 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/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml new file mode 100644 index 000000000000..76e788985148 --- /dev/null +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -0,0 +1,47 @@ +category: Cloud Services +commonfields: + id: Gem + version: -1 +configuration: +- defaultvalue: https://example.com/ + display: Your server URL + name: url + required: true + type: 0 +- displaypassword: API Key + additionalinfo: The API Key to use for connection + name: credentials + required: true + hiddenusername: true + type: 9 +- display: Trust any certificate (not secure) + name: insecure + type: 8 + required: false +- display: Use system proxy settings + name: proxy + type: 8 + required: false +description: '[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.]' +display: Gem +name: Gem +script: + commands: + - arguments: + - description: '[Enter a description of the argument, including any important information users need to know, for example, default values.]' + name: dummy + required: true + description: '[Enter a description of the command, including any important information users need to know, for example required permissions.]' + name: baseintegration-dummy + outputs: + - contextPath: BaseIntegration.Output + description: '[Enter a description of the data returned in this output.]' + type: String + runonce: false + script: '-' + type: python + subtype: python3 + dockerimage: demisto/python3:3.10.12.63474 +fromversion: 5.5.0 +tests: +- No tests (auto formatted) diff --git a/Packs/Gem/Integrations/Gem/Gem_description.md b/Packs/Gem/Integrations/Gem/Gem_description.md new file mode 100644 index 000000000000..51bd561c623f --- /dev/null +++ b/Packs/Gem/Integrations/Gem/Gem_description.md @@ -0,0 +1,8 @@ +## BaseIntegration Help + +Markdown file for integration configuration help snippet. In this file add: + +- Brief information about how to retrieve the API key of your product +- Other useful information on how to configure your integration in XSOAR + +Since this is a Markdown file, we encourage you to use MD formatting for sections, sub-sections, lists, etc. diff --git a/Packs/Gem/Integrations/Gem/Gem_image.png b/Packs/Gem/Integrations/Gem/Gem_image.png new file mode 100644 index 0000000000000000000000000000000000000000..772c6af21bebd9230ea48f23a29ad2260f386e71 GIT binary patch literal 2507 zcmV;+2{iVJP)NJU1VgcOS!Wr4 zO{q;AyQYAIs;$+wHZ~Sp+*+hq)D%gf ztHY9woe3{0IJoIrpgCQC7`DJ3m>Rb4IVaSF>acO==CH3?2YW9zeW_Dx~*%o3bFhWN8-vqxH&=>B0u zuaCmH%$&2TPhhFWSb?U_&pUZ|*bx4bY2lAeKf4Fz( zmQcC1G(7!QIj=-*@_K6Xu1z?%2l)e_654|gT&Yu996XHs=&CTZ`w-v}%L}p|&0V{i z+>M}fRVtn9z|!)NwJa=JU&b?XP1tkblQ4D3yx@~^KJ{ql)!hryGQsnWH2d0+H@nGX zw4$doc(6Jj$F{`H#bN9f?}g#LF3mfF;nU`awLA8cKM!>FeJ~$VrQ(!~W*_628V=UH z#L*3oZlPbNGeW+jEG_4Q0)Dht@52W-_{z?+TAyKZtwufpGKm1!42gYaP3o=Hp5 zpENDeNw=&g(wishi@^u5KHBy z0B5lAQOWLBab_QSK09fjTO zC@3Ws@CkVee3)foO2$1e+uh|0=G5tv6Q@D!mTg_+}$dIq?{bj!*uvDc%`2UX?@FJXeYlO zql@{RdZcteM0jQY4X%XKp#!*g{X6jLzX!TOK_|!pF2zT3WJB`(jkNkL_}X+Gl)`YB z2EHqQ4+=WY7VrZ@LmX(C`XO?ji^Ej+Opo`g5xWAGl^6a3G? z&p{{f9xG+wdu=iJnzREvZxZ-gR8YYJ1q&1`P_RJ30tE{cEO1OM;46U-Cb=BbMjBDs z)ttK)h8|@daa>LHgTYT3?|-25D93$R@gid10e^0qi+Lx5PNNfk+3|QZisSOhx*-=W$J3%r+sPEn@)0ekD#*uCOYo^?Wv^h40bS-pMXKv)%JM$A&pY;mgh?FhkU+QE8BVmEWZwZ1Os3?tOv{bg-ZM9Yuh@kKT3Z*1=`auTt9(gP*;L= zYM0sIh3fe&AlwBta3|cJr8h@40S(p`YfCjh$JYPeoo}f{m1KXYlPCUyd701;zn`qs(u>dr$7Yn+zbza=YJN;K&Ss5w9P+3!^a6@TgF#|cJ-WZz!Y%D%ukcHbs5yv zHpv-V`0+!O}lnF#l)S zyxg`;wvOoF*cT^l)Di+ZR7D$U3#BdW&v=a=gNtBJyf z9dok((ZwPiqQALjyh|Hg0izuz@yL&?uKKjIP+TF!L!4*?Gxd3lZ5vK1_C>o# z8FoUss^nF&!V#46z7aKpzyxRwec=Uo1iYV=g7SPDa*1iIT!y{~=fU;h4D~9}AgV|0 zA^e%+Z7>n;gBsA;&qHJMLH6XYaP*3u3#(upYy+3X!SF}W;opKW@FaNUB(GkgpHdkq z-nYBJbznRyx9xXgM)nx{@@?W(Pyt>9lfd!UtGmdxP%h5M{V*0(KR5utHiBFledzcY zeh!}hB~Z@J$(c~?pZ7TYD-oYVcx57P`NiPUVm(VCE=x|PWnkOUD7O&S36?e8iI=N5 zuCCdPsT|`y&7@J_`Ij0&CGZNE<`vowoXoF-Y4Rq-3HM?m-Mlq$2dLb(OmijJ2G*_Z z-T=#~y4udI!;8#GW?S0biQWoSyazjRR5@7g0V9o(_ai&kSn1$Dfh$5ZAi+awM#yxJ zQHFJ1bb3s0?6C_KIIg5R5J{%>CcYC~YWu~r>$8V_Z3FpKSKGN|JCP6_o11si z#&fUuleVMTj(wG*SJ92&!{Pu~4vl>dpo(;ACd2wc6B?Sg4ex(($=#5RpLMd0;eS43 V(U=mQ{m=ja002ovPDHLkV1nG2;bs5; literal 0 HcmV?d00001 diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py new file mode 100644 index 000000000000..6a48b6e932e3 --- /dev/null +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -0,0 +1,42 @@ +"""Base Integration for Cortex XSOAR - Unit Tests file + +Pytest Unit Tests: all funcion names must start with "test_" + +More details: https://xsoar.pan.dev/docs/integrations/unit-testing + +MAKE SURE YOU REVIEW/REPLACE ALL THE COMMENTS MARKED AS "TODO" + +You must add at least a Unit Test function for every XSOAR command +you are implementing with your integration +""" + +import json +import io + + +def util_load_json(path): + with io.open(path, mode='r', encoding='utf-8') as f: + return json.loads(f.read()) + + +# TODO: REMOVE the following dummy unit test function +def test_baseintegration_dummy(): + """Tests helloworld-say-hello command function. + + Checks the output of the command function with the expected output. + + No mock is needed here because the say_hello_command does not call + any external API. + """ + from BaseIntegration import Client, baseintegration_dummy_command + + client = Client(base_url='some_mock_url', verify=False) + args = { + 'dummy': 'this is a dummy response' + } + response = baseintegration_dummy_command(client, args) + + mock_response = util_load_json('test_data/baseintegration-dummy.json') + + assert response.outputs == mock_response +# TODO: ADD HERE unit tests for every command diff --git a/Packs/Gem/Integrations/Gem/README.md b/Packs/Gem/Integrations/Gem/README.md new file mode 100644 index 000000000000..5d6d1dc2bf52 --- /dev/null +++ b/Packs/Gem/Integrations/Gem/README.md @@ -0,0 +1,5 @@ +This README contains the full documentation for your integration. + +You auto-generate this README file from your integration YML file using the `demisto-sdk generate-docs` command. + +For more information see the [integration documentation](https://xsoar.pan.dev/docs/integrations/integration-docs). diff --git a/Packs/Gem/Integrations/Gem/command_examples b/Packs/Gem/Integrations/Gem/command_examples new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Packs/Gem/Integrations/Gem/test_data/baseintegration-dummy.json b/Packs/Gem/Integrations/Gem/test_data/baseintegration-dummy.json new file mode 100644 index 000000000000..37fa47b18cd0 --- /dev/null +++ b/Packs/Gem/Integrations/Gem/test_data/baseintegration-dummy.json @@ -0,0 +1,3 @@ +{ + "dummy": "this is a dummy response" +} \ No newline at end of file diff --git a/Packs/Gem/README.md b/Packs/Gem/README.md new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json new file mode 100644 index 000000000000..641659eb35ff --- /dev/null +++ b/Packs/Gem/pack_metadata.json @@ -0,0 +1,26 @@ +{ + "name": "Gem", + "description": "Integrate with Gem Security for bidirectional threat management", + "support": "partner", + "currentVersion": "1.0.0", + "author": "Gem Security", + "url": "https://gem.security/", + "email": "support@gem.security", + "categories": [ + "Cloud Services" + ], + "tags": [], + "useCases": [], + "keywords": [], + "marketplaces": [ + "xsoar", + "marketplacev2" + ], + "devEmail": [ + "support@gem.security" + ], + "githubUser": [ + "dorkauf", + "liormgem" + ] +} \ No newline at end of file From aaa92dbbb17380b137117fa59616fdd5ee283dbd Mon Sep 17 00:00:00 2001 From: dorkauf Date: Sun, 18 Feb 2024 13:39:18 +0000 Subject: [PATCH 02/62] Initial commit of Gem integration --- Packs/Gem/Integrations/Gem/Gem.py | 8 ++++---- Packs/Gem/Integrations/Gem/Gem_test.py | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 0f60ca990ec6..b4f9f56e3564 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -19,7 +19,7 @@ from CommonServerUserPython import * # noqa import urllib3 -from typing import Dict, Any +from typing import Any # Disable insecure warnings urllib3.disable_warnings() @@ -43,7 +43,7 @@ class Client(BaseClient): """ # TODO: REMOVE the following dummy function: - def baseintegration_dummy(self, dummy: str) -> Dict[str, str]: + def baseintegration_dummy(self, dummy: str) -> dict[str, str]: """Returns a simple python dict with the information provided in the input (dummy). @@ -94,7 +94,7 @@ def test_module(client: Client) -> str: # TODO: REMOVE the following dummy command function -def baseintegration_dummy_command(client: Client, args: Dict[str, Any]) -> CommandResults: +def baseintegration_dummy_command(client: Client, args: dict[str, Any]) -> CommandResults: dummy = args.get('dummy', None) if not dummy: @@ -141,7 +141,7 @@ def main() -> None: # TODO: Make sure you add the proper headers for authentication # (i.e. "Authorization": {api key}) - headers: Dict = {} + headers: dict = {} client = Client( base_url=base_url, diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py index 6a48b6e932e3..d957c5edf2a0 100644 --- a/Packs/Gem/Integrations/Gem/Gem_test.py +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -11,11 +11,10 @@ """ import json -import io def util_load_json(path): - with io.open(path, mode='r', encoding='utf-8') as f: + with open(path, encoding='utf-8') as f: return json.loads(f.read()) From f4e10a71e9865e00222ae87bac2f06447da3c127 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Thu, 22 Feb 2024 09:26:06 +0000 Subject: [PATCH 03/62] wip --- .../Gem/Classifiers/classifier-GemThreat.json | 18 + ...lassifier-mapper-incoming-Gem-webhook.json | 65 ++ .../classifier-mapper-incoming-Gem.json | 65 ++ .../IncidentTypes/incidenttype-GemThreat.json | 25 + Packs/Gem/pack_metadata.json | 10 + package-lock.json | 1036 ++++++++++++----- 6 files changed, 923 insertions(+), 296 deletions(-) create mode 100644 Packs/Gem/Classifiers/classifier-GemThreat.json create mode 100644 Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json create mode 100644 Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json create mode 100644 Packs/Gem/IncidentTypes/incidenttype-GemThreat.json diff --git a/Packs/Gem/Classifiers/classifier-GemThreat.json b/Packs/Gem/Classifiers/classifier-GemThreat.json new file mode 100644 index 000000000000..92b90988df07 --- /dev/null +++ b/Packs/Gem/Classifiers/classifier-GemThreat.json @@ -0,0 +1,18 @@ +{ + "id": "Gem Classifier", + "name": "Gem - Classification", + "type": "classification", + "defaultIncidentType": "Gem Threat", + "description": "Classifies Gem Threats.", + "fromVersion": "6.0.0", + "keyTypeMap": {}, + "transformer": { + "complex": null, + "simple": "" + }, + "version": -1, + "feed": false, + "propagationLabels": [ + "all" + ] +} \ No newline at end of file diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json new file mode 100644 index 000000000000..4573da84518c --- /dev/null +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -0,0 +1,65 @@ +{ + "id": "Gem-mapper-webhook", + "name": "Gem - Incoming Mapper Webhook", + "type": "mapping-incoming", + "description": "Maps incoming Gem Threat fields when received via webhook.", + "fromVersion": "6.8.0", + "defaultIncidentType": "", + "mapping": { + "Gem Threat": { + "dontMapEventToLabels": false, + "internalMapping": { + "Alert ID": { + "complex": { + "accessor": "alert_id", + "filters": [], + "root": "event", + "transformers": [] + } + }, + "Description": { + "simple": "description" + }, + "Incident Link": { + "simple": "link" + }, + "occurred": { + "complex": { + "filters": [], + "root": "event_datetime", + "transformers": [ + { + "args": { + "add_utc_timezone": { + "isContext": false, + "value": { + "simple": "true" + } + }, + "dayfirst": { + "isContext": false + }, + "fuzzy": { + "isContext": false + }, + "yearfirst": { + "isContext": false + } + }, + "operator": "DateStringToISOFormat" + } + ] + } + }, + "severity": { + "complex": { + "filters": [], + "root": "severity", + "transformers": [] + } + } + } + } + }, + "version": -1 +} \ No newline at end of file diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json new file mode 100644 index 000000000000..198e90026558 --- /dev/null +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -0,0 +1,65 @@ +{ + "id": "Gem-mapper", + "name": "Gem - Incoming Mapper", + "type": "mapping-incoming", + "description": "Maps incoming Gem Threat fields.", + "fromVersion": "6.8.0", + "defaultIncidentType": "", + "mapping": { + "Gem Threat": { + "dontMapEventToLabels": false, + "internalMapping": { + "Alert ID": { + "complex": { + "accessor": "alert_id", + "filters": [], + "root": "event", + "transformers": [] + } + }, + "Description": { + "simple": "description" + }, + "Incident Link": { + "simple": "link" + }, + "occurred": { + "complex": { + "filters": [], + "root": "event_datetime", + "transformers": [ + { + "args": { + "add_utc_timezone": { + "isContext": false, + "value": { + "simple": "true" + } + }, + "dayfirst": { + "isContext": false + }, + "fuzzy": { + "isContext": false + }, + "yearfirst": { + "isContext": false + } + }, + "operator": "DateStringToISOFormat" + } + ] + } + }, + "severity": { + "complex": { + "filters": [], + "root": "severity", + "transformers": [] + } + } + } + } + }, + "version": -1 +} \ No newline at end of file diff --git a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json new file mode 100644 index 000000000000..0be096f50262 --- /dev/null +++ b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json @@ -0,0 +1,25 @@ +{ + "fromVersion": "5.0.0", + "autorun": true, + "closureScript": "", + "color": "#32EAC2", + "days": 0, + "daysR": 0, + "default": false, + "disabled": false, + "hours": 0, + "hoursR": 0, + "id": "Gem Threat", + "locked": false, + "name": "Gem Threat", + "playbookId": "Handle Gem Threat", + "preProcessingScript": "", + "readonly": false, + "reputationCalc": 0, + "sortValues": null, + "system": false, + "version": -1, + "weeks": 0, + "weeksR": 0, + "layout": "Gem Threat" +} \ No newline at end of file diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index 641659eb35ff..870119e52ef4 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -12,6 +12,16 @@ "tags": [], "useCases": [], "keywords": [], + "dependencies": { + "Base": { + "mandatory": true, + "name": "Base" + }, + "GenericWebhook": { + "mandatory": true, + "name": "Generic Webhook" + } + }, "marketplaces": [ "xsoar", "marketplacev2" diff --git a/package-lock.json b/package-lock.json index fd73e88d80d8..16fc85fa6084 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,38 @@ { "name": "content", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 3, "requires": true, - "dependencies": { - "@babel/code-frame": { + "packages": { + "": { + "name": "content", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@mdx-js/mdx": "^1.6.22", + "commander": "^5.1.0", + "fs-extra": "^8.1.0", + "markdownlint": "^0.26.2", + "markdownlint-rule-helpers": "^0.17.2" + } + }, + "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { + "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/core": { + "node_modules/@babel/core": { "version": "7.12.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "requires": { + "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.5", "@babel/helper-module-transforms": "^7.12.1", @@ -34,166 +49,240 @@ "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "@babel/generator": { + "node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "requires": { + "dependencies": { "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-environment-visitor": { + "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-function-name": { + "node_modules/@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { + "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-hoist-variables": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-imports": { + "node_modules/@babel/helper-module-imports": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "requires": { + "dependencies": { "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-module-transforms": { + "node_modules/@babel/helper-module-transforms": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { + "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "@babel/helper-plugin-utils": { + "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-simple-access": { + "node_modules/@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-split-export-declaration": { + "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { + "dependencies": { "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/helper-string-parser": { + "node_modules/@babel/helper-string-parser": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helper-validator-identifier": { + "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } }, - "@babel/helpers": { + "node_modules/@babel/helpers": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "requires": { + "dependencies": { "@babel/template": "^7.23.9", "@babel/traverse": "^7.23.9", "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/highlight": { + "node_modules/@babel/highlight": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { + "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/parser": { + "node_modules/@babel/parser": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==" + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "@babel/plugin-proposal-object-rest-spread": { + "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "requires": { + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-jsx": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-syntax-object-rest-spread": { + "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/plugin-transform-parameters": { + "node_modules/@babel/plugin-transform-parameters": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "@babel/template": { + "node_modules/@babel/template": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "requires": { + "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.23.9", "@babel/types": "^7.23.9" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/traverse": { + "node_modules/@babel/traverse": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "requires": { + "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", @@ -204,57 +293,72 @@ "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@babel/types": { + "node_modules/@babel/types": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "requires": { + "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "@jridgewell/gen-mapping": { + "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "requires": { + "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, - "@jridgewell/resolve-uri": { + "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/set-array": { + "node_modules/@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } }, - "@jridgewell/sourcemap-codec": { + "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "@jridgewell/trace-mapping": { + "node_modules/@jridgewell/trace-mapping": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "requires": { + "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@mdx-js/mdx": { + "node_modules/@mdx-js/mdx": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "requires": { + "dependencies": { "@babel/core": "7.12.9", "@babel/plugin-syntax-jsx": "7.12.1", "@babel/plugin-syntax-object-rest-spread": "7.8.3", @@ -274,230 +378,318 @@ "unified": "9.2.0", "unist-builder": "2.0.3", "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "@mdx-js/util": { + "node_modules/@mdx-js/util": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "@types/hast": { + "node_modules/@types/hast": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", - "requires": { + "dependencies": { "@types/unist": "^2" } }, - "@types/mdast": { + "node_modules/@types/mdast": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "requires": { + "dependencies": { "@types/unist": "^2" } }, - "@types/parse5": { + "node_modules/@types/parse5": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, - "@types/unist": { + "node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { + "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "argparse": { + "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "babel-plugin-apply-mdx-type-prop": { + "node_modules/babel-plugin-apply-mdx-type-prop": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "1.6.22" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" } }, - "babel-plugin-extract-import-names": { + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-extract-import-names": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "requires": { + "dependencies": { "@babel/helper-plugin-utils": "7.10.4" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "bail": { + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "camelcase-css": { + "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } }, - "ccount": { + "node_modules/ccount": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "chalk": { + "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { + "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "character-entities": { + "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "character-entities-legacy": { + "node_modules/character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "character-reference-invalid": { + "node_modules/character-reference-invalid": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "collapse-white-space": { + "node_modules/collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "color-convert": { + "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { + "dependencies": { "color-name": "1.1.3" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "comma-separated-tokens": { + "node_modules/comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "commander": { + "node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "debug": { + "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { + "dependencies": { "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "detab": { + "node_modules/detab": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "requires": { + "dependencies": { "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, - "extend": { + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "fs-extra": { + "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { + "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "function-bind": { + "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "gensync": { + "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } }, - "globals": { + "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, - "has-flag": { + "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } }, - "hasown": { + "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "requires": { + "dependencies": { "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "hast-to-hyperscript": { + "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "requires": { + "dependencies": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", "property-information": "^5.3.0", @@ -505,31 +697,43 @@ "style-to-object": "^0.3.0", "unist-util-is": "^4.0.0", "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "hast-util-from-parse5": { + "node_modules/hast-util-from-parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "requires": { + "dependencies": { "@types/parse5": "^5.0.0", "hastscript": "^6.0.0", "property-information": "^5.0.0", "vfile": "^4.0.0", "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "hast-util-parse-selector": { + "node_modules/hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "hast-util-raw": { + "node_modules/hast-util-raw": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "requires": { + "dependencies": { "@types/hast": "^2.0.0", "hast-util-from-parse5": "^6.0.0", "hast-util-to-parse5": "^6.0.0", @@ -540,198 +744,298 @@ "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "hast-util-to-parse5": { + "node_modules/hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "requires": { + "dependencies": { "hast-to-hyperscript": "^9.0.0", "property-information": "^5.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "hastscript": { + "node_modules/hastscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "requires": { + "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "html-void-elements": { + "node_modules/html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "inline-style-parser": { + "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, - "is-alphabetical": { + "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "is-alphanumerical": { + "node_modules/is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "requires": { + "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "is-buffer": { + "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "requires": { + "dependencies": { "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-decimal": { + "node_modules/is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "is-hexadecimal": { + "node_modules/is-hexadecimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } }, - "is-whitespace-character": { + "node_modules/is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "is-word-character": { + "node_modules/is-word-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "js-tokens": { + "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "jsesc": { + "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } }, - "json5": { + "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } }, - "jsonfile": { + "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { + "optionalDependencies": { "graceful-fs": "^4.1.6" } }, - "lodash": { + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.uniq": { + "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, - "markdown-escapes": { + "node_modules/markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "markdownlint": { + "node_modules/markdownlint": { "version": "0.26.2", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", - "requires": { + "dependencies": { "markdown-it": "13.0.1" }, - "dependencies": { - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" - }, - "linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "requires": { - "uc.micro": "^1.0.1" - } - }, - "markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", - "requires": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - } + "engines": { + "node": ">=14" } }, - "markdownlint-rule-helpers": { + "node_modules/markdownlint-rule-helpers": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz", - "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==" + "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/markdownlint/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/markdownlint/node_modules/markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } }, - "mdast-squeeze-paragraphs": { + "node_modules/mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "requires": { + "dependencies": { "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "mdast-util-definitions": { + "node_modules/mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "requires": { + "dependencies": { "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "mdast-util-to-hast": { + "node_modules/mdast-util-to-hast": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "requires": { + "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "mdast-util-definitions": "^4.0.0", @@ -740,59 +1044,75 @@ "unist-util-generated": "^1.0.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "mdurl": { + "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, - "ms": { + "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "parse-entities": { + "node_modules/parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "requires": { + "dependencies": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "parse5": { + "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "property-information": { + "node_modules/property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "requires": { + "dependencies": { "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "remark-footnotes": { + "node_modules/remark-footnotes": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "remark-mdx": { + "node_modules/remark-mdx": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "requires": { + "dependencies": { "@babel/core": "7.12.9", "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-proposal-object-rest-spread": "7.12.1", @@ -802,19 +1122,21 @@ "remark-parse": "8.0.3", "unified": "9.2.0" }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-parse": { + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-parse": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "requires": { + "dependencies": { "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", "is-alphabetical": "^1.0.0", @@ -831,226 +1153,348 @@ "unist-util-remove-position": "^2.0.0", "vfile-location": "^3.0.0", "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-squeeze-paragraphs": { + "node_modules/remark-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "requires": { + "dependencies": { "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } }, - "resolve": { + "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "requires": { + "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "semver": { + "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } }, - "source-map": { + "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } }, - "space-separated-tokens": { + "node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "state-toggle": { + "node_modules/state-toggle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "style-to-object": { + "node_modules/style-to-object": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "requires": { + "dependencies": { "inline-style-parser": "0.1.1" } }, - "supports-color": { + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { + "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } }, - "trim": { + "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, - "trim-trailing-lines": { + "node_modules/trim-trailing-lines": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "trough": { + "node_modules/trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "uc.micro": { + "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, - "unherit": { + "node_modules/unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "requires": { + "dependencies": { "inherits": "^2.0.0", "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "unified": { + "node_modules/unified": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "requires": { + "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-builder": { + "node_modules/unist-builder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "unist-util-generated": { + "node_modules/unist-util-generated": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "unist-util-is": { + "node_modules/unist-util-is": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "unist-util-position": { + "node_modules/unist-util-position": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "unist-util-remove": { + "node_modules/unist-util-remove": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "requires": { + "dependencies": { "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-util-remove-position": { + "node_modules/unist-util-remove-position": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "requires": { + "dependencies": { "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-util-stringify-position": { + "node_modules/unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "requires": { + "dependencies": { "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-util-visit": { + "node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "requires": { + "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "unist-util-visit-parents": { + "node_modules/unist-util-visit-parents": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "requires": { + "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "universalify": { + "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } }, - "vfile": { + "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "requires": { + "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "vfile-location": { + "node_modules/vfile-location": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "vfile-message": { + "node_modules/vfile-message": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "requires": { + "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "web-namespaces": { + "node_modules/web-namespaces": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } }, - "zwitch": { + "node_modules/zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } From 4d2a5b5f18f1b7dbc04e9541b94b0c6c549f6372 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Thu, 22 Feb 2024 14:59:27 +0000 Subject: [PATCH 04/62] wip --- Packs/Gem/Integrations/Gem/Gem.yml | 68 ++++++++++--------- ...63-8856-37a2fbbe722b-Gem_Alert_Merger.json | 67 ++++++++++++++++++ 2 files changed, 103 insertions(+), 32 deletions(-) create mode 100644 Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 76e788985148..cf144da6e4b1 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -3,45 +3,49 @@ commonfields: id: Gem version: -1 configuration: -- defaultvalue: https://example.com/ - display: Your server URL - name: url - required: true - type: 0 -- displaypassword: API Key - additionalinfo: The API Key to use for connection - name: credentials - required: true - hiddenusername: true - type: 9 -- display: Trust any certificate (not secure) - name: insecure - type: 8 - required: false -- display: Use system proxy settings - name: proxy - type: 8 - required: false -description: '[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.]' + - defaultvalue: "https://app.gem.security/api/v1" + display: API Endpoint + additionalinfo: "The API endpoint to use for connection (US or EU)" + name: api_endpoint + type: 15 + required: true + options: + - "https://app.gem.security/api/v1" + - "https://eu-west-1.app.gem.security/api/v1" + - display: Service Account ID + additionalinfo: The Service Account ID to use for connection + name: client_id + type: 0 + required: true + - display: Service Account Secret + additionalinfo: The Service Account Secret to use for connection + name: client_secret + type: 4 + required: true + - display: Use system proxy settings + name: proxy + type: 8 + required: false +description: "[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.]" display: Gem name: Gem script: commands: - - arguments: - - description: '[Enter a description of the argument, including any important information users need to know, for example, default values.]' - name: dummy - required: true - description: '[Enter a description of the command, including any important information users need to know, for example required permissions.]' - name: baseintegration-dummy - outputs: - - contextPath: BaseIntegration.Output - description: '[Enter a description of the data returned in this output.]' - type: String + - arguments: + - description: "[Enter a description of the argument, including any important information users need to know, for example, default values.]" + name: dummy + required: true + description: "[Enter a description of the command, including any important information users need to know, for example required permissions.]" + name: baseintegration-dummy + outputs: + - contextPath: BaseIntegration.Output + description: "[Enter a description of the data returned in this output.]" + type: String runonce: false - script: '-' + script: "-" type: python subtype: python3 dockerimage: demisto/python3:3.10.12.63474 fromversion: 5.5.0 tests: -- No tests (auto formatted) + - No tests diff --git a/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json b/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json new file mode 100644 index 000000000000..66f3b5cb626f --- /dev/null +++ b/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json @@ -0,0 +1,67 @@ +{ + "action": "link", + "cacheVersn": 0, + "definitionId": "", + "enabled": true, + "existingEventsFilters": [ + [ + { + "left": { + "isContext": true, + "value": { + "simple": "threatid" + } + }, + "operator": "isIdenticalIncident", + "right": { + "isContext": true, + "value": { + "simple": "${incident.threatid}" + } + }, + "type": "shortText" + } + ] + ], + "fromServerVersion": "", + "id": "Gem Alert Merger", + "index": 0, + "itemVersion": "", + "linkTo": "oldest", + "locked": false, + "name": "Gem Alert Merger", + "newEventFilters": [], + "packID": "", + "packName": "", + "period": { + "by": "days", + "fromValue": 2 + }, + "readyExistingEventsFilters": [ + [ + { + "left": { + "isContext": true, + "value": { + "simple": "threatid" + } + }, + "operator": "isIdenticalIncident", + "right": { + "isContext": true, + "value": { + "simple": "${incident.threatid}" + } + }, + "type": "shortText" + } + ] + ], + "readyNewEventFilters": [], + "scriptID": "", + "scriptName": "", + "searchClosed": true, + "system": false, + "toServerVersion": "", + "version": -1 +} \ No newline at end of file From 104f780911fec42b119c9746c387c831e5052904 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 22 Feb 2024 15:34:59 +0000 Subject: [PATCH 05/62] Add incident fields --- .../incidentfield-Account_Id.json | 55 +++++++++++++++++++ .../incidentfield-Account_Name.json | 55 +++++++++++++++++++ .../incidentfield-Account_Provider.json | 55 +++++++++++++++++++ .../incidentfield-Alert_Source.json | 55 +++++++++++++++++++ .../incidentfield-Alert_Time.json | 55 +++++++++++++++++++ .../incidentfield-Event_Time.json | 55 +++++++++++++++++++ .../incidentfield-Events_Count.json | 55 +++++++++++++++++++ .../IncidentFields/incidentfield-Gem_Url.json | 55 +++++++++++++++++++ .../incidentfield-Main_Entity_Id.json | 55 +++++++++++++++++++ .../incidentfield-Main_Entity_Name.json | 55 +++++++++++++++++++ .../incidentfield-Main_Entity_Region.json | 55 +++++++++++++++++++ .../incidentfield-Main_Entity_Type.json | 55 +++++++++++++++++++ .../incidentfield-Severity.json | 55 +++++++++++++++++++ .../incidentfield-Threat_Id.json | 55 +++++++++++++++++++ .../IncidentFields/incidentfield-Title.json | 55 +++++++++++++++++++ .../IncidentFields/incidentfield-Ttp_Id.json | 55 +++++++++++++++++++ 16 files changed, 880 insertions(+) create mode 100644 Packs/Gem/IncidentFields/incidentfield-Account_Id.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Account_Name.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Account_Provider.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Alert_Source.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Alert_Time.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Event_Time.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Events_Count.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Gem_Url.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Severity.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Threat_Id.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Title.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json diff --git a/Packs/Gem/IncidentFields/incidentfield-Account_Id.json b/Packs/Gem/IncidentFields/incidentfield-Account_Id.json new file mode 100644 index 000000000000..581066ada42e --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Account_Id.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "accountid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_accountid", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Account Id", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Account_Name.json b/Packs/Gem/IncidentFields/incidentfield-Account_Name.json new file mode 100644 index 000000000000..2f15d1100a45 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Account_Name.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "accountname", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_accountname", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Account Name", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Account_Provider.json new file mode 100644 index 000000000000..65eb9562aa56 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Account_Provider.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "accountprovider", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_accountprovider", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Account Provider", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json b/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json new file mode 100644 index 000000000000..358a35c25633 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "alertsource", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_alertsource", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Alert Source", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Alert_Time.json b/Packs/Gem/IncidentFields/incidentfield-Alert_Time.json new file mode 100644 index 000000000000..c2ab22b50548 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Alert_Time.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "alerttime", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_alerttime", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Alert Time", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "date", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "date", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Event_Time.json b/Packs/Gem/IncidentFields/incidentfield-Event_Time.json new file mode 100644 index 000000000000..9a7557aec6c9 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Event_Time.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "eventtime", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_eventtime", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Event Time", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "date", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "date", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Events_Count.json b/Packs/Gem/IncidentFields/incidentfield-Events_Count.json new file mode 100644 index 000000000000..c57a2785d809 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Events_Count.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "eventscount", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_eventscount", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Events Count", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "number", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "number", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json new file mode 100644 index 000000000000..14ca804b3070 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "gemurl", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_gemurl", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Gem Url", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "url", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "url", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json new file mode 100644 index 000000000000..b9dd6bcc72ae --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "mainentityid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_mainentityid", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Main Entity Id", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json new file mode 100644 index 000000000000..ea63ce1ce002 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "mainentityname", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_mainentityname", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Main Entity Name", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json new file mode 100644 index 000000000000..88c64fb283ce --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "mainentityregion", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_mainentityregion", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Main Entity Region", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json new file mode 100644 index 000000000000..669c129a3622 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "mainentitytype", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_mainentitytype", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Main Entity Type", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Severity.json b/Packs/Gem/IncidentFields/incidentfield-Severity.json new file mode 100644 index 000000000000..563655afdfe8 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Severity.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "severity", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_severity", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Severity", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "number", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "number", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json b/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json new file mode 100644 index 000000000000..ec2e8363f4d8 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "threatid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_threatid", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Threat Id", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Title.json b/Packs/Gem/IncidentFields/incidentfield-Title.json new file mode 100644 index 000000000000..e338718be8ea --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Title.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "title", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_title", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Title", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json b/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json new file mode 100644 index 000000000000..60267ee89d83 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "ttpid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_ttpid", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Ttp Id", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file From 9299ce0c898b594f5595409597b3fccff29b104c Mon Sep 17 00:00:00 2001 From: dorkauf Date: Sun, 25 Feb 2024 15:34:52 +0000 Subject: [PATCH 06/62] wip --- Packs/Gem/Integrations/Gem/Gem.py | 253 +++++++++++++++++------------ Packs/Gem/Integrations/Gem/Gem.yml | 12 +- 2 files changed, 163 insertions(+), 102 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index b4f9f56e3564..39c11429e9d6 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -1,25 +1,10 @@ import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 -"""Base Integration for Cortex XSOAR (aka Demisto) - -This is an empty Integration with some basic structure according -to the code conventions. - -MAKE SURE YOU REVIEW/REPLACE ALL THE COMMENTS MARKED AS "TODO" - -Developer Documentation: https://xsoar.pan.dev/docs/welcome -Code Conventions: https://xsoar.pan.dev/docs/integrations/code-conventions -Linting: https://xsoar.pan.dev/docs/integrations/linting - -This is an empty structure file. Check an example at; -https://github.com/demisto/content/blob/master/Packs/HelloWorld/Integrations/HelloWorld/HelloWorld.py - -""" - from CommonServerUserPython import * # noqa import urllib3 from typing import Any +import jwt # Disable insecure warnings urllib3.disable_warnings() @@ -29,86 +14,169 @@ DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ' # ISO8601 format with UTC, default in XSOAR +# ENDPOINTS +TOKEN_URL = 'https://login.gem.security/oauth/token' +THREATS_ENDPOINT = '/threats' +THREAT_ENDPOINT = '/threats/{id}' +INVENTORY_ENDPOINT = '/inventory' +INVENTORY_ITEM_ENDPOINT = '/inventory/{id}' + + ''' CLIENT CLASS ''' -class Client(BaseClient): - """Client class to interact with the service API +class GemClient(BaseClient): + def __init__(self, base_url: str, verify: bool, proxy: bool, client_id: str, client_secret: str): + super().__init__(base_url=base_url, verify=verify, proxy=proxy) + self._client_id = client_id + self._client_secret = client_secret + try: + self._auth_token = self._get_token() + except Exception as e: + raise DemistoException(f'Failed to get token. Error: {str(e)}') - This Client implements API calls, and does not contain any XSOAR logic. - Should only do requests and return data. - It inherits from BaseClient defined in CommonServer Python. - Most calls use _http_request() that handles proxy, SSL verification, etc. - For this implementation, no special attributes defined - """ + def _get_token(self): + ctx = get_integration_context() + + if not ctx or not ctx.get('auth_token'): + # No token in integration context, probably first run + auth_token = self._generate_token() + else: + # Token exists, check if it's expired and generate a new one if needed + auth_token = ctx.get('auth_token') + decoded_jwt = jwt.decode(auth_token, options={"verify_signature": False}) - # TODO: REMOVE the following dummy function: - def baseintegration_dummy(self, dummy: str) -> dict[str, str]: - """Returns a simple python dict with the information provided - in the input (dummy). + token_expiration = datetime.fromtimestamp(decoded_jwt['exp']) - :type dummy: ``str`` - :param dummy: string to add in the dummy dict that is returned + if token_expiration < datetime.now(): + auth_token = self._generate_token() - :return: dict as {"dummy": dummy} - :rtype: ``str`` + return auth_token + + def http_request(self, method: str, url_suffix='', full_url=None, headers=None, json_data=None, params=None, auth=True): + if auth: + headers = headers or {} + headers['Authorization'] = f'Bearer {self._auth_token}' + return super()._http_request( + method=method, + url_suffix=url_suffix, + full_url=full_url, + headers=headers, + json_data=json_data, + params=params + ) + + def _generate_token(self) -> str: + """Generate an access token using the client id and secret + :return: valid token """ - return {"dummy": dummy} - # TODO: ADD HERE THE FUNCTIONS TO INTERACT WITH YOUR PRODUCT API + data = { + 'client_id': self._client_id, + 'client_secret': self._client_secret, + 'grant_type': 'client_credentials', + "audience": "https://backend.gem.security" + } + headers = { + 'Content-Type': 'application/json' + } -''' HELPER FUNCTIONS ''' + token_res = self.http_request( + method='POST', + full_url=TOKEN_URL, + headers=headers, + json_data=data, + auth=False + ) -# TODO: ADD HERE ANY HELPER FUNCTION YOU MIGHT NEED (if any) + set_integration_context((get_integration_context() or {}).update({'auth_token': token_res.get('access_token')})) -''' COMMAND FUNCTIONS ''' + return token_res.get('access_token') + def get_inventory_item(self, item_id: str) -> dict: + """Get inventory item by id + :param item_id: id of the item to get + :return: inventory item + """ + return self.http_request( + method='GET', + url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=item_id) + ) + + def get_alert_list(self, limit=None, severity=None) -> list[dict]: + """For developing walkthrough purposes, this is a dummy response. + For real API calls, see the specific_api_endpoint_call_example method. + + Args: + limit (int): The number of items to generate. + severity (str) : The severity value of the items returned. + + Returns: + list[dict]: List of alerts data. + """ -def test_module(client: Client) -> str: - """Tests API connectivity and authentication' + # TODO: Implement filtering - Returning 'ok' indicates that the integration works like it is supposed to. - Connection to the service is successful. - Raises exceptions if something goes wrong. + response = self.http_request( + method='GET', + url_suffix=THREATS_ENDPOINT + ) - :type client: ``Client`` - :param Client: client to use + return response - :return: 'ok' if test passed, anything else will fail the test. - :rtype: ``str`` + +''' HELPER FUNCTIONS ''' + + +def init_client(params: dict) -> GemClient: + """ + Initializes a new Client object """ + return GemClient( + base_url=params['api_endpoint'], + verify=True, + proxy=params.get('proxy', False), + client_id=params['client_id'], + client_secret=params['client_secret'] + ) - message: str = '' + +''' COMMAND FUNCTIONS ''' + + +def test_module(params: dict[str, Any]) -> str: + """ + Tests API connectivity and authentication. + Return "ok" if test passed, anything else will fail the test. + + Args: + params (Dict): Integration parameters + + Returns: + str: 'ok' if test passed, anything else will raise an exception and will fail the test. + """ try: - # TODO: ADD HERE some code to test connectivity and authentication to your service. - # This should validate all the inputs given in the integration configuration panel, - # either manually or by using an API that uses them. - message = 'ok' - except DemistoException as e: - if 'Forbidden' in str(e) or 'Authorization' in str(e): # TODO: make sure you capture authentication errors - message = 'Authorization Error: make sure API Key is correctly set' - else: - raise e - return message + init_client(params) + except Exception: + raise DemistoException('Authentication failed') + return 'ok' -# TODO: REMOVE the following dummy command function -def baseintegration_dummy_command(client: Client, args: dict[str, Any]) -> CommandResults: - dummy = args.get('dummy', None) - if not dummy: - raise ValueError('dummy not specified') +def get_inventory_item(client: GemClient, args: dict[str, Any]) -> CommandResults: + item_id = args.get('item_id') + if not item_id: + raise DemistoException('Item ID is a required parameter.') - # Call the Client function and get the raw response - result = client.baseintegration_dummy(dummy) + result = client.get_inventory_item(item_id) return CommandResults( - outputs_prefix='BaseIntegration', - outputs_key_field='', - outputs=result, + readable_output=tableToMarkdown('Inventory Item', result), + outputs_prefix='Gem.InventoryItem', + outputs_key_field='id', + outputs=result ) -# TODO: ADD additional command functions that translate XSOAR inputs/outputs to Client ''' MAIN FUNCTION ''' @@ -121,47 +189,30 @@ def main() -> None: :rtype: """ - # TODO: make sure you properly handle authentication - # api_key = demisto.params().get('credentials', {}).get('password') - - # get the service API url - base_url = urljoin(demisto.params()['url'], '/api/v1') + params = demisto.params() + args = demisto.args() + command = demisto.command() - # if your Client class inherits from BaseClient, SSL verification is - # handled out of the box by it, just pass ``verify_certificate`` to - # the Client constructor - verify_certificate = not demisto.params().get('insecure', False) + # TODO: Implement fetch_incidents, use fetch_back param to determine if to fetch 30 days back + # Whether to fetch incident 30 days back on initial fetch + params.get('fetch_back', False) - # if your Client class inherits from BaseClient, system proxy is handled - # out of the box by it, just pass ``proxy`` to the Client constructor - proxy = demisto.params().get('proxy', False) - - demisto.debug(f'Command being called is {demisto.command()}') + demisto.debug(f'Command being called is {command}') try: + if command == 'test-module': + # This is the call made when pressing the integration Test button + return_results(test_module(params)) - # TODO: Make sure you add the proper headers for authentication - # (i.e. "Authorization": {api key}) - headers: dict = {} - - client = Client( - base_url=base_url, - verify=verify_certificate, - headers=headers, - proxy=proxy) + client = init_client(params) - if demisto.command() == 'test-module': - # This is the call made when pressing the integration Test button. - result = test_module(client) - return_results(result) - - # TODO: REMOVE the following dummy command case: - elif demisto.command() == 'baseintegration-dummy': - return_results(baseintegration_dummy_command(client, demisto.args())) - # TODO: ADD command cases for the commands you will implement + if command == 'gem-get-inventory-item': + return_results(get_inventory_item(client, args)) + else: + raise NotImplementedError(f'Command {command} is not implemented') # Log exceptions and return errors except Exception as e: - return_error(f'Failed to execute {demisto.command()} command.\nError:\n{str(e)}') + return_error(f'Failed to execute {command} command.\nError:\n{str(e)}') ''' ENTRY POINT ''' diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index cf144da6e4b1..e1c22ea6f382 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -22,6 +22,10 @@ configuration: name: client_secret type: 4 required: true + - display: Sync incidents 30 days back + name: fetch_back + type: 8 + required: false - display: Use system proxy settings name: proxy type: 8 @@ -41,11 +45,17 @@ script: - contextPath: BaseIntegration.Output description: "[Enter a description of the data returned in this output.]" type: String + - name: gem-get-inventory-item + description: Get an inventory item by ID. + arguments: + - name: item_id + description: inventory item id. + required: true runonce: false script: "-" type: python subtype: python3 - dockerimage: demisto/python3:3.10.12.63474 + dockerimage: demisto/auth-utils:1.0.0.76157 # TODO: This docker image was selected since it contains the "jwt" package. Double check if it's the correct one. fromversion: 5.5.0 tests: - No tests From 15f8b9ed2c3c652da69914e24cd19d025c476e55 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 26 Feb 2024 09:59:34 +0000 Subject: [PATCH 07/62] wip --- Packs/Gem/Author_image.png | Bin 0 -> 14497 bytes Packs/Gem/Integrations/Gem/Gem.py | 24 ++++++++++++++++++++++- Packs/Gem/Integrations/Gem/Gem.yml | 10 ++++++++++ Packs/Gem/Integrations/Gem/Gem_image.png | Bin 2507 -> 14497 bytes 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Packs/Gem/Author_image.png b/Packs/Gem/Author_image.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0c2b20669597404debd169cb7f3f42140e7cd5d1 100644 GIT binary patch literal 14497 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 F`9G;eNX!5L literal 0 HcmV?d00001 diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 39c11429e9d6..980bcddb04f8 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -120,7 +120,8 @@ def get_alert_list(self, limit=None, severity=None) -> list[dict]: response = self.http_request( method='GET', - url_suffix=THREATS_ENDPOINT + url_suffix=THREATS_ENDPOINT, + params={'limit': limit, 'severity': severity} ) return response @@ -177,6 +178,25 @@ def get_inventory_item(client: GemClient, args: dict[str, Any]) -> CommandResult outputs_key_field='id', outputs=result ) + +def get_alert_list(client: GemClient, args: dict[str, Any]) -> CommandResults: + limit = args.get('limit') + severity = args.get('severity') + + if not limit: + raise DemistoException('Limit is a required parameter.') + + if not limit.isdigit(): + raise DemistoException('Limit must be a number.') + + result = client.get_alert_list(limit, severity) + + return CommandResults( + readable_output=tableToMarkdown('Alerts', result), + outputs_prefix='Gem.Alert', + outputs_key_field='id', + outputs=result + ) ''' MAIN FUNCTION ''' @@ -207,6 +227,8 @@ def main() -> None: if command == 'gem-get-inventory-item': return_results(get_inventory_item(client, args)) + elif command == 'gem-get-alert-list': + return_results(get_alert_list(client, args)) else: raise NotImplementedError(f'Command {command} is not implemented') diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index e1c22ea6f382..343d56b66630 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -51,6 +51,16 @@ script: - name: item_id description: inventory item id. required: true + - name: gem-get-alert-list + description: Get a list of alerts. + arguments: + - name: limit + description: The maximum number of alerts to return. + required: true + - name: severity + description: The severity of the alerts to return. + required: false + type: Number runonce: false script: "-" type: python diff --git a/Packs/Gem/Integrations/Gem/Gem_image.png b/Packs/Gem/Integrations/Gem/Gem_image.png index 772c6af21bebd9230ea48f23a29ad2260f386e71..0c2b20669597404debd169cb7f3f42140e7cd5d1 100644 GIT binary patch literal 14497 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 F`9G;eNX!5L literal 2507 zcmV;+2{iVJP)NJU1VgcOS!Wr4 zO{q;AyQYAIs;$+wHZ~Sp+*+hq)D%gf ztHY9woe3{0IJoIrpgCQC7`DJ3m>Rb4IVaSF>acO==CH3?2YW9zeW_Dx~*%o3bFhWN8-vqxH&=>B0u zuaCmH%$&2TPhhFWSb?U_&pUZ|*bx4bY2lAeKf4Fz( zmQcC1G(7!QIj=-*@_K6Xu1z?%2l)e_654|gT&Yu996XHs=&CTZ`w-v}%L}p|&0V{i z+>M}fRVtn9z|!)NwJa=JU&b?XP1tkblQ4D3yx@~^KJ{ql)!hryGQsnWH2d0+H@nGX zw4$doc(6Jj$F{`H#bN9f?}g#LF3mfF;nU`awLA8cKM!>FeJ~$VrQ(!~W*_628V=UH z#L*3oZlPbNGeW+jEG_4Q0)Dht@52W-_{z?+TAyKZtwufpGKm1!42gYaP3o=Hp5 zpENDeNw=&g(wishi@^u5KHBy z0B5lAQOWLBab_QSK09fjTO zC@3Ws@CkVee3)foO2$1e+uh|0=G5tv6Q@D!mTg_+}$dIq?{bj!*uvDc%`2UX?@FJXeYlO zql@{RdZcteM0jQY4X%XKp#!*g{X6jLzX!TOK_|!pF2zT3WJB`(jkNkL_}X+Gl)`YB z2EHqQ4+=WY7VrZ@LmX(C`XO?ji^Ej+Opo`g5xWAGl^6a3G? z&p{{f9xG+wdu=iJnzREvZxZ-gR8YYJ1q&1`P_RJ30tE{cEO1OM;46U-Cb=BbMjBDs z)ttK)h8|@daa>LHgTYT3?|-25D93$R@gid10e^0qi+Lx5PNNfk+3|QZisSOhx*-=W$J3%r+sPEn@)0ekD#*uCOYo^?Wv^h40bS-pMXKv)%JM$A&pY;mgh?FhkU+QE8BVmEWZwZ1Os3?tOv{bg-ZM9Yuh@kKT3Z*1=`auTt9(gP*;L= zYM0sIh3fe&AlwBta3|cJr8h@40S(p`YfCjh$JYPeoo}f{m1KXYlPCUyd701;zn`qs(u>dr$7Yn+zbza=YJN;K&Ss5w9P+3!^a6@TgF#|cJ-WZz!Y%D%ukcHbs5yv zHpv-V`0+!O}lnF#l)S zyxg`;wvOoF*cT^l)Di+ZR7D$U3#BdW&v=a=gNtBJyf z9dok((ZwPiqQALjyh|Hg0izuz@yL&?uKKjIP+TF!L!4*?Gxd3lZ5vK1_C>o# z8FoUss^nF&!V#46z7aKpzyxRwec=Uo1iYV=g7SPDa*1iIT!y{~=fU;h4D~9}AgV|0 zA^e%+Z7>n;gBsA;&qHJMLH6XYaP*3u3#(upYy+3X!SF}W;opKW@FaNUB(GkgpHdkq z-nYBJbznRyx9xXgM)nx{@@?W(Pyt>9lfd!UtGmdxP%h5M{V*0(KR5utHiBFledzcY zeh!}hB~Z@J$(c~?pZ7TYD-oYVcx57P`NiPUVm(VCE=x|PWnkOUD7O&S36?e8iI=N5 zuCCdPsT|`y&7@J_`Ij0&CGZNE<`vowoXoF-Y4Rq-3HM?m-Mlq$2dLb(OmijJ2G*_Z z-T=#~y4udI!;8#GW?S0biQWoSyazjRR5@7g0V9o(_ai&kSn1$Dfh$5ZAi+awM#yxJ zQHFJ1bb3s0?6C_KIIg5R5J{%>CcYC~YWu~r>$8V_Z3FpKSKGN|JCP6_o11si z#&fUuleVMTj(wG*SJ92&!{Pu~4vl>dpo(;ACd2wc6B?Sg4ex(($=#5RpLMd0;eS43 V(U=mQ{m=ja002ovPDHLkV1nG2;bs5; From 1ed7cb7003cf1eff82df9420fe259cfc0c6bd531 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 26 Feb 2024 10:00:41 +0000 Subject: [PATCH 08/62] Add webhook mapper --- ...lassifier-mapper-incoming-Gem-webhook.json | 98 ++++++++++--------- 1 file changed, 53 insertions(+), 45 deletions(-) diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 4573da84518c..32ffac7e9b1c 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -1,65 +1,73 @@ { - "id": "Gem-mapper-webhook", - "name": "Gem - Incoming Mapper Webhook", - "type": "mapping-incoming", - "description": "Maps incoming Gem Threat fields when received via webhook.", - "fromVersion": "6.8.0", + "brands": null, + "cacheVersn": 0, "defaultIncidentType": "", + "definitionId": "", + "feed": false, + "fromVersion": "6.8.0", + "incidentSamples": null, + "indicatorSamples": null, + "instanceIds": null, + "itemVersion": "", + "keyTypeMap": {}, + "locked": false, + "logicalVersion": 3, "mapping": { "Gem Threat": { - "dontMapEventToLabels": false, + "dontMapEventToLabels": true, "internalMapping": { + "Account Id": { + "simple": "account.name" + }, + "Account Name": { + "simple": "account.display_name" + }, + "Account Provider": { + "simple": "account.cloud_provider" + }, "Alert ID": { - "complex": { - "accessor": "alert_id", - "filters": [], - "root": "event", - "transformers": [] - } + "simple": "event.alert_id" + }, + "Alert Source": { + "simple": "event.alert_source" + }, + "Alert Time": { + "simple": "event.created_at" }, "Description": { "simple": "description" }, - "Incident Link": { + "Event Time": { + "simple": "event_datetime" + }, + "Gem Url": { "simple": "link" }, - "occurred": { - "complex": { - "filters": [], - "root": "event_datetime", - "transformers": [ - { - "args": { - "add_utc_timezone": { - "isContext": false, - "value": { - "simple": "true" - } - }, - "dayfirst": { - "isContext": false - }, - "fuzzy": { - "isContext": false - }, - "yearfirst": { - "isContext": false - } - }, - "operator": "DateStringToISOFormat" - } - ] - } + "Threat Id": { + "simple": "event.threat_id" + }, + "Title": { + "simple": "title" + }, + "name": { + "simple": "title" }, "severity": { - "complex": { - "filters": [], - "root": "severity", - "transformers": [] - } + "simple": "severity" } } } }, + "id": "Gem-mapper-webhook", + "name": "Gem - Incoming Mapper Webhook", + "type": "mapping-incoming", + "description": "Maps incoming Gem Threat fields when received via webhook.", + "packID": "", + "packName": "", + "sourceClassifierId": "", + "system": false, + "toServerVersion": "", + "transformer": {}, + "unclassifiedCases": null, "version": -1 } \ No newline at end of file From 03609572578f89f20be7a29662325673e8349d45 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 26 Feb 2024 10:49:57 +0000 Subject: [PATCH 09/62] wip --- Packs/Gem/Integrations/Gem/Gem.py | 31 +++--- Packs/Gem/Integrations/Gem/Gem.yml | 147 ++++++++++++++++++++++++++--- 2 files changed, 150 insertions(+), 28 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 980bcddb04f8..f2f9aec57398 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -94,14 +94,14 @@ def _generate_token(self) -> str: return token_res.get('access_token') - def get_inventory_item(self, item_id: str) -> dict: - """Get inventory item by id - :param item_id: id of the item to get + def get_resource_details(self, resource_id: str) -> dict: + """ Get inventory item details + :param resource_id: id of the item to get :return: inventory item """ return self.http_request( method='GET', - url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=item_id) + url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=resource_id) ) def get_alert_list(self, limit=None, severity=None) -> list[dict]: @@ -165,12 +165,12 @@ def test_module(params: dict[str, Any]) -> str: return 'ok' -def get_inventory_item(client: GemClient, args: dict[str, Any]) -> CommandResults: - item_id = args.get('item_id') - if not item_id: - raise DemistoException('Item ID is a required parameter.') +def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResults: + resource_id = args.get('resource_id') + if not resource_id: + raise DemistoException('Resource ID is a required parameter.') - result = client.get_inventory_item(item_id) + result = client.get_resource_details(resource_id) return CommandResults( readable_output=tableToMarkdown('Inventory Item', result), @@ -178,17 +178,18 @@ def get_inventory_item(client: GemClient, args: dict[str, Any]) -> CommandResult outputs_key_field='id', outputs=result ) - + + def get_alert_list(client: GemClient, args: dict[str, Any]) -> CommandResults: limit = args.get('limit') severity = args.get('severity') - + if not limit: raise DemistoException('Limit is a required parameter.') - + if not limit.isdigit(): raise DemistoException('Limit must be a number.') - + result = client.get_alert_list(limit, severity) return CommandResults( @@ -225,8 +226,8 @@ def main() -> None: client = init_client(params) - if command == 'gem-get-inventory-item': - return_results(get_inventory_item(client, args)) + if command == 'gem-get-resource-details': + return_results(get_resource_details(client, args)) elif command == 'gem-get-alert-list': return_results(get_alert_list(client, args)) else: diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 343d56b66630..a352f1451f0b 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -35,22 +35,143 @@ display: Gem name: Gem script: commands: - - arguments: - - description: "[Enter a description of the argument, including any important information users need to know, for example, default values.]" - name: dummy + - name: gem-list-threats + description: List all threats detected in Gem + arguments: + - name: page + description: The page number to return. + required: true + defaultValue: "1" + - name: page_size + description: The number of items to return per page. + required: true + defaultValue: "10" + - name: ordering + description: The ordering of the items. + required: false + defaultValue: "-timeframe_start" + auto: PREDEFINED + predefined: + - "-timeframe_start" + - "timeframe_state" + - "-mitre_technique" + - "mitre_technique" + - "-severity" + - "severity" + - "-assignee" + - "assignee" + - "-is_resolved" + - "is_resolved" + - name: status + description: The status of the threats to return. + required: false + isArray: true + auto: PREDEFINED + predefined: + - open + - resolved + - in_progress + - name: ttp_id + description: The TTP ID of the threats to return. + required: false + - name: title + description: The title of the threats to return. + required: false + - name: severity + description: The severity of the threats to return. + required: false + isArray: true + auto: PREDEFINED + predefined: + - low + - medium + - high + - name: cloud_provider + description: The provider of the threats to return. + required: false + isArray: true + auto: PREDEFINED + predefined: + - aws + - azure + - gcp + - okta + - huawei + - name: entity_type + description: The entity type of the threats to return. + required: false + - name: time_start + description: "The start time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: time_end + description: "The end time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + + - name: gem-get-threat-details + description: Get details about a specific threat + arguments: + - name: threat_id + description: The ID of the threat to get details for. required: true - description: "[Enter a description of the command, including any important information users need to know, for example required permissions.]" - name: baseintegration-dummy - outputs: - - contextPath: BaseIntegration.Output - description: "[Enter a description of the data returned in this output.]" - type: String - - name: gem-get-inventory-item - description: Get an inventory item by ID. + + - name: gem-list-inventory-resources + description: List inventory resources in Gem arguments: - - name: item_id - description: inventory item id. + - name: cursor + description: The cursor to use for pagination. + required: false + - name: page_size + description: The number of items to return per page. + required: true + defaultValue: "10" + - name: include_deleted + description: Include deleted resources in the response. + required: false + defaultValue: false + type: Boolean + - name: region + description: The region of the resources to return. + required: false + - name: resource_type + description: The type of the resources to return. + required: false + - name: search + description: The search query to use. + required: false + - name: total + description: Whether to include the total count of resources in the response. + required: false + defaultValue: false + type: Boolean + + - name: gem-get-resource-details + description: Get details about a specific resource + arguments: + - name: resource_id + description: The ID of the resource to get details for. + required: true + + - name: gem-list-ips-by-entity + description: List all source IP addresses used by an entity in a specific timeframe. The results are sorted by activity volume. + arguments: + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + required: true + - name: entity_type + description: "Type of the entity. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true + - name: gem-get-alert-list description: Get a list of alerts. arguments: From 9590dc125a4630f5821ec3113a262ff996684636 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 26 Feb 2024 13:15:30 +0000 Subject: [PATCH 10/62] wip --- Packs/Gem/Integrations/Gem/Gem.py | 10 +- Packs/Gem/Integrations/Gem/Gem.yml | 157 +++++++++++++++++++++++++++-- 2 files changed, 155 insertions(+), 12 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index f2f9aec57398..4fb67ac18f1c 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -104,7 +104,7 @@ def get_resource_details(self, resource_id: str) -> dict: url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=resource_id) ) - def get_alert_list(self, limit=None, severity=None) -> list[dict]: + def list_threats(self, limit=None, severity=None) -> list[dict]: """For developing walkthrough purposes, this is a dummy response. For real API calls, see the specific_api_endpoint_call_example method. @@ -180,7 +180,7 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu ) -def get_alert_list(client: GemClient, args: dict[str, Any]) -> CommandResults: +def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: limit = args.get('limit') severity = args.get('severity') @@ -190,7 +190,7 @@ def get_alert_list(client: GemClient, args: dict[str, Any]) -> CommandResults: if not limit.isdigit(): raise DemistoException('Limit must be a number.') - result = client.get_alert_list(limit, severity) + result = client.list_threats(limit, severity) return CommandResults( readable_output=tableToMarkdown('Alerts', result), @@ -228,8 +228,8 @@ def main() -> None: if command == 'gem-get-resource-details': return_results(get_resource_details(client, args)) - elif command == 'gem-get-alert-list': - return_results(get_alert_list(client, args)) + elif command == 'gem-list-threats': + return_results(list_threats(client, args)) else: raise NotImplementedError(f'Command {command} is not implemented') diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index a352f1451f0b..12e04884b126 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -172,16 +172,159 @@ script: description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true - - name: gem-get-alert-list - description: Get a list of alerts. + - name: gem-list-services-by-entity + description: List all services accessed by an entity in a specific timeframe. The results are sorted by activity volume. arguments: - - name: limit - description: The maximum number of alerts to return. + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" required: true - - name: severity - description: The severity of the alerts to return. + - name: entity_type + description: "Type of the entity. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + + - name: gem-list-events-by-entity + description: List all events performed by an entity in a specific timeframe. The results are sorted by activity volume. + arguments: + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + required: true + - name: entity_type + description: "Type of the entity. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + + - name: gem-list-accessing-entities + description: List all entities that accessed an entity in a specific timeframe. The results are sorted by activity volume. + arguments: + - name: resource_id + description: "Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + required: true + - name: resource_type + description: "Type of the resource. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + + - name: gem-list-using-entities + description: List all entities that used an entity in a specific timeframe. The results are sorted by activity volume. + arguments: + - name: resource_id + description: "Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + required: true + - name: resource_type + description: "Type of the resource. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + + - name: gem-list-events-on-entity + description: List all events performed on an entity in a specific timeframe. The results are sorted by activity volume. + arguments: + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + required: true + - name: entity_type + description: "Type of the entity. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: gem-list-accessing-ips + description: List all source IP addresses that accessed an entity in a specific timeframe. The results are sorted by activity volume. + arguments: + - name: resource_id + description: "Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + required: true + - name: resource_type + description: "Type of the resource. See documentation for the full options list." + required: true + - name: read_only + description: "Show read-only events." + required: false + type: Boolean + defaultValue: false + - name: start_time + description: "Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + - name: end_time + description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" + required: true + + - name: gem-update-threat-status + description: Set a threat's status to open, in progress or resolved. + arguments: + - name: threat_id + description: The ID of the threat to update. + required: true + - name: status + description: The new status of the threat (open, in_progress, resolved). + required: true + auto: PREDEFINED + predefined: + - open + - in_progress + - resolved + - name: verdict + description: The verdict of the threat. + required: true + auto: PREDEFINED + predefined: + - malicious + - security_test + - planned_action + - not_malicious + - inconclusive + - name: reason + description: The reason for resolving the threat. required: false - type: Number + runonce: false script: "-" type: python From e5f24a6dd364d727026aa339796e74e3cc37bbf6 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 26 Feb 2024 13:32:08 +0000 Subject: [PATCH 11/62] wip --- Packs/Gem/Integrations/Gem/README.md | 299 ++++++++++++++++++++++++++- 1 file changed, 296 insertions(+), 3 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/README.md b/Packs/Gem/Integrations/Gem/README.md index 5d6d1dc2bf52..a4ad7d7244c7 100644 --- a/Packs/Gem/Integrations/Gem/README.md +++ b/Packs/Gem/Integrations/Gem/README.md @@ -1,5 +1,298 @@ -This README contains the full documentation for your integration. +[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.] +This integration was integrated and tested with version xx of Gem. -You auto-generate this README file from your integration YML file using the `demisto-sdk generate-docs` command. +## Configure Gem on Cortex XSOAR -For more information see the [integration documentation](https://xsoar.pan.dev/docs/integrations/integration-docs). +1. Navigate to **Settings** > **Integrations** > **Servers & Services**. +2. Search for Gem. +3. Click **Add instance** to create and configure a new integration instance. + + | **Parameter** | **Description** | **Required** | + | --- | --- | --- | + | API Endpoint | The API endpoint to use for connection \(US or EU\) | True | + | Service Account ID | The Service Account ID to use for connection | True | + | Service Account Secret | The Service Account Secret to use for connection | True | + | Sync incidents 30 days back | | False | + | 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. + +### gem-list-threats + +*** +List all threats detected in Gem + +#### Base Command + +`gem-list-threats` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| page | The page number to return. Default is 1. | Required | +| page_size | The number of items to return per page. Default is 10. | Required | +| ordering | The ordering of the items. Possible values are: -timeframe_start, timeframe_state, -mitre_technique, mitre_technique, -severity, severity, -assignee, assignee, -is_resolved, is_resolved. Default is -timeframe_start. | Optional | +| status | The status of the threats to return. Possible values are: open, resolved, in_progress. | Optional | +| ttp_id | The TTP ID of the threats to return. | Optional | +| title | The title of the threats to return. | Optional | +| severity | The severity of the threats to return. Possible values are: low, medium, high. | Optional | +| cloud_provider | The provider of the threats to return. Possible values are: aws, azure, gcp, okta, huawei. | Optional | +| entity_type | The entity type of the threats to return. | Optional | +| time_start | The start time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| time_end | The end time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-get-threat-details + +*** +Get details about a specific threat + +#### Base Command + +`gem-get-threat-details` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| threat_id | The ID of the threat to get details for. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-inventory-resources + +*** +List inventory resources in Gem + +#### Base Command + +`gem-list-inventory-resources` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| cursor | The cursor to use for pagination. | Optional | +| page_size | The number of items to return per page. Default is 10. | Required | +| include_deleted | Include deleted resources in the response. | Optional | +| region | The region of the resources to return. | Optional | +| resource_type | The type of the resources to return. | Optional | +| search | The search query to use. | Optional | +| total | Whether to include the total count of resources in the response. | Optional | + +#### Context Output + +There is no context output for this command. + +### gem-get-resource-details + +*** +Get details about a specific resource + +#### Base Command + +`gem-get-resource-details` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| resource_id | The ID of the resource to get details for. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-ips-by-entity + +*** +List all source IP addresses used by an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-ips-by-entity` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| entity_id | Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| entity_type | Type of the entity. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-services-by-entity + +*** +List all services accessed by an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-services-by-entity` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| entity_id | Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| entity_type | Type of the entity. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-events-by-entity + +*** +List all events performed by an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-events-by-entity` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| entity_id | Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| entity_type | Type of the entity. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-accessing-entities + +*** +List all entities that accessed an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-accessing-entities` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| resource_id | Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| resource_type | Type of the resource. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-using-entities + +*** +List all entities that used an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-using-entities` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| resource_id | Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| resource_type | Type of the resource. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-events-on-entity + +*** +List all events performed on an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-events-on-entity` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| entity_id | Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| entity_type | Type of the entity. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-list-accessing-ips + +*** +List all source IP addresses that accessed an entity in a specific timeframe. The results are sorted by activity volume. + +#### Base Command + +`gem-list-accessing-ips` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| resource_id | Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg. | Required | +| resource_type | Type of the resource. See documentation for the full options list. | Required | +| read_only | Show read-only events. | Optional | +| start_time | Timeframe start (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | +| end_time | Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00. | Required | + +#### Context Output + +There is no context output for this command. + +### gem-update-threat-status + +*** +Set a threat's status to open, in progress or resolved. + +#### Base Command + +`gem-update-threat-status` + +#### Input + +| **Argument Name** | **Description** | **Required** | +| --- | --- | --- | +| threat_id | The ID of the threat to update. | Required | +| status | The new status of the threat (open, in_progress, resolved). Possible values are: open, in_progress, resolved. | Required | +| verdict | The verdict of the threat. Possible values are: malicious, security_test, planned_action, not_malicious, inconclusive. | Required | +| reason | The reason for resolving the threat. | Optional | + +#### Context Output + +There is no context output for this command. From 581ef3596e481c7796d9d3d1a2ec31d971f0a436 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 26 Feb 2024 13:33:41 +0000 Subject: [PATCH 12/62] merge --- Packs/Gem/Integrations/Gem/Gem.py | 39 ++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 4fb67ac18f1c..27b7a1545cb4 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -104,7 +104,8 @@ def get_resource_details(self, resource_id: str) -> dict: url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=resource_id) ) - def list_threats(self, limit=None, severity=None) -> list[dict]: + def list_threats(self, maxincidents=None, firstfetch=None, severity=None, start_time=None, category=None, accounts=None, status=None, + assignee=None, mitre_technique_id=None, threat_source=None, entity_type=None, ttp_id=None, provider=None) -> list[dict]: """For developing walkthrough purposes, this is a dummy response. For real API calls, see the specific_api_endpoint_call_example method. @@ -116,15 +117,16 @@ def list_threats(self, limit=None, severity=None) -> list[dict]: list[dict]: List of alerts data. """ - # TODO: Implement filtering - + params = {'page_size': maxincidents, 'start_time': start_time, 'severity': severity, 'category': category, 'accounts': accounts, 'status': status, 'assignee': assignee, + 'mitre_technique_id': mitre_technique_id, 'threat_source': threat_source, 'entity_type': entity_type, + 'ttp_id': ttp_id, 'provider': provider} response = self.http_request( method='GET', url_suffix=THREATS_ENDPOINT, - params={'limit': limit, 'severity': severity} + params={k: v for k, v in params.items() if v is not None} ) - return response + return response['results'] ''' HELPER FUNCTIONS ''' @@ -146,6 +148,26 @@ def init_client(params: dict) -> GemClient: ''' COMMAND FUNCTIONS ''' +def fetch_threats(client: GemClient, max_results=None, severity=None) -> None: + last_run = demisto.getLastRun() + + day_ago = datetime.now() - timedelta(days=1) + day_ago.time() + if last_run and 'start_time' in last_run: + last_run.get('start_time') + + incidents: list[dict[str, Any]] = [] + + alerts = client.list_threats(maxincidents=max_results, + start_time=dateparser.parse(last_fetch), # type: ignore + severity=severity) + demisto.debug(f'Received {len(alerts)} alerts from server.') + + demisto.incidents(incidents) + demisto.setLastRun( + {'start_time': datetime.now().strftime(DATE_FORMAT)}) + + def test_module(params: dict[str, Any]) -> str: """ Tests API connectivity and authentication. @@ -183,6 +205,8 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: limit = args.get('limit') severity = args.get('severity') + provider = args.get('provider') + start_time = args.get('start_time') if not limit: raise DemistoException('Limit is a required parameter.') @@ -190,8 +214,9 @@ def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: if not limit.isdigit(): raise DemistoException('Limit must be a number.') - result = client.list_threats(limit, severity) + result = client.list_threats(maxincidents=limit, severity=severity, provider=provider, start_time=start_time) + demisto.debug(f"Got {len(result)} Alerts") return CommandResults( readable_output=tableToMarkdown('Alerts', result), outputs_prefix='Gem.Alert', @@ -230,6 +255,8 @@ def main() -> None: return_results(get_resource_details(client, args)) elif command == 'gem-list-threats': return_results(list_threats(client, args)) + elif command == 'fetch-incidents': + fetch_threats(client) else: raise NotImplementedError(f'Command {command} is not implemented') From abcb85530345a288079ac9ba63078a75aa6149df Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 26 Feb 2024 14:14:21 +0000 Subject: [PATCH 13/62] Add gem-list-threats --- Packs/Gem/Integrations/Gem/Gem.py | 56 +++++++++++++------------------ 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 27b7a1545cb4..84e2a793d530 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -104,8 +104,8 @@ def get_resource_details(self, resource_id: str) -> dict: url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=resource_id) ) - def list_threats(self, maxincidents=None, firstfetch=None, severity=None, start_time=None, category=None, accounts=None, status=None, - assignee=None, mitre_technique_id=None, threat_source=None, entity_type=None, ttp_id=None, provider=None) -> list[dict]: + def list_threats(self, time_start=None, time_end=None, page=None, page_size=None, ordering=None, status=None, ttp_id=None, + title=None, severity=None, entity_type=None, cloud_provider=None) -> list[dict]: """For developing walkthrough purposes, this is a dummy response. For real API calls, see the specific_api_endpoint_call_example method. @@ -117,13 +117,14 @@ def list_threats(self, maxincidents=None, firstfetch=None, severity=None, start_ list[dict]: List of alerts data. """ - params = {'page_size': maxincidents, 'start_time': start_time, 'severity': severity, 'category': category, 'accounts': accounts, 'status': status, 'assignee': assignee, - 'mitre_technique_id': mitre_technique_id, 'threat_source': threat_source, 'entity_type': entity_type, - 'ttp_id': ttp_id, 'provider': provider} + params = {'start_time': time_start, 'end_time': time_end, 'page': page, 'page_size': page_size, 'ordering': ordering, + 'status': status, 'ttp_id': ttp_id, 'title': title, 'severity': severity, 'entity_type': entity_type, + 'provider': cloud_provider} response = self.http_request( method='GET', url_suffix=THREATS_ENDPOINT, params={k: v for k, v in params.items() if v is not None} + ) return response['results'] @@ -148,24 +149,10 @@ def init_client(params: dict) -> GemClient: ''' COMMAND FUNCTIONS ''' -def fetch_threats(client: GemClient, max_results=None, severity=None) -> None: - last_run = demisto.getLastRun() - - day_ago = datetime.now() - timedelta(days=1) - day_ago.time() - if last_run and 'start_time' in last_run: - last_run.get('start_time') - - incidents: list[dict[str, Any]] = [] - - alerts = client.list_threats(maxincidents=max_results, - start_time=dateparser.parse(last_fetch), # type: ignore - severity=severity) - demisto.debug(f'Received {len(alerts)} alerts from server.') - - demisto.incidents(incidents) - demisto.setLastRun( - {'start_time': datetime.now().strftime(DATE_FORMAT)}) +def fetch_threats(client: GemClient, maxincidents=None, firstfetch=None, severity=None, start_time=None, category=None, + accounts=None, status=None, assignee=None, mitre_technique_id=None, threat_source=None, entity_type=None, + ttp_id=None, provider=None) -> None: + pass def test_module(params: dict[str, Any]) -> str: @@ -203,18 +190,21 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: - limit = args.get('limit') + time_start = args.get('time_start') + time_end = args.get('time_end') + page = args.get('page') + page_size = args.get('page_size') + ordering = args.get('ordering') + status = args.get('status') + ttp_id = args.get('ttp_id') + title = args.get('title') severity = args.get('severity') - provider = args.get('provider') - start_time = args.get('start_time') - - if not limit: - raise DemistoException('Limit is a required parameter.') - - if not limit.isdigit(): - raise DemistoException('Limit must be a number.') + entity_type = args.get('entity_type') + cloud_provider = args.get('cloud_provider') - result = client.list_threats(maxincidents=limit, severity=severity, provider=provider, start_time=start_time) + result = client.list_threats(time_start=time_start, time_end=time_end, page=page, page_size=page_size, + ordering=ordering, status=status, ttp_id=ttp_id, title=title, severity=severity, + entity_type=entity_type, cloud_provider=cloud_provider) demisto.debug(f"Got {len(result)} Alerts") return CommandResults( From df3b3f81924778eb700085fdb259200332757889 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 26 Feb 2024 14:23:03 +0000 Subject: [PATCH 14/62] Add gem-get-threat-details --- Packs/Gem/Integrations/Gem/Gem.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 84e2a793d530..b46ab3a0c376 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -104,6 +104,14 @@ def get_resource_details(self, resource_id: str) -> dict: url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=resource_id) ) + def get_threat_details(self, threat_id): + response = self.http_request( + method='GET', + url_suffix=THREAT_ENDPOINT.format(id=threat_id) + ) + + return response + def list_threats(self, time_start=None, time_end=None, page=None, page_size=None, ordering=None, status=None, ttp_id=None, title=None, severity=None, entity_type=None, cloud_provider=None) -> list[dict]: """For developing walkthrough purposes, this is a dummy response. @@ -189,6 +197,17 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu ) +def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResults: + threat_id = args.get('threat_id') + result = client.get_threat_details(threat_id=threat_id) + return CommandResults( + readable_output=tableToMarkdown('Alert', result), + outputs_prefix='Gem.Alert', + outputs_key_field='id', + outputs=result + ) + + def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: time_start = args.get('time_start') time_end = args.get('time_end') @@ -245,6 +264,8 @@ def main() -> None: return_results(get_resource_details(client, args)) elif command == 'gem-list-threats': return_results(list_threats(client, args)) + elif command == 'gem-get-threat-details': + return_results(get_threat_details(client, args)) elif command == 'fetch-incidents': fetch_threats(client) else: From 13a19fe15bac8c84da75f6bf0ee421e138fe2c89 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 26 Feb 2024 14:41:11 +0000 Subject: [PATCH 15/62] Add gem-list-inventory-resources --- Packs/Gem/Integrations/Gem/Gem.py | 46 ++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index b46ab3a0c376..ba85baa4a82b 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -104,7 +104,11 @@ def get_resource_details(self, resource_id: str) -> dict: url_suffix=INVENTORY_ITEM_ENDPOINT.format(id=resource_id) ) - def get_threat_details(self, threat_id): + def get_threat_details(self, threat_id: str): + """ Get threat details + :param threat_id: id of the threat to get + :return: threat details + """ response = self.http_request( method='GET', url_suffix=THREAT_ENDPOINT.format(id=threat_id) @@ -137,6 +141,20 @@ def list_threats(self, time_start=None, time_end=None, page=None, page_size=None return response['results'] + def list_inventory_resources(self, cursor=None, page_size=None, include_deleted=None, region=None, resource_type=None, + search=None, total=None) -> list[dict]: + params = {'cursor': cursor, 'page_size': page_size, 'include_deleted': include_deleted, 'region': region, + 'resource_type': resource_type, 'search': search, 'total': total} + + response = self.http_request( + method='GET', + url_suffix=INVENTORY_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + + ) + + return response['results'] + ''' HELPER FUNCTIONS ''' @@ -199,7 +217,31 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResults: threat_id = args.get('threat_id') + + if not threat_id: + raise DemistoException('Threat ID is a required parameter.') result = client.get_threat_details(threat_id=threat_id) + + return CommandResults( + readable_output=tableToMarkdown('Alert', result), + outputs_prefix='Gem.Alert', + outputs_key_field='id', + outputs=result + ) + + +def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> CommandResults: + cursor = args.get('cursor') + page_size = args.get('page_size') + include_deleted = args.get('include_deleted') + region = args.get('region') + resource_type = args.get('resource_type') + search = args.get('search') + total = args.get('total') + + result = client.list_inventory_resources(cursor=cursor, page_size=page_size, include_deleted=include_deleted, + region=region, resource_type=resource_type, search=search, total=total) + return CommandResults( readable_output=tableToMarkdown('Alert', result), outputs_prefix='Gem.Alert', @@ -266,6 +308,8 @@ def main() -> None: return_results(list_threats(client, args)) elif command == 'gem-get-threat-details': return_results(get_threat_details(client, args)) + elif command == 'gem-list-inventory-resources': + return_results(list_inventory_resources(client, args)) elif command == 'fetch-incidents': fetch_threats(client) else: From d3557cd359aab747081eaa185baa82995f65468e Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 26 Feb 2024 16:36:41 +0000 Subject: [PATCH 16/62] Add gem-update-threat-status --- Packs/Gem/Integrations/Gem/Gem.py | 78 +++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index ba85baa4a82b..d7eb265745ce 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -20,6 +20,9 @@ THREAT_ENDPOINT = '/threats/{id}' INVENTORY_ENDPOINT = '/inventory' INVENTORY_ITEM_ENDPOINT = '/inventory/{id}' +BREAKDOWN_ENDPOINT = '/' + +UPDATE_THREAT_ENDPOINT = '../detection/threats/{id}/update_threat_status_v2' ''' CLIENT CLASS ''' @@ -155,6 +158,30 @@ def list_inventory_resources(self, cursor=None, page_size=None, include_deleted= return response['results'] + def list_ips_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, + end_time=None) -> list[dict]: + + params = {'entity_id': entity_id, 'entity_type': entity_type, 'read_only': read_only, + 'start_time': start_time, 'end_time': end_time} + response = self.http_request( + method='GET', + url_suffix=BREAKDOWN_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + + ) + + return response['results'] + + def update_threat_status(self, threat_id: str, status: Optional[str], verdict: Optional[str], reason: Optional[str] = None): + json_data = {"resolved_metadata": {'verdict': verdict, 'reason': reason}, 'status': status} + response = self.http_request( + method='PATCH', + url_suffix=UPDATE_THREAT_ENDPOINT.format(id=threat_id), + json_data=json_data + ) + + return response + ''' HELPER FUNCTIONS ''' @@ -276,6 +303,47 @@ def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: ) +def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + entity_id = args.get('entity_id') + entity_type = args.get('entity_type') + read_only = args.get('read_only') + start_time = args.get('start_time') + end_time = args.get('end_time') + + if not entity_id: + raise DemistoException('Entity ID is a required parameter.') + + if not entity_type: + raise DemistoException('Entity Type is a required parameter.') + + if not start_time: + raise DemistoException('Start time is a required parameter.') + + if not end_time: + raise DemistoException('End time is a required parameter.') + + result = client.list_ips_by_entity(entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + + return CommandResults( + readable_output=tableToMarkdown('Alerts', result), + outputs_prefix='Gem.Alert', + outputs_key_field='id', + outputs=result + ) + + +def update_threat_status(client: GemClient, args: dict[str, Any]): + threat_id = args.get('threat_id') + status = args.get('status') + verdict = args.get('verdict') + reason = args.get('reason') + + if not threat_id: + raise DemistoException('Threat ID is a required parameter.') + client.update_threat_status(threat_id=threat_id, status=status, verdict=verdict, reason=reason) + + ''' MAIN FUNCTION ''' @@ -302,14 +370,18 @@ def main() -> None: client = init_client(params) - if command == 'gem-get-resource-details': - return_results(get_resource_details(client, args)) - elif command == 'gem-list-threats': + if command == 'gem-list-threats': return_results(list_threats(client, args)) elif command == 'gem-get-threat-details': return_results(get_threat_details(client, args)) elif command == 'gem-list-inventory-resources': return_results(list_inventory_resources(client, args)) + elif command == 'gem-get-resource-details': + return_results(get_resource_details(client, args)) + elif command == 'gem-list-ips-by-entity': + return_results(list_ips_by_entity(client, args)) + elif command == 'gem-update-threat-status': + return_results(update_threat_status(client, args)) elif command == 'fetch-incidents': fetch_threats(client) else: From 00aacc3e8ed12f1c6da3ad392935ca4193d5d03e Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Wed, 28 Feb 2024 11:41:21 +0000 Subject: [PATCH 17/62] Add pagination --- Packs/Gem/Integrations/Gem/Gem.py | 127 +++++++++++++++++++++-------- Packs/Gem/Integrations/Gem/Gem.yml | 35 +++----- 2 files changed, 105 insertions(+), 57 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index d7eb265745ce..b810ef1a6846 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -13,6 +13,7 @@ ''' CONSTANTS ''' DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ' # ISO8601 format with UTC, default in XSOAR +PAGE_SIZE = 5 # ENDPOINTS TOKEN_URL = 'https://login.gem.security/oauth/token' @@ -119,44 +120,99 @@ def get_threat_details(self, threat_id: str): return response - def list_threats(self, time_start=None, time_end=None, page=None, page_size=None, ordering=None, status=None, ttp_id=None, + def list_threats(self, limit, time_start=None, time_end=None, ordering=None, status=None, ttp_id=None, title=None, severity=None, entity_type=None, cloud_provider=None) -> list[dict]: - """For developing walkthrough purposes, this is a dummy response. - For real API calls, see the specific_api_endpoint_call_example method. - - Args: - limit (int): The number of items to generate. - severity (str) : The severity value of the items returned. - - Returns: - list[dict]: List of alerts data. + """ List threats + :param time_start: time of first threat + :param time_end: time of last threat + :param limit: amount of threats + :param ordering: how to order threats + :param status: filter of threat status + :param ttp_id: filter of threat ttp + :param title: filter of threat title + :param severity: filter of threat severity + :param entity_type: filter of threat entity type + :param cloud_provider: filter of threat cloud provider + + :return: threat list """ - params = {'start_time': time_start, 'end_time': time_end, 'page': page, 'page_size': page_size, 'ordering': ordering, - 'status': status, 'ttp_id': ttp_id, 'title': title, 'severity': severity, 'entity_type': entity_type, - 'provider': cloud_provider} + results = [] + results_fetched = 0 + for p in range(1, int(limit / PAGE_SIZE) + 2): + if limit == results_fetched: + break + if limit - results_fetched < PAGE_SIZE: + demisto.debug(f"Fetching page #{p} page_size {limit - results_fetched}") + params = {'start_time': time_start, 'end_time': time_end, 'page': p, 'page_size': limit - results_fetched, + 'ordering': ordering, + 'status': status, 'ttp_id': ttp_id, 'title': title, 'severity': severity, 'entity_type': entity_type, + 'provider': cloud_provider} + response = self.http_request( + method='GET', + url_suffix=THREATS_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + + ) + results_fetched = limit + + else: + demisto.debug(f"Fetching page #{p} page_size {PAGE_SIZE}") + params = {'start_time': time_start, 'end_time': time_end, 'page': p, 'page_size': PAGE_SIZE, 'ordering': ordering, + 'status': status, 'ttp_id': ttp_id, 'title': title, 'severity': severity, 'entity_type': entity_type, + 'provider': cloud_provider} + response = self.http_request( + method='GET', + url_suffix=THREATS_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + + ) + if len(response['results']) < PAGE_SIZE: + demisto.debug(f"Fetched {len(response['results'])}") + results_fetched += len(response['results']) + results.extend(response['results']) + break + + results_fetched += PAGE_SIZE + + results.extend(response['results']) + + demisto.debug(f"Fetched {len(results)} threats") + + return results + + def list_inventory_resources(self, limit, include_deleted=None, region=None, resource_type=None, + search=None) -> list[dict]: + results = [] + results_fetched = 0 + params = {'page_size': limit if limit < PAGE_SIZE else PAGE_SIZE, 'include_deleted': include_deleted, 'region': region, + 'resource_type': resource_type, 'search': search} response = self.http_request( method='GET', - url_suffix=THREATS_ENDPOINT, + url_suffix=INVENTORY_ENDPOINT, params={k: v for k, v in params.items() if v is not None} ) + results_fetched += len(response['results']) + results.extend(response['results']) - return response['results'] + while response['next'] != "" and results_fetched < limit: + page_size = limit - results_fetched if limit - results_fetched < PAGE_SIZE else PAGE_SIZE + demisto.debug(f"Fetching page #{response['next']} page_size {page_size}") + params = {'cursor': response['next'], 'page_size': page_size, 'include_deleted': include_deleted, 'region': region, + 'resource_type': resource_type, 'search': search} + response = self.http_request( + method='GET', + url_suffix=INVENTORY_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} - def list_inventory_resources(self, cursor=None, page_size=None, include_deleted=None, region=None, resource_type=None, - search=None, total=None) -> list[dict]: - params = {'cursor': cursor, 'page_size': page_size, 'include_deleted': include_deleted, 'region': region, - 'resource_type': resource_type, 'search': search, 'total': total} + ) + results_fetched += len(response['results']) + results.extend(response['results']) - response = self.http_request( - method='GET', - url_suffix=INVENTORY_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + demisto.debug(f"Fetched {len(results)} inventory resources") - ) - - return response['results'] + return results def list_ips_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> list[dict]: @@ -258,16 +314,14 @@ def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResult def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> CommandResults: - cursor = args.get('cursor') - page_size = args.get('page_size') + limit = arg_to_number(args.get("limit")) or PAGE_SIZE include_deleted = args.get('include_deleted') region = args.get('region') resource_type = args.get('resource_type') search = args.get('search') - total = args.get('total') - result = client.list_inventory_resources(cursor=cursor, page_size=page_size, include_deleted=include_deleted, - region=region, resource_type=resource_type, search=search, total=total) + result = client.list_inventory_resources(limit, include_deleted=include_deleted, + region=region, resource_type=resource_type, search=search) return CommandResults( readable_output=tableToMarkdown('Alert', result), @@ -280,8 +334,7 @@ def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> Command def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: time_start = args.get('time_start') time_end = args.get('time_end') - page = args.get('page') - page_size = args.get('page_size') + limit = arg_to_number(args.get("limit")) or PAGE_SIZE ordering = args.get('ordering') status = args.get('status') ttp_id = args.get('ttp_id') @@ -290,7 +343,13 @@ def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: entity_type = args.get('entity_type') cloud_provider = args.get('cloud_provider') - result = client.list_threats(time_start=time_start, time_end=time_end, page=page, page_size=page_size, + if not time_start: + raise DemistoException('Start time is a required parameter.') + + if not time_end: + raise DemistoException('End time is a required parameter.') + + result = client.list_threats(time_start=time_start, time_end=time_end, limit=limit, ordering=ordering, status=status, ttp_id=ttp_id, title=title, severity=severity, entity_type=entity_type, cloud_provider=cloud_provider) diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 12e04884b126..e6cf09541a2c 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -38,14 +38,16 @@ script: - name: gem-list-threats description: List all threats detected in Gem arguments: - - name: page - description: The page number to return. + - name: limit + description: The number of alert to fetch. + required: false + defaultValue: "50" + - name: time_start + description: "The start time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true - defaultValue: "1" - - name: page_size - description: The number of items to return per page. + - name: time_end + description: "The end time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true - defaultValue: "10" - name: ordering description: The ordering of the items. required: false @@ -100,12 +102,7 @@ script: - name: entity_type description: The entity type of the threats to return. required: false - - name: time_start - description: "The start time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" - required: true - - name: time_end - description: "The end time of the threats to return in ISO format. Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" - required: true + - name: gem-get-threat-details description: Get details about a specific threat @@ -117,13 +114,10 @@ script: - name: gem-list-inventory-resources description: List inventory resources in Gem arguments: - - name: cursor - description: The cursor to use for pagination. + - name: limit + description: The number of items to return. required: false - - name: page_size - description: The number of items to return per page. - required: true - defaultValue: "10" + defaultValue: "50" - name: include_deleted description: Include deleted resources in the response. required: false @@ -138,11 +132,6 @@ script: - name: search description: The search query to use. required: false - - name: total - description: Whether to include the total count of resources in the response. - required: false - defaultValue: false - type: Boolean - name: gem-get-resource-details description: Get details about a specific resource From 4a4933430789979c8de35414e014f84d6a9ba0ba Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Wed, 28 Feb 2024 13:02:05 +0000 Subject: [PATCH 18/62] Add breakdown by ip and service --- Packs/Gem/Integrations/Gem/Gem.py | 64 +++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index b810ef1a6846..1e376847e532 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -21,7 +21,7 @@ THREAT_ENDPOINT = '/threats/{id}' INVENTORY_ENDPOINT = '/inventory' INVENTORY_ITEM_ENDPOINT = '/inventory/{id}' -BREAKDOWN_ENDPOINT = '/' +BREAKDOWN_ENDPOINT = '../triage/investigation/timeline/breakdown' UPDATE_THREAT_ENDPOINT = '../detection/threats/{id}/update_threat_status_v2' @@ -214,19 +214,26 @@ def list_inventory_resources(self, limit, include_deleted=None, region=None, res return results - def list_ips_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, - end_time=None) -> list[dict]: - - params = {'entity_id': entity_id, 'entity_type': entity_type, 'read_only': read_only, + def _breakdown(self, breakdown_by, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + params = {'breakdown_by': breakdown_by, 'entity_id': entity_id, 'entity_type': entity_type, 'read_only': read_only, 'start_time': start_time, 'end_time': end_time} response = self.http_request( method='GET', url_suffix=BREAKDOWN_ENDPOINT, params={k: v for k, v in params.items() if v is not None} - ) - return response['results'] + return response['table'] + + def list_ips_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, + end_time=None) -> dict: + return self._breakdown(breakdown_by='source_ip', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + + def list_services_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, + end_time=None) -> dict: + return self._breakdown(breakdown_by='service', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) def update_threat_status(self, threat_id: str, status: Optional[str], verdict: Optional[str], reason: Optional[str] = None): json_data = {"resolved_metadata": {'verdict': verdict, 'reason': reason}, 'status': status} @@ -362,7 +369,7 @@ def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: ) -def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: +def _breakdown_validate_params(client: GemClient, args: dict[str, Any]) -> tuple[Any, Any, Any | None, Any, Any]: entity_id = args.get('entity_id') entity_type = args.get('entity_type') read_only = args.get('read_only') @@ -381,14 +388,47 @@ def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResult if not end_time: raise DemistoException('End time is a required parameter.') + return entity_id, entity_type, read_only, start_time, end_time + + +def _parse_breakdown_result(result: dict) -> tuple[list[str], list[list[str]], list[dict]]: + new_t = [] + + for r in result['rows']: + new_t.append(r['row']) + + return result['headers'], new_t, result['rows'] + + +def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + result = client.list_ips_by_entity(entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) + headers, rows, outputs = _parse_breakdown_result(result) return CommandResults( - readable_output=tableToMarkdown('Alerts', result), + readable_output=tableToMarkdown('IPs', rows, headers=headers), outputs_prefix='Gem.Alert', - outputs_key_field='id', - outputs=result + outputs_key_field='SOURCEIPADDRESS', + outputs=outputs + ) + + +def list_services_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + + result = client.list_services_by_entity(entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + headers, rows, outputs = _parse_breakdown_result(result) + + return CommandResults( + readable_output=tableToMarkdown('Services', rows, headers=headers), + outputs_prefix='Gem.Alert', + outputs_key_field='SERVICE', + outputs=outputs ) @@ -439,6 +479,8 @@ def main() -> None: return_results(get_resource_details(client, args)) elif command == 'gem-list-ips-by-entity': return_results(list_ips_by_entity(client, args)) + elif command == 'gem-list-services-by-entity': + return_results(list_services_by_entity(client, args)) elif command == 'gem-update-threat-status': return_results(update_threat_status(client, args)) elif command == 'fetch-incidents': From fb49e20b4d8c8da275ccb8c96869543db32971f1 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Wed, 28 Feb 2024 16:34:11 +0000 Subject: [PATCH 19/62] Add more commands and outputs --- Packs/Gem/Integrations/Gem/Gem.py | 144 ++++++++++++++++++++++++++--- Packs/Gem/Integrations/Gem/Gem.yml | 132 +++++++++++++++++++++++--- 2 files changed, 251 insertions(+), 25 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 1e376847e532..d3a3f346e12a 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -14,6 +14,7 @@ DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ' # ISO8601 format with UTC, default in XSOAR PAGE_SIZE = 5 +OK_CODES = (200, 201, 202) # ENDPOINTS TOKEN_URL = 'https://login.gem.security/oauth/token' @@ -22,6 +23,7 @@ INVENTORY_ENDPOINT = '/inventory' INVENTORY_ITEM_ENDPOINT = '/inventory/{id}' BREAKDOWN_ENDPOINT = '../triage/investigation/timeline/breakdown' +EVENTS_ENDPOINT = '../triage/investigation/entity/events' UPDATE_THREAT_ENDPOINT = '../detection/threats/{id}/update_threat_status_v2' @@ -31,7 +33,7 @@ class GemClient(BaseClient): def __init__(self, base_url: str, verify: bool, proxy: bool, client_id: str, client_secret: str): - super().__init__(base_url=base_url, verify=verify, proxy=proxy) + super().__init__(base_url=base_url, verify=verify, proxy=proxy, ok_codes=OK_CODES) self._client_id = client_id self._client_secret = client_secret try: @@ -61,14 +63,19 @@ def http_request(self, method: str, url_suffix='', full_url=None, headers=None, if auth: headers = headers or {} headers['Authorization'] = f'Bearer {self._auth_token}' - return super()._http_request( - method=method, - url_suffix=url_suffix, - full_url=full_url, - headers=headers, - json_data=json_data, - params=params - ) + try: + return super()._http_request( + method=method, + url_suffix=url_suffix, + full_url=full_url, + headers=headers, + json_data=json_data, + params=params, + raise_on_status=True + ) + except DemistoException as e: + demisto.error(f"Failed to execute {method} request to {url_suffix}. Error: {str(e)}") + raise Exception(f"Failed to execute {method} request to {url_suffix}. Error: {str(e)}") def _generate_token(self) -> str: """Generate an access token using the client id and secret @@ -235,6 +242,29 @@ def list_services_by_entity(self, entity_id=None, entity_type=None, read_only=No return self._breakdown(breakdown_by='service', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) + def list_events_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, + end_time=None) -> dict: + return self._breakdown(breakdown_by='entity_event_out', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + + def list_accessing_entities(self, entity_id=None, entity_type=None, read_only=None, start_time=None, + end_time=None) -> dict: + return self._breakdown(breakdown_by='user_in', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + + def list_using_entities(self, entity_id=None, entity_type=None, read_only=None, start_time=None, + end_time=None) -> dict: + return self._breakdown(breakdown_by='using_entities', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + + def list_events_on_entity(self, entity_id=None, entity_type=None, start_time=None, end_time=None, read_only=None) -> dict: + return self._breakdown(breakdown_by='entity_event_in', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + + def list_accessing_ips(self, entity_id=None, entity_type=None, start_time=None, end_time=None, read_only=None) -> dict: + return self._breakdown(breakdown_by='ip_access', entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + def update_threat_status(self, threat_id: str, status: Optional[str], verdict: Optional[str], reason: Optional[str] = None): json_data = {"resolved_metadata": {'verdict': verdict, 'reason': reason}, 'status': status} response = self.http_request( @@ -300,7 +330,7 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu return CommandResults( readable_output=tableToMarkdown('Inventory Item', result), outputs_prefix='Gem.InventoryItem', - outputs_key_field='id', + outputs_key_field='resource_id', outputs=result ) @@ -331,8 +361,8 @@ def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> Command region=region, resource_type=resource_type, search=search) return CommandResults( - readable_output=tableToMarkdown('Alert', result), - outputs_prefix='Gem.Alert', + readable_output=tableToMarkdown('Inventory Items', result), + outputs_prefix='Gem.InventoryItems', outputs_key_field='id', outputs=result ) @@ -432,6 +462,86 @@ def list_services_by_entity(client: GemClient, args: dict[str, Any]) -> CommandR ) +def list_events_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + + result = client.list_events_by_entity(entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + headers, rows, outputs = _parse_breakdown_result(result) + + return CommandResults( + readable_output=tableToMarkdown('Events by Entity', rows, headers=headers), + outputs_prefix='Gem.Alert', + outputs_key_field='EVENTNAME', + outputs=outputs + ) + + +def list_accessing_entities(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + + result = client.list_accessing_entities(entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + headers, rows, outputs = _parse_breakdown_result(result) + + return CommandResults( + readable_output=tableToMarkdown('Accessing Entities', rows, headers=headers), + outputs_prefix='Gem.Alert', + outputs_key_field='', + outputs=outputs + ) + + +def list_using_entities(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + + result = client.list_using_entities(entity_id=entity_id, entity_type=entity_type, read_only=read_only, + start_time=start_time, end_time=end_time) + headers, rows, outputs = _parse_breakdown_result(result) + + return CommandResults( + readable_output=tableToMarkdown('Using Entities', rows, headers=headers), + outputs_prefix='Gem.Alert', + outputs_key_field='ENTITY_ID', + outputs=outputs + ) + + +def list_events_on_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + + result = client.list_events_on_entity(entity_id=entity_id, entity_type=entity_type, + start_time=start_time, end_time=end_time, read_only=read_only) + headers, rows, outputs = _parse_breakdown_result(result) + + return CommandResults( + readable_output=tableToMarkdown('Events on Entity', rows, headers=headers), + outputs_prefix='Gem.Alert', + outputs_key_field='EVENTNAME', + outputs=outputs + ) + + +def list_accessing_ips(client: GemClient, args: dict[str, Any]) -> CommandResults: + + entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) + + result = client.list_accessing_ips(entity_id=entity_id, entity_type=entity_type, + start_time=start_time, end_time=end_time, read_only=read_only) + headers, rows, outputs = _parse_breakdown_result(result) + + return CommandResults( + readable_output=tableToMarkdown('IPs Accessing Entity', rows, headers=headers), + outputs_prefix='Gem.Alert', + outputs_key_field='EVENTNAME', + outputs=outputs + ) + + def update_threat_status(client: GemClient, args: dict[str, Any]): threat_id = args.get('threat_id') status = args.get('status') @@ -481,6 +591,16 @@ def main() -> None: return_results(list_ips_by_entity(client, args)) elif command == 'gem-list-services-by-entity': return_results(list_services_by_entity(client, args)) + elif command == 'gem-list-events-by-entity': + return_results(list_events_by_entity(client, args)) + elif command == 'gem-list-accessing-entities': + return_results(list_accessing_entities(client, args)) + elif command == 'gem-list-using-entities': + return_results(list_using_entities(client, args)) + elif command == 'gem-list-events-on-entity': + return_results(list_events_on_entity(client, args)) + elif command == 'gem-list-accessing-ips': + return_results(list_accessing_ips(client, args)) elif command == 'gem-update-threat-status': return_results(update_threat_status(client, args)) elif command == 'fetch-incidents': diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index e6cf09541a2c..5f7851d39c97 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -103,7 +103,6 @@ script: description: The entity type of the threats to return. required: false - - name: gem-get-threat-details description: Get details about a specific threat arguments: @@ -132,6 +131,61 @@ script: - name: search description: The search query to use. required: false + outputs: + - contextPath: Gem.InventoryItems.account.account_status + description: "" + type: String + - contextPath: Gem.InventoryItems.account.cloud_provider + description: "" + type: String + - contextPath: Gem.InventoryItems.account.display_name + description: "" + type: String + - contextPath: Gem.InventoryItems.account.hierarchy_path + description: "" + type: Unknown + - contextPath: Gem.InventoryItems.account.id + description: "" + type: Number + - contextPath: Gem.InventoryItems.account.identifier + description: "" + type: String + - contextPath: Gem.InventoryItems.account.organization_name + description: "" + type: String + - contextPath: Gem.InventoryItems.account.tenant + description: "" + type: String + - contextPath: Gem.InventoryItems.categories + description: "" + type: String + - contextPath: Gem.InventoryItems.created_at + description: "" + type: Date + - contextPath: Gem.InventoryItems.deleted + description: "" + type: Boolean + - contextPath: Gem.InventoryItems.external_url + description: "" + type: String + - contextPath: Gem.InventoryItems.identifiers.name + description: "" + type: String + - contextPath: Gem.InventoryItems.identifiers.value + description: "" + type: String + - contextPath: Gem.InventoryItems.region + description: "" + type: String + - contextPath: Gem.InventoryItems.resource_id + description: "" + type: String + - contextPath: Gem.InventoryItems.resource_type + description: "" + type: String + - contextPath: Gem.InventoryItems.tags + description: "" + type: Unknown - name: gem-get-resource-details description: Get details about a specific resource @@ -139,6 +193,58 @@ script: - name: resource_id description: The ID of the resource to get details for. required: true + outputs: + - contextPath: Gem.InventoryItem.account.account_status + description: "" + type: String + - contextPath: Gem.InventoryItem.account.cloud_provider + description: "" + type: String + - contextPath: Gem.InventoryItem.account.display_name + description: "" + type: String + - contextPath: Gem.InventoryItem.account.hierarchy_path + description: "" + type: Unknown + - contextPath: Gem.InventoryItem.account.id + description: "" + type: Number + - contextPath: Gem.InventoryItem.account.identifier + description: "" + type: String + - contextPath: Gem.InventoryItem.account.organization_name + description: "" + type: String + - contextPath: Gem.InventoryItem.account.tenant + description: "" + type: String + - contextPath: Gem.InventoryItem.categories + description: "" + type: String + - contextPath: Gem.InventoryItem.created_at + description: "" + type: Date + - contextPath: Gem.InventoryItem.deleted + description: "" + type: Boolean + - contextPath: Gem.InventoryItem.external_url + description: "" + type: String + - contextPath: Gem.InventoryItem.identifiers.name + description: "" + type: String + - contextPath: Gem.InventoryItem.identifiers.value + description: "" + type: String + - contextPath: Gem.InventoryItem.region + description: "" + type: String + - contextPath: Gem.InventoryItem.resource_id + description: "" + type: String + - contextPath: Gem.InventoryItem.resource_type + description: "" + type: String - name: gem-list-ips-by-entity description: List all source IP addresses used by an entity in a specific timeframe. The results are sorted by activity volume. @@ -206,11 +312,11 @@ script: - name: gem-list-accessing-entities description: List all entities that accessed an entity in a specific timeframe. The results are sorted by activity volume. arguments: - - name: resource_id - description: "Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" required: true - - name: resource_type - description: "Type of the resource. See documentation for the full options list." + - name: entity_type + description: "Type of the entity. See documentation for the full options list." required: true - name: read_only description: "Show read-only events." @@ -227,11 +333,11 @@ script: - name: gem-list-using-entities description: List all entities that used an entity in a specific timeframe. The results are sorted by activity volume. arguments: - - name: resource_id - description: "Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" required: true - - name: resource_type - description: "Type of the resource. See documentation for the full options list." + - name: entity_type + description: "Type of the entity. See documentation for the full options list." required: true - name: read_only description: "Show read-only events." @@ -268,11 +374,11 @@ script: - name: gem-list-accessing-ips description: List all source IP addresses that accessed an entity in a specific timeframe. The results are sorted by activity volume. arguments: - - name: resource_id - description: "Gem ID of the resource. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" + - name: entity_id + description: "Gem ID of the entity. This will usually be the ARN or CSP ID. This property is also available for every resource in the Inventory screen. Example: arn:aws:ec2:us-east-1:112233445566:instance/i-1234567890abcdefg" required: true - - name: resource_type - description: "Type of the resource. See documentation for the full options list." + - name: entity_type + description: "Type of the entity. See documentation for the full options list." required: true - name: read_only description: "Show read-only events." From 58f2c3b7f2c039ea9c8799c4406d91c673466aae Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 29 Feb 2024 12:49:11 +0000 Subject: [PATCH 20/62] Finish outputs --- Packs/Gem/Integrations/Gem/Gem.py | 28 +- Packs/Gem/Integrations/Gem/Gem.yml | 444 ++++++++++++++++++++++++++++- 2 files changed, 456 insertions(+), 16 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index d3a3f346e12a..3123ae7c0da2 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -343,8 +343,8 @@ def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResult result = client.get_threat_details(threat_id=threat_id) return CommandResults( - readable_output=tableToMarkdown('Alert', result), - outputs_prefix='Gem.Alert', + readable_output=tableToMarkdown('Threat', result), + outputs_prefix='Gem.Threat', outputs_key_field='id', outputs=result ) @@ -390,10 +390,10 @@ def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: ordering=ordering, status=status, ttp_id=ttp_id, title=title, severity=severity, entity_type=entity_type, cloud_provider=cloud_provider) - demisto.debug(f"Got {len(result)} Alerts") + demisto.debug(f"Got {len(result)} Threats") return CommandResults( - readable_output=tableToMarkdown('Alerts', result), - outputs_prefix='Gem.Alert', + readable_output=tableToMarkdown('Threats', result), + outputs_prefix='Gem.ThreatsList', outputs_key_field='id', outputs=result ) @@ -427,7 +427,7 @@ def _parse_breakdown_result(result: dict) -> tuple[list[str], list[list[str]], l for r in result['rows']: new_t.append(r['row']) - return result['headers'], new_t, result['rows'] + return result['headers'], new_t, new_t def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: @@ -440,7 +440,7 @@ def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResult return CommandResults( readable_output=tableToMarkdown('IPs', rows, headers=headers), - outputs_prefix='Gem.Alert', + outputs_prefix='Gem.IP', outputs_key_field='SOURCEIPADDRESS', outputs=outputs ) @@ -456,7 +456,7 @@ def list_services_by_entity(client: GemClient, args: dict[str, Any]) -> CommandR return CommandResults( readable_output=tableToMarkdown('Services', rows, headers=headers), - outputs_prefix='Gem.Alert', + outputs_prefix='Gem.Entity.By.Services', outputs_key_field='SERVICE', outputs=outputs ) @@ -472,7 +472,7 @@ def list_events_by_entity(client: GemClient, args: dict[str, Any]) -> CommandRes return CommandResults( readable_output=tableToMarkdown('Events by Entity', rows, headers=headers), - outputs_prefix='Gem.Alert', + outputs_prefix='Gem.Entity.By.Events', outputs_key_field='EVENTNAME', outputs=outputs ) @@ -488,7 +488,7 @@ def list_accessing_entities(client: GemClient, args: dict[str, Any]) -> CommandR return CommandResults( readable_output=tableToMarkdown('Accessing Entities', rows, headers=headers), - outputs_prefix='Gem.Alert', + outputs_prefix='Gem.Entity.Accessing', outputs_key_field='', outputs=outputs ) @@ -504,7 +504,7 @@ def list_using_entities(client: GemClient, args: dict[str, Any]) -> CommandResul return CommandResults( readable_output=tableToMarkdown('Using Entities', rows, headers=headers), - outputs_prefix='Gem.Alert', + outputs_prefix='Gem.Entity.Using', outputs_key_field='ENTITY_ID', outputs=outputs ) @@ -520,7 +520,7 @@ def list_events_on_entity(client: GemClient, args: dict[str, Any]) -> CommandRes return CommandResults( readable_output=tableToMarkdown('Events on Entity', rows, headers=headers), - outputs_prefix='Gem.Alert', + outputs_prefix='Gem.Entity.On.Events', outputs_key_field='EVENTNAME', outputs=outputs ) @@ -536,8 +536,8 @@ def list_accessing_ips(client: GemClient, args: dict[str, Any]) -> CommandResult return CommandResults( readable_output=tableToMarkdown('IPs Accessing Entity', rows, headers=headers), - outputs_prefix='Gem.Alert', - outputs_key_field='EVENTNAME', + outputs_prefix='Gem.Entity.Accessing.IPs', + outputs_key_field='AS_NAME', outputs=outputs ) diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 5f7851d39c97..1b358bce1031 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -102,6 +102,172 @@ script: - name: entity_type description: The entity type of the threats to return. required: false + outputs: + - contextPath: Gem.ThreatsList.accounts.account_status + description: "" + type: String + - contextPath: Gem.ThreatsList.accounts.cloud_provider + description: "" + type: String + - contextPath: Gem.ThreatsList.accounts.display_name + description: "" + type: String + - contextPath: Gem.ThreatsList.accounts.hierarchy_path.id + description: "" + type: String + - contextPath: Gem.ThreatsList.accounts.hierarchy_path.name + description: "" + type: String + - contextPath: Gem.ThreatsList.accounts.id + description: "" + type: Number + - contextPath: Gem.ThreatsList.accounts.identifier + description: "" + type: String + - contextPath: Gem.ThreatsList.accounts.organization_name + description: "" + type: String + - contextPath: Gem.ThreatsList.alert_source + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.accounts.account_status + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.accounts.cloud_provider + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.accounts.display_name + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.accounts.id + description: "" + type: Number + - contextPath: Gem.ThreatsList.alerts.accounts.identifier + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.accounts.organization_name + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.alert_source + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.datetime + description: "" + type: Date + - contextPath: Gem.ThreatsList.alerts.description + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.entities.activity_by_provider + description: "" + type: Unknown + - contextPath: Gem.ThreatsList.alerts.entities.cloud_provider + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.entities.id + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.entities.is_main_entity + description: "" + type: Boolean + - contextPath: Gem.ThreatsList.alerts.entities.is_secondary_entity + description: "" + type: Boolean + - contextPath: Gem.ThreatsList.alerts.entities.resource_id + description: "" + type: Unknown + - contextPath: Gem.ThreatsList.alerts.entities.type + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.id + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.main_alert_id + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.mitre_techniques.id + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.mitre_techniques.technique_name + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.organization_id + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.severity + description: "" + type: Number + - contextPath: Gem.ThreatsList.alerts.severity_text + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.status + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.title + description: "" + type: String + - contextPath: Gem.ThreatsList.alerts.ttp_id + description: "" + type: String + - contextPath: Gem.ThreatsList.assignees + description: "" + type: Unknown + - contextPath: Gem.ThreatsList.category + description: "" + type: String + - contextPath: Gem.ThreatsList.datetime + description: "" + type: Date + - contextPath: Gem.ThreatsList.description + description: "" + type: String + - contextPath: Gem.ThreatsList.entities.activity_by_provider + description: "" + type: Unknown + - contextPath: Gem.ThreatsList.entities.cloud_provider + description: "" + type: String + - contextPath: Gem.ThreatsList.entities.id + description: "" + type: String + - contextPath: Gem.ThreatsList.entities.is_main_entity + description: "" + type: Boolean + - contextPath: Gem.ThreatsList.entities.is_secondary_entity + description: "" + type: Boolean + - contextPath: Gem.ThreatsList.entities.resource_id + description: "" + type: Unknown + - contextPath: Gem.ThreatsList.entities.type + description: "" + type: String + - contextPath: Gem.ThreatsList.id + description: "" + type: String + - contextPath: Gem.ThreatsList.main_alert_id + description: "" + type: String + - contextPath: Gem.ThreatsList.mitre_techniques.id + description: "" + type: String + - contextPath: Gem.ThreatsList.mitre_techniques.technique_name + description: "" + type: String + - contextPath: Gem.ThreatsList.organization_id + description: "" + type: String + - contextPath: Gem.ThreatsList.severity_text + description: "" + type: String + - contextPath: Gem.ThreatsList.status + description: "" + type: String + - contextPath: Gem.ThreatsList.title + description: "" + type: String + - contextPath: Gem.ThreatsList.ttp_id + description: "" + type: String - name: gem-get-threat-details description: Get details about a specific threat @@ -109,6 +275,172 @@ script: - name: threat_id description: The ID of the threat to get details for. required: true + outputs: + - contextPath: Gem.Threat.accounts.account_status + description: "" + type: String + - contextPath: Gem.Threat.accounts.cloud_provider + description: "" + type: String + - contextPath: Gem.Threat.accounts.display_name + description: "" + type: String + - contextPath: Gem.Threat.accounts.hierarchy_path.id + description: "" + type: String + - contextPath: Gem.Threat.accounts.hierarchy_path.name + description: "" + type: String + - contextPath: Gem.Threat.accounts.id + description: "" + type: Number + - contextPath: Gem.Threat.accounts.identifier + description: "" + type: String + - contextPath: Gem.Threat.accounts.organization_name + description: "" + type: String + - contextPath: Gem.Threat.alert_source + description: "" + type: String + - contextPath: Gem.Threat.alerts.accounts.account_status + description: "" + type: String + - contextPath: Gem.Threat.alerts.accounts.cloud_provider + description: "" + type: String + - contextPath: Gem.Threat.alerts.accounts.display_name + description: "" + type: String + - contextPath: Gem.Threat.alerts.accounts.id + description: "" + type: Number + - contextPath: Gem.Threat.alerts.accounts.identifier + description: "" + type: String + - contextPath: Gem.Threat.alerts.accounts.organization_name + description: "" + type: String + - contextPath: Gem.Threat.alerts.alert_source + description: "" + type: String + - contextPath: Gem.Threat.alerts.datetime + description: "" + type: Date + - contextPath: Gem.Threat.alerts.description + description: "" + type: String + - contextPath: Gem.Threat.alerts.entities.activity_by_provider + description: "" + type: Unknown + - contextPath: Gem.Threat.alerts.entities.cloud_provider + description: "" + type: String + - contextPath: Gem.Threat.alerts.entities.id + description: "" + type: String + - contextPath: Gem.Threat.alerts.entities.is_main_entity + description: "" + type: Boolean + - contextPath: Gem.Threat.alerts.entities.is_secondary_entity + description: "" + type: Boolean + - contextPath: Gem.Threat.alerts.entities.resource_id + description: "" + type: Unknown + - contextPath: Gem.Threat.alerts.entities.type + description: "" + type: String + - contextPath: Gem.Threat.alerts.id + description: "" + type: String + - contextPath: Gem.Threat.alerts.main_alert_id + description: "" + type: String + - contextPath: Gem.Threat.alerts.mitre_techniques.id + description: "" + type: String + - contextPath: Gem.Threat.alerts.mitre_techniques.technique_name + description: "" + type: String + - contextPath: Gem.Threat.alerts.organization_id + description: "" + type: String + - contextPath: Gem.Threat.alerts.severity + description: "" + type: Number + - contextPath: Gem.Threat.alerts.severity_text + description: "" + type: String + - contextPath: Gem.Threat.alerts.status + description: "" + type: String + - contextPath: Gem.Threat.alerts.title + description: "" + type: String + - contextPath: Gem.Threat.alerts.ttp_id + description: "" + type: String + - contextPath: Gem.Threat.assignees + description: "" + type: Unknown + - contextPath: Gem.Threat.category + description: "" + type: String + - contextPath: Gem.Threat.datetime + description: "" + type: Date + - contextPath: Gem.Threat.description + description: "" + type: String + - contextPath: Gem.Threat.entities.activity_by_provider + description: "" + type: Unknown + - contextPath: Gem.Threat.entities.cloud_provider + description: "" + type: String + - contextPath: Gem.Threat.entities.id + description: "" + type: String + - contextPath: Gem.Threat.entities.is_main_entity + description: "" + type: Boolean + - contextPath: Gem.Threat.entities.is_secondary_entity + description: "" + type: Boolean + - contextPath: Gem.Threat.entities.resource_id + description: "" + type: Unknown + - contextPath: Gem.Threat.entities.type + description: "" + type: String + - contextPath: Gem.Threat.id + description: "" + type: String + - contextPath: Gem.Threat.main_alert_id + description: "" + type: String + - contextPath: Gem.Threat.mitre_techniques.id + description: "" + type: String + - contextPath: Gem.Threat.mitre_techniques.technique_name + description: "" + type: String + - contextPath: Gem.Threat.organization_id + description: "" + type: String + - contextPath: Gem.Threat.severity_text + description: "" + type: String + - contextPath: Gem.Threat.status + description: "" + type: String + - contextPath: Gem.Threat.title + description: "" + type: String + - contextPath: Gem.Threat.ttp_id + description: "" + type: String - name: gem-list-inventory-resources description: List inventory resources in Gem @@ -266,6 +598,43 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true + outputs: + - contextPath: Gem.IP.AS_NAME + description: "" + type: String + - contextPath: Gem.IP.AS_NUMBER + description: "" + type: String + - contextPath: Gem.IP.CITY + description: "" + type: String + - contextPath: Gem.IP.COUNTRY_CODE + description: "" + type: String + - contextPath: Gem.IP.COUNTRY_NAME + description: "" + type: String + - contextPath: Gem.IP.COUNT_SOURCEIP + description: "" + type: String + - contextPath: Gem.IP.IP_TYPE + description: "" + type: String + - contextPath: Gem.IP.IS_PRIVATE + description: "" + type: String + - contextPath: Gem.IP.LATITUDE + description: "" + type: String + - contextPath: Gem.IP.LONGITUDE + description: "" + type: String + - contextPath: Gem.IP.PROVIDER + description: "" + type: String + - contextPath: Gem.IP.SOURCEIPADDRESS + description: "" + type: String - name: gem-list-services-by-entity description: List all services accessed by an entity in a specific timeframe. The results are sorted by activity volume. @@ -287,7 +656,13 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true - + outputs: + - contextPath: Gem.Entity.By.Services.COUNT_SERVICE + description: "" + type: String + - contextPath: Gem.Entity.By.Services.SERVICE + description: "" + type: String - name: gem-list-events-by-entity description: List all events performed by an entity in a specific timeframe. The results are sorted by activity volume. arguments: @@ -308,7 +683,13 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true - + outputs: + - contextPath: Gem.Entity.By.Events.EVENTNAME + description: "" + type: String + - contextPath: Gem.Entity.By.Events.EVENTNAME_COUNT + description: "" + type: String - name: gem-list-accessing-entities description: List all entities that accessed an entity in a specific timeframe. The results are sorted by activity volume. arguments: @@ -329,6 +710,13 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true + outputs: + - contextPath: Gem.Entity.Accessing.USER_COUNT + description: "" + type: String + - contextPath: Gem.Entity.Accessing.USER_ID + description: "" + type: String - name: gem-list-using-entities description: List all entities that used an entity in a specific timeframe. The results are sorted by activity volume. @@ -350,6 +738,13 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true + outputs: + - contextPath: Gem.Entity.Accessing.USER_COUNT + description: "" + type: String + - contextPath: Gem.Entity.Accessing.USER_ID + description: "" + type: String - name: gem-list-events-on-entity description: List all events performed on an entity in a specific timeframe. The results are sorted by activity volume. @@ -371,6 +766,14 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true + outputs: + - contextPath: Gem.Entity.On.Events.EVENTNAME + description: "" + type: String + - contextPath: Gem.Entity.On.Events.EVENTNAME_COUNT + description: "" + type: String + - name: gem-list-accessing-ips description: List all source IP addresses that accessed an entity in a specific timeframe. The results are sorted by activity volume. arguments: @@ -391,6 +794,43 @@ script: - name: end_time description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true + outputs: + - contextPath: Gem.Entity.Accessing.IPs.AS_NAME + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.AS_NUMBER + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.CITY + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.COUNTRY_CODE + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.COUNTRY_NAME + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.COUNT_SOURCEIP + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.IP_TYPE + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.IS_PRIVATE + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.LATITUDE + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.LONGITUDE + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.PROVIDER + description: "" + type: String + - contextPath: Gem.Entity.Accessing.IPs.SOURCEIPADDRESS + description: "" + type: String - name: gem-update-threat-status description: Set a threat's status to open, in progress or resolved. From 44274fd5275b8b73cf10433774dd80d4df8e9126 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 29 Feb 2024 12:55:54 +0000 Subject: [PATCH 21/62] Fix webhook mapper --- ...classifier-mapper-incoming-Gem-webhook.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 32ffac7e9b1c..8666565282f9 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -40,15 +40,33 @@ "Event Time": { "simple": "event_datetime" }, + "Events Count": { + "simple": "event.events_total_count" + }, "Gem Url": { "simple": "link" }, + "Main Entity Id": { + "simple": "event.main_entity.id" + }, + "Main Entity Name": { + "simple": "event.main_entity.name" + }, + "Main Entity Region": { + "simple": "event.main_entity.metadata.region" + }, + "Main Entity Type": { + "simple": "event.main_entity.type" + }, "Threat Id": { "simple": "event.threat_id" }, "Title": { "simple": "title" }, + "Ttp Id": { + "simple": "event.ttp_id" + }, "name": { "simple": "title" }, From 04212e702a5d64735a8fab6947e86606fe962fd1 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 29 Feb 2024 14:55:21 +0000 Subject: [PATCH 22/62] Add mappers --- ...lassifier-mapper-incoming-Gem-webhook.json | 2 +- .../classifier-mapper-incoming-Gem.json | 83 ++++++++++--------- Packs/Gem/Integrations/Gem/Gem.yml | 21 ++++- 3 files changed, 65 insertions(+), 41 deletions(-) diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 8666565282f9..4405d8c9b547 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -14,7 +14,7 @@ "logicalVersion": 3, "mapping": { "Gem Threat": { - "dontMapEventToLabels": true, + "dontMapEventToLabels": false, "internalMapping": { "Account Id": { "simple": "account.name" diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index 198e90026558..34f3a120a773 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -9,54 +9,59 @@ "Gem Threat": { "dontMapEventToLabels": false, "internalMapping": { + "Account Id": { + "simple": "account.name" + }, + "Account Name": { + "simple": "account.display_name" + }, + "Account Provider": { + "simple": "account.cloud_provider" + }, "Alert ID": { - "complex": { - "accessor": "alert_id", - "filters": [], - "root": "event", - "transformers": [] - } + "simple": "metadata.alert_id" + }, + "Alert Source": { + "simple": "metadata.alert_source" + }, + "Alert Time": { + "simple": "event_datetime" }, "Description": { "simple": "description" }, - "Incident Link": { + "Event ID": { + "simple": "metadata.events.[0].id" + }, + "Events Count": { + "simple": "metadata.events_total_count" + }, + "Gem Url": { "simple": "link" }, - "occurred": { - "complex": { - "filters": [], - "root": "event_datetime", - "transformers": [ - { - "args": { - "add_utc_timezone": { - "isContext": false, - "value": { - "simple": "true" - } - }, - "dayfirst": { - "isContext": false - }, - "fuzzy": { - "isContext": false - }, - "yearfirst": { - "isContext": false - } - }, - "operator": "DateStringToISOFormat" - } - ] - } + "Main Entity Id": { + "simple": "metadata.main_entity.id" + }, + "Main Entity Name": { + "simple": "metadata.main_entity.name" + }, + "Main Entity Type": { + "simple": "metadata.main_entity.type" + }, + "Threat Id": { + "simple": "metadata.threat_id" + }, + "Title": { + "simple": "title" + }, + "Ttp Id": { + "simple": "metadata.ttp_id" + }, + "name": { + "simple": "title" }, "severity": { - "complex": { - "filters": [], - "root": "severity", - "transformers": [] - } + "simple": "severity" } } } diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 1b358bce1031..fed85717283b 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -1,4 +1,7 @@ category: Cloud Services +sectionOrder: + - Connect + - Collect commonfields: id: Gem version: -1 @@ -8,6 +11,7 @@ configuration: additionalinfo: "The API endpoint to use for connection (US or EU)" name: api_endpoint type: 15 + section: Connect required: true options: - "https://app.gem.security/api/v1" @@ -16,19 +20,34 @@ configuration: additionalinfo: The Service Account ID to use for connection name: client_id type: 0 + section: Connect required: true - display: Service Account Secret additionalinfo: The Service Account Secret to use for connection name: client_secret type: 4 + section: Connect required: true - display: Sync incidents 30 days back - name: fetch_back + name: firstFetch type: 8 + section: Collect required: false - display: Use system proxy settings name: proxy type: 8 + section: Connect + required: false + - display: Fetch incidents + name: isFetch + type: 8 + section: Collect + required: false + - defaultvalue: "10" + display: Maximum number of alerts per fetch + name: max_fetch + type: 0 + section: Collect required: false description: "[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.]" display: Gem From 9362c9020d2463906f9bfdfc1c9b7316a6754f3e Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Sun, 3 Mar 2024 16:33:13 +0000 Subject: [PATCH 23/62] Add post proccessing resolve script --- ...lassifier-mapper-incoming-Gem-webhook.json | 2 +- .../IncidentFields/incidentfield-Verdict.json | 62 +++++++++++++++++++ .../IncidentTypes/incidenttype-GemThreat.json | 4 +- Packs/Gem/Scripts/ResolveGemThreat/README.md | 21 +++++++ .../ResolveGemThreat/ResolveGemThreat.py | 25 ++++++++ .../ResolveGemThreat/ResovleGemThreat.yml | 17 +++++ 6 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 Packs/Gem/IncidentFields/incidentfield-Verdict.json create mode 100644 Packs/Gem/Scripts/ResolveGemThreat/README.md create mode 100644 Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py create mode 100644 Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 4405d8c9b547..dcd608f51c77 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -71,7 +71,7 @@ "simple": "title" }, "severity": { - "simple": "severity" + "simple": "severity_text" } } } diff --git a/Packs/Gem/IncidentFields/incidentfield-Verdict.json b/Packs/Gem/IncidentFields/incidentfield-Verdict.json new file mode 100644 index 000000000000..b0edf726f0bc --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Verdict.json @@ -0,0 +1,62 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "verdict", + "closeForm": true, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": false, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_verdict", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Verdict", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "singleSelect", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": [ + "", + "Malicious", + "Security Test", + "Planned action", + "Not malicious", + "Inconclusive" + ], + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "singleSelect", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json index 0be096f50262..42f0cec9ec70 100644 --- a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json +++ b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json @@ -1,7 +1,7 @@ { "fromVersion": "5.0.0", "autorun": true, - "closureScript": "", + "closureScript": "ResovleGemThreat", "color": "#32EAC2", "days": 0, "daysR": 0, @@ -12,7 +12,7 @@ "id": "Gem Threat", "locked": false, "name": "Gem Threat", - "playbookId": "Handle Gem Threat", + "playbookId": "", "preProcessingScript": "", "readonly": false, "reputationCalc": 0, diff --git a/Packs/Gem/Scripts/ResolveGemThreat/README.md b/Packs/Gem/Scripts/ResolveGemThreat/README.md new file mode 100644 index 000000000000..485292a8c559 --- /dev/null +++ b/Packs/Gem/Scripts/ResolveGemThreat/README.md @@ -0,0 +1,21 @@ +Post Processing Script that will close linked Incidents when the Incident is closed. Will set the same close code as the parent, and add closing notes from the parent. + +## Script Data + +--- + +| **Name** | **Description** | +| --- | --- | +| Script Type | python3 | +| Tags | post-processing, training, internal | +| Cortex XSOAR Version | 6.8.0 | + +## Inputs + +--- +There are no inputs for this script. + +## Outputs + +--- +There are no outputs for this script. diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py new file mode 100644 index 000000000000..ec161ce16044 --- /dev/null +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py @@ -0,0 +1,25 @@ +from CommonServerPython import * # noqa: F401 + + +def main(): + incident = demisto.incident() + incident.get("closeReason", "") + close_notes = incident.get("closeNotes", "") + incident_id = incident.get("id", "") + threat_id = incident.get("CustomFields").get("threatid") + verdict = incident.get("CustomFields").get("verdict") + verdict = verdict if verdict != "" else "inconclusive" + verdict = verdict.replace(" ", "_").lower() + status = "resolved" + + demisto.executeCommand("gem-update-threat-status", { + "verdict": verdict, + "reason": f"Closed from XSOAR, incident id: {incident_id}\n" + f"\nClose Notes:\n{close_notes}", + "threat_id": threat_id, + "status": status}) + demisto.log(f"Resolved Gem Threat {threat_id} with status {status}, verdict {verdict} and close notes {close_notes}") + + +if __name__ in ('__main__', '__builtin__', 'builtins'): + main() diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml b/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml new file mode 100644 index 000000000000..f865aa2df44c --- /dev/null +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml @@ -0,0 +1,17 @@ +comment: "Post Processing Script that will resolve the relevant threat in the Gem platform." +commonfields: + id: ResovleGemThreat + version: -1 +dockerimage: demisto/python3:3.10.12.63474 +enabled: true +name: ResovleGemThreat +runas: DBotWeakRole +script: "" +scripttarget: 0 +subtype: python3 +tags: + - post-processing +type: python +fromversion: 6.8.0 +tests: + - No tests (auto formatted) From 6f32668454a8cb9c383eda65d68cb8abfac80d22 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Sun, 3 Mar 2024 17:23:39 +0000 Subject: [PATCH 24/62] Docs --- Packs/Gem/Integrations/Gem/Gem.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 3123ae7c0da2..78a9d65855ba 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -190,6 +190,18 @@ def list_threats(self, limit, time_start=None, time_end=None, ordering=None, sta def list_inventory_resources(self, limit, include_deleted=None, region=None, resource_type=None, search=None) -> list[dict]: + """List inventory resources + + Args: + limit (int): How many resources to fetch + include_deleted (boolean, optional): Should include deleted resources. Defaults to None. + region (str, optional): Resources region. Defaults to None. + resource_type (str, optional): Filter resource types. Defaults to None. + search (str, optional): Filter search params. Defaults to None. + + Returns: + list[dict]: List of inventory resources + """ results = [] results_fetched = 0 params = {'page_size': limit if limit < PAGE_SIZE else PAGE_SIZE, 'include_deleted': include_deleted, 'region': region, @@ -222,6 +234,7 @@ def list_inventory_resources(self, limit, include_deleted=None, region=None, res return results def _breakdown(self, breakdown_by, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + params = {'breakdown_by': breakdown_by, 'entity_id': entity_id, 'entity_type': entity_type, 'read_only': read_only, 'start_time': start_time, 'end_time': end_time} response = self.http_request( From e90cbaea4688912954c06c8b1451f59348fc21ee Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 4 Mar 2024 12:00:46 +0000 Subject: [PATCH 25/62] Add layout and doc fixs --- .../IncidentTypes/incidenttype-GemThreat.json | 2 +- Packs/Gem/Integrations/Gem/Gem.yml | 2 +- Packs/Gem/Integrations/Gem/Gem_description.md | 17 +- Packs/Gem/Integrations/Gem/README.md | 2 +- .../Layouts/layoutscontainer-Gem_Layout.json | 2609 +++++++++++++++++ 5 files changed, 2621 insertions(+), 11 deletions(-) create mode 100644 Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json diff --git a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json index 42f0cec9ec70..b1aa1aaf6a16 100644 --- a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json +++ b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json @@ -21,5 +21,5 @@ "version": -1, "weeks": 0, "weeksR": 0, - "layout": "Gem Threat" + "layout": "Gem Layout" } \ No newline at end of file diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index fed85717283b..27197b29ac76 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -49,7 +49,7 @@ configuration: type: 0 section: Collect required: false -description: "[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.]" +description: "Use Gem alerts as a trigger for Cortex XSOAR’s custom playbooks, to automate response to specific TTPs" display: Gem name: Gem script: diff --git a/Packs/Gem/Integrations/Gem/Gem_description.md b/Packs/Gem/Integrations/Gem/Gem_description.md index 51bd561c623f..4289ace6a9b2 100644 --- a/Packs/Gem/Integrations/Gem/Gem_description.md +++ b/Packs/Gem/Integrations/Gem/Gem_description.md @@ -1,8 +1,9 @@ -## BaseIntegration Help - -Markdown file for integration configuration help snippet. In this file add: - -- Brief information about how to retrieve the API key of your product -- Other useful information on how to configure your integration in XSOAR - -Since this is a Markdown file, we encourage you to use MD formatting for sections, sub-sections, lists, etc. +- **Generating an API Access Key** + - In order for XSOAR to fetch incidents from the Gem platform and be able to modify status and other details, you’ll need to provide an API access key. + - Follow these instructions to generate one: + - In Gem, go to the **Integrations** page, and find the **XSOAR** integration card under the **Destinations** tab + - Under the **Actions and Pull Integration** section you’ll find the **Client ID** and **Client Secret** to use when setting up the integration in XSOAR +- **Configuration Settings** + - **API Endpoint:** Select the Gem tenant to use (US or EU). Default tenant is US + - **Sync incidents 30 days back**: Check this box to send historic Gem alerts to XSOAR as well + - **Maximum number of alerts per fetch:** The number of alerts to fetch in every run, when using the pull integration method instead of real-time. Default value is 10 \ No newline at end of file diff --git a/Packs/Gem/Integrations/Gem/README.md b/Packs/Gem/Integrations/Gem/README.md index a4ad7d7244c7..6b278ad8d9b2 100644 --- a/Packs/Gem/Integrations/Gem/README.md +++ b/Packs/Gem/Integrations/Gem/README.md @@ -1,4 +1,4 @@ -[Enter a comprehensive, yet concise, description of what the integration does, what use cases it is designed for, etc.] +Use Gem alerts as a trigger for Cortex XSOAR’s custom playbooks, to automate response to specific TTPs This integration was integrated and tested with version xx of Gem. ## Configure Gem on Cortex XSOAR diff --git a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json new file mode 100644 index 000000000000..04e8f952fae7 --- /dev/null +++ b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json @@ -0,0 +1,2609 @@ +{ + "cacheVersn": 0, + "close": { + "sections": [ + { + "description": "", + "fields": [ + { + "fieldId": "incident_closereason", + "isVisible": true + }, + { + "fieldId": "incident_closenotes", + "isVisible": true + } + ], + "isVisible": true, + "name": "Basic Information", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + }, + { + "description": "", + "fields": [ + { + "fieldId": "incident_verdict", + "isVisible": true + } + ], + "isVisible": true, + "name": "Custom Fields", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + } + ] + }, + "definitionId": "", + "description": "", + "detached": false, + "details": null, + "detailsV2": { + "TypeName": "", + "tabs": [ + { + "id": "summary", + "name": "Legacy Summary", + "type": "summary" + }, + { + "id": "caseinfoid", + "name": "Incident Info", + "sections": [ + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-fce71720-98b0-11e9-97d7-ed26ef9e46c8", + "isVisible": true, + "items": [ + { + "endCol": 2, + "fieldId": "type", + "height": 22, + "id": "incident-type-field", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "severity", + "height": 22, + "id": "incident-severity-field", + "index": 1, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "owner", + "height": 22, + "id": "incident-owner-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "sourcebrand", + "height": 22, + "id": "incident-sourceBrand-field", + "index": 3, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "sourceinstance", + "height": 22, + "id": "incident-sourceInstance-field", + "index": 4, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "playbookid", + "height": 22, + "id": "incident-playbookId-field", + "index": 5, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "threatid", + "height": 22, + "id": "266e6a70-d9c1-11ee-9bad-cf4eea417a3f", + "index": 6, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemurl", + "height": 22, + "id": "f5b8c7e0-d9c0-11ee-9bad-cf4eea417a3f", + "index": 7, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "alerttime", + "height": 22, + "id": "9c5f4970-d9c1-11ee-9bad-cf4eea417a3f", + "index": 8, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "ttpid", + "height": 22, + "id": "d28a0440-d9c1-11ee-9bad-cf4eea417a3f", + "index": 9, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "alertsource", + "height": 22, + "id": "c8759a50-d9c1-11ee-9bad-cf4eea417a3f", + "index": 9, + "sectionItemType": "field", + "startCol": 0 + } + ], + "maxW": 3, + "moved": false, + "name": "Case Details", + "static": false, + "w": 1, + "x": 0, + "y": 0 + }, + { + "h": 2, + "i": "caseinfoid-61263cc0-98b1-11e9-97d7-ed26ef9e46c8", + "maxW": 3, + "moved": false, + "name": "Notes", + "static": false, + "type": "notes", + "w": 1, + "x": 2, + "y": 0 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-6aabad20-98b1-11e9-97d7-ed26ef9e46c8", + "maxW": 3, + "moved": false, + "name": "Work Plan", + "static": false, + "type": "workplan", + "w": 1, + "x": 1, + "y": 0 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-770ec200-98b1-11e9-97d7-ed26ef9e46c8", + "isVisible": true, + "maxW": 3, + "moved": false, + "name": "Linked Incidents", + "static": false, + "type": "linkedIncidents", + "w": 2, + "x": 0, + "y": 8 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-842632c0-98b1-11e9-97d7-ed26ef9e46c8", + "maxW": 3, + "moved": false, + "name": "Child Incidents", + "static": false, + "type": "childInv", + "w": 1, + "x": 2, + "y": 4 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-4a31afa0-98ba-11e9-a519-93a53c759fe0", + "maxW": 3, + "moved": false, + "name": "Evidence", + "static": false, + "type": "evidence", + "w": 2, + "x": 0, + "y": 6 + }, + { + "displayType": "ROW", + "h": 2, + "hideName": false, + "i": "caseinfoid-7717e580-9bed-11e9-9a3f-8b4b2158e260", + "maxW": 3, + "moved": false, + "name": "Team Members", + "static": false, + "type": "team", + "w": 1, + "x": 2, + "y": 8 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-7ce69dd0-a07f-11e9-936c-5395a1acf11e", + "maxW": 3, + "moved": false, + "name": "Indicators", + "query": "", + "queryType": "input", + "static": false, + "type": "indicators", + "w": 2, + "x": 0, + "y": 4 + }, + { + "displayType": "CARD", + "h": 2, + "i": "caseinfoid-ac32f620-a0b0-11e9-b27f-13ae1773d289", + "items": [ + { + "endCol": 1, + "fieldId": "occurred", + "height": 53, + "id": "incident-occurred-field", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 1, + "fieldId": "dbotmodified", + "height": 53, + "id": "incident-modified-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "dbotduedate", + "height": 53, + "id": "incident-dueDate-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "dbotcreated", + "height": 53, + "id": "incident-created-field", + "index": 0, + "sectionItemType": "field", + "startCol": 1 + }, + { + "endCol": 2, + "fieldId": "dbotclosed", + "height": 53, + "id": "incident-closed-field", + "index": 2, + "sectionItemType": "field", + "startCol": 1 + } + ], + "maxW": 3, + "moved": false, + "name": "Timeline Information", + "static": false, + "w": 1, + "x": 0, + "y": 2 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-88e6bf70-a0b1-11e9-b27f-13ae1773d289", + "isVisible": true, + "items": [ + { + "endCol": 2, + "fieldId": "dbotclosed", + "height": 22, + "id": "incident-dbotClosed-field", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "closereason", + "height": 22, + "id": "incident-closeReason-field", + "index": 1, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "closenotes", + "height": 22, + "id": "incident-closeNotes-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + } + ], + "maxW": 3, + "moved": false, + "name": "Closing Information", + "static": false, + "w": 1, + "x": 2, + "y": 6 + }, + { + "displayType": "CARD", + "h": 2, + "i": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "isVisible": true, + "items": [ + { + "endCol": 2, + "fieldId": "description", + "height": 53, + "id": "8b7c03a0-d9c1-11ee-9bad-cf4eea417a3f", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "dropEffect": "move", + "endCol": 2, + "fieldId": "accountprovider", + "height": 53, + "id": "ab71c6e0-d9c1-11ee-9bad-cf4eea417a3f", + "index": 1, + "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "accountname", + "height": 53, + "id": "b2a9ebe0-d9c1-11ee-9bad-cf4eea417a3f", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "cloudaccountid", + "height": 53, + "id": "af737900-d9c1-11ee-9bad-cf4eea417a3f", + "index": 3, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "eventscount", + "height": 53, + "id": "e37671d0-d9c1-11ee-9bad-cf4eea417a3f", + "index": 4, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 4, + "fieldId": "mainentitytype", + "height": 53, + "id": "dabc40b0-d9c1-11ee-9bad-cf4eea417a3f", + "index": 0, + "sectionItemType": "field", + "startCol": 2 + }, + { + "dropEffect": "move", + "endCol": 4, + "fieldId": "mainentityname", + "height": 53, + "id": "de1556c0-d9c1-11ee-9bad-cf4eea417a3f", + "index": 1, + "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "sectionItemType": "field", + "startCol": 2 + }, + { + "dropEffect": "move", + "endCol": 4, + "fieldId": "mainentityid", + "height": 53, + "id": "d7b12390-d9c1-11ee-9bad-cf4eea417a3f", + "index": 2, + "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "sectionItemType": "field", + "startCol": 2 + }, + { + "dropEffect": "move", + "endCol": 4, + "fieldId": "mainentityregion", + "height": 53, + "id": "dfbb1780-d9c1-11ee-9bad-cf4eea417a3f", + "index": 3, + "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "sectionItemType": "field", + "startCol": 2 + } + ], + "maxW": 3, + "moved": false, + "name": "Investigation Data", + "static": false, + "w": 2, + "x": 1, + "y": 2 + } + ], + "type": "custom" + }, + { + "id": "warRoom", + "name": "War Room", + "type": "warRoom" + }, + { + "id": "workPlan", + "name": "Work Plan", + "type": "workPlan" + }, + { + "id": "evidenceBoard", + "name": "Evidence Board", + "type": "evidenceBoard" + }, + { + "id": "relatedIncidents", + "name": "Related Incidents", + "type": "relatedIncidents" + }, + { + "id": "canvas", + "name": "Canvas", + "type": "canvas" + } + ] + }, + "edit": { + "sections": [ + { + "description": "", + "fields": [ + { + "fieldId": "incident_name", + "isVisible": true + }, + { + "fieldId": "incident_occurred", + "isVisible": true + }, + { + "fieldId": "incident_reminder", + "isVisible": true + }, + { + "fieldId": "incident_owner", + "isVisible": true + }, + { + "fieldId": "incident_roles", + "isVisible": true + }, + { + "fieldId": "incident_type", + "isVisible": true + }, + { + "fieldId": "incident_severity", + "isVisible": true + }, + { + "fieldId": "incident_playbookid", + "isVisible": true + }, + { + "fieldId": "incident_labels", + "isVisible": true + }, + { + "fieldId": "incident_phase", + "isVisible": true + }, + { + "fieldId": "incident_details", + "isVisible": true + }, + { + "fieldId": "incident_attachment", + "isVisible": true + } + ], + "isVisible": true, + "name": "Basic Information", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + }, + { + "description": "", + "fields": [ + { + "fieldId": "incident_asn", + "isVisible": true + }, + { + "fieldId": "incident_asnname", + "isVisible": true + }, + { + "fieldId": "incident_accountmemberof", + "isVisible": true + }, + { + "fieldId": "incident_accountstatus", + "isVisible": true + }, + { + "fieldId": "incident_additionaldata", + "isVisible": true + }, + { + "fieldId": "incident_additionalindicators", + "isVisible": true + }, + { + "fieldId": "incident_affectedhosts", + "isVisible": true + }, + { + "fieldId": "incident_affectedusers", + "isVisible": true + }, + { + "fieldId": "incident_agentid", + "isVisible": true + }, + { + "fieldId": "incident_agentversion", + "isVisible": true + }, + { + "fieldId": "incident_agentsid", + "isVisible": true + }, + { + "fieldId": "incident_alertcategory", + "isVisible": true + }, + { + "fieldId": "incident_alertid", + "isVisible": true + }, + { + "fieldId": "incident_alertname", + "isVisible": true + }, + { + "fieldId": "incident_alerttypeid", + "isVisible": true + }, + { + "fieldId": "incident_app", + "isVisible": true + }, + { + "fieldId": "incident_appmessage", + "isVisible": true + }, + { + "fieldId": "incident_assigneduser", + "isVisible": true + }, + { + "fieldId": "incident_assignmentgroup", + "isVisible": true + }, + { + "fieldId": "incident_attackpatterns", + "isVisible": true + }, + { + "fieldId": "incident_birthday", + "isVisible": true + }, + { + "fieldId": "incident_blockindicatorsstatus", + "isVisible": true + }, + { + "fieldId": "incident_cmd", + "isVisible": true + }, + { + "fieldId": "incident_cmdline", + "isVisible": true + }, + { + "fieldId": "incident_cvelist", + "isVisible": true + }, + { + "fieldId": "incident_caller", + "isVisible": true + }, + { + "fieldId": "incident_campaignname", + "isVisible": true + }, + { + "fieldId": "incident_categories", + "isVisible": true + }, + { + "fieldId": "incident_changed", + "isVisible": true + }, + { + "fieldId": "incident_childprocess", + "isVisible": true + }, + { + "fieldId": "incident_classification", + "isVisible": true + }, + { + "fieldId": "incident_cloudaccountid", + "isVisible": true + }, + { + "fieldId": "incident_cloudinstanceid", + "isVisible": true + }, + { + "fieldId": "incident_cloudoperationtype", + "isVisible": true + }, + { + "fieldId": "incident_commandline", + "isVisible": true + }, + { + "fieldId": "incident_commandlineverdict", + "isVisible": true + }, + { + "fieldId": "incident_comment", + "isVisible": true + }, + { + "fieldId": "incident_country", + "isVisible": true + }, + { + "fieldId": "incident_countrycode", + "isVisible": true + }, + { + "fieldId": "incident_countrycodenumber", + "isVisible": true + }, + { + "fieldId": "incident_customqueryresults", + "isVisible": true + }, + { + "fieldId": "incident_description", + "isVisible": true + }, + { + "fieldId": "incident_destinationhostname", + "isVisible": true + }, + { + "fieldId": "incident_destinationip", + "isVisible": true + }, + { + "fieldId": "incident_destinationnetwork", + "isVisible": true + }, + { + "fieldId": "incident_destinationnetworks", + "isVisible": true + }, + { + "fieldId": "incident_destinationport", + "isVisible": true + }, + { + "fieldId": "incident_detectedendpoints", + "isVisible": true + }, + { + "fieldId": "incident_detectedips", + "isVisible": true + }, + { + "fieldId": "incident_detecteduser", + "isVisible": true + }, + { + "fieldId": "incident_detectionurl", + "isVisible": true + }, + { + "fieldId": "incident_deviceexternalip", + "isVisible": true + }, + { + "fieldId": "incident_deviceexternalips", + "isVisible": true + }, + { + "fieldId": "incident_devicehash", + "isVisible": true + }, + { + "fieldId": "incident_deviceid", + "isVisible": true + }, + { + "fieldId": "incident_deviceinternalips", + "isVisible": true + }, + { + "fieldId": "incident_devicelocalip", + "isVisible": true + }, + { + "fieldId": "incident_devicemacaddress", + "isVisible": true + }, + { + "fieldId": "incident_devicemodel", + "isVisible": true + }, + { + "fieldId": "incident_devicename", + "isVisible": true + }, + { + "fieldId": "incident_deviceosname", + "isVisible": true + }, + { + "fieldId": "incident_deviceosversion", + "isVisible": true + }, + { + "fieldId": "incident_deviceou", + "isVisible": true + }, + { + "fieldId": "incident_deviceusername", + "isVisible": true + }, + { + "fieldId": "incident_domainname", + "isVisible": true + }, + { + "fieldId": "incident_dsts", + "isVisible": true + }, + { + "fieldId": "incident_endpoint", + "isVisible": true + }, + { + "fieldId": "incident_endpointisolationstatus", + "isVisible": true + }, + { + "fieldId": "incident_endpointsdetails", + "isVisible": true + }, + { + "fieldId": "incident_escalation", + "isVisible": true + }, + { + "fieldId": "incident_eventid", + "isVisible": true + }, + { + "fieldId": "incident_eventtype", + "isVisible": true + }, + { + "fieldId": "incident_externalcategoryid", + "isVisible": true + }, + { + "fieldId": "incident_externalcategoryname", + "isVisible": true + }, + { + "fieldId": "incident_externalconfidence", + "isVisible": true + }, + { + "fieldId": "incident_externalendtime", + "isVisible": true + }, + { + "fieldId": "incident_externallink", + "isVisible": true + }, + { + "fieldId": "incident_externalseverity", + "isVisible": true + }, + { + "fieldId": "incident_externalstarttime", + "isVisible": true + }, + { + "fieldId": "incident_externalstatus", + "isVisible": true + }, + { + "fieldId": "incident_externalsubcategoryid", + "isVisible": true + }, + { + "fieldId": "incident_externalsubcategoryname", + "isVisible": true + }, + { + "fieldId": "incident_externalsystemid", + "isVisible": true + }, + { + "fieldId": "incident_failedlogonevents", + "isVisible": true + }, + { + "fieldId": "incident_failedlogoneventstimeframe", + "isVisible": true + }, + { + "fieldId": "incident_filehash", + "isVisible": true + }, + { + "fieldId": "incident_filemd5", + "isVisible": true + }, + { + "fieldId": "incident_filename", + "isVisible": true + }, + { + "fieldId": "incident_filenames", + "isVisible": true + }, + { + "fieldId": "incident_filepath", + "isVisible": true + }, + { + "fieldId": "incident_filepaths", + "isVisible": true + }, + { + "fieldId": "incident_filerelationships", + "isVisible": true + }, + { + "fieldId": "incident_filesha1", + "isVisible": true + }, + { + "fieldId": "incident_filesha256", + "isVisible": true + }, + { + "fieldId": "incident_filesize", + "isVisible": true + }, + { + "fieldId": "incident_fileupload", + "isVisible": true + }, + { + "fieldId": "incident_firstname", + "isVisible": true + }, + { + "fieldId": "incident_fullname", + "isVisible": true + }, + { + "fieldId": "incident_highriskyhosts", + "isVisible": true + }, + { + "fieldId": "incident_highriskyusers", + "isVisible": true + }, + { + "fieldId": "incident_hostnames", + "isVisible": true + }, + { + "fieldId": "incident_huntresultscount", + "isVisible": true + }, + { + "fieldId": "incident_ipblockedstatus", + "isVisible": true + }, + { + "fieldId": "incident_ipreputation", + "isVisible": true + }, + { + "fieldId": "incident_identitytype", + "isVisible": true + }, + { + "fieldId": "incident_incidentlink", + "isVisible": true + }, + { + "fieldId": "incident_incomingmirrorerror", + "isVisible": true + }, + { + "fieldId": "incident_investigationstage", + "isVisible": true + }, + { + "fieldId": "incident_isactive", + "isVisible": true + }, + { + "fieldId": "incident_lastmirroredtimestamp", + "isVisible": true + }, + { + "fieldId": "incident_lastname", + "isVisible": true + }, + { + "fieldId": "incident_logsource", + "isVisible": true + }, + { + "fieldId": "incident_lowlevelcategoriesevents", + "isVisible": true + }, + { + "fieldId": "incident_macaddress", + "isVisible": true + }, + { + "fieldId": "incident_md5", + "isVisible": true + }, + { + "fieldId": "incident_mitretacticid", + "isVisible": true + }, + { + "fieldId": "incident_mitretacticname", + "isVisible": true + }, + { + "fieldId": "incident_mitretechniqueid", + "isVisible": true + }, + { + "fieldId": "incident_mitretechniquename", + "isVisible": true + }, + { + "fieldId": "incident_mobiledevicemodel", + "isVisible": true + }, + { + "fieldId": "incident_numberoffoundrelatedalerts", + "isVisible": true + }, + { + "fieldId": "incident_numberofrelatedincidents", + "isVisible": true + }, + { + "fieldId": "incident_numberofsimilarfiles", + "isVisible": true + }, + { + "fieldId": "incident_os", + "isVisible": true + }, + { + "fieldId": "incident_ostype", + "isVisible": true + }, + { + "fieldId": "incident_osversion", + "isVisible": true + }, + { + "fieldId": "incident_objective", + "isVisible": true + }, + { + "fieldId": "incident_operationname", + "isVisible": true + }, + { + "fieldId": "incident_orglevel1", + "isVisible": true + }, + { + "fieldId": "incident_orglevel2", + "isVisible": true + }, + { + "fieldId": "incident_orglevel3", + "isVisible": true + }, + { + "fieldId": "incident_orgunit", + "isVisible": true + }, + { + "fieldId": "incident_outgoingmirrorerror", + "isVisible": true + }, + { + "fieldId": "incident_pid", + "isVisible": true + }, + { + "fieldId": "incident_parentcmdline", + "isVisible": true + }, + { + "fieldId": "incident_parentprocess", + "isVisible": true + }, + { + "fieldId": "incident_parentprocesscmd", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessfilepath", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessids", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessmd5", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessname", + "isVisible": true + }, + { + "fieldId": "incident_parentprocesspath", + "isVisible": true + }, + { + "fieldId": "incident_parentprocesssha256", + "isVisible": true + }, + { + "fieldId": "incident_passwordchangeddate", + "isVisible": true + }, + { + "fieldId": "incident_phonenumber", + "isVisible": true + }, + { + "fieldId": "incident_policyactions", + "isVisible": true + }, + { + "fieldId": "incident_processcmd", + "isVisible": true + }, + { + "fieldId": "incident_processcreationtime", + "isVisible": true + }, + { + "fieldId": "incident_processid", + "isVisible": true + }, + { + "fieldId": "incident_processmd5", + "isVisible": true + }, + { + "fieldId": "incident_processname", + "isVisible": true + }, + { + "fieldId": "incident_processnames", + "isVisible": true + }, + { + "fieldId": "incident_processpath", + "isVisible": true + }, + { + "fieldId": "incident_processpaths", + "isVisible": true + }, + { + "fieldId": "incident_processsha256", + "isVisible": true + }, + { + "fieldId": "incident_projectid", + "isVisible": true + }, + { + "fieldId": "incident_protocol", + "isVisible": true + }, + { + "fieldId": "incident_protocolnames", + "isVisible": true + }, + { + "fieldId": "incident_referencedresourceid", + "isVisible": true + }, + { + "fieldId": "incident_referencedresourcename", + "isVisible": true + }, + { + "fieldId": "incident_registryhive", + "isVisible": true + }, + { + "fieldId": "incident_registrykey", + "isVisible": true + }, + { + "fieldId": "incident_registryvalue", + "isVisible": true + }, + { + "fieldId": "incident_registryvaluetype", + "isVisible": true + }, + { + "fieldId": "incident_relatedalerts", + "isVisible": true + }, + { + "fieldId": "incident_relatedcampaign", + "isVisible": true + }, + { + "fieldId": "incident_relatedendpoints", + "isVisible": true + }, + { + "fieldId": "incident_relatedreport", + "isVisible": true + }, + { + "fieldId": "incident_renderedhtml", + "isVisible": true + }, + { + "fieldId": "incident_reportname", + "isVisible": true + }, + { + "fieldId": "incident_rulename", + "isVisible": true + }, + { + "fieldId": "incident_sha1", + "isVisible": true + }, + { + "fieldId": "incident_sha256", + "isVisible": true + }, + { + "fieldId": "incident_sha512", + "isVisible": true + }, + { + "fieldId": "incident_ssdeep", + "isVisible": true + }, + { + "fieldId": "incident_scenario", + "isVisible": true + }, + { + "fieldId": "incident_selectedindicators", + "isVisible": true + }, + { + "fieldId": "incident_similarincidentsdbot", + "isVisible": true + }, + { + "fieldId": "incident_sourcecategory", + "isVisible": true + }, + { + "fieldId": "incident_sourcecreatetime", + "isVisible": true + }, + { + "fieldId": "incident_sourcecreatedby", + "isVisible": true + }, + { + "fieldId": "incident_sourceexternalips", + "isVisible": true + }, + { + "fieldId": "incident_sourcehostname", + "isVisible": true + }, + { + "fieldId": "incident_sourceip", + "isVisible": true + }, + { + "fieldId": "incident_sourceid", + "isVisible": true + }, + { + "fieldId": "incident_sourcenetwork", + "isVisible": true + }, + { + "fieldId": "incident_sourcenetworks", + "isVisible": true + }, + { + "fieldId": "incident_sourceport", + "isVisible": true + }, + { + "fieldId": "incident_sourcepriority", + "isVisible": true + }, + { + "fieldId": "incident_sourcestatus", + "isVisible": true + }, + { + "fieldId": "incident_sourceupdatedby", + "isVisible": true + }, + { + "fieldId": "incident_sourceusername", + "isVisible": true + }, + { + "fieldId": "incident_srcs", + "isVisible": true + }, + { + "fieldId": "incident_state", + "isVisible": true + }, + { + "fieldId": "incident_statusreason", + "isVisible": true + }, + { + "fieldId": "incident_stringsimilarityresults", + "isVisible": true + }, + { + "fieldId": "incident_subcategory", + "isVisible": true + }, + { + "fieldId": "incident_suspiciousexecutions", + "isVisible": true + }, + { + "fieldId": "incident_suspiciousexecutionsfound", + "isVisible": true + }, + { + "fieldId": "incident_tactic", + "isVisible": true + }, + { + "fieldId": "incident_tacticid", + "isVisible": true + }, + { + "fieldId": "incident_tags", + "isVisible": true + }, + { + "fieldId": "incident_target", + "isVisible": true + }, + { + "fieldId": "incident_teamname", + "isVisible": true + }, + { + "fieldId": "incident_technique", + "isVisible": true + }, + { + "fieldId": "incident_techniqueid", + "isVisible": true + }, + { + "fieldId": "incident_tenantname", + "isVisible": true + }, + { + "fieldId": "incident_threatfamilyname", + "isVisible": true + }, + { + "fieldId": "incident_threathuntingdetectedhostnames", + "isVisible": true + }, + { + "fieldId": "incident_threathuntingdetectedip", + "isVisible": true + }, + { + "fieldId": "incident_threatid", + "isVisible": true + }, + { + "fieldId": "incident_threatname", + "isVisible": true + }, + { + "fieldId": "incident_ticketacknowledgeddate", + "isVisible": true + }, + { + "fieldId": "incident_ticketcloseddate", + "isVisible": true + }, + { + "fieldId": "incident_ticketnumber", + "isVisible": true + }, + { + "fieldId": "incident_ticketopeneddate", + "isVisible": true + }, + { + "fieldId": "incident_toolusagefound", + "isVisible": true + }, + { + "fieldId": "incident_tools", + "isVisible": true + }, + { + "fieldId": "incident_urlsslverification", + "isVisible": true + }, + { + "fieldId": "incident_urls", + "isVisible": true + }, + { + "fieldId": "incident_usecasedescription", + "isVisible": true + }, + { + "fieldId": "incident_useragent", + "isVisible": true + }, + { + "fieldId": "incident_userblockstatus", + "isVisible": true + }, + { + "fieldId": "incident_usercreationtime", + "isVisible": true + }, + { + "fieldId": "incident_userengagementresponse", + "isVisible": true + }, + { + "fieldId": "incident_usersid", + "isVisible": true + }, + { + "fieldId": "incident_users", + "isVisible": true + }, + { + "fieldId": "incident_usersdetails", + "isVisible": true + }, + { + "fieldId": "incident_verdict", + "isVisible": true + }, + { + "fieldId": "incident_appchannelname", + "isVisible": true + }, + { + "fieldId": "incident_samaccountname", + "isVisible": true + }, + { + "fieldId": "incident_similarincidents", + "isVisible": true + }, + { + "fieldId": "incident_testdatepicker", + "isVisible": true + }, + { + "fieldId": "incident_testnumber", + "isVisible": true + }, + { + "fieldId": "incident_testurl", + "isVisible": true + }, + { + "fieldId": "incident_useraccountcontrol", + "isVisible": true + } + ], + "isVisible": true, + "name": "Custom Fields", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + } + ] + }, + "fromServerVersion": "", + "group": "incident", + "id": "Gem Layout", + "indicatorsDetails": null, + "indicatorsQuickView": null, + "itemVersion": "", + "locked": false, + "mobile": null, + "name": "Gem Layout", + "packID": "", + "packName": "", + "quickView": { + "sections": [ + { + "description": "", + "fields": [ + { + "fieldId": "incident_type", + "isVisible": true + }, + { + "fieldId": "incident_severity", + "isVisible": true + }, + { + "fieldId": "incident_owner", + "isVisible": true + }, + { + "fieldId": "incident_dbotstatus", + "isVisible": true + }, + { + "fieldId": "incident_sourcebrand", + "isVisible": true + }, + { + "fieldId": "incident_sourceinstance", + "isVisible": true + }, + { + "fieldId": "incident_playbookid", + "isVisible": true + }, + { + "fieldId": "incident_phase", + "isVisible": true + }, + { + "fieldId": "incident_roles", + "isVisible": true + } + ], + "isVisible": true, + "name": "Basic Information", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + }, + { + "description": "", + "fields": [ + { + "fieldId": "incident_occurred", + "isVisible": true + }, + { + "fieldId": "incident_dbotcreated", + "isVisible": true + }, + { + "fieldId": "incident_dbotduedate", + "isVisible": true + }, + { + "fieldId": "incident_dbotmodified", + "isVisible": true + }, + { + "fieldId": "incident_dbottotaltime", + "isVisible": true + } + ], + "isVisible": true, + "name": "Timeline Information", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + }, + { + "description": "", + "fields": [ + { + "fieldId": "incident_asn", + "isVisible": true + }, + { + "fieldId": "incident_asnname", + "isVisible": true + }, + { + "fieldId": "incident_accountmemberof", + "isVisible": true + }, + { + "fieldId": "incident_accountstatus", + "isVisible": true + }, + { + "fieldId": "incident_additionaldata", + "isVisible": true + }, + { + "fieldId": "incident_additionalindicators", + "isVisible": true + }, + { + "fieldId": "incident_affectedhosts", + "isVisible": true + }, + { + "fieldId": "incident_affectedusers", + "isVisible": true + }, + { + "fieldId": "incident_agentid", + "isVisible": true + }, + { + "fieldId": "incident_agentversion", + "isVisible": true + }, + { + "fieldId": "incident_agentsid", + "isVisible": true + }, + { + "fieldId": "incident_alertcategory", + "isVisible": true + }, + { + "fieldId": "incident_alertid", + "isVisible": true + }, + { + "fieldId": "incident_alertname", + "isVisible": true + }, + { + "fieldId": "incident_alerttypeid", + "isVisible": true + }, + { + "fieldId": "incident_app", + "isVisible": true + }, + { + "fieldId": "incident_appmessage", + "isVisible": true + }, + { + "fieldId": "incident_assigneduser", + "isVisible": true + }, + { + "fieldId": "incident_assignmentgroup", + "isVisible": true + }, + { + "fieldId": "incident_attackpatterns", + "isVisible": true + }, + { + "fieldId": "incident_birthday", + "isVisible": true + }, + { + "fieldId": "incident_blockindicatorsstatus", + "isVisible": true + }, + { + "fieldId": "incident_cmd", + "isVisible": true + }, + { + "fieldId": "incident_cmdline", + "isVisible": true + }, + { + "fieldId": "incident_cvelist", + "isVisible": true + }, + { + "fieldId": "incident_caller", + "isVisible": true + }, + { + "fieldId": "incident_campaignname", + "isVisible": true + }, + { + "fieldId": "incident_categories", + "isVisible": true + }, + { + "fieldId": "incident_changed", + "isVisible": true + }, + { + "fieldId": "incident_childprocess", + "isVisible": true + }, + { + "fieldId": "incident_classification", + "isVisible": true + }, + { + "fieldId": "incident_cloudaccountid", + "isVisible": true + }, + { + "fieldId": "incident_cloudinstanceid", + "isVisible": true + }, + { + "fieldId": "incident_cloudoperationtype", + "isVisible": true + }, + { + "fieldId": "incident_commandline", + "isVisible": true + }, + { + "fieldId": "incident_commandlineverdict", + "isVisible": true + }, + { + "fieldId": "incident_comment", + "isVisible": true + }, + { + "fieldId": "incident_containmentsla", + "isVisible": true + }, + { + "fieldId": "incident_country", + "isVisible": true + }, + { + "fieldId": "incident_countrycode", + "isVisible": true + }, + { + "fieldId": "incident_countrycodenumber", + "isVisible": true + }, + { + "fieldId": "incident_customqueryresults", + "isVisible": true + }, + { + "fieldId": "incident_description", + "isVisible": true + }, + { + "fieldId": "incident_destinationhostname", + "isVisible": true + }, + { + "fieldId": "incident_destinationip", + "isVisible": true + }, + { + "fieldId": "incident_destinationnetwork", + "isVisible": true + }, + { + "fieldId": "incident_destinationnetworks", + "isVisible": true + }, + { + "fieldId": "incident_destinationport", + "isVisible": true + }, + { + "fieldId": "incident_detectedendpoints", + "isVisible": true + }, + { + "fieldId": "incident_detectedips", + "isVisible": true + }, + { + "fieldId": "incident_detecteduser", + "isVisible": true + }, + { + "fieldId": "incident_detectionsla", + "isVisible": true + }, + { + "fieldId": "incident_detectionurl", + "isVisible": true + }, + { + "fieldId": "incident_deviceexternalip", + "isVisible": true + }, + { + "fieldId": "incident_deviceexternalips", + "isVisible": true + }, + { + "fieldId": "incident_devicehash", + "isVisible": true + }, + { + "fieldId": "incident_deviceid", + "isVisible": true + }, + { + "fieldId": "incident_deviceinternalips", + "isVisible": true + }, + { + "fieldId": "incident_devicelocalip", + "isVisible": true + }, + { + "fieldId": "incident_devicemacaddress", + "isVisible": true + }, + { + "fieldId": "incident_devicemodel", + "isVisible": true + }, + { + "fieldId": "incident_devicename", + "isVisible": true + }, + { + "fieldId": "incident_deviceosname", + "isVisible": true + }, + { + "fieldId": "incident_deviceosversion", + "isVisible": true + }, + { + "fieldId": "incident_deviceou", + "isVisible": true + }, + { + "fieldId": "incident_deviceusername", + "isVisible": true + }, + { + "fieldId": "incident_domainname", + "isVisible": true + }, + { + "fieldId": "incident_dsts", + "isVisible": true + }, + { + "fieldId": "incident_endpoint", + "isVisible": true + }, + { + "fieldId": "incident_endpointisolationstatus", + "isVisible": true + }, + { + "fieldId": "incident_endpointsdetails", + "isVisible": true + }, + { + "fieldId": "incident_escalation", + "isVisible": true + }, + { + "fieldId": "incident_eventid", + "isVisible": true + }, + { + "fieldId": "incident_eventtype", + "isVisible": true + }, + { + "fieldId": "incident_externalcategoryid", + "isVisible": true + }, + { + "fieldId": "incident_externalcategoryname", + "isVisible": true + }, + { + "fieldId": "incident_externalconfidence", + "isVisible": true + }, + { + "fieldId": "incident_externalendtime", + "isVisible": true + }, + { + "fieldId": "incident_externallink", + "isVisible": true + }, + { + "fieldId": "incident_externalseverity", + "isVisible": true + }, + { + "fieldId": "incident_externalstarttime", + "isVisible": true + }, + { + "fieldId": "incident_externalstatus", + "isVisible": true + }, + { + "fieldId": "incident_externalsubcategoryid", + "isVisible": true + }, + { + "fieldId": "incident_externalsubcategoryname", + "isVisible": true + }, + { + "fieldId": "incident_externalsystemid", + "isVisible": true + }, + { + "fieldId": "incident_failedlogonevents", + "isVisible": true + }, + { + "fieldId": "incident_failedlogoneventstimeframe", + "isVisible": true + }, + { + "fieldId": "incident_filehash", + "isVisible": true + }, + { + "fieldId": "incident_filemd5", + "isVisible": true + }, + { + "fieldId": "incident_filename", + "isVisible": true + }, + { + "fieldId": "incident_filenames", + "isVisible": true + }, + { + "fieldId": "incident_filepath", + "isVisible": true + }, + { + "fieldId": "incident_filepaths", + "isVisible": true + }, + { + "fieldId": "incident_filerelationships", + "isVisible": true + }, + { + "fieldId": "incident_filesha1", + "isVisible": true + }, + { + "fieldId": "incident_filesha256", + "isVisible": true + }, + { + "fieldId": "incident_filesize", + "isVisible": true + }, + { + "fieldId": "incident_fileupload", + "isVisible": true + }, + { + "fieldId": "incident_firstname", + "isVisible": true + }, + { + "fieldId": "incident_fullname", + "isVisible": true + }, + { + "fieldId": "incident_highriskyhosts", + "isVisible": true + }, + { + "fieldId": "incident_highriskyusers", + "isVisible": true + }, + { + "fieldId": "incident_hostnames", + "isVisible": true + }, + { + "fieldId": "incident_huntresultscount", + "isVisible": true + }, + { + "fieldId": "incident_ipblockedstatus", + "isVisible": true + }, + { + "fieldId": "incident_ipreputation", + "isVisible": true + }, + { + "fieldId": "incident_identitytype", + "isVisible": true + }, + { + "fieldId": "incident_incidentduration", + "isVisible": true + }, + { + "fieldId": "incident_incidentlink", + "isVisible": true + }, + { + "fieldId": "incident_incomingmirrorerror", + "isVisible": true + }, + { + "fieldId": "incident_investigationstage", + "isVisible": true + }, + { + "fieldId": "incident_isactive", + "isVisible": true + }, + { + "fieldId": "incident_lastmirroredtimestamp", + "isVisible": true + }, + { + "fieldId": "incident_lastname", + "isVisible": true + }, + { + "fieldId": "incident_logsource", + "isVisible": true + }, + { + "fieldId": "incident_lowlevelcategoriesevents", + "isVisible": true + }, + { + "fieldId": "incident_macaddress", + "isVisible": true + }, + { + "fieldId": "incident_md5", + "isVisible": true + }, + { + "fieldId": "incident_mitretacticid", + "isVisible": true + }, + { + "fieldId": "incident_mitretacticname", + "isVisible": true + }, + { + "fieldId": "incident_mitretechniqueid", + "isVisible": true + }, + { + "fieldId": "incident_mitretechniquename", + "isVisible": true + }, + { + "fieldId": "incident_mobiledevicemodel", + "isVisible": true + }, + { + "fieldId": "incident_numberoffoundrelatedalerts", + "isVisible": true + }, + { + "fieldId": "incident_numberofrelatedincidents", + "isVisible": true + }, + { + "fieldId": "incident_numberofsimilarfiles", + "isVisible": true + }, + { + "fieldId": "incident_os", + "isVisible": true + }, + { + "fieldId": "incident_ostype", + "isVisible": true + }, + { + "fieldId": "incident_osversion", + "isVisible": true + }, + { + "fieldId": "incident_objective", + "isVisible": true + }, + { + "fieldId": "incident_operationname", + "isVisible": true + }, + { + "fieldId": "incident_orglevel1", + "isVisible": true + }, + { + "fieldId": "incident_orglevel2", + "isVisible": true + }, + { + "fieldId": "incident_orglevel3", + "isVisible": true + }, + { + "fieldId": "incident_orgunit", + "isVisible": true + }, + { + "fieldId": "incident_outgoingmirrorerror", + "isVisible": true + }, + { + "fieldId": "incident_pid", + "isVisible": true + }, + { + "fieldId": "incident_parentcmdline", + "isVisible": true + }, + { + "fieldId": "incident_parentprocess", + "isVisible": true + }, + { + "fieldId": "incident_parentprocesscmd", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessfilepath", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessids", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessmd5", + "isVisible": true + }, + { + "fieldId": "incident_parentprocessname", + "isVisible": true + }, + { + "fieldId": "incident_parentprocesspath", + "isVisible": true + }, + { + "fieldId": "incident_parentprocesssha256", + "isVisible": true + }, + { + "fieldId": "incident_passwordchangeddate", + "isVisible": true + }, + { + "fieldId": "incident_phonenumber", + "isVisible": true + }, + { + "fieldId": "incident_policyactions", + "isVisible": true + }, + { + "fieldId": "incident_processcmd", + "isVisible": true + }, + { + "fieldId": "incident_processcreationtime", + "isVisible": true + }, + { + "fieldId": "incident_processid", + "isVisible": true + }, + { + "fieldId": "incident_processmd5", + "isVisible": true + }, + { + "fieldId": "incident_processname", + "isVisible": true + }, + { + "fieldId": "incident_processnames", + "isVisible": true + }, + { + "fieldId": "incident_processpath", + "isVisible": true + }, + { + "fieldId": "incident_processpaths", + "isVisible": true + }, + { + "fieldId": "incident_processsha256", + "isVisible": true + }, + { + "fieldId": "incident_projectid", + "isVisible": true + }, + { + "fieldId": "incident_protocol", + "isVisible": true + }, + { + "fieldId": "incident_protocolnames", + "isVisible": true + }, + { + "fieldId": "incident_referencedresourceid", + "isVisible": true + }, + { + "fieldId": "incident_referencedresourcename", + "isVisible": true + }, + { + "fieldId": "incident_registryhive", + "isVisible": true + }, + { + "fieldId": "incident_registrykey", + "isVisible": true + }, + { + "fieldId": "incident_registryvalue", + "isVisible": true + }, + { + "fieldId": "incident_registryvaluetype", + "isVisible": true + }, + { + "fieldId": "incident_relatedalerts", + "isVisible": true + }, + { + "fieldId": "incident_relatedcampaign", + "isVisible": true + }, + { + "fieldId": "incident_relatedendpoints", + "isVisible": true + }, + { + "fieldId": "incident_relatedreport", + "isVisible": true + }, + { + "fieldId": "incident_remediationsla", + "isVisible": true + }, + { + "fieldId": "incident_renderedhtml", + "isVisible": true + }, + { + "fieldId": "incident_reportname", + "isVisible": true + }, + { + "fieldId": "incident_rulename", + "isVisible": true + }, + { + "fieldId": "incident_sha1", + "isVisible": true + }, + { + "fieldId": "incident_sha256", + "isVisible": true + }, + { + "fieldId": "incident_sha512", + "isVisible": true + }, + { + "fieldId": "incident_ssdeep", + "isVisible": true + }, + { + "fieldId": "incident_scenario", + "isVisible": true + }, + { + "fieldId": "incident_selectedindicators", + "isVisible": true + }, + { + "fieldId": "incident_similarincidentsdbot", + "isVisible": true + }, + { + "fieldId": "incident_sourcecategory", + "isVisible": true + }, + { + "fieldId": "incident_sourcecreatetime", + "isVisible": true + }, + { + "fieldId": "incident_sourcecreatedby", + "isVisible": true + }, + { + "fieldId": "incident_sourceexternalips", + "isVisible": true + }, + { + "fieldId": "incident_sourcehostname", + "isVisible": true + }, + { + "fieldId": "incident_sourceip", + "isVisible": true + }, + { + "fieldId": "incident_sourceid", + "isVisible": true + }, + { + "fieldId": "incident_sourcenetwork", + "isVisible": true + }, + { + "fieldId": "incident_sourcenetworks", + "isVisible": true + }, + { + "fieldId": "incident_sourceport", + "isVisible": true + }, + { + "fieldId": "incident_sourcepriority", + "isVisible": true + }, + { + "fieldId": "incident_sourcestatus", + "isVisible": true + }, + { + "fieldId": "incident_sourceupdatedby", + "isVisible": true + }, + { + "fieldId": "incident_sourceusername", + "isVisible": true + }, + { + "fieldId": "incident_srcs", + "isVisible": true + }, + { + "fieldId": "incident_state", + "isVisible": true + }, + { + "fieldId": "incident_statusreason", + "isVisible": true + }, + { + "fieldId": "incident_stringsimilarityresults", + "isVisible": true + }, + { + "fieldId": "incident_subcategory", + "isVisible": true + }, + { + "fieldId": "incident_suspiciousexecutions", + "isVisible": true + }, + { + "fieldId": "incident_suspiciousexecutionsfound", + "isVisible": true + }, + { + "fieldId": "incident_tactic", + "isVisible": true + }, + { + "fieldId": "incident_tacticid", + "isVisible": true + }, + { + "fieldId": "incident_tags", + "isVisible": true + }, + { + "fieldId": "incident_target", + "isVisible": true + }, + { + "fieldId": "incident_teamname", + "isVisible": true + }, + { + "fieldId": "incident_technique", + "isVisible": true + }, + { + "fieldId": "incident_techniqueid", + "isVisible": true + }, + { + "fieldId": "incident_tenantname", + "isVisible": true + }, + { + "fieldId": "incident_threatfamilyname", + "isVisible": true + }, + { + "fieldId": "incident_threathuntingdetectedhostnames", + "isVisible": true + }, + { + "fieldId": "incident_threathuntingdetectedip", + "isVisible": true + }, + { + "fieldId": "incident_threatid", + "isVisible": true + }, + { + "fieldId": "incident_threatname", + "isVisible": true + }, + { + "fieldId": "incident_ticketacknowledgeddate", + "isVisible": true + }, + { + "fieldId": "incident_ticketcloseddate", + "isVisible": true + }, + { + "fieldId": "incident_ticketnumber", + "isVisible": true + }, + { + "fieldId": "incident_ticketopeneddate", + "isVisible": true + }, + { + "fieldId": "incident_timetoassignment", + "isVisible": true + }, + { + "fieldId": "incident_toolusagefound", + "isVisible": true + }, + { + "fieldId": "incident_tools", + "isVisible": true + }, + { + "fieldId": "incident_triagesla", + "isVisible": true + }, + { + "fieldId": "incident_urlsslverification", + "isVisible": true + }, + { + "fieldId": "incident_urls", + "isVisible": true + }, + { + "fieldId": "incident_usecasedescription", + "isVisible": true + }, + { + "fieldId": "incident_useragent", + "isVisible": true + }, + { + "fieldId": "incident_userblockstatus", + "isVisible": true + }, + { + "fieldId": "incident_usercreationtime", + "isVisible": true + }, + { + "fieldId": "incident_userengagementresponse", + "isVisible": true + }, + { + "fieldId": "incident_usersid", + "isVisible": true + }, + { + "fieldId": "incident_users", + "isVisible": true + }, + { + "fieldId": "incident_usersdetails", + "isVisible": true + }, + { + "fieldId": "incident_verdict", + "isVisible": true + }, + { + "fieldId": "incident_appchannelname", + "isVisible": true + }, + { + "fieldId": "incident_samaccountname", + "isVisible": true + }, + { + "fieldId": "incident_similarincidents", + "isVisible": true + }, + { + "fieldId": "incident_testdatepicker", + "isVisible": true + }, + { + "fieldId": "incident_testnumber", + "isVisible": true + }, + { + "fieldId": "incident_testurl", + "isVisible": true + }, + { + "fieldId": "incident_useraccountcontrol", + "isVisible": true + } + ], + "isVisible": true, + "name": "Custom Fields", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + }, + { + "description": "", + "fields": [ + { + "fieldId": "incident_labels", + "isVisible": true + } + ], + "isVisible": true, + "name": "Labels", + "query": null, + "queryType": "", + "readOnly": true, + "type": "labels" + } + ] + }, + "quickViewV2": null, + "system": false, + "toServerVersion": "", + "version": -1 +} \ No newline at end of file From b16a425591693fa49f355fa2dd288f5240f451f3 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 4 Mar 2024 13:09:05 +0000 Subject: [PATCH 26/62] add run action --- Packs/Gem/Integrations/Gem/Gem.py | 46 ++++++++++++++++++++++++++++++ Packs/Gem/Integrations/Gem/Gem.yml | 19 ++++++++++++ 2 files changed, 65 insertions(+) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 78a9d65855ba..7bf57fb7c23b 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -27,6 +27,8 @@ UPDATE_THREAT_ENDPOINT = '../detection/threats/{id}/update_threat_status_v2' +RUN_ACTION_ENDPOINT = '../triage/containment/entity/run-action' + ''' CLIENT CLASS ''' @@ -287,6 +289,18 @@ def update_threat_status(self, threat_id: str, status: Optional[str], verdict: O ) return response + def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, alert_id: str, + resource_id: str) -> dict: + params = {'action': action, 'entity_id': entity_id, 'entity_type': entity_type, + 'alert_id': alert_id, 'resource_id': resource_id} + + response = self.http_request( + method='POST', + url_suffix=RUN_ACTION_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + ) + + return response ''' HELPER FUNCTIONS ''' @@ -566,6 +580,36 @@ def update_threat_status(client: GemClient, args: dict[str, Any]): client.update_threat_status(threat_id=threat_id, status=status, verdict=verdict, reason=reason) +def run_action_on_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + + action = args.get('action') + entity_id = args.get('entity_id') + entity_type = args.get('entity_type') + alert_id = args.get('alert_id') + resource_id = args.get('resource_id') + + if not action: + raise DemistoException('Action is a required parameter.') + if not entity_id: + raise DemistoException('Entity ID is a required parameter.') + if not entity_type: + raise DemistoException('Entity type is a required parameter.') + if not alert_id: + raise DemistoException('Alert ID is a required parameter.') + if not resource_id: + raise DemistoException('Resource ID is a required parameter.') + + result = client.run_action_on_entity(action=action, entity_id=entity_id, entity_type=entity_type, alert_id=alert_id, + resource_id=resource_id,) + + return CommandResults( + readable_output=tableToMarkdown('Run Result', result), + outputs_prefix='Gem.Run', + outputs_key_field='id', + outputs=result + ) + + ''' MAIN FUNCTION ''' @@ -616,6 +660,8 @@ def main() -> None: return_results(list_accessing_ips(client, args)) elif command == 'gem-update-threat-status': return_results(update_threat_status(client, args)) + elif command == 'gem-run-action': + return_results(run_action_on_entity(client, args)) elif command == 'fetch-incidents': fetch_threats(client) else: diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 27197b29ac76..8ea02dd66871 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -879,6 +879,25 @@ script: description: The reason for resolving the threat. required: false + - name: gem-run-action + description: Run an action on an entity. + arguments: + - name: action + description: The action to run. + required: true + - name: entity_id + description: The ID of the entity to run the action on. + required: true + - name: entity_type + description: The type of the entity to run the action on. + required: true + - name: alert_id + description: The ID of the alert to run the action on. + required: true + - name: resource_id + description: The ID of the resource to run the action on. + required: true + runonce: false script: "-" type: python From ac255a3e454834c7f7f3049b3546f7a72431e572 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 4 Mar 2024 13:15:08 +0000 Subject: [PATCH 27/62] wip --- .../incidentfield-Alert_Source.json | 2 +- .../IncidentFields/incidentfield-Gem_Url.json | 2 +- .../incidentfield-Threat_Id.json | 102 +++++++++--------- .../IncidentFields/incidentfield-Ttp_Id.json | 2 +- 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json b/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json index 358a35c25633..09b3d4ae18fe 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json +++ b/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_alertsource", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json index 14ca804b3070..89dc59c6f64b 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemurl", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json b/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json index ec2e8363f4d8..f5c4dc1dbcd1 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json +++ b/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json @@ -1,55 +1,55 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ "Gem Threat" ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "threatid", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_threatid", - "isReadOnly": false, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Threat Id", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "threatid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_threatid", + "isReadOnly": true, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Threat Id", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json b/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json index 60267ee89d83..cb51f9638f77 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json +++ b/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_ttpid", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", From 00593a2221f2a2d02d318f57ac918d18ed0a6a66 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 4 Mar 2024 13:54:12 +0000 Subject: [PATCH 28/62] wip --- ...lassifier-mapper-incoming-Gem-webhook.json | 38 ++++++------- .../classifier-mapper-incoming-Gem.json | 53 +++++++++--------- .../incidentfield-Alert_Time.json | 55 ------------------- .../incidentfield-Event_Time.json | 55 ------------------- ...json => incidentfield-Gem_Account_ID.json} | 6 +- ...on => incidentfield-Gem_Account_Name.json} | 6 +- .../incidentfield-Gem_Account_Provider.json | 55 +++++++++++++++++++ ...d.json => incidentfield-Gem_Alert_ID.json} | 6 +- ...on => incidentfield-Gem_Alert_Source.json} | 6 +- ...on => incidentfield-Gem_Events_Count.json} | 6 +- ... => incidentfield-Gem_Main_Entity_ID.json} | 6 +- ...> incidentfield-Gem_Main_Entity_Name.json} | 6 +- .../incidentfield-Gem_Main_Entity_Region.json | 55 +++++++++++++++++++ .../incidentfield-Gem_Main_Entity_Type.json | 55 +++++++++++++++++++ ...y.json => incidentfield-Gem_Severity.json} | 6 +- ..._Id.json => incidentfield-Gem_TTP_ID.json} | 6 +- .../incidentfield-Gem_Threat_ID.json | 55 +++++++++++++++++++ ...itle.json => incidentfield-Gem_Title.json} | 6 +- .../IncidentFields/incidentfield-Gem_Url.json | 2 +- ...ct.json => incidentfield-Gem_Verdict.json} | 6 +- .../incidentfield-Main_Entity_Name.json | 55 ------------------- .../incidentfield-Main_Entity_Region.json | 55 ------------------- .../incidentfield-Main_Entity_Type.json | 55 ------------------- 23 files changed, 301 insertions(+), 353 deletions(-) delete mode 100644 Packs/Gem/IncidentFields/incidentfield-Alert_Time.json delete mode 100644 Packs/Gem/IncidentFields/incidentfield-Event_Time.json rename Packs/Gem/IncidentFields/{incidentfield-Account_Id.json => incidentfield-Gem_Account_ID.json} (92%) rename Packs/Gem/IncidentFields/{incidentfield-Account_Name.json => incidentfield-Gem_Account_Name.json} (91%) create mode 100644 Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json rename Packs/Gem/IncidentFields/{incidentfield-Threat_Id.json => incidentfield-Gem_Alert_ID.json} (92%) rename Packs/Gem/IncidentFields/{incidentfield-Alert_Source.json => incidentfield-Gem_Alert_Source.json} (91%) rename Packs/Gem/IncidentFields/{incidentfield-Events_Count.json => incidentfield-Gem_Events_Count.json} (91%) rename Packs/Gem/IncidentFields/{incidentfield-Account_Provider.json => incidentfield-Gem_Main_Entity_ID.json} (91%) rename Packs/Gem/IncidentFields/{incidentfield-Main_Entity_Id.json => incidentfield-Gem_Main_Entity_Name.json} (90%) create mode 100644 Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json create mode 100644 Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json rename Packs/Gem/IncidentFields/{incidentfield-Severity.json => incidentfield-Gem_Severity.json} (92%) rename Packs/Gem/IncidentFields/{incidentfield-Ttp_Id.json => incidentfield-Gem_TTP_ID.json} (93%) create mode 100644 Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json rename Packs/Gem/IncidentFields/{incidentfield-Title.json => incidentfield-Gem_Title.json} (93%) rename Packs/Gem/IncidentFields/{incidentfield-Verdict.json => incidentfield-Gem_Verdict.json} (93%) delete mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json delete mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json delete mode 100644 Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index dcd608f51c77..640fb3169f76 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -16,55 +16,52 @@ "Gem Threat": { "dontMapEventToLabels": false, "internalMapping": { - "Account Id": { + "Gem Account ID": { "simple": "account.name" }, - "Account Name": { + "Gem Account Name": { "simple": "account.display_name" }, - "Account Provider": { + "Gem Account Provider": { "simple": "account.cloud_provider" }, - "Alert ID": { + "Gem Alert ID": { "simple": "event.alert_id" }, - "Alert Source": { + "Gem Alert Source": { "simple": "event.alert_source" }, - "Alert Time": { - "simple": "event.created_at" + "Occurred": { + "simple": "event_datetime" }, "Description": { "simple": "description" }, - "Event Time": { - "simple": "event_datetime" - }, - "Events Count": { + "Gem Events Count": { "simple": "event.events_total_count" }, - "Gem Url": { + "Gem URL": { "simple": "link" }, - "Main Entity Id": { + "Gem Main Entity ID": { "simple": "event.main_entity.id" }, - "Main Entity Name": { + "Gem Main Entity Name": { "simple": "event.main_entity.name" }, - "Main Entity Region": { + "Gem Main Entity Region": { "simple": "event.main_entity.metadata.region" }, - "Main Entity Type": { + "Gem Main Entity Type": { "simple": "event.main_entity.type" }, - "Threat Id": { + "Gem Threat ID": { "simple": "event.threat_id" }, - "Title": { + "Gem Title": { "simple": "title" }, - "Ttp Id": { + "Gem TTP ID": { "simple": "event.ttp_id" }, "name": { @@ -72,6 +69,9 @@ }, "severity": { "simple": "severity_text" + }, + "Gem Severity": { + "simple": "severity" } } } diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index 34f3a120a773..98547c4979c5 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -9,58 +9,61 @@ "Gem Threat": { "dontMapEventToLabels": false, "internalMapping": { - "Account Id": { + "Gem Account ID": { "simple": "account.name" }, - "Account Name": { + "Gem Account Name": { "simple": "account.display_name" }, - "Account Provider": { + "Gem Account Provider": { "simple": "account.cloud_provider" }, - "Alert ID": { - "simple": "metadata.alert_id" + "Gem Alert ID": { + "simple": "event.alert_id" }, - "Alert Source": { - "simple": "metadata.alert_source" + "Gem Alert Source": { + "simple": "event.alert_source" }, - "Alert Time": { + "Occurred": { "simple": "event_datetime" }, "Description": { "simple": "description" }, - "Event ID": { - "simple": "metadata.events.[0].id" + "Gem Events Count": { + "simple": "event.events_total_count" }, - "Events Count": { - "simple": "metadata.events_total_count" - }, - "Gem Url": { + "Gem URL": { "simple": "link" }, - "Main Entity Id": { - "simple": "metadata.main_entity.id" + "Gem Main Entity ID": { + "simple": "event.main_entity.id" + }, + "Gem Main Entity Name": { + "simple": "event.main_entity.name" }, - "Main Entity Name": { - "simple": "metadata.main_entity.name" + "Gem Main Entity Region": { + "simple": "event.main_entity.metadata.region" }, - "Main Entity Type": { - "simple": "metadata.main_entity.type" + "Gem Main Entity Type": { + "simple": "event.main_entity.type" }, - "Threat Id": { - "simple": "metadata.threat_id" + "Gem Threat ID": { + "simple": "event.threat_id" }, - "Title": { + "Gem Title": { "simple": "title" }, - "Ttp Id": { - "simple": "metadata.ttp_id" + "Gem TTP ID": { + "simple": "event.ttp_id" }, "name": { "simple": "title" }, "severity": { + "simple": "severity_text" + }, + "Gem Severity": { "simple": "severity" } } diff --git a/Packs/Gem/IncidentFields/incidentfield-Alert_Time.json b/Packs/Gem/IncidentFields/incidentfield-Alert_Time.json deleted file mode 100644 index c2ab22b50548..000000000000 --- a/Packs/Gem/IncidentFields/incidentfield-Alert_Time.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Threat" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "alerttime", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_alerttime", - "isReadOnly": false, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Alert Time", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "date", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "date", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" -} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Event_Time.json b/Packs/Gem/IncidentFields/incidentfield-Event_Time.json deleted file mode 100644 index 9a7557aec6c9..000000000000 --- a/Packs/Gem/IncidentFields/incidentfield-Event_Time.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Threat" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "eventtime", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_eventtime", - "isReadOnly": false, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Event Time", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "date", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "date", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" -} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Account_Id.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json similarity index 92% rename from Packs/Gem/IncidentFields/incidentfield-Account_Id.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json index 581066ada42e..445311ddef8d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Account_Id.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "accountid", + "cliName": "gemaccountid", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_accountid", + "id": "incident_gemaccountid", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Account Id", + "name": "Gem Account ID", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Account_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json similarity index 91% rename from Packs/Gem/IncidentFields/incidentfield-Account_Name.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json index 2f15d1100a45..8b262b9c60e5 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Account_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "accountname", + "cliName": "gemaccountname", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_accountname", + "id": "incident_gemaccountname", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Account Name", + "name": "Gem Account Name", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json new file mode 100644 index 000000000000..18e7bf2e940e --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "gemaccountprovider", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_gemaccountprovider", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Gem Account Provider", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json similarity index 92% rename from Packs/Gem/IncidentFields/incidentfield-Threat_Id.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json index f5c4dc1dbcd1..44f891a628f4 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Threat_Id.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "threatid", + "cliName": "gemalertid", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_threatid", + "id": "incident_gemalertid", "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Threat Id", + "name": "Gem Alert ID", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json similarity index 91% rename from Packs/Gem/IncidentFields/incidentfield-Alert_Source.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json index 09b3d4ae18fe..b29a98e849e7 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Alert_Source.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "alertsource", + "cliName": "gemalertsource", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_alertsource", + "id": "incident_gemalertsource", "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Alert Source", + "name": "Gem Alert Source", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Events_Count.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json similarity index 91% rename from Packs/Gem/IncidentFields/incidentfield-Events_Count.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json index c57a2785d809..0ca474676f05 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Events_Count.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "eventscount", + "cliName": "gemeventscount", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_eventscount", + "id": "incident_gemeventscount", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Events Count", + "name": "Gem Events Count", "neverSetAsRequired": false, "openEnded": false, "orgType": "number", diff --git a/Packs/Gem/IncidentFields/incidentfield-Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json similarity index 91% rename from Packs/Gem/IncidentFields/incidentfield-Account_Provider.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json index 65eb9562aa56..2a4013ac8811 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Account_Provider.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "accountprovider", + "cliName": "gemmainentityid", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_accountprovider", + "id": "incident_gemmainentityid", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Account Provider", + "name": "Gem Main Entity ID", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json similarity index 90% rename from Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json index b9dd6bcc72ae..f87f722034d7 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Id.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "mainentityid", + "cliName": "gemmainentityname", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_mainentityid", + "id": "incident_gemmainentityname", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Main Entity Id", + "name": "Gem Main Entity Name", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json new file mode 100644 index 000000000000..522a52668637 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "gemmainentityregion", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_gemmainentityregion", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Gem Main Entity Region", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json new file mode 100644 index 000000000000..e3140516da12 --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "gemmainentitytype", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_gemmainentitytype", + "isReadOnly": false, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Gem Main Entity Type", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Severity.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json similarity index 92% rename from Packs/Gem/IncidentFields/incidentfield-Severity.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json index 563655afdfe8..3922dd58530d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Severity.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "severity", + "cliName": "gemseverity", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_severity", + "id": "incident_gemseverity", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Severity", + "name": "Gem Severity", "neverSetAsRequired": false, "openEnded": false, "orgType": "number", diff --git a/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json similarity index 93% rename from Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json index cb51f9638f77..caa6a6536ac7 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Ttp_Id.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "ttpid", + "cliName": "gemttpid", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_ttpid", + "id": "incident_gemttpid", "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Ttp Id", + "name": "Gem TTP ID", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json new file mode 100644 index 000000000000..558d8419a1ca --- /dev/null +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json @@ -0,0 +1,55 @@ +{ + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Threat" + ], + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "gemthreatid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_gemthreatid", + "isReadOnly": true, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Gem Threat ID", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" +} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Title.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json similarity index 93% rename from Packs/Gem/IncidentFields/incidentfield-Title.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Title.json index e338718be8ea..f1d738e25cd0 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Title.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "title", + "cliName": "gemtitle", "closeForm": false, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_title", + "id": "incident_gemtitle", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Title", + "name": "Gem Title", "neverSetAsRequired": false, "openEnded": false, "orgType": "shortText", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json index 89dc59c6f64b..e778c3e71350 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json @@ -26,7 +26,7 @@ "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Gem Url", + "name": "Gem URL", "neverSetAsRequired": false, "openEnded": false, "orgType": "url", diff --git a/Packs/Gem/IncidentFields/incidentfield-Verdict.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json similarity index 93% rename from Packs/Gem/IncidentFields/incidentfield-Verdict.json rename to Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json index b0edf726f0bc..147af8c27cd7 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Verdict.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json @@ -9,7 +9,7 @@ "breachScript": "", "cacheVersn": 0, "caseInsensitive": true, - "cliName": "verdict", + "cliName": "gemverdict", "closeForm": true, "columns": null, "content": false, @@ -21,12 +21,12 @@ "fromServerVersion": "", "group": 0, "hidden": false, - "id": "incident_verdict", + "id": "incident_gemverdict", "isReadOnly": false, "itemVersion": "", "locked": false, "mergeStrategy": "", - "name": "Verdict", + "name": "Gem Verdict", "neverSetAsRequired": false, "openEnded": false, "orgType": "singleSelect", diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json deleted file mode 100644 index ea63ce1ce002..000000000000 --- a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Name.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Threat" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "mainentityname", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_mainentityname", - "isReadOnly": false, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Main Entity Name", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" -} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json deleted file mode 100644 index 88c64fb283ce..000000000000 --- a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Region.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Threat" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "mainentityregion", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_mainentityregion", - "isReadOnly": false, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Main Entity Region", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" -} \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json deleted file mode 100644 index 669c129a3622..000000000000 --- a/Packs/Gem/IncidentFields/incidentfield-Main_Entity_Type.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Threat" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "mainentitytype", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_mainentitytype", - "isReadOnly": false, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Main Entity Type", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" -} \ No newline at end of file From 15f5b6ca8c29c064a0c3fe71d1d06468b82e29c8 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 4 Mar 2024 14:14:20 +0000 Subject: [PATCH 29/62] wip --- ...lassifier-mapper-incoming-Gem-webhook.json | 10 +- .../classifier-mapper-incoming-Gem.json | 10 +- .../Layouts/layoutscontainer-Gem_Layout.json | 2297 +---------------- 3 files changed, 88 insertions(+), 2229 deletions(-) diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 640fb3169f76..24c053d60060 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -31,7 +31,7 @@ "Gem Alert Source": { "simple": "event.alert_source" }, - "Occurred": { + "occurred": { "simple": "event_datetime" }, "Description": { @@ -74,6 +74,14 @@ "simple": "severity" } } + }, + "dbot_classification_incident_type_all": { + "dontMapEventToLabels": false, + "internalMapping": { + "occurred": { + "simple": "event_datetime" + } + } } }, "id": "Gem-mapper-webhook", diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index 98547c4979c5..e4439f69d619 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -24,7 +24,7 @@ "Gem Alert Source": { "simple": "event.alert_source" }, - "Occurred": { + "occurred": { "simple": "event_datetime" }, "Description": { @@ -67,6 +67,14 @@ "simple": "severity" } } + }, + "dbot_classification_incident_type_all": { + "dontMapEventToLabels": false, + "internalMapping": { + "occurred": { + "simple": "event_datetime" + } + } } }, "version": -1 diff --git a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json index 04e8f952fae7..26d79c0bb837 100644 --- a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json +++ b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json @@ -1,43 +1,6 @@ { "cacheVersn": 0, - "close": { - "sections": [ - { - "description": "", - "fields": [ - { - "fieldId": "incident_closereason", - "isVisible": true - }, - { - "fieldId": "incident_closenotes", - "isVisible": true - } - ], - "isVisible": true, - "name": "Basic Information", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - }, - { - "description": "", - "fields": [ - { - "fieldId": "incident_verdict", - "isVisible": true - } - ], - "isVisible": true, - "name": "Custom Fields", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - } - ] - }, + "close": null, "definitionId": "", "description": "", "detached": false, @@ -116,48 +79,32 @@ }, { "endCol": 2, - "fieldId": "threatid", + "fieldId": "gemthreatid", "height": 22, - "id": "266e6a70-d9c1-11ee-9bad-cf4eea417a3f", + "id": "3d6bff30-da2f-11ee-9447-69eb690acaf3", "index": 6, "sectionItemType": "field", "startCol": 0 }, { + "dropEffect": "move", "endCol": 2, "fieldId": "gemurl", "height": 22, - "id": "f5b8c7e0-d9c0-11ee-9bad-cf4eea417a3f", + "id": "3ab48050-da2f-11ee-9447-69eb690acaf3", "index": 7, + "listId": "caseinfoid-fce71720-98b0-11e9-97d7-ed26ef9e46c8", "sectionItemType": "field", "startCol": 0 }, { "endCol": 2, - "fieldId": "alerttime", + "fieldId": "gemttpid", "height": 22, - "id": "9c5f4970-d9c1-11ee-9bad-cf4eea417a3f", + "id": "f4174d70-da2f-11ee-9447-69eb690acaf3", "index": 8, "sectionItemType": "field", "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "ttpid", - "height": 22, - "id": "d28a0440-d9c1-11ee-9bad-cf4eea417a3f", - "index": 9, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "alertsource", - "height": 22, - "id": "c8759a50-d9c1-11ee-9bad-cf4eea417a3f", - "index": 9, - "sectionItemType": "field", - "startCol": 0 } ], "maxW": 3, @@ -203,9 +150,9 @@ "name": "Linked Incidents", "static": false, "type": "linkedIncidents", - "w": 2, - "x": 0, - "y": 8 + "w": 1, + "x": 1, + "y": 6 }, { "displayType": "ROW", @@ -218,7 +165,7 @@ "type": "childInv", "w": 1, "x": 2, - "y": 4 + "y": 8 }, { "displayType": "ROW", @@ -229,8 +176,8 @@ "name": "Evidence", "static": false, "type": "evidence", - "w": 2, - "x": 0, + "w": 1, + "x": 2, "y": 6 }, { @@ -244,23 +191,8 @@ "static": false, "type": "team", "w": 1, - "x": 2, - "y": 8 - }, - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-7ce69dd0-a07f-11e9-936c-5395a1acf11e", - "maxW": 3, - "moved": false, - "name": "Indicators", - "query": "", - "queryType": "input", - "static": false, - "type": "indicators", - "w": 2, "x": 0, - "y": 4 + "y": 6 }, { "displayType": "CARD", @@ -281,7 +213,7 @@ "fieldId": "dbotmodified", "height": 53, "id": "incident-modified-field", - "index": 2, + "index": 1, "sectionItemType": "field", "startCol": 0 }, @@ -308,7 +240,7 @@ "fieldId": "dbotclosed", "height": 53, "id": "incident-closed-field", - "index": 2, + "index": 1, "sectionItemType": "field", "startCol": 1 } @@ -360,101 +292,104 @@ "name": "Closing Information", "static": false, "w": 1, - "x": 2, - "y": 6 + "x": 0, + "y": 4 }, { "displayType": "CARD", - "h": 2, + "h": 4, "i": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", "isVisible": true, "items": [ { - "endCol": 2, + "endCol": 4, "fieldId": "description", "height": 53, - "id": "8b7c03a0-d9c1-11ee-9bad-cf4eea417a3f", + "id": "0208ca80-da30-11ee-9447-69eb690acaf3", "index": 0, "sectionItemType": "field", "startCol": 0 }, { - "dropEffect": "move", "endCol": 2, - "fieldId": "accountprovider", + "fieldId": "gemaccountid", "height": 53, - "id": "ab71c6e0-d9c1-11ee-9bad-cf4eea417a3f", - "index": 1, - "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "id": "7bd9bf50-da2f-11ee-9447-69eb690acaf3", + "index": 2, "sectionItemType": "field", "startCol": 0 }, { "endCol": 2, - "fieldId": "accountname", + "fieldId": "gemaccountname", "height": 53, - "id": "b2a9ebe0-d9c1-11ee-9bad-cf4eea417a3f", - "index": 2, + "id": "804b7150-da2f-11ee-9447-69eb690acaf3", + "index": 3, "sectionItemType": "field", "startCol": 0 }, { "endCol": 2, - "fieldId": "cloudaccountid", + "fieldId": "gemaccountprovider", "height": 53, - "id": "af737900-d9c1-11ee-9bad-cf4eea417a3f", - "index": 3, + "id": "829fe8a0-da2f-11ee-9447-69eb690acaf3", + "index": 4, "sectionItemType": "field", "startCol": 0 }, { "endCol": 2, - "fieldId": "eventscount", + "fieldId": "gemalertsource", "height": 53, - "id": "e37671d0-d9c1-11ee-9bad-cf4eea417a3f", - "index": 4, + "id": "8d3394b0-da2f-11ee-9447-69eb690acaf3", + "index": 5, + "sectionItemType": "field", + "startCol": 0 + }, + { + "dropEffect": "move", + "endCol": 2, + "fieldId": "gemeventscount", + "height": 53, + "id": "c2e68770-da2f-11ee-9447-69eb690acaf3", + "index": 6, + "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", "sectionItemType": "field", "startCol": 0 }, { "endCol": 4, - "fieldId": "mainentitytype", + "fieldId": "gemmainentityid", "height": 53, - "id": "dabc40b0-d9c1-11ee-9bad-cf4eea417a3f", - "index": 0, + "id": "d9086c30-da2f-11ee-9447-69eb690acaf3", + "index": 2, "sectionItemType": "field", "startCol": 2 }, { - "dropEffect": "move", "endCol": 4, - "fieldId": "mainentityname", + "fieldId": "gemmainentityname", "height": 53, - "id": "de1556c0-d9c1-11ee-9bad-cf4eea417a3f", - "index": 1, - "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "id": "daf0b430-da2f-11ee-9447-69eb690acaf3", + "index": 3, "sectionItemType": "field", "startCol": 2 }, { - "dropEffect": "move", "endCol": 4, - "fieldId": "mainentityid", + "fieldId": "gemmainentityregion", "height": 53, - "id": "d7b12390-d9c1-11ee-9bad-cf4eea417a3f", - "index": 2, - "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "id": "dc4b6230-da2f-11ee-9447-69eb690acaf3", + "index": 4, "sectionItemType": "field", "startCol": 2 }, { - "dropEffect": "move", "endCol": 4, - "fieldId": "mainentityregion", + "fieldId": "gemmainentitytype", "height": 53, - "id": "dfbb1780-d9c1-11ee-9bad-cf4eea417a3f", - "index": 3, - "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "id": "dda39f30-da2f-11ee-9447-69eb690acaf3", + "index": 5, "sectionItemType": "field", "startCol": 2 } @@ -497,2111 +432,19 @@ } ] }, - "edit": { - "sections": [ - { - "description": "", - "fields": [ - { - "fieldId": "incident_name", - "isVisible": true - }, - { - "fieldId": "incident_occurred", - "isVisible": true - }, - { - "fieldId": "incident_reminder", - "isVisible": true - }, - { - "fieldId": "incident_owner", - "isVisible": true - }, - { - "fieldId": "incident_roles", - "isVisible": true - }, - { - "fieldId": "incident_type", - "isVisible": true - }, - { - "fieldId": "incident_severity", - "isVisible": true - }, - { - "fieldId": "incident_playbookid", - "isVisible": true - }, - { - "fieldId": "incident_labels", - "isVisible": true - }, - { - "fieldId": "incident_phase", - "isVisible": true - }, - { - "fieldId": "incident_details", - "isVisible": true - }, - { - "fieldId": "incident_attachment", - "isVisible": true - } - ], - "isVisible": true, - "name": "Basic Information", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - }, - { - "description": "", - "fields": [ - { - "fieldId": "incident_asn", - "isVisible": true - }, - { - "fieldId": "incident_asnname", - "isVisible": true - }, - { - "fieldId": "incident_accountmemberof", - "isVisible": true - }, - { - "fieldId": "incident_accountstatus", - "isVisible": true - }, - { - "fieldId": "incident_additionaldata", - "isVisible": true - }, - { - "fieldId": "incident_additionalindicators", - "isVisible": true - }, - { - "fieldId": "incident_affectedhosts", - "isVisible": true - }, - { - "fieldId": "incident_affectedusers", - "isVisible": true - }, - { - "fieldId": "incident_agentid", - "isVisible": true - }, - { - "fieldId": "incident_agentversion", - "isVisible": true - }, - { - "fieldId": "incident_agentsid", - "isVisible": true - }, - { - "fieldId": "incident_alertcategory", - "isVisible": true - }, - { - "fieldId": "incident_alertid", - "isVisible": true - }, - { - "fieldId": "incident_alertname", - "isVisible": true - }, - { - "fieldId": "incident_alerttypeid", - "isVisible": true - }, - { - "fieldId": "incident_app", - "isVisible": true - }, - { - "fieldId": "incident_appmessage", - "isVisible": true - }, - { - "fieldId": "incident_assigneduser", - "isVisible": true - }, - { - "fieldId": "incident_assignmentgroup", - "isVisible": true - }, - { - "fieldId": "incident_attackpatterns", - "isVisible": true - }, - { - "fieldId": "incident_birthday", - "isVisible": true - }, - { - "fieldId": "incident_blockindicatorsstatus", - "isVisible": true - }, - { - "fieldId": "incident_cmd", - "isVisible": true - }, - { - "fieldId": "incident_cmdline", - "isVisible": true - }, - { - "fieldId": "incident_cvelist", - "isVisible": true - }, - { - "fieldId": "incident_caller", - "isVisible": true - }, - { - "fieldId": "incident_campaignname", - "isVisible": true - }, - { - "fieldId": "incident_categories", - "isVisible": true - }, - { - "fieldId": "incident_changed", - "isVisible": true - }, - { - "fieldId": "incident_childprocess", - "isVisible": true - }, - { - "fieldId": "incident_classification", - "isVisible": true - }, - { - "fieldId": "incident_cloudaccountid", - "isVisible": true - }, - { - "fieldId": "incident_cloudinstanceid", - "isVisible": true - }, - { - "fieldId": "incident_cloudoperationtype", - "isVisible": true - }, - { - "fieldId": "incident_commandline", - "isVisible": true - }, - { - "fieldId": "incident_commandlineverdict", - "isVisible": true - }, - { - "fieldId": "incident_comment", - "isVisible": true - }, - { - "fieldId": "incident_country", - "isVisible": true - }, - { - "fieldId": "incident_countrycode", - "isVisible": true - }, - { - "fieldId": "incident_countrycodenumber", - "isVisible": true - }, - { - "fieldId": "incident_customqueryresults", - "isVisible": true - }, - { - "fieldId": "incident_description", - "isVisible": true - }, - { - "fieldId": "incident_destinationhostname", - "isVisible": true - }, - { - "fieldId": "incident_destinationip", - "isVisible": true - }, - { - "fieldId": "incident_destinationnetwork", - "isVisible": true - }, - { - "fieldId": "incident_destinationnetworks", - "isVisible": true - }, - { - "fieldId": "incident_destinationport", - "isVisible": true - }, - { - "fieldId": "incident_detectedendpoints", - "isVisible": true - }, - { - "fieldId": "incident_detectedips", - "isVisible": true - }, - { - "fieldId": "incident_detecteduser", - "isVisible": true - }, - { - "fieldId": "incident_detectionurl", - "isVisible": true - }, - { - "fieldId": "incident_deviceexternalip", - "isVisible": true - }, - { - "fieldId": "incident_deviceexternalips", - "isVisible": true - }, - { - "fieldId": "incident_devicehash", - "isVisible": true - }, - { - "fieldId": "incident_deviceid", - "isVisible": true - }, - { - "fieldId": "incident_deviceinternalips", - "isVisible": true - }, - { - "fieldId": "incident_devicelocalip", - "isVisible": true - }, - { - "fieldId": "incident_devicemacaddress", - "isVisible": true - }, - { - "fieldId": "incident_devicemodel", - "isVisible": true - }, - { - "fieldId": "incident_devicename", - "isVisible": true - }, - { - "fieldId": "incident_deviceosname", - "isVisible": true - }, - { - "fieldId": "incident_deviceosversion", - "isVisible": true - }, - { - "fieldId": "incident_deviceou", - "isVisible": true - }, - { - "fieldId": "incident_deviceusername", - "isVisible": true - }, - { - "fieldId": "incident_domainname", - "isVisible": true - }, - { - "fieldId": "incident_dsts", - "isVisible": true - }, - { - "fieldId": "incident_endpoint", - "isVisible": true - }, - { - "fieldId": "incident_endpointisolationstatus", - "isVisible": true - }, - { - "fieldId": "incident_endpointsdetails", - "isVisible": true - }, - { - "fieldId": "incident_escalation", - "isVisible": true - }, - { - "fieldId": "incident_eventid", - "isVisible": true - }, - { - "fieldId": "incident_eventtype", - "isVisible": true - }, - { - "fieldId": "incident_externalcategoryid", - "isVisible": true - }, - { - "fieldId": "incident_externalcategoryname", - "isVisible": true - }, - { - "fieldId": "incident_externalconfidence", - "isVisible": true - }, - { - "fieldId": "incident_externalendtime", - "isVisible": true - }, - { - "fieldId": "incident_externallink", - "isVisible": true - }, - { - "fieldId": "incident_externalseverity", - "isVisible": true - }, - { - "fieldId": "incident_externalstarttime", - "isVisible": true - }, - { - "fieldId": "incident_externalstatus", - "isVisible": true - }, - { - "fieldId": "incident_externalsubcategoryid", - "isVisible": true - }, - { - "fieldId": "incident_externalsubcategoryname", - "isVisible": true - }, - { - "fieldId": "incident_externalsystemid", - "isVisible": true - }, - { - "fieldId": "incident_failedlogonevents", - "isVisible": true - }, - { - "fieldId": "incident_failedlogoneventstimeframe", - "isVisible": true - }, - { - "fieldId": "incident_filehash", - "isVisible": true - }, - { - "fieldId": "incident_filemd5", - "isVisible": true - }, - { - "fieldId": "incident_filename", - "isVisible": true - }, - { - "fieldId": "incident_filenames", - "isVisible": true - }, - { - "fieldId": "incident_filepath", - "isVisible": true - }, - { - "fieldId": "incident_filepaths", - "isVisible": true - }, - { - "fieldId": "incident_filerelationships", - "isVisible": true - }, - { - "fieldId": "incident_filesha1", - "isVisible": true - }, - { - "fieldId": "incident_filesha256", - "isVisible": true - }, - { - "fieldId": "incident_filesize", - "isVisible": true - }, - { - "fieldId": "incident_fileupload", - "isVisible": true - }, - { - "fieldId": "incident_firstname", - "isVisible": true - }, - { - "fieldId": "incident_fullname", - "isVisible": true - }, - { - "fieldId": "incident_highriskyhosts", - "isVisible": true - }, - { - "fieldId": "incident_highriskyusers", - "isVisible": true - }, - { - "fieldId": "incident_hostnames", - "isVisible": true - }, - { - "fieldId": "incident_huntresultscount", - "isVisible": true - }, - { - "fieldId": "incident_ipblockedstatus", - "isVisible": true - }, - { - "fieldId": "incident_ipreputation", - "isVisible": true - }, - { - "fieldId": "incident_identitytype", - "isVisible": true - }, - { - "fieldId": "incident_incidentlink", - "isVisible": true - }, - { - "fieldId": "incident_incomingmirrorerror", - "isVisible": true - }, - { - "fieldId": "incident_investigationstage", - "isVisible": true - }, - { - "fieldId": "incident_isactive", - "isVisible": true - }, - { - "fieldId": "incident_lastmirroredtimestamp", - "isVisible": true - }, - { - "fieldId": "incident_lastname", - "isVisible": true - }, - { - "fieldId": "incident_logsource", - "isVisible": true - }, - { - "fieldId": "incident_lowlevelcategoriesevents", - "isVisible": true - }, - { - "fieldId": "incident_macaddress", - "isVisible": true - }, - { - "fieldId": "incident_md5", - "isVisible": true - }, - { - "fieldId": "incident_mitretacticid", - "isVisible": true - }, - { - "fieldId": "incident_mitretacticname", - "isVisible": true - }, - { - "fieldId": "incident_mitretechniqueid", - "isVisible": true - }, - { - "fieldId": "incident_mitretechniquename", - "isVisible": true - }, - { - "fieldId": "incident_mobiledevicemodel", - "isVisible": true - }, - { - "fieldId": "incident_numberoffoundrelatedalerts", - "isVisible": true - }, - { - "fieldId": "incident_numberofrelatedincidents", - "isVisible": true - }, - { - "fieldId": "incident_numberofsimilarfiles", - "isVisible": true - }, - { - "fieldId": "incident_os", - "isVisible": true - }, - { - "fieldId": "incident_ostype", - "isVisible": true - }, - { - "fieldId": "incident_osversion", - "isVisible": true - }, - { - "fieldId": "incident_objective", - "isVisible": true - }, - { - "fieldId": "incident_operationname", - "isVisible": true - }, - { - "fieldId": "incident_orglevel1", - "isVisible": true - }, - { - "fieldId": "incident_orglevel2", - "isVisible": true - }, - { - "fieldId": "incident_orglevel3", - "isVisible": true - }, - { - "fieldId": "incident_orgunit", - "isVisible": true - }, - { - "fieldId": "incident_outgoingmirrorerror", - "isVisible": true - }, - { - "fieldId": "incident_pid", - "isVisible": true - }, - { - "fieldId": "incident_parentcmdline", - "isVisible": true - }, - { - "fieldId": "incident_parentprocess", - "isVisible": true - }, - { - "fieldId": "incident_parentprocesscmd", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessfilepath", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessids", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessmd5", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessname", - "isVisible": true - }, - { - "fieldId": "incident_parentprocesspath", - "isVisible": true - }, - { - "fieldId": "incident_parentprocesssha256", - "isVisible": true - }, - { - "fieldId": "incident_passwordchangeddate", - "isVisible": true - }, - { - "fieldId": "incident_phonenumber", - "isVisible": true - }, - { - "fieldId": "incident_policyactions", - "isVisible": true - }, - { - "fieldId": "incident_processcmd", - "isVisible": true - }, - { - "fieldId": "incident_processcreationtime", - "isVisible": true - }, - { - "fieldId": "incident_processid", - "isVisible": true - }, - { - "fieldId": "incident_processmd5", - "isVisible": true - }, - { - "fieldId": "incident_processname", - "isVisible": true - }, - { - "fieldId": "incident_processnames", - "isVisible": true - }, - { - "fieldId": "incident_processpath", - "isVisible": true - }, - { - "fieldId": "incident_processpaths", - "isVisible": true - }, - { - "fieldId": "incident_processsha256", - "isVisible": true - }, - { - "fieldId": "incident_projectid", - "isVisible": true - }, - { - "fieldId": "incident_protocol", - "isVisible": true - }, - { - "fieldId": "incident_protocolnames", - "isVisible": true - }, - { - "fieldId": "incident_referencedresourceid", - "isVisible": true - }, - { - "fieldId": "incident_referencedresourcename", - "isVisible": true - }, - { - "fieldId": "incident_registryhive", - "isVisible": true - }, - { - "fieldId": "incident_registrykey", - "isVisible": true - }, - { - "fieldId": "incident_registryvalue", - "isVisible": true - }, - { - "fieldId": "incident_registryvaluetype", - "isVisible": true - }, - { - "fieldId": "incident_relatedalerts", - "isVisible": true - }, - { - "fieldId": "incident_relatedcampaign", - "isVisible": true - }, - { - "fieldId": "incident_relatedendpoints", - "isVisible": true - }, - { - "fieldId": "incident_relatedreport", - "isVisible": true - }, - { - "fieldId": "incident_renderedhtml", - "isVisible": true - }, - { - "fieldId": "incident_reportname", - "isVisible": true - }, - { - "fieldId": "incident_rulename", - "isVisible": true - }, - { - "fieldId": "incident_sha1", - "isVisible": true - }, - { - "fieldId": "incident_sha256", - "isVisible": true - }, - { - "fieldId": "incident_sha512", - "isVisible": true - }, - { - "fieldId": "incident_ssdeep", - "isVisible": true - }, - { - "fieldId": "incident_scenario", - "isVisible": true - }, - { - "fieldId": "incident_selectedindicators", - "isVisible": true - }, - { - "fieldId": "incident_similarincidentsdbot", - "isVisible": true - }, - { - "fieldId": "incident_sourcecategory", - "isVisible": true - }, - { - "fieldId": "incident_sourcecreatetime", - "isVisible": true - }, - { - "fieldId": "incident_sourcecreatedby", - "isVisible": true - }, - { - "fieldId": "incident_sourceexternalips", - "isVisible": true - }, - { - "fieldId": "incident_sourcehostname", - "isVisible": true - }, - { - "fieldId": "incident_sourceip", - "isVisible": true - }, - { - "fieldId": "incident_sourceid", - "isVisible": true - }, - { - "fieldId": "incident_sourcenetwork", - "isVisible": true - }, - { - "fieldId": "incident_sourcenetworks", - "isVisible": true - }, - { - "fieldId": "incident_sourceport", - "isVisible": true - }, - { - "fieldId": "incident_sourcepriority", - "isVisible": true - }, - { - "fieldId": "incident_sourcestatus", - "isVisible": true - }, - { - "fieldId": "incident_sourceupdatedby", - "isVisible": true - }, - { - "fieldId": "incident_sourceusername", - "isVisible": true - }, - { - "fieldId": "incident_srcs", - "isVisible": true - }, - { - "fieldId": "incident_state", - "isVisible": true - }, - { - "fieldId": "incident_statusreason", - "isVisible": true - }, - { - "fieldId": "incident_stringsimilarityresults", - "isVisible": true - }, - { - "fieldId": "incident_subcategory", - "isVisible": true - }, - { - "fieldId": "incident_suspiciousexecutions", - "isVisible": true - }, - { - "fieldId": "incident_suspiciousexecutionsfound", - "isVisible": true - }, - { - "fieldId": "incident_tactic", - "isVisible": true - }, - { - "fieldId": "incident_tacticid", - "isVisible": true - }, - { - "fieldId": "incident_tags", - "isVisible": true - }, - { - "fieldId": "incident_target", - "isVisible": true - }, - { - "fieldId": "incident_teamname", - "isVisible": true - }, - { - "fieldId": "incident_technique", - "isVisible": true - }, - { - "fieldId": "incident_techniqueid", - "isVisible": true - }, - { - "fieldId": "incident_tenantname", - "isVisible": true - }, - { - "fieldId": "incident_threatfamilyname", - "isVisible": true - }, - { - "fieldId": "incident_threathuntingdetectedhostnames", - "isVisible": true - }, - { - "fieldId": "incident_threathuntingdetectedip", - "isVisible": true - }, - { - "fieldId": "incident_threatid", - "isVisible": true - }, - { - "fieldId": "incident_threatname", - "isVisible": true - }, - { - "fieldId": "incident_ticketacknowledgeddate", - "isVisible": true - }, - { - "fieldId": "incident_ticketcloseddate", - "isVisible": true - }, - { - "fieldId": "incident_ticketnumber", - "isVisible": true - }, - { - "fieldId": "incident_ticketopeneddate", - "isVisible": true - }, - { - "fieldId": "incident_toolusagefound", - "isVisible": true - }, - { - "fieldId": "incident_tools", - "isVisible": true - }, - { - "fieldId": "incident_urlsslverification", - "isVisible": true - }, - { - "fieldId": "incident_urls", - "isVisible": true - }, - { - "fieldId": "incident_usecasedescription", - "isVisible": true - }, - { - "fieldId": "incident_useragent", - "isVisible": true - }, - { - "fieldId": "incident_userblockstatus", - "isVisible": true - }, - { - "fieldId": "incident_usercreationtime", - "isVisible": true - }, - { - "fieldId": "incident_userengagementresponse", - "isVisible": true - }, - { - "fieldId": "incident_usersid", - "isVisible": true - }, - { - "fieldId": "incident_users", - "isVisible": true - }, - { - "fieldId": "incident_usersdetails", - "isVisible": true - }, - { - "fieldId": "incident_verdict", - "isVisible": true - }, - { - "fieldId": "incident_appchannelname", - "isVisible": true - }, - { - "fieldId": "incident_samaccountname", - "isVisible": true - }, - { - "fieldId": "incident_similarincidents", - "isVisible": true - }, - { - "fieldId": "incident_testdatepicker", - "isVisible": true - }, - { - "fieldId": "incident_testnumber", - "isVisible": true - }, - { - "fieldId": "incident_testurl", - "isVisible": true - }, - { - "fieldId": "incident_useraccountcontrol", - "isVisible": true - } - ], - "isVisible": true, - "name": "Custom Fields", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - } - ] - }, - "fromServerVersion": "", - "group": "incident", - "id": "Gem Layout", - "indicatorsDetails": null, - "indicatorsQuickView": null, - "itemVersion": "", - "locked": false, - "mobile": null, - "name": "Gem Layout", - "packID": "", - "packName": "", - "quickView": { - "sections": [ - { - "description": "", - "fields": [ - { - "fieldId": "incident_type", - "isVisible": true - }, - { - "fieldId": "incident_severity", - "isVisible": true - }, - { - "fieldId": "incident_owner", - "isVisible": true - }, - { - "fieldId": "incident_dbotstatus", - "isVisible": true - }, - { - "fieldId": "incident_sourcebrand", - "isVisible": true - }, - { - "fieldId": "incident_sourceinstance", - "isVisible": true - }, - { - "fieldId": "incident_playbookid", - "isVisible": true - }, - { - "fieldId": "incident_phase", - "isVisible": true - }, - { - "fieldId": "incident_roles", - "isVisible": true - } - ], - "isVisible": true, - "name": "Basic Information", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - }, - { - "description": "", - "fields": [ - { - "fieldId": "incident_occurred", - "isVisible": true - }, - { - "fieldId": "incident_dbotcreated", - "isVisible": true - }, - { - "fieldId": "incident_dbotduedate", - "isVisible": true - }, - { - "fieldId": "incident_dbotmodified", - "isVisible": true - }, - { - "fieldId": "incident_dbottotaltime", - "isVisible": true - } - ], - "isVisible": true, - "name": "Timeline Information", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - }, - { - "description": "", - "fields": [ - { - "fieldId": "incident_asn", - "isVisible": true - }, - { - "fieldId": "incident_asnname", - "isVisible": true - }, - { - "fieldId": "incident_accountmemberof", - "isVisible": true - }, - { - "fieldId": "incident_accountstatus", - "isVisible": true - }, - { - "fieldId": "incident_additionaldata", - "isVisible": true - }, - { - "fieldId": "incident_additionalindicators", - "isVisible": true - }, - { - "fieldId": "incident_affectedhosts", - "isVisible": true - }, - { - "fieldId": "incident_affectedusers", - "isVisible": true - }, - { - "fieldId": "incident_agentid", - "isVisible": true - }, - { - "fieldId": "incident_agentversion", - "isVisible": true - }, - { - "fieldId": "incident_agentsid", - "isVisible": true - }, - { - "fieldId": "incident_alertcategory", - "isVisible": true - }, - { - "fieldId": "incident_alertid", - "isVisible": true - }, - { - "fieldId": "incident_alertname", - "isVisible": true - }, - { - "fieldId": "incident_alerttypeid", - "isVisible": true - }, - { - "fieldId": "incident_app", - "isVisible": true - }, - { - "fieldId": "incident_appmessage", - "isVisible": true - }, - { - "fieldId": "incident_assigneduser", - "isVisible": true - }, - { - "fieldId": "incident_assignmentgroup", - "isVisible": true - }, - { - "fieldId": "incident_attackpatterns", - "isVisible": true - }, - { - "fieldId": "incident_birthday", - "isVisible": true - }, - { - "fieldId": "incident_blockindicatorsstatus", - "isVisible": true - }, - { - "fieldId": "incident_cmd", - "isVisible": true - }, - { - "fieldId": "incident_cmdline", - "isVisible": true - }, - { - "fieldId": "incident_cvelist", - "isVisible": true - }, - { - "fieldId": "incident_caller", - "isVisible": true - }, - { - "fieldId": "incident_campaignname", - "isVisible": true - }, - { - "fieldId": "incident_categories", - "isVisible": true - }, - { - "fieldId": "incident_changed", - "isVisible": true - }, - { - "fieldId": "incident_childprocess", - "isVisible": true - }, - { - "fieldId": "incident_classification", - "isVisible": true - }, - { - "fieldId": "incident_cloudaccountid", - "isVisible": true - }, - { - "fieldId": "incident_cloudinstanceid", - "isVisible": true - }, - { - "fieldId": "incident_cloudoperationtype", - "isVisible": true - }, - { - "fieldId": "incident_commandline", - "isVisible": true - }, - { - "fieldId": "incident_commandlineverdict", - "isVisible": true - }, - { - "fieldId": "incident_comment", - "isVisible": true - }, - { - "fieldId": "incident_containmentsla", - "isVisible": true - }, - { - "fieldId": "incident_country", - "isVisible": true - }, - { - "fieldId": "incident_countrycode", - "isVisible": true - }, - { - "fieldId": "incident_countrycodenumber", - "isVisible": true - }, - { - "fieldId": "incident_customqueryresults", - "isVisible": true - }, - { - "fieldId": "incident_description", - "isVisible": true - }, - { - "fieldId": "incident_destinationhostname", - "isVisible": true - }, - { - "fieldId": "incident_destinationip", - "isVisible": true - }, - { - "fieldId": "incident_destinationnetwork", - "isVisible": true - }, - { - "fieldId": "incident_destinationnetworks", - "isVisible": true - }, - { - "fieldId": "incident_destinationport", - "isVisible": true - }, - { - "fieldId": "incident_detectedendpoints", - "isVisible": true - }, - { - "fieldId": "incident_detectedips", - "isVisible": true - }, - { - "fieldId": "incident_detecteduser", - "isVisible": true - }, - { - "fieldId": "incident_detectionsla", - "isVisible": true - }, - { - "fieldId": "incident_detectionurl", - "isVisible": true - }, - { - "fieldId": "incident_deviceexternalip", - "isVisible": true - }, - { - "fieldId": "incident_deviceexternalips", - "isVisible": true - }, - { - "fieldId": "incident_devicehash", - "isVisible": true - }, - { - "fieldId": "incident_deviceid", - "isVisible": true - }, - { - "fieldId": "incident_deviceinternalips", - "isVisible": true - }, - { - "fieldId": "incident_devicelocalip", - "isVisible": true - }, - { - "fieldId": "incident_devicemacaddress", - "isVisible": true - }, - { - "fieldId": "incident_devicemodel", - "isVisible": true - }, - { - "fieldId": "incident_devicename", - "isVisible": true - }, - { - "fieldId": "incident_deviceosname", - "isVisible": true - }, - { - "fieldId": "incident_deviceosversion", - "isVisible": true - }, - { - "fieldId": "incident_deviceou", - "isVisible": true - }, - { - "fieldId": "incident_deviceusername", - "isVisible": true - }, - { - "fieldId": "incident_domainname", - "isVisible": true - }, - { - "fieldId": "incident_dsts", - "isVisible": true - }, - { - "fieldId": "incident_endpoint", - "isVisible": true - }, - { - "fieldId": "incident_endpointisolationstatus", - "isVisible": true - }, - { - "fieldId": "incident_endpointsdetails", - "isVisible": true - }, - { - "fieldId": "incident_escalation", - "isVisible": true - }, - { - "fieldId": "incident_eventid", - "isVisible": true - }, - { - "fieldId": "incident_eventtype", - "isVisible": true - }, - { - "fieldId": "incident_externalcategoryid", - "isVisible": true - }, - { - "fieldId": "incident_externalcategoryname", - "isVisible": true - }, - { - "fieldId": "incident_externalconfidence", - "isVisible": true - }, - { - "fieldId": "incident_externalendtime", - "isVisible": true - }, - { - "fieldId": "incident_externallink", - "isVisible": true - }, - { - "fieldId": "incident_externalseverity", - "isVisible": true - }, - { - "fieldId": "incident_externalstarttime", - "isVisible": true - }, - { - "fieldId": "incident_externalstatus", - "isVisible": true - }, - { - "fieldId": "incident_externalsubcategoryid", - "isVisible": true - }, - { - "fieldId": "incident_externalsubcategoryname", - "isVisible": true - }, - { - "fieldId": "incident_externalsystemid", - "isVisible": true - }, - { - "fieldId": "incident_failedlogonevents", - "isVisible": true - }, - { - "fieldId": "incident_failedlogoneventstimeframe", - "isVisible": true - }, - { - "fieldId": "incident_filehash", - "isVisible": true - }, - { - "fieldId": "incident_filemd5", - "isVisible": true - }, - { - "fieldId": "incident_filename", - "isVisible": true - }, - { - "fieldId": "incident_filenames", - "isVisible": true - }, - { - "fieldId": "incident_filepath", - "isVisible": true - }, - { - "fieldId": "incident_filepaths", - "isVisible": true - }, - { - "fieldId": "incident_filerelationships", - "isVisible": true - }, - { - "fieldId": "incident_filesha1", - "isVisible": true - }, - { - "fieldId": "incident_filesha256", - "isVisible": true - }, - { - "fieldId": "incident_filesize", - "isVisible": true - }, - { - "fieldId": "incident_fileupload", - "isVisible": true - }, - { - "fieldId": "incident_firstname", - "isVisible": true - }, - { - "fieldId": "incident_fullname", - "isVisible": true - }, - { - "fieldId": "incident_highriskyhosts", - "isVisible": true - }, - { - "fieldId": "incident_highriskyusers", - "isVisible": true - }, - { - "fieldId": "incident_hostnames", - "isVisible": true - }, - { - "fieldId": "incident_huntresultscount", - "isVisible": true - }, - { - "fieldId": "incident_ipblockedstatus", - "isVisible": true - }, - { - "fieldId": "incident_ipreputation", - "isVisible": true - }, - { - "fieldId": "incident_identitytype", - "isVisible": true - }, - { - "fieldId": "incident_incidentduration", - "isVisible": true - }, - { - "fieldId": "incident_incidentlink", - "isVisible": true - }, - { - "fieldId": "incident_incomingmirrorerror", - "isVisible": true - }, - { - "fieldId": "incident_investigationstage", - "isVisible": true - }, - { - "fieldId": "incident_isactive", - "isVisible": true - }, - { - "fieldId": "incident_lastmirroredtimestamp", - "isVisible": true - }, - { - "fieldId": "incident_lastname", - "isVisible": true - }, - { - "fieldId": "incident_logsource", - "isVisible": true - }, - { - "fieldId": "incident_lowlevelcategoriesevents", - "isVisible": true - }, - { - "fieldId": "incident_macaddress", - "isVisible": true - }, - { - "fieldId": "incident_md5", - "isVisible": true - }, - { - "fieldId": "incident_mitretacticid", - "isVisible": true - }, - { - "fieldId": "incident_mitretacticname", - "isVisible": true - }, - { - "fieldId": "incident_mitretechniqueid", - "isVisible": true - }, - { - "fieldId": "incident_mitretechniquename", - "isVisible": true - }, - { - "fieldId": "incident_mobiledevicemodel", - "isVisible": true - }, - { - "fieldId": "incident_numberoffoundrelatedalerts", - "isVisible": true - }, - { - "fieldId": "incident_numberofrelatedincidents", - "isVisible": true - }, - { - "fieldId": "incident_numberofsimilarfiles", - "isVisible": true - }, - { - "fieldId": "incident_os", - "isVisible": true - }, - { - "fieldId": "incident_ostype", - "isVisible": true - }, - { - "fieldId": "incident_osversion", - "isVisible": true - }, - { - "fieldId": "incident_objective", - "isVisible": true - }, - { - "fieldId": "incident_operationname", - "isVisible": true - }, - { - "fieldId": "incident_orglevel1", - "isVisible": true - }, - { - "fieldId": "incident_orglevel2", - "isVisible": true - }, - { - "fieldId": "incident_orglevel3", - "isVisible": true - }, - { - "fieldId": "incident_orgunit", - "isVisible": true - }, - { - "fieldId": "incident_outgoingmirrorerror", - "isVisible": true - }, - { - "fieldId": "incident_pid", - "isVisible": true - }, - { - "fieldId": "incident_parentcmdline", - "isVisible": true - }, - { - "fieldId": "incident_parentprocess", - "isVisible": true - }, - { - "fieldId": "incident_parentprocesscmd", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessfilepath", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessids", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessmd5", - "isVisible": true - }, - { - "fieldId": "incident_parentprocessname", - "isVisible": true - }, - { - "fieldId": "incident_parentprocesspath", - "isVisible": true - }, - { - "fieldId": "incident_parentprocesssha256", - "isVisible": true - }, - { - "fieldId": "incident_passwordchangeddate", - "isVisible": true - }, - { - "fieldId": "incident_phonenumber", - "isVisible": true - }, - { - "fieldId": "incident_policyactions", - "isVisible": true - }, - { - "fieldId": "incident_processcmd", - "isVisible": true - }, - { - "fieldId": "incident_processcreationtime", - "isVisible": true - }, - { - "fieldId": "incident_processid", - "isVisible": true - }, - { - "fieldId": "incident_processmd5", - "isVisible": true - }, - { - "fieldId": "incident_processname", - "isVisible": true - }, - { - "fieldId": "incident_processnames", - "isVisible": true - }, - { - "fieldId": "incident_processpath", - "isVisible": true - }, - { - "fieldId": "incident_processpaths", - "isVisible": true - }, - { - "fieldId": "incident_processsha256", - "isVisible": true - }, - { - "fieldId": "incident_projectid", - "isVisible": true - }, - { - "fieldId": "incident_protocol", - "isVisible": true - }, - { - "fieldId": "incident_protocolnames", - "isVisible": true - }, - { - "fieldId": "incident_referencedresourceid", - "isVisible": true - }, - { - "fieldId": "incident_referencedresourcename", - "isVisible": true - }, - { - "fieldId": "incident_registryhive", - "isVisible": true - }, - { - "fieldId": "incident_registrykey", - "isVisible": true - }, - { - "fieldId": "incident_registryvalue", - "isVisible": true - }, - { - "fieldId": "incident_registryvaluetype", - "isVisible": true - }, - { - "fieldId": "incident_relatedalerts", - "isVisible": true - }, - { - "fieldId": "incident_relatedcampaign", - "isVisible": true - }, - { - "fieldId": "incident_relatedendpoints", - "isVisible": true - }, - { - "fieldId": "incident_relatedreport", - "isVisible": true - }, - { - "fieldId": "incident_remediationsla", - "isVisible": true - }, - { - "fieldId": "incident_renderedhtml", - "isVisible": true - }, - { - "fieldId": "incident_reportname", - "isVisible": true - }, - { - "fieldId": "incident_rulename", - "isVisible": true - }, - { - "fieldId": "incident_sha1", - "isVisible": true - }, - { - "fieldId": "incident_sha256", - "isVisible": true - }, - { - "fieldId": "incident_sha512", - "isVisible": true - }, - { - "fieldId": "incident_ssdeep", - "isVisible": true - }, - { - "fieldId": "incident_scenario", - "isVisible": true - }, - { - "fieldId": "incident_selectedindicators", - "isVisible": true - }, - { - "fieldId": "incident_similarincidentsdbot", - "isVisible": true - }, - { - "fieldId": "incident_sourcecategory", - "isVisible": true - }, - { - "fieldId": "incident_sourcecreatetime", - "isVisible": true - }, - { - "fieldId": "incident_sourcecreatedby", - "isVisible": true - }, - { - "fieldId": "incident_sourceexternalips", - "isVisible": true - }, - { - "fieldId": "incident_sourcehostname", - "isVisible": true - }, - { - "fieldId": "incident_sourceip", - "isVisible": true - }, - { - "fieldId": "incident_sourceid", - "isVisible": true - }, - { - "fieldId": "incident_sourcenetwork", - "isVisible": true - }, - { - "fieldId": "incident_sourcenetworks", - "isVisible": true - }, - { - "fieldId": "incident_sourceport", - "isVisible": true - }, - { - "fieldId": "incident_sourcepriority", - "isVisible": true - }, - { - "fieldId": "incident_sourcestatus", - "isVisible": true - }, - { - "fieldId": "incident_sourceupdatedby", - "isVisible": true - }, - { - "fieldId": "incident_sourceusername", - "isVisible": true - }, - { - "fieldId": "incident_srcs", - "isVisible": true - }, - { - "fieldId": "incident_state", - "isVisible": true - }, - { - "fieldId": "incident_statusreason", - "isVisible": true - }, - { - "fieldId": "incident_stringsimilarityresults", - "isVisible": true - }, - { - "fieldId": "incident_subcategory", - "isVisible": true - }, - { - "fieldId": "incident_suspiciousexecutions", - "isVisible": true - }, - { - "fieldId": "incident_suspiciousexecutionsfound", - "isVisible": true - }, - { - "fieldId": "incident_tactic", - "isVisible": true - }, - { - "fieldId": "incident_tacticid", - "isVisible": true - }, - { - "fieldId": "incident_tags", - "isVisible": true - }, - { - "fieldId": "incident_target", - "isVisible": true - }, - { - "fieldId": "incident_teamname", - "isVisible": true - }, - { - "fieldId": "incident_technique", - "isVisible": true - }, - { - "fieldId": "incident_techniqueid", - "isVisible": true - }, - { - "fieldId": "incident_tenantname", - "isVisible": true - }, - { - "fieldId": "incident_threatfamilyname", - "isVisible": true - }, - { - "fieldId": "incident_threathuntingdetectedhostnames", - "isVisible": true - }, - { - "fieldId": "incident_threathuntingdetectedip", - "isVisible": true - }, - { - "fieldId": "incident_threatid", - "isVisible": true - }, - { - "fieldId": "incident_threatname", - "isVisible": true - }, - { - "fieldId": "incident_ticketacknowledgeddate", - "isVisible": true - }, - { - "fieldId": "incident_ticketcloseddate", - "isVisible": true - }, - { - "fieldId": "incident_ticketnumber", - "isVisible": true - }, - { - "fieldId": "incident_ticketopeneddate", - "isVisible": true - }, - { - "fieldId": "incident_timetoassignment", - "isVisible": true - }, - { - "fieldId": "incident_toolusagefound", - "isVisible": true - }, - { - "fieldId": "incident_tools", - "isVisible": true - }, - { - "fieldId": "incident_triagesla", - "isVisible": true - }, - { - "fieldId": "incident_urlsslverification", - "isVisible": true - }, - { - "fieldId": "incident_urls", - "isVisible": true - }, - { - "fieldId": "incident_usecasedescription", - "isVisible": true - }, - { - "fieldId": "incident_useragent", - "isVisible": true - }, - { - "fieldId": "incident_userblockstatus", - "isVisible": true - }, - { - "fieldId": "incident_usercreationtime", - "isVisible": true - }, - { - "fieldId": "incident_userengagementresponse", - "isVisible": true - }, - { - "fieldId": "incident_usersid", - "isVisible": true - }, - { - "fieldId": "incident_users", - "isVisible": true - }, - { - "fieldId": "incident_usersdetails", - "isVisible": true - }, - { - "fieldId": "incident_verdict", - "isVisible": true - }, - { - "fieldId": "incident_appchannelname", - "isVisible": true - }, - { - "fieldId": "incident_samaccountname", - "isVisible": true - }, - { - "fieldId": "incident_similarincidents", - "isVisible": true - }, - { - "fieldId": "incident_testdatepicker", - "isVisible": true - }, - { - "fieldId": "incident_testnumber", - "isVisible": true - }, - { - "fieldId": "incident_testurl", - "isVisible": true - }, - { - "fieldId": "incident_useraccountcontrol", - "isVisible": true - } - ], - "isVisible": true, - "name": "Custom Fields", - "query": null, - "queryType": "", - "readOnly": false, - "type": "" - }, - { - "description": "", - "fields": [ - { - "fieldId": "incident_labels", - "isVisible": true - } - ], - "isVisible": true, - "name": "Labels", - "query": null, - "queryType": "", - "readOnly": true, - "type": "labels" - } - ] - }, + "edit": null, + "fromServerVersion": "", + "group": "incident", + "id": "Gem Layout", + "indicatorsDetails": null, + "indicatorsQuickView": null, + "itemVersion": "", + "locked": false, + "mobile": null, + "name": "Gem Layout", + "packID": "", + "packName": "", + "quickView": null, "quickViewV2": null, "system": false, "toServerVersion": "", From b08f64b50317265b11879f1286c7ce14baa82f89 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 4 Mar 2024 14:18:26 +0000 Subject: [PATCH 30/62] Add playbook --- .../Playbooks/Gem_Stop_ec2_and_Resolve.yml | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml diff --git a/Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml b/Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml new file mode 100644 index 000000000000..f890f916e14b --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml @@ -0,0 +1,129 @@ +id: 'Gem Stop ec2 and Resolve' +inputs: [] +name: Gem Stop ec2 and Resolve +outputs: [] +starttaskid: "0" +tasks: + "0": + continueonerrortype: "" + id: "0" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + '#none#': + - "2" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + id: 4e30bc53-839e-475a-8995-370d20bbb09d + iscommand: false + name: "" + version: -1 + taskid: 4e30bc53-839e-475a-8995-370d20bbb09d + timertriggers: [] + type: start + view: |- + { + "position": { + "x": 450, + "y": 50 + } + } + "2": + continueonerrortype: "" + id: "2" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + '#none#': + - "3" + note: false + quietmode: 0 + scriptarguments: + action: + simple: stop + alert_id: + simple: ${incident.gemalertid} + entity_id: + simple: ${incident.gemmainentityid} + entity_type: + simple: ${incident.gemmainentitytype} + resource_id: + simple: ${incident.gemmainentityid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Run an action on an entity. + id: 785239f0-3684-4c2c-8fae-b5dce369186b + iscommand: true + name: gem-run-action + script: Gem|||gem-run-action + type: regular + version: -1 + taskid: 785239f0-3684-4c2c-8fae-b5dce369186b + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 410 + } + } + "3": + continueonerrortype: "" + id: "3" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + scriptarguments: + reason: + simple: 'Stopped ec2 instance ' + status: + simple: resolved + threat_id: + simple: ${incident.gemthreatid} + verdict: + simple: inconclusive + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Set a threat's status to open, in progress or resolved. + id: 3b839c36-4127-4df4-859b-a4e35856f947 + iscommand: true + name: gem-update-threat-status + script: Gem|||gem-update-threat-status + type: regular + version: -1 + taskid: 3b839c36-4127-4df4-859b-a4e35856f947 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 590 + } + } +version: -1 +view: |- + { + "linkLabelsPosition": {}, + "paper": { + "dimensions": { + "height": 635, + "width": 380, + "x": 450, + "y": 50 + } + } + } From d54c6e64b51fb3843c66232fabccbf9524470ef1 Mon Sep 17 00:00:00 2001 From: dorkauf Date: Mon, 4 Mar 2024 14:28:05 +0000 Subject: [PATCH 31/62] read-only true --- Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json | 2 +- Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json | 2 +- .../Gem/IncidentFields/incidentfield-Gem_Account_Provider.json | 2 +- Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json | 2 +- Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json | 2 +- .../Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json | 2 +- .../IncidentFields/incidentfield-Gem_Main_Entity_Region.json | 2 +- .../Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json | 2 +- Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json | 2 +- Packs/Gem/IncidentFields/incidentfield-Gem_Title.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json index 445311ddef8d..fc17172109ed 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemaccountid", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json index 8b262b9c60e5..cfd498ba6f4a 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemaccountname", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json index 18e7bf2e940e..c23f280766be 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemaccountprovider", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json index 0ca474676f05..c86db602e069 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemeventscount", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json index 2a4013ac8811..6e76737d51ee 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemmainentityid", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json index f87f722034d7..a6e2ee3e6e2d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemmainentityname", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json index 522a52668637..03edd7e3d26c 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemmainentityregion", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json index e3140516da12..eefcf3066ae2 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemmainentitytype", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json index 3922dd58530d..965148b4cdab 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemseverity", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json index f1d738e25cd0..20cde23b3ece 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json @@ -22,7 +22,7 @@ "group": 0, "hidden": false, "id": "incident_gemtitle", - "isReadOnly": false, + "isReadOnly": true, "itemVersion": "", "locked": false, "mergeStrategy": "", From 58c482c41bc400b22475778bd1ab6f294a1c198b Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 4 Mar 2024 16:13:04 +0000 Subject: [PATCH 32/62] Fix script --- Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py index ec161ce16044..d75e7da3c5c9 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py @@ -3,21 +3,23 @@ def main(): incident = demisto.incident() - incident.get("closeReason", "") + # incident.get("closeReason", "") close_notes = incident.get("closeNotes", "") incident_id = incident.get("id", "") - threat_id = incident.get("CustomFields").get("threatid") - verdict = incident.get("CustomFields").get("verdict") - verdict = verdict if verdict != "" else "inconclusive" + threat_id = incident.get("CustomFields").get("gemthreatid") + verdict = incident.get("CustomFields").get("gemverdict") + verdict = verdict if verdict else "inconclusive" verdict = verdict.replace(" ", "_").lower() status = "resolved" + demisto.log(f"Resolving Gem Threat {threat_id} with status {status}, verdict {verdict} and close notes {close_notes}") demisto.executeCommand("gem-update-threat-status", { "verdict": verdict, "reason": f"Closed from XSOAR, incident id: {incident_id}\n" f"\nClose Notes:\n{close_notes}", "threat_id": threat_id, "status": status}) + demisto.log(f"Resolved Gem Threat {threat_id} with status {status}, verdict {verdict} and close notes {close_notes}") From 11223dbd748377094d41c751e832387b6cac420e Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 5 Mar 2024 13:27:08 +0000 Subject: [PATCH 33/62] Fix script --- Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py index d75e7da3c5c9..dff7b693742d 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py @@ -5,8 +5,11 @@ def main(): incident = demisto.incident() # incident.get("closeReason", "") close_notes = incident.get("closeNotes", "") + close_notes = close_notes if close_notes else demisto.params().get("closeNotes", "") + incident_id = incident.get("id", "") threat_id = incident.get("CustomFields").get("gemthreatid") + verdict = incident.get("CustomFields").get("gemverdict") verdict = verdict if verdict else "inconclusive" verdict = verdict.replace(" ", "_").lower() From ab7f58f74ac60f538b08e7c919931afbe11285a8 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Wed, 6 Mar 2024 14:31:07 +0000 Subject: [PATCH 34/62] Fetch incidents --- .../Gem/Classifiers/classifier-GemThreat.json | 2 +- ...lassifier-mapper-incoming-Gem-webhook.json | 4 +- .../classifier-mapper-incoming-Gem.json | 50 +++++------ .../IncidentTypes/incidenttype-GemThreat.json | 2 +- Packs/Gem/Integrations/Gem/Gem.py | 84 +++++++++++++++++-- Packs/Gem/Integrations/Gem/Gem.yml | 25 ++++-- .../ResolveGemThreat/ResolveGemThreat.py | 3 +- .../ResolveGemThreat/ResovleGemThreat.yml | 4 +- Packs/Gem/pack_metadata.json | 2 +- 9 files changed, 128 insertions(+), 48 deletions(-) diff --git a/Packs/Gem/Classifiers/classifier-GemThreat.json b/Packs/Gem/Classifiers/classifier-GemThreat.json index 92b90988df07..f8744250ea8f 100644 --- a/Packs/Gem/Classifiers/classifier-GemThreat.json +++ b/Packs/Gem/Classifiers/classifier-GemThreat.json @@ -1,6 +1,6 @@ { "id": "Gem Classifier", - "name": "Gem - Classification", + "name": "Gem Classifier", "type": "classification", "defaultIncidentType": "Gem Threat", "description": "Classifies Gem Threats.", diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 24c053d60060..32541a037508 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -84,8 +84,8 @@ } } }, - "id": "Gem-mapper-webhook", - "name": "Gem - Incoming Mapper Webhook", + "id": "Gem Mapper Webhook", + "name": "Gem Mapper Webhook", "type": "mapping-incoming", "description": "Maps incoming Gem Threat fields when received via webhook.", "packID": "", diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index e4439f69d619..4e8144e1832e 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -1,14 +1,17 @@ { - "id": "Gem-mapper", - "name": "Gem - Incoming Mapper", + "id": "Gem Mapper", + "name": "Gem Mapper", "type": "mapping-incoming", "description": "Maps incoming Gem Threat fields.", "fromVersion": "6.8.0", - "defaultIncidentType": "", + "defaultIncidentType": "Gem Threat", "mapping": { "Gem Threat": { "dontMapEventToLabels": false, "internalMapping": { + "Description": { + "simple": "description" + }, "Gem Account ID": { "simple": "account.name" }, @@ -19,51 +22,48 @@ "simple": "account.cloud_provider" }, "Gem Alert ID": { - "simple": "event.alert_id" + "simple": "metadata.alert_id" }, "Gem Alert Source": { - "simple": "event.alert_source" - }, - "occurred": { - "simple": "event_datetime" - }, - "Description": { - "simple": "description" + "simple": "metadata.alert_source" }, "Gem Events Count": { - "simple": "event.events_total_count" - }, - "Gem URL": { - "simple": "link" + "simple": "metadata.events_total_count" }, "Gem Main Entity ID": { - "simple": "event.main_entity.id" + "simple": "metadata.main_entity.id" }, "Gem Main Entity Name": { - "simple": "event.main_entity.name" + "simple": "metadata.main_entity.name" }, "Gem Main Entity Region": { - "simple": "event.main_entity.metadata.region" + "simple": "metadata.main_entity.metadata.region" }, "Gem Main Entity Type": { - "simple": "event.main_entity.type" + "simple": "metadata.main_entity.type" + }, + "Gem Severity": { + "simple": "severity" + }, + "Gem TTP ID": { + "simple": "metadata.ttp_id" }, "Gem Threat ID": { - "simple": "event.threat_id" + "simple": "metadata.threat_id" }, "Gem Title": { "simple": "title" }, - "Gem TTP ID": { - "simple": "event.ttp_id" + "Gem URL": { + "simple": "link" }, "name": { "simple": "title" }, - "severity": { - "simple": "severity_text" + "occurred": { + "simple": "event_datetime" }, - "Gem Severity": { + "severity": { "simple": "severity" } } diff --git a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json index b1aa1aaf6a16..afcf1a791c23 100644 --- a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json +++ b/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json @@ -1,7 +1,7 @@ { "fromVersion": "5.0.0", "autorun": true, - "closureScript": "ResovleGemThreat", + "closureScript": "ResolveGemThreat", "color": "#32EAC2", "days": 0, "daysR": 0, diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 7bf57fb7c23b..83ca8489a576 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -13,8 +13,9 @@ ''' CONSTANTS ''' DATE_FORMAT = '%Y-%m-%dT%H:%M:%SZ' # ISO8601 format with UTC, default in XSOAR -PAGE_SIZE = 5 +PAGE_SIZE = 10 OK_CODES = (200, 201, 202) +MAX_ALERTS_TO_FETCH = 50 # ENDPOINTS TOKEN_URL = 'https://login.gem.security/oauth/token' @@ -24,6 +25,7 @@ INVENTORY_ITEM_ENDPOINT = '/inventory/{id}' BREAKDOWN_ENDPOINT = '../triage/investigation/timeline/breakdown' EVENTS_ENDPOINT = '../triage/investigation/entity/events' +FETCH_ENDPOINT = '../integrations/notification' UPDATE_THREAT_ENDPOINT = '../detection/threats/{id}/update_threat_status_v2' @@ -107,6 +109,15 @@ def _generate_token(self) -> str: return token_res.get('access_token') + def fetch_threats(self, maxincidents=None, start_time=None) -> list[dict]: + params = {'limit': maxincidents, 'created__gt': start_time, 'ordering': 'created'} + return self.http_request( + method='GET', + url_suffix=FETCH_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + + ) + def get_resource_details(self, resource_id: str) -> dict: """ Get inventory item details :param resource_id: id of the item to get @@ -322,10 +333,37 @@ def init_client(params: dict) -> GemClient: ''' COMMAND FUNCTIONS ''' -def fetch_threats(client: GemClient, maxincidents=None, firstfetch=None, severity=None, start_time=None, category=None, - accounts=None, status=None, assignee=None, mitre_technique_id=None, threat_source=None, entity_type=None, - ttp_id=None, provider=None) -> None: - pass +def fetch_threats(client: GemClient, max_results: int, last_run: dict, first_fetch_time: str) -> tuple[dict, list[dict]]: + last_fetch = last_run.get('last_fetch', None) + if last_fetch is None: + # if missing, use what provided via first_fetch_time + last_fetch = first_fetch_time + else: + # otherwise use the stored last fetch + last_fetch = last_fetch + demisto.debug(f"Last fetch time: {last_fetch}") + incidents: list[dict[str, Any]] = [] + + for _ in range(0, int(max_results / PAGE_SIZE) + 1): + results = client.fetch_threats(maxincidents=PAGE_SIZE, start_time=last_fetch) + for r in results: + incident = { + 'name': r['title'], # name is required field, must be set + 'occurred': r['created'], # must be string of a format ISO8601 + 'dbotMirrorId': str(r['id']), # must be a string + 'severity': int(int(r['severity']) / 2), + 'rawJSON': json.dumps(r) # the original event, this will allow mapping of the event in the mapping stage. + } + incidents.append(incident) + demisto.debug(f"Fetched {len(incidents)} incidents") + if incidents: + last_fetch = incidents[-1].get('occurred') + + demisto.debug(f"Last fetch time: {last_fetch}") + assert last_fetch + last_run['last_fetch'] = last_fetch + + return last_run, incidents def test_module(params: dict[str, Any]) -> str: @@ -624,9 +662,8 @@ def main() -> None: args = demisto.args() command = demisto.command() - # TODO: Implement fetch_incidents, use fetch_back param to determine if to fetch 30 days back - # Whether to fetch incident 30 days back on initial fetch - params.get('fetch_back', False) + demisto.debug(f"args {args}") + demisto.debug(f"params {params}") demisto.debug(f'Command being called is {command}') try: @@ -663,7 +700,36 @@ def main() -> None: elif command == 'gem-run-action': return_results(run_action_on_entity(client, args)) elif command == 'fetch-incidents': - fetch_threats(client) + # How much time before the first fetch to retrieve alerts + first_fetch_time = arg_to_datetime( + arg=params.get('first_fetch', '30 days'), + arg_name='First fetch time', + required=True + ) + assert first_fetch_time + + max_results = arg_to_number( + arg=params.get('max_fetch'), + arg_name='max_fetch', + required=False + ) + if not max_results or max_results > MAX_ALERTS_TO_FETCH: + max_results = MAX_ALERTS_TO_FETCH + + next_run, incidents = fetch_threats( + client=client, + max_results=max_results, + last_run=demisto.getLastRun(), # getLastRun() gets the last run dict + first_fetch_time=datetime.strftime(first_fetch_time, DATE_FORMAT)) + + demisto.debug(f'Fetched {len(incidents)} incidents') + demisto.debug(f'Next run: {next_run}') + # saves next_run for the time fetch-incidents is invoked + demisto.setLastRun(next_run) + # fetch-incidents calls ``demisto.incidents()`` to provide the list + # of incidents to create + demisto.incidents(incidents) + else: raise NotImplementedError(f'Command {command} is not implemented') diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 8ea02dd66871..56c245b1751f 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -5,9 +5,17 @@ sectionOrder: commonfields: id: Gem version: -1 +defaultmapperin: Gem Mapper +defaultclassifier: Gem Classifier configuration: - - defaultvalue: "https://app.gem.security/api/v1" - display: API Endpoint + - display: Incident type + name: incidentType + type: 13 + defaultvalue: Gem Threat + section: Connect + required: false + - display: API Endpoint + defaultvalue: "https://app.gem.security/api/v1" additionalinfo: "The API endpoint to use for connection (US or EU)" name: api_endpoint type: 15 @@ -41,10 +49,15 @@ configuration: - display: Fetch incidents name: isFetch type: 8 + section: Connect + required: false + - display: Get incidents from webhook + name: isWebhook + type: 8 section: Collect required: false - - defaultvalue: "10" - display: Maximum number of alerts per fetch + - display: Maximum number of alerts per fetch + defaultvalue: 10 name: max_fetch type: 0 section: Collect @@ -897,12 +910,12 @@ script: - name: resource_id description: The ID of the resource to run the action on. required: true - + isfetch: true runonce: false script: "-" type: python subtype: python3 dockerimage: demisto/auth-utils:1.0.0.76157 # TODO: This docker image was selected since it contains the "jwt" package. Double check if it's the correct one. -fromversion: 5.5.0 +fromversion: 6.8.0 tests: - No tests diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py index dff7b693742d..c01f690be58c 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py @@ -5,12 +5,13 @@ def main(): incident = demisto.incident() # incident.get("closeReason", "") close_notes = incident.get("closeNotes", "") - close_notes = close_notes if close_notes else demisto.params().get("closeNotes", "") + close_notes = close_notes if close_notes else demisto.args().get("closeNotes", "") incident_id = incident.get("id", "") threat_id = incident.get("CustomFields").get("gemthreatid") verdict = incident.get("CustomFields").get("gemverdict") + verdict = verdict if verdict else demisto.args().get("gemverdict", "") verdict = verdict if verdict else "inconclusive" verdict = verdict.replace(" ", "_").lower() status = "resolved" diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml b/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml index f865aa2df44c..d923b089ff4b 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml @@ -1,10 +1,10 @@ comment: "Post Processing Script that will resolve the relevant threat in the Gem platform." commonfields: - id: ResovleGemThreat + id: ResolveGemThreat version: -1 dockerimage: demisto/python3:3.10.12.63474 enabled: true -name: ResovleGemThreat +name: ResolveGemThreat runas: DBotWeakRole script: "" scripttarget: 0 diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index 870119e52ef4..a649f5e189b4 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -18,7 +18,7 @@ "name": "Base" }, "GenericWebhook": { - "mandatory": true, + "mandatory": false, "name": "Generic Webhook" } }, From ae38787e3735b9b006fc5eff3b8fa836dd5c490c Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 7 Mar 2024 08:44:50 +0000 Subject: [PATCH 35/62] Add alert merger --- ...63-8856-37a2fbbe722b-Gem_Alert_Merger.json | 164 +++++++++++------- 1 file changed, 99 insertions(+), 65 deletions(-) diff --git a/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json b/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json index 66f3b5cb626f..1fdb1e02b8a6 100644 --- a/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json +++ b/Packs/Gem/PreProcessRules/preprocessrule-d9268047-fccf-4e63-8856-37a2fbbe722b-Gem_Alert_Merger.json @@ -1,67 +1,101 @@ { - "action": "link", - "cacheVersn": 0, - "definitionId": "", - "enabled": true, - "existingEventsFilters": [ - [ - { - "left": { - "isContext": true, - "value": { - "simple": "threatid" - } - }, - "operator": "isIdenticalIncident", - "right": { - "isContext": true, - "value": { - "simple": "${incident.threatid}" - } - }, - "type": "shortText" - } - ] - ], - "fromServerVersion": "", - "id": "Gem Alert Merger", - "index": 0, - "itemVersion": "", - "linkTo": "oldest", - "locked": false, - "name": "Gem Alert Merger", - "newEventFilters": [], - "packID": "", - "packName": "", - "period": { - "by": "days", - "fromValue": 2 - }, - "readyExistingEventsFilters": [ - [ - { - "left": { - "isContext": true, - "value": { - "simple": "threatid" - } - }, - "operator": "isIdenticalIncident", - "right": { - "isContext": true, - "value": { - "simple": "${incident.threatid}" - } - }, - "type": "shortText" - } - ] - ], - "readyNewEventFilters": [], - "scriptID": "", - "scriptName": "", - "searchClosed": true, - "system": false, - "toServerVersion": "", - "version": -1 + "action": "link", + "cacheVersn": 0, + "definitionId": "", + "enabled": true, + "existingEventsFilters": [ + [ + { + "left": { + "isContext": true, + "value": { + "simple": "gemthreatid" + } + }, + "operator": "isEqualString", + "right": { + "isContext": true, + "value": { + "simple": "incident.gemthreatid" + } + }, + "type": "shortText" + } + ] + ], + "fromServerVersion": "", + "id": "Gem Alert Merger", + "index": 2, + "itemVersion": "", + "linkTo": "oldest", + "locked": false, + "name": "Gem Alert Merger", + "newEventFilters": [ + [ + { + "left": { + "isContext": true, + "value": { + "simple": "gemthreatid" + } + }, + "operator": "isNotEmpty", + "right": { + "isContext": false, + "value": {} + }, + "type": "shortText" + } + ] + ], + "packID": "", + "packName": "", + "period": { + "by": "days", + "fromValue": 1 + }, + "readyExistingEventsFilters": [ + [ + { + "left": { + "isContext": true, + "value": { + "simple": "gemthreatid" + } + }, + "operator": "isEqualString", + "right": { + "isContext": true, + "value": { + "simple": "${incident.gemthreatid}" + } + }, + "type": "shortText" + } + ] + ], + "readyNewEventFilters": [ + [ + { + "left": { + "isContext": true, + "value": { + "simple": "gemthreatid" + } + }, + "operator": "isNotEmpty", + "right": { + "isContext": false, + "value": {} + }, + "type": "shortText" + } + ] + ], + "scriptID": "", + "scriptName": "", + "searchClosed": true, + "system": false, + "toServerVersion": "", + "version": -1 } \ No newline at end of file From cffa48bbf495e7757c8aa29bd1799bfbc2f041e0 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 7 Mar 2024 10:30:19 +0000 Subject: [PATCH 36/62] Fix severity --- ...lassifier-mapper-incoming-Gem-webhook.json | 24 ++++++++++++++++++- .../classifier-mapper-incoming-Gem.json | 24 ++++++++++++++++++- Packs/Gem/Integrations/Gem/Gem.py | 1 - 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index 32541a037508..f2e11d151167 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -68,7 +68,29 @@ "simple": "title" }, "severity": { - "simple": "severity_text" + "complex": { + "filters": [], + "root": "severity", + "transformers": [ + { + "args": { + "input_values": { + "isContext": false, + "value": { + "simple": "1,2,3,4,5,6,7,8,9,10" + } + }, + "mapped_values": { + "isContext": false, + "value": { + "simple": "1,1,1,2,2,2,2,3,3,3" + } + } + }, + "operator": "MapValuesTransformer" + } + ] + } }, "Gem Severity": { "simple": "severity" diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index 4e8144e1832e..04f1486eeef8 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -64,7 +64,29 @@ "simple": "event_datetime" }, "severity": { - "simple": "severity" + "complex": { + "filters": [], + "root": "severity", + "transformers": [ + { + "args": { + "input_values": { + "isContext": false, + "value": { + "simple": "1,2,3,4,5,6,7,8,9,10" + } + }, + "mapped_values": { + "isContext": false, + "value": { + "simple": "1,1,1,2,2,2,2,3,3,3" + } + } + }, + "operator": "MapValuesTransformer" + } + ] + } } } }, diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 83ca8489a576..329921faae96 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -351,7 +351,6 @@ def fetch_threats(client: GemClient, max_results: int, last_run: dict, first_fet 'name': r['title'], # name is required field, must be set 'occurred': r['created'], # must be string of a format ISO8601 'dbotMirrorId': str(r['id']), # must be a string - 'severity': int(int(r['severity']) / 2), 'rawJSON': json.dumps(r) # the original event, this will allow mapping of the event in the mapping stage. } incidents.append(incident) From 4b748db1914a27286cb4c0a6b9b69f75a324f773 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Sun, 10 Mar 2024 11:17:46 +0000 Subject: [PATCH 37/62] Update spec stuff --- .../Gem/Classifiers/classifier-GemThreat.json | 4 +- ...lassifier-mapper-incoming-Gem-webhook.json | 4 +- .../classifier-mapper-incoming-Gem.json | 6 +- .../incidentfield-Gem_Account_ID.json | 104 +++++++++--------- .../incidentfield-Gem_Account_Name.json | 4 +- .../incidentfield-Gem_Account_Provider.json | 4 +- .../incidentfield-Gem_Alert_ID.json | 2 +- .../incidentfield-Gem_Alert_Source.json | 4 +- .../incidentfield-Gem_Events_Count.json | 4 +- .../incidentfield-Gem_Main_Entity_ID.json | 4 +- .../incidentfield-Gem_Main_Entity_Name.json | 4 +- .../incidentfield-Gem_Main_Entity_Region.json | 4 +- .../incidentfield-Gem_Main_Entity_Type.json | 4 +- .../incidentfield-Gem_Severity.json | 4 +- .../incidentfield-Gem_TTP_ID.json | 4 +- .../incidentfield-Gem_Threat_ID.json | 2 +- .../incidentfield-Gem_Title.json | 4 +- .../IncidentFields/incidentfield-Gem_Url.json | 4 +- .../incidentfield-Gem_Verdict.json | 2 +- ...Threat.json => incidenttype-GemAlert.json} | 6 +- Packs/Gem/Integrations/Gem/Gem.py | 18 +-- Packs/Gem/Integrations/Gem/Gem.yml | 15 +-- ...ResolveGemThreat.py => ResolveGemAlert.py} | 0 ...sovleGemThreat.yml => ResovleGemAlert.yml} | 6 +- Packs/Gem/pack_metadata.json | 45 +++++++- 25 files changed, 148 insertions(+), 114 deletions(-) rename Packs/Gem/IncidentTypes/{incidenttype-GemThreat.json => incidenttype-GemAlert.json} (82%) rename Packs/Gem/Scripts/ResolveGemThreat/{ResolveGemThreat.py => ResolveGemAlert.py} (100%) rename Packs/Gem/Scripts/ResolveGemThreat/{ResovleGemThreat.yml => ResovleGemAlert.yml} (80%) diff --git a/Packs/Gem/Classifiers/classifier-GemThreat.json b/Packs/Gem/Classifiers/classifier-GemThreat.json index f8744250ea8f..abb8ac67aeb7 100644 --- a/Packs/Gem/Classifiers/classifier-GemThreat.json +++ b/Packs/Gem/Classifiers/classifier-GemThreat.json @@ -2,8 +2,8 @@ "id": "Gem Classifier", "name": "Gem Classifier", "type": "classification", - "defaultIncidentType": "Gem Threat", - "description": "Classifies Gem Threats.", + "defaultIncidentType": "Gem Alert", + "description": "Classifies Gem Alerts.", "fromVersion": "6.0.0", "keyTypeMap": {}, "transformer": { diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index f2e11d151167..e8ab98fa28fc 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -13,7 +13,7 @@ "locked": false, "logicalVersion": 3, "mapping": { - "Gem Threat": { + "Gem Alert": { "dontMapEventToLabels": false, "internalMapping": { "Gem Account ID": { @@ -109,7 +109,7 @@ "id": "Gem Mapper Webhook", "name": "Gem Mapper Webhook", "type": "mapping-incoming", - "description": "Maps incoming Gem Threat fields when received via webhook.", + "description": "Maps incoming Gem Alert fields when received via webhook.", "packID": "", "packName": "", "sourceClassifierId": "", diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index 04f1486eeef8..bc31fd6f7166 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -2,11 +2,11 @@ "id": "Gem Mapper", "name": "Gem Mapper", "type": "mapping-incoming", - "description": "Maps incoming Gem Threat fields.", + "description": "Maps incoming Gem Alert fields.", "fromVersion": "6.8.0", - "defaultIncidentType": "Gem Threat", + "defaultIncidentType": "Gem Alert", "mapping": { - "Gem Threat": { + "Gem Alert": { "dontMapEventToLabels": false, "internalMapping": { "Description": { diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json index fc17172109ed..6fccf65a589b 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json @@ -1,55 +1,55 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Threat" + "aliasTo": "", + "aliases": null, + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemaccountid", - "closeForm": false, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemaccountid", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Account ID", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "autoCompleteTags": null, + "breachScript": "", + "cacheVersn": 0, + "caseInsensitive": true, + "cliName": "gemaccountid", + "closeForm": false, + "columns": null, + "content": false, + "defaultRows": null, + "definitionId": "", + "description": "", + "editForm": true, + "fieldCalcScript": "", + "fromServerVersion": "", + "group": 0, + "hidden": false, + "id": "incident_gemaccountid", + "isReadOnly": true, + "itemVersion": "", + "locked": false, + "mergeStrategy": "", + "name": "Gem Account ID", + "neverSetAsRequired": false, + "openEnded": false, + "orgType": "shortText", + "ownerOnly": false, + "packID": "", + "packName": "", + "placeholder": "", + "required": false, + "runScriptAfterUpdate": false, + "script": "", + "selectValues": null, + "sla": 0, + "system": false, + "systemAssociatedTypes": null, + "template": "", + "threshold": 72, + "toServerVersion": "", + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "validatedError": "", + "validationRegex": "", + "version": -1, + "x2_fields": "" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json index cfd498ba6f4a..7231cced1848 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json index c23f280766be..8785bf614d51 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json index 44f891a628f4..11fbf086f4fc 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json @@ -3,7 +3,7 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" + "Gem Alert" ], "autoCompleteTags": null, "breachScript": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json index b29a98e849e7..8200178ed4a3 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json index c86db602e069..2288bbe079b3 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json index 6e76737d51ee..d8e72c48dd78 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json index a6e2ee3e6e2d..05d371375a14 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json index 03edd7e3d26c..ab1a12ec427c 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json index eefcf3066ae2..bb9b4c37f1ec 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json index 965148b4cdab..ed7ff000306f 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json index caa6a6536ac7..a22ba1718b9d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json index 558d8419a1ca..fe616a35d079 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json @@ -3,7 +3,7 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" + "Gem Alert" ], "autoCompleteTags": null, "breachScript": "", diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json index 20cde23b3ece..c581f6f4556f 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json index e778c3e71350..83dba2eee7bd 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json @@ -3,8 +3,8 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" - ], + "Gem Alert" + ], "autoCompleteTags": null, "breachScript": "", "cacheVersn": 0, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json index 147af8c27cd7..cf369e81e3f7 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json @@ -3,7 +3,7 @@ "aliases": null, "associatedToAll": false, "associatedTypes": [ - "Gem Threat" + "Gem Alert" ], "autoCompleteTags": null, "breachScript": "", diff --git a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json b/Packs/Gem/IncidentTypes/incidenttype-GemAlert.json similarity index 82% rename from Packs/Gem/IncidentTypes/incidenttype-GemThreat.json rename to Packs/Gem/IncidentTypes/incidenttype-GemAlert.json index afcf1a791c23..43370797b74d 100644 --- a/Packs/Gem/IncidentTypes/incidenttype-GemThreat.json +++ b/Packs/Gem/IncidentTypes/incidenttype-GemAlert.json @@ -1,7 +1,7 @@ { "fromVersion": "5.0.0", "autorun": true, - "closureScript": "ResolveGemThreat", + "closureScript": "ResolveGemAlert", "color": "#32EAC2", "days": 0, "daysR": 0, @@ -9,9 +9,9 @@ "disabled": false, "hours": 0, "hoursR": 0, - "id": "Gem Threat", + "id": "Gem Alert", "locked": false, - "name": "Gem Threat", + "name": "Gem Alert", "playbookId": "", "preProcessingScript": "", "readonly": false, diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 329921faae96..3cbc7bf9261b 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -19,17 +19,17 @@ # ENDPOINTS TOKEN_URL = 'https://login.gem.security/oauth/token' -THREATS_ENDPOINT = '/threats' -THREAT_ENDPOINT = '/threats/{id}' -INVENTORY_ENDPOINT = '/inventory' -INVENTORY_ITEM_ENDPOINT = '/inventory/{id}' -BREAKDOWN_ENDPOINT = '../triage/investigation/timeline/breakdown' -EVENTS_ENDPOINT = '../triage/investigation/entity/events' -FETCH_ENDPOINT = '../integrations/notification' +THREATS_ENDPOINT = '/v1/threats' +THREAT_ENDPOINT = '/v1/threats/{id}' +INVENTORY_ENDPOINT = '/v1/inventory' +INVENTORY_ITEM_ENDPOINT = '/v1/inventory/{id}' +BREAKDOWN_ENDPOINT = '/triage/investigation/timeline/breakdown' +EVENTS_ENDPOINT = '/triage/investigation/entity/events' +FETCH_ENDPOINT = '/integrations/notification' -UPDATE_THREAT_ENDPOINT = '../detection/threats/{id}/update_threat_status_v2' +UPDATE_THREAT_ENDPOINT = '/detection/threats/{id}/update_threat_status_v2' -RUN_ACTION_ENDPOINT = '../triage/containment/entity/run-action' +RUN_ACTION_ENDPOINT = '/triage/containment/entity/run-action' ''' CLIENT CLASS ''' diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 56c245b1751f..d5de08d18a3b 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -11,19 +11,19 @@ configuration: - display: Incident type name: incidentType type: 13 - defaultvalue: Gem Threat + defaultvalue: Gem Alert section: Connect required: false - display: API Endpoint - defaultvalue: "https://app.gem.security/api/v1" + defaultvalue: "https://app.gem.security/api" additionalinfo: "The API endpoint to use for connection (US or EU)" name: api_endpoint type: 15 section: Connect required: true options: - - "https://app.gem.security/api/v1" - - "https://eu-west-1.app.gem.security/api/v1" + - "https://app.gem.security/api" + - "https://eu-west-1.app.gem.security/api" - display: Service Account ID additionalinfo: The Service Account ID to use for connection name: client_id @@ -49,11 +49,6 @@ configuration: - display: Fetch incidents name: isFetch type: 8 - section: Connect - required: false - - display: Get incidents from webhook - name: isWebhook - type: 8 section: Collect required: false - display: Maximum number of alerts per fetch @@ -916,6 +911,6 @@ script: type: python subtype: python3 dockerimage: demisto/auth-utils:1.0.0.76157 # TODO: This docker image was selected since it contains the "jwt" package. Double check if it's the correct one. -fromversion: 6.8.0 +fromversion: 6.5.0 tests: - No tests diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py similarity index 100% rename from Packs/Gem/Scripts/ResolveGemThreat/ResolveGemThreat.py rename to Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml b/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemAlert.yml similarity index 80% rename from Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml rename to Packs/Gem/Scripts/ResolveGemThreat/ResovleGemAlert.yml index d923b089ff4b..02541dc0f1fa 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemThreat.yml +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemAlert.yml @@ -1,10 +1,10 @@ -comment: "Post Processing Script that will resolve the relevant threat in the Gem platform." +comment: "Post Processing Script that will resolve the relevant Alert in the Gem platform." commonfields: - id: ResolveGemThreat + id: ResolveGemAlert version: -1 dockerimage: demisto/python3:3.10.12.63474 enabled: true -name: ResolveGemThreat +name: ResolveGemAlert runas: DBotWeakRole script: "" scripttarget: 0 diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index a649f5e189b4..2ef3ee63eb7c 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -7,11 +7,50 @@ "url": "https://gem.security/", "email": "support@gem.security", "categories": [ + "Analytics & SIEM", + "Data Enrichment & Threat Intelligence", + "Forensics & Malware Analysis", + "Network Security", "Cloud Services" ], - "tags": [], - "useCases": [], - "keywords": [], + "tags": [ + "Alerts", + "Attack", + "Breach", + "Forensics", + "IAM", + "Incident Handling", + "Incident Response", + "DevOps", + "DevSecOps", + "Network", + "Security", + "Security Analytics", + "MITRE ATT&CK", + "CDR", + "CIRA", + "Security Automation", + "Investigation", + "Cloud Security" + ], + "useCases": [ + "Breach Notification", + "Identity and Access Management", + "Incident Response", + "Network Security" + ], + "keywords": [ + "Alerts", + "Attack", + "Breach", + "Forensics", + "IAM", + "Incident Handling", + "Incident Response", + "Security", + "Security Analytics", + "MITRE ATT&CK" + ], "dependencies": { "Base": { "mandatory": true, From ed56edbcddb47ca0b16edede56a6f8e0ded3377e Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 11 Mar 2024 15:08:22 +0000 Subject: [PATCH 38/62] Update status update --- ...emThreat.json => classifier-GemAlert.json} | 0 .../incidentfield-Gem_Account_ID.json | 4 +- .../incidentfield-Gem_Account_Name.json | 2 +- .../incidentfield-Gem_Account_Provider.json | 2 +- .../incidentfield-Gem_Alert_ID.json | 2 +- .../incidentfield-Gem_Alert_Source.json | 2 +- .../incidentfield-Gem_Events_Count.json | 2 +- .../incidentfield-Gem_Main_Entity_ID.json | 2 +- .../incidentfield-Gem_Main_Entity_Name.json | 2 +- .../incidentfield-Gem_Main_Entity_Region.json | 2 +- .../incidentfield-Gem_Main_Entity_Type.json | 2 +- .../incidentfield-Gem_Severity.json | 2 +- .../incidentfield-Gem_TTP_ID.json | 2 +- .../incidentfield-Gem_Threat_ID.json | 2 +- .../incidentfield-Gem_Title.json | 2 +- .../IncidentFields/incidentfield-Gem_Url.json | 2 +- .../incidentfield-Gem_Verdict.json | 2 +- Packs/Gem/Integrations/Gem/Gem.py | 6 +- .../Layouts/layoutscontainer-Gem_Layout.json | 947 +++++++++--------- 19 files changed, 518 insertions(+), 469 deletions(-) rename Packs/Gem/Classifiers/{classifier-GemThreat.json => classifier-GemAlert.json} (100%) diff --git a/Packs/Gem/Classifiers/classifier-GemThreat.json b/Packs/Gem/Classifiers/classifier-GemAlert.json similarity index 100% rename from Packs/Gem/Classifiers/classifier-GemThreat.json rename to Packs/Gem/Classifiers/classifier-GemAlert.json diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json index 6fccf65a589b..e119d7acb743 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemaccountid", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, @@ -37,7 +37,7 @@ "required": false, "runScriptAfterUpdate": false, "script": "", - "selectValues": null, + "selectValues": [], "sla": 0, "system": false, "systemAssociatedTypes": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json index 7231cced1848..0715238b99b9 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemaccountname", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json index 8785bf614d51..3181cb4aa5f0 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemaccountprovider", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json index 11fbf086f4fc..70efb0e84f3d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemalertid", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json index 8200178ed4a3..abd45a14157e 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemalertsource", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json index 2288bbe079b3..26a2d92c7494 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemeventscount", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json index d8e72c48dd78..13504217006c 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemmainentityid", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json index 05d371375a14..bfc219c899ed 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemmainentityname", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json index ab1a12ec427c..6499ef2e8a90 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemmainentityregion", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json index bb9b4c37f1ec..4316556643a1 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemmainentitytype", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json index ed7ff000306f..eb3f823c337b 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemseverity", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json index a22ba1718b9d..d9b215728bd9 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemttpid", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json index fe616a35d079..9a35a0405fa9 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemthreatid", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json index c581f6f4556f..f2a5d2e86d16 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemtitle", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json index 83dba2eee7bd..e073b19cb89d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json @@ -10,7 +10,7 @@ "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemurl", - "closeForm": false, + "closeForm": true, "columns": null, "content": false, "defaultRows": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json index cf369e81e3f7..3b1d1cf2dedb 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json @@ -16,7 +16,7 @@ "defaultRows": null, "definitionId": "", "description": "", - "editForm": false, + "editForm": true, "fieldCalcScript": "", "fromServerVersion": "", "group": 0, diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 3cbc7bf9261b..b59fcd954e36 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -19,15 +19,17 @@ # ENDPOINTS TOKEN_URL = 'https://login.gem.security/oauth/token' + THREATS_ENDPOINT = '/v1/threats' THREAT_ENDPOINT = '/v1/threats/{id}' INVENTORY_ENDPOINT = '/v1/inventory' INVENTORY_ITEM_ENDPOINT = '/v1/inventory/{id}' + BREAKDOWN_ENDPOINT = '/triage/investigation/timeline/breakdown' EVENTS_ENDPOINT = '/triage/investigation/entity/events' FETCH_ENDPOINT = '/integrations/notification' -UPDATE_THREAT_ENDPOINT = '/detection/threats/{id}/update_threat_status_v2' +UPDATE_THREAT_ENDPOINT = '/v1/threats/{id}/status' RUN_ACTION_ENDPOINT = '/triage/containment/entity/run-action' @@ -292,7 +294,7 @@ def list_accessing_ips(self, entity_id=None, entity_type=None, start_time=None, start_time=start_time, end_time=end_time) def update_threat_status(self, threat_id: str, status: Optional[str], verdict: Optional[str], reason: Optional[str] = None): - json_data = {"resolved_metadata": {'verdict': verdict, 'reason': reason}, 'status': status} + json_data = {'verdict': verdict, 'additional_info': reason, 'status': status} response = self.http_request( method='PATCH', url_suffix=UPDATE_THREAT_ENDPOINT.format(id=threat_id), diff --git a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json index 26d79c0bb837..f328adf99799 100644 --- a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json +++ b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json @@ -1,452 +1,499 @@ { - "cacheVersn": 0, - "close": null, - "definitionId": "", - "description": "", - "detached": false, - "details": null, - "detailsV2": { - "TypeName": "", - "tabs": [ - { - "id": "summary", - "name": "Legacy Summary", - "type": "summary" - }, - { - "id": "caseinfoid", - "name": "Incident Info", - "sections": [ - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-fce71720-98b0-11e9-97d7-ed26ef9e46c8", - "isVisible": true, - "items": [ - { - "endCol": 2, - "fieldId": "type", - "height": 22, - "id": "incident-type-field", - "index": 0, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "severity", - "height": 22, - "id": "incident-severity-field", - "index": 1, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "owner", - "height": 22, - "id": "incident-owner-field", - "index": 2, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "sourcebrand", - "height": 22, - "id": "incident-sourceBrand-field", - "index": 3, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "sourceinstance", - "height": 22, - "id": "incident-sourceInstance-field", - "index": 4, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "playbookid", - "height": 22, - "id": "incident-playbookId-field", - "index": 5, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "gemthreatid", - "height": 22, - "id": "3d6bff30-da2f-11ee-9447-69eb690acaf3", - "index": 6, - "sectionItemType": "field", - "startCol": 0 - }, - { - "dropEffect": "move", - "endCol": 2, - "fieldId": "gemurl", - "height": 22, - "id": "3ab48050-da2f-11ee-9447-69eb690acaf3", - "index": 7, - "listId": "caseinfoid-fce71720-98b0-11e9-97d7-ed26ef9e46c8", - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "gemttpid", - "height": 22, - "id": "f4174d70-da2f-11ee-9447-69eb690acaf3", - "index": 8, - "sectionItemType": "field", - "startCol": 0 - } - ], - "maxW": 3, - "moved": false, - "name": "Case Details", - "static": false, - "w": 1, - "x": 0, - "y": 0 - }, - { - "h": 2, - "i": "caseinfoid-61263cc0-98b1-11e9-97d7-ed26ef9e46c8", - "maxW": 3, - "moved": false, - "name": "Notes", - "static": false, - "type": "notes", - "w": 1, - "x": 2, - "y": 0 - }, - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-6aabad20-98b1-11e9-97d7-ed26ef9e46c8", - "maxW": 3, - "moved": false, - "name": "Work Plan", - "static": false, - "type": "workplan", - "w": 1, - "x": 1, - "y": 0 - }, - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-770ec200-98b1-11e9-97d7-ed26ef9e46c8", - "isVisible": true, - "maxW": 3, - "moved": false, - "name": "Linked Incidents", - "static": false, - "type": "linkedIncidents", - "w": 1, - "x": 1, - "y": 6 - }, - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-842632c0-98b1-11e9-97d7-ed26ef9e46c8", - "maxW": 3, - "moved": false, - "name": "Child Incidents", - "static": false, - "type": "childInv", - "w": 1, - "x": 2, - "y": 8 - }, - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-4a31afa0-98ba-11e9-a519-93a53c759fe0", - "maxW": 3, - "moved": false, - "name": "Evidence", - "static": false, - "type": "evidence", - "w": 1, - "x": 2, - "y": 6 - }, - { - "displayType": "ROW", - "h": 2, - "hideName": false, - "i": "caseinfoid-7717e580-9bed-11e9-9a3f-8b4b2158e260", - "maxW": 3, - "moved": false, - "name": "Team Members", - "static": false, - "type": "team", - "w": 1, - "x": 0, - "y": 6 - }, - { - "displayType": "CARD", - "h": 2, - "i": "caseinfoid-ac32f620-a0b0-11e9-b27f-13ae1773d289", - "items": [ - { - "endCol": 1, - "fieldId": "occurred", - "height": 53, - "id": "incident-occurred-field", - "index": 0, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 1, - "fieldId": "dbotmodified", - "height": 53, - "id": "incident-modified-field", - "index": 1, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "dbotduedate", - "height": 53, - "id": "incident-dueDate-field", - "index": 2, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "dbotcreated", - "height": 53, - "id": "incident-created-field", - "index": 0, - "sectionItemType": "field", - "startCol": 1 - }, - { - "endCol": 2, - "fieldId": "dbotclosed", - "height": 53, - "id": "incident-closed-field", - "index": 1, - "sectionItemType": "field", - "startCol": 1 - } - ], - "maxW": 3, - "moved": false, - "name": "Timeline Information", - "static": false, - "w": 1, - "x": 0, - "y": 2 - }, - { - "displayType": "ROW", - "h": 2, - "i": "caseinfoid-88e6bf70-a0b1-11e9-b27f-13ae1773d289", - "isVisible": true, - "items": [ - { - "endCol": 2, - "fieldId": "dbotclosed", - "height": 22, - "id": "incident-dbotClosed-field", - "index": 0, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "closereason", - "height": 22, - "id": "incident-closeReason-field", - "index": 1, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "closenotes", - "height": 22, - "id": "incident-closeNotes-field", - "index": 2, - "sectionItemType": "field", - "startCol": 0 - } - ], - "maxW": 3, - "moved": false, - "name": "Closing Information", - "static": false, - "w": 1, - "x": 0, - "y": 4 - }, - { - "displayType": "CARD", - "h": 4, - "i": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", - "isVisible": true, - "items": [ - { - "endCol": 4, - "fieldId": "description", - "height": 53, - "id": "0208ca80-da30-11ee-9447-69eb690acaf3", - "index": 0, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "gemaccountid", - "height": 53, - "id": "7bd9bf50-da2f-11ee-9447-69eb690acaf3", - "index": 2, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "gemaccountname", - "height": 53, - "id": "804b7150-da2f-11ee-9447-69eb690acaf3", - "index": 3, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "gemaccountprovider", - "height": 53, - "id": "829fe8a0-da2f-11ee-9447-69eb690acaf3", - "index": 4, - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 2, - "fieldId": "gemalertsource", - "height": 53, - "id": "8d3394b0-da2f-11ee-9447-69eb690acaf3", - "index": 5, - "sectionItemType": "field", - "startCol": 0 - }, - { - "dropEffect": "move", - "endCol": 2, - "fieldId": "gemeventscount", - "height": 53, - "id": "c2e68770-da2f-11ee-9447-69eb690acaf3", - "index": 6, - "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", - "sectionItemType": "field", - "startCol": 0 - }, - { - "endCol": 4, - "fieldId": "gemmainentityid", - "height": 53, - "id": "d9086c30-da2f-11ee-9447-69eb690acaf3", - "index": 2, - "sectionItemType": "field", - "startCol": 2 - }, - { - "endCol": 4, - "fieldId": "gemmainentityname", - "height": 53, - "id": "daf0b430-da2f-11ee-9447-69eb690acaf3", - "index": 3, - "sectionItemType": "field", - "startCol": 2 - }, - { - "endCol": 4, - "fieldId": "gemmainentityregion", - "height": 53, - "id": "dc4b6230-da2f-11ee-9447-69eb690acaf3", - "index": 4, - "sectionItemType": "field", - "startCol": 2 - }, - { - "endCol": 4, - "fieldId": "gemmainentitytype", - "height": 53, - "id": "dda39f30-da2f-11ee-9447-69eb690acaf3", - "index": 5, - "sectionItemType": "field", - "startCol": 2 - } - ], - "maxW": 3, - "moved": false, - "name": "Investigation Data", - "static": false, - "w": 2, - "x": 1, - "y": 2 - } - ], - "type": "custom" - }, - { - "id": "warRoom", - "name": "War Room", - "type": "warRoom" - }, - { - "id": "workPlan", - "name": "Work Plan", - "type": "workPlan" - }, - { - "id": "evidenceBoard", - "name": "Evidence Board", - "type": "evidenceBoard" - }, - { - "id": "relatedIncidents", - "name": "Related Incidents", - "type": "relatedIncidents" - }, - { - "id": "canvas", - "name": "Canvas", - "type": "canvas" - } - ] - }, - "edit": null, - "fromServerVersion": "", - "group": "incident", - "id": "Gem Layout", - "indicatorsDetails": null, - "indicatorsQuickView": null, - "itemVersion": "", - "locked": false, - "mobile": null, - "name": "Gem Layout", - "packID": "", - "packName": "", - "quickView": null, - "quickViewV2": null, - "system": false, - "toServerVersion": "", - "version": -1 + "cacheVersn": 0, + "close": { + "sections": [ + { + "description": "", + "fields": [ + { + "fieldId": "incident_closereason", + "isVisible": true + }, + { + "fieldId": "incident_closenotes", + "isVisible": true + } + ], + "isVisible": true, + "name": "Basic Information", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + }, + { + "description": "", + "fields": [ + { + "fieldId": "incident_gemverdict", + "isVisible": true + } + ], + "isVisible": true, + "name": "Custom Fields", + "query": null, + "queryType": "", + "readOnly": false, + "type": "" + } + ] + }, + "definitionId": "", + "description": "", + "detached": false, + "details": null, + "detailsV2": { + "TypeName": "", + "tabs": [ + { + "id": "summary", + "name": "Legacy Summary", + "type": "summary" + }, + { + "id": "caseinfoid", + "name": "Incident Info", + "sections": [ + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-fce71720-98b0-11e9-97d7-ed26ef9e46c8", + "isVisible": true, + "items": [ + { + "endCol": 2, + "fieldId": "type", + "height": 22, + "id": "incident-type-field", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "severity", + "height": 22, + "id": "incident-severity-field", + "index": 1, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "owner", + "height": 22, + "id": "incident-owner-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "sourcebrand", + "height": 22, + "id": "incident-sourceBrand-field", + "index": 3, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "sourceinstance", + "height": 22, + "id": "incident-sourceInstance-field", + "index": 4, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "playbookid", + "height": 22, + "id": "incident-playbookId-field", + "index": 5, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemthreatid", + "height": 22, + "id": "3d6bff30-da2f-11ee-9447-69eb690acaf3", + "index": 6, + "sectionItemType": "field", + "startCol": 0 + }, + { + "dropEffect": "move", + "endCol": 2, + "fieldId": "gemurl", + "height": 22, + "id": "3ab48050-da2f-11ee-9447-69eb690acaf3", + "index": 7, + "listId": "caseinfoid-fce71720-98b0-11e9-97d7-ed26ef9e46c8", + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemttpid", + "height": 22, + "id": "f4174d70-da2f-11ee-9447-69eb690acaf3", + "index": 8, + "sectionItemType": "field", + "startCol": 0 + } + ], + "maxW": 3, + "moved": false, + "name": "Case Details", + "static": false, + "w": 1, + "x": 0, + "y": 0 + }, + { + "h": 2, + "i": "caseinfoid-61263cc0-98b1-11e9-97d7-ed26ef9e46c8", + "maxW": 3, + "moved": false, + "name": "Notes", + "static": false, + "type": "notes", + "w": 1, + "x": 2, + "y": 0 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-6aabad20-98b1-11e9-97d7-ed26ef9e46c8", + "maxW": 3, + "moved": false, + "name": "Work Plan", + "static": false, + "type": "workplan", + "w": 1, + "x": 1, + "y": 0 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-770ec200-98b1-11e9-97d7-ed26ef9e46c8", + "isVisible": true, + "maxW": 3, + "moved": false, + "name": "Linked Incidents", + "static": false, + "type": "linkedIncidents", + "w": 1, + "x": 1, + "y": 6 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-842632c0-98b1-11e9-97d7-ed26ef9e46c8", + "maxW": 3, + "moved": false, + "name": "Child Incidents", + "static": false, + "type": "childInv", + "w": 1, + "x": 2, + "y": 8 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-4a31afa0-98ba-11e9-a519-93a53c759fe0", + "maxW": 3, + "moved": false, + "name": "Evidence", + "static": false, + "type": "evidence", + "w": 1, + "x": 2, + "y": 6 + }, + { + "displayType": "ROW", + "h": 2, + "hideName": false, + "i": "caseinfoid-7717e580-9bed-11e9-9a3f-8b4b2158e260", + "maxW": 3, + "moved": false, + "name": "Team Members", + "static": false, + "type": "team", + "w": 1, + "x": 0, + "y": 6 + }, + { + "displayType": "CARD", + "h": 2, + "i": "caseinfoid-ac32f620-a0b0-11e9-b27f-13ae1773d289", + "items": [ + { + "endCol": 1, + "fieldId": "occurred", + "height": 53, + "id": "incident-occurred-field", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 1, + "fieldId": "dbotmodified", + "height": 53, + "id": "incident-modified-field", + "index": 1, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "dbotduedate", + "height": 53, + "id": "incident-dueDate-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "dbotcreated", + "height": 53, + "id": "incident-created-field", + "index": 0, + "sectionItemType": "field", + "startCol": 1 + }, + { + "endCol": 2, + "fieldId": "dbotclosed", + "height": 53, + "id": "incident-closed-field", + "index": 1, + "sectionItemType": "field", + "startCol": 1 + } + ], + "maxW": 3, + "moved": false, + "name": "Timeline Information", + "static": false, + "w": 1, + "x": 0, + "y": 2 + }, + { + "displayType": "ROW", + "h": 2, + "i": "caseinfoid-88e6bf70-a0b1-11e9-b27f-13ae1773d289", + "isVisible": true, + "items": [ + { + "endCol": 2, + "fieldId": "dbotclosed", + "height": 22, + "id": "incident-dbotClosed-field", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "closereason", + "height": 22, + "id": "incident-closeReason-field", + "index": 1, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "closenotes", + "height": 22, + "id": "incident-closeNotes-field", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemverdict", + "height": 22, + "id": "incident-gemverdict-field", + "index": 3, + "sectionItemType": "field", + "startCol": 0 + } + ], + "maxW": 3, + "moved": false, + "name": "Closing Information", + "static": false, + "w": 1, + "x": 0, + "y": 4 + }, + { + "displayType": "CARD", + "h": 4, + "i": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "isVisible": true, + "items": [ + { + "endCol": 4, + "fieldId": "description", + "height": 53, + "id": "0208ca80-da30-11ee-9447-69eb690acaf3", + "index": 0, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemaccountid", + "height": 53, + "id": "7bd9bf50-da2f-11ee-9447-69eb690acaf3", + "index": 2, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemaccountname", + "height": 53, + "id": "804b7150-da2f-11ee-9447-69eb690acaf3", + "index": 3, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemaccountprovider", + "height": 53, + "id": "829fe8a0-da2f-11ee-9447-69eb690acaf3", + "index": 4, + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 2, + "fieldId": "gemalertsource", + "height": 53, + "id": "8d3394b0-da2f-11ee-9447-69eb690acaf3", + "index": 5, + "sectionItemType": "field", + "startCol": 0 + }, + { + "dropEffect": "move", + "endCol": 2, + "fieldId": "gemeventscount", + "height": 53, + "id": "c2e68770-da2f-11ee-9447-69eb690acaf3", + "index": 6, + "listId": "caseinfoid-e54b1770-a0b1-11e9-b27f-13ae1773d289", + "sectionItemType": "field", + "startCol": 0 + }, + { + "endCol": 4, + "fieldId": "gemmainentityid", + "height": 53, + "id": "d9086c30-da2f-11ee-9447-69eb690acaf3", + "index": 2, + "sectionItemType": "field", + "startCol": 2 + }, + { + "endCol": 4, + "fieldId": "gemmainentityname", + "height": 53, + "id": "daf0b430-da2f-11ee-9447-69eb690acaf3", + "index": 3, + "sectionItemType": "field", + "startCol": 2 + }, + { + "endCol": 4, + "fieldId": "gemmainentityregion", + "height": 53, + "id": "dc4b6230-da2f-11ee-9447-69eb690acaf3", + "index": 4, + "sectionItemType": "field", + "startCol": 2 + }, + { + "endCol": 4, + "fieldId": "gemmainentitytype", + "height": 53, + "id": "dda39f30-da2f-11ee-9447-69eb690acaf3", + "index": 5, + "sectionItemType": "field", + "startCol": 2 + } + ], + "maxW": 3, + "moved": false, + "name": "Investigation Data", + "static": false, + "w": 2, + "x": 1, + "y": 2 + } + ], + "showEmptyFields": true, + "type": "custom" + }, + { + "id": "warRoom", + "name": "War Room", + "type": "warRoom" + }, + { + "id": "workPlan", + "name": "Work Plan", + "type": "workPlan" + }, + { + "id": "evidenceBoard", + "name": "Evidence Board", + "type": "evidenceBoard" + }, + { + "id": "relatedIncidents", + "name": "Related Incidents", + "type": "relatedIncidents" + }, + { + "id": "canvas", + "name": "Canvas", + "type": "canvas" + } + ] + }, + "edit": null, + "fromServerVersion": "", + "group": "incident", + "id": "Gem Layout", + "indicatorsDetails": null, + "indicatorsQuickView": null, + "itemVersion": "", + "locked": false, + "mobile": null, + "name": "Gem Layout", + "packID": "", + "packName": "", + "quickView": null, + "quickViewV2": null, + "system": false, + "toServerVersion": "", + "version": -1 } \ No newline at end of file From ca7dc99c23dad96f3df9c8d5ea2b356cd8333a6a Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 12 Mar 2024 14:09:34 +0000 Subject: [PATCH 39/62] Added tests for list commands --- Packs/Gem/Integrations/Gem/Gem.py | 4 +- Packs/Gem/Integrations/Gem/Gem_test.py | 485 +++++++++++++++++++++++-- 2 files changed, 466 insertions(+), 23 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index b59fcd954e36..1b44fa0de013 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -70,7 +70,7 @@ def http_request(self, method: str, url_suffix='', full_url=None, headers=None, headers = headers or {} headers['Authorization'] = f'Bearer {self._auth_token}' try: - return super()._http_request( + response = super()._http_request( method=method, url_suffix=url_suffix, full_url=full_url, @@ -79,6 +79,8 @@ def http_request(self, method: str, url_suffix='', full_url=None, headers=None, params=params, raise_on_status=True ) + demisto.debug(f"Got response: {response}") + return response except DemistoException as e: demisto.error(f"Failed to execute {method} request to {url_suffix}. Error: {str(e)}") raise Exception(f"Failed to execute {method} request to {url_suffix}. Error: {str(e)}") diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py index d957c5edf2a0..da463dbefee9 100644 --- a/Packs/Gem/Integrations/Gem/Gem_test.py +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -1,16 +1,23 @@ -"""Base Integration for Cortex XSOAR - Unit Tests file +import json -Pytest Unit Tests: all funcion names must start with "test_" +import pytest +from unittest.mock import patch +import demistomock as demisto -More details: https://xsoar.pan.dev/docs/integrations/unit-testing +params = { + "api_endpoint": "https://notexisting.gem.security/api/v1", + "client_id": "client_id", + "client_secret": "client_secret", + "firstFetch": True, + "max_fetch": "10", +} -MAKE SURE YOU REVIEW/REPLACE ALL THE COMMENTS MARKED AS "TODO" +mock_auth_token = "mock_auth_token" -You must add at least a Unit Test function for every XSOAR command -you are implementing with your integration -""" -import json +@pytest.fixture(autouse=True) +def set_mocks(mocker): + mocker.patch.object(demisto, 'params', return_value=params) def util_load_json(path): @@ -18,24 +25,458 @@ def util_load_json(path): return json.loads(f.read()) -# TODO: REMOVE the following dummy unit test function -def test_baseintegration_dummy(): - """Tests helloworld-say-hello command function. +test_get_threat_details_data = { + "id": "00000000-0000-0000-0000-000000000000", + "type": "Threat", + "link": "A link", + "title": "A title", + "description": "A description", + "event_datetime": "2023-03-09T12:41:33.000000", + "event": { + "alert_id": "00000000-0000-0000-0000-000000000000", + "alert_source": "Gem", + "threat_id": "11111111-1111-1111-1111-111111111111", + "created_at": "2023-03-09T12:41:33.000000", + "secondary_entities": [ + { + "id": "Example RDS", + "type": "rds_cluster", + "metadata": { + "name": "Example RDS", + "region": None, + "account_id": None, + "context_from_event": None, + "arn_id": "Example RDS" + }, + "name": "Example RDS", + "cloud_provider": "aws" + } + ], + "timeframe": { + "start": "2023-03-09T12:41:33.000000", + "end": "2023-03-09T12:41:33.000000" + }, + "events": [], + "events_total_count": 0, + "attributes": { + "bucket_name": "collected-data" + }, + "main_entity": { + "id": "Example IAM", + "type": "iam_user", + "metadata": { + "name": "Example IAM", + "region": "global", + "account_id": None, + "context_from_event": None, + "arn_id": "Example IAM", + "access_key": None, + "user_name": "Example IAM" + }, + "name": "Example IAM", + "cloud_provider": "aws" + }, + "ttp_id": "AWS/DefenseEvasion:S3/PublicAccessBlockPolicyModified" + }, + "account": { + "name": "123456789012", + "display_name": "test account", + "cloud_provider": "aws" + }, + "severity": 5, + "severity_text": "Medium" +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_get_threat_details_data) +def test_get_threat_details(http_request, _generate_token): + from Gem import get_threat_details, init_client + client = init_client(params) + args = { + "threat_id": "11111111-1111-1111-1111-111111111111" + } + res = get_threat_details(client, args) + assert res.outputs == test_get_threat_details_data + + +test_list_threats_data = {'count': 1, 'next': None, 'previous': None, 'results': [test_get_threat_details_data]} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_threats_data) +def test_list_threats(http_request, _generate_token): + from Gem import list_threats, init_client + client = init_client(params) + args = { + "time_start": "2024-03-01", + "time_end": "2024-03-02" + } + res = list_threats(client, args) + assert res.outputs == test_list_threats_data['results'] - Checks the output of the command function with the expected output. - No mock is needed here because the say_hello_command does not call - any external API. - """ - from BaseIntegration import Client, baseintegration_dummy_command +test_get_resource_details_data = { + "resource_id": "11111111-1111-1111-1111-111111111111", + "account": { + "id": 123, + "display_name": "display_name", + "organization_name": "organization_name", + "identifier": "11111111-1111-1111-1111-111111111111", + "hierarchy_path": [], + "account_status": "accessible", + "tenant": "11111111-1111-1111-1111-111111111111", + "cloud_provider": "azure_tenant" + }, + "region": "region", + "resource_type": "resource_type", + "created_at": "2023-03-01T12:37:16Z", + "identifiers": [], + "external_url": "", + "tags": {}, + "deleted": False, + "categories": [ + "Identity" + ] +} - client = Client(base_url='some_mock_url', verify=False) + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_get_resource_details_data) +def test_get_resource_details(http_request, _generate_token): + from Gem import get_resource_details, init_client + client = init_client(params) args = { - 'dummy': 'this is a dummy response' + "resource_id": "11111111-1111-1111-1111-111111111111" } - response = baseintegration_dummy_command(client, args) + res = get_resource_details(client, args) + assert res.outputs == test_get_resource_details_data + + +test_list_inventory_resources_data = {'next': None, 'previous': None, 'results': [test_get_resource_details_data]} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_inventory_resources_data) +def test_list_inventory_resources(http_request, _generate_token): + from Gem import list_inventory_resources, init_client + client = init_client(params) + args = { + "limit": "1" + } + res = list_inventory_resources(client, args) + assert res.outputs == test_list_inventory_resources_data['results'] + + +test_list_ips_by_entity_data = { + "table": { + "headers": [ + "SOURCEIPADDRESS", + "COUNT_SOURCEIP", + "CITY", + "LONGITUDE", + "LATITUDE", + "IP_TYPE", + "COUNTRY_CODE" + ], + "rows": [ + { + "row": { + "SOURCEIPADDRESS": "1.1.1.1", + "COUNT_SOURCEIP": "4037", + "IP_TYPE": "external", + "COUNTRY_CODE": "IL", + "COUNTRY_NAME": "Israel", + "AS_NAME": "As Name", + "AS_NUMBER": "11111", + "CITY": "a citytel", + "LONGITUDE": "longitude", + "LATITUDE": "latitude", + "PROVIDER": "provider", + "IS_PRIVATE": "False" + } + }, + { + "row": { + "SOURCEIPADDRESS": "2.2.2.2", + "COUNT_SOURCEIP": "499", + "IP_TYPE": "external", + "COUNTRY_CODE": "NL", + "COUNTRY_NAME": "Amsterdam", + "AS_NAME": "As Name", + "AS_NUMBER": "22222", + "CITY": "a city", + "LONGITUDE": "longitude", + "LATITUDE": "latitude", + "PROVIDER": "provider", + "IS_PRIVATE": "False" + } + } + + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_ips_by_entity_data) +def test_list_ips_by_entity(http_request, _generate_token): + from Gem import list_ips_by_entity, init_client + client = init_client(params) + args = { + "entity_id": "11111111-1111-1111-1111-111111111111", + "entity_type": "rds_cluster", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_ips_by_entity(client, args) + assert res.outputs[0] == test_list_ips_by_entity_data['table']['rows'][0]['row'] + + +test_list_services_by_entity_data = { + "table": { + "headers": [ + "SERVICE", + "COUNT_SERVICE" + ], + "rows": [ + { + "row": { + "SERVICE": "A service", + "COUNT_SERVICE": "567" + } + }, + { + "row": { + "SERVICE": "Another service", + "COUNT_SERVICE": "524" + } + } + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_services_by_entity_data) +def test_list_services_by_entity(http_request, _generate_token): + from Gem import list_services_by_entity, init_client + client = init_client(params) + args = { + "entity_id": "11111111-1111-1111-1111-111111111111", + "entity_type": "rds_cluster", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_services_by_entity(client, args) + + assert res.outputs[0] == test_list_services_by_entity_data['table']['rows'][0]['row'] - mock_response = util_load_json('test_data/baseintegration-dummy.json') - assert response.outputs == mock_response -# TODO: ADD HERE unit tests for every command +test_list_events_by_entity_data = { + "table": { + "headers": [ + "EVENTNAME", + "EVENTNAME_COUNT" + ], + "rows": [ + { + "row": { + "EVENTNAME": "An event", + "EVENTNAME_COUNT": "6" + } + }, + { + "row": { + "EVENTNAME": "Another event", + "EVENTNAME_COUNT": "1" + } + } + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_events_by_entity_data) +def test_list_events_by_entity(http_request, _generate_token): + from Gem import list_events_by_entity, init_client + client = init_client(params) + args = { + "entity_id": "11111111-1111-1111-1111-111111111111", + "entity_type": "rds_cluster", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_events_by_entity(client, args) + assert res.outputs[0] == test_list_events_by_entity_data['table']['rows'][0]['row'] + + +test_list_accessing_entities_data = { + "table": { + "headers": [ + "USER_ID", + "USER_COUNT" + ], + "rows": [ + { + "row": { + "USER_ID": "user id", + "USER_COUNT": "4" + } + } + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_accessing_entities_data) +def test_list_accessing_entities(http_request, _generate_token): + from Gem import list_accessing_entities, init_client + client = init_client(params) + args = { + "entity_id": "ec2/instance/id", + "entity_type": "ec2_instance", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_accessing_entities(client, args) + assert res.outputs[0] == test_list_accessing_entities_data['table']['rows'][0]['row'] + + +test_list_using_entities_data = { + "table": { + "headers": [ + "ENTITY_ID", + "ENTITY_COUNT" + ], + "rows": [ + { + "row": { + "ENTITY_ID": "entity id", + "ENTITY_COUNT": "4" + } + } + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_using_entities_data) +def test_list_using_entities(http_request, _generate_token): + from Gem import list_using_entities, init_client + client = init_client(params) + args = { + "entity_id": "1.1.1.1", + "entity_type": "external_ip", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_using_entities(client, args) + assert res.outputs[0] == test_list_using_entities_data['table']['rows'][0]['row'] + + +test_list_events_on_entity_data = { + "table": { + "headers": [ + "EVENTNAME", + "EVENTNAME_COUNT" + ], + "rows": [ + { + "row": { + "EVENTNAME": "An event", + "EVENTNAME_COUNT": "6" + } + }, + { + "row": { + "EVENTNAME": "Another event", + "EVENTNAME_COUNT": "1" + } + } + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_events_on_entity_data) +def test_list_events_on_entity(http_request, _generate_token): + from Gem import list_events_on_entity, init_client + client = init_client(params) + args = { + "entity_id": "security group id", + "entity_type": "security_group", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_events_on_entity(client, args) + assert res.outputs[0] == test_list_events_on_entity_data['table']['rows'][0]['row'] + + +test_list_accessing_ips_data = { + "table": { + "headers": [ + "SOURCEIPADDRESS", + "COUNT_SOURCEIP", + "CITY", + "LONGITUDE", + "LATITUDE", + "IP_TYPE", + "COUNTRY_CODE" + ], + "rows": [ + { + "row": { + "SOURCEIPADDRESS": "1.1.1.1", + "COUNT_SOURCEIP": "4037", + "IP_TYPE": "external", + "COUNTRY_CODE": "IL", + "COUNTRY_NAME": "Israel", + "AS_NAME": "As Name", + "AS_NUMBER": "11111", + "CITY": "a citytel", + "LONGITUDE": "longitude", + "LATITUDE": "latitude", + "PROVIDER": "provider", + "IS_PRIVATE": "False" + } + }, + { + "row": { + "SOURCEIPADDRESS": "2.2.2.2", + "COUNT_SOURCEIP": "499", + "IP_TYPE": "external", + "COUNTRY_CODE": "NL", + "COUNTRY_NAME": "Amsterdam", + "AS_NAME": "As Name", + "AS_NUMBER": "22222", + "CITY": "a city", + "LONGITUDE": "longitude", + "LATITUDE": "latitude", + "PROVIDER": "provider", + "IS_PRIVATE": "False" + } + } + + ] + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_list_accessing_ips_data) +def test_list_accessing_ips(http_request, _generate_token): + from Gem import list_accessing_ips, init_client + client = init_client(params) + args = { + "entity_id": "security group id", + "entity_type": "security_group", + "start_time": "2024-03-01", + "end_time": "2024-03-02" + } + res = list_accessing_ips(client, args) + assert res.outputs[0] == test_list_accessing_ips_data['table']['rows'][0]['row'] From d34e86e707f1275ba9e0e33d438204a1fb395609 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 12 Mar 2024 16:18:00 +0000 Subject: [PATCH 40/62] Change Gem Verdict default --- Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json | 5 ++--- Packs/Gem/Integrations/Gem/Gem_test.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json index 3b1d1cf2dedb..2d154edfd682 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json @@ -38,12 +38,11 @@ "runScriptAfterUpdate": false, "script": "", "selectValues": [ - "", + "Inconclusive", "Malicious", "Security Test", "Planned action", - "Not malicious", - "Inconclusive" + "Not malicious" ], "sla": 0, "system": false, diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py index da463dbefee9..bbe77eb32b49 100644 --- a/Packs/Gem/Integrations/Gem/Gem_test.py +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -189,7 +189,7 @@ def test_list_inventory_resources(http_request, _generate_token): "COUNTRY_NAME": "Israel", "AS_NAME": "As Name", "AS_NUMBER": "11111", - "CITY": "a citytel", + "CITY": "a city", "LONGITUDE": "longitude", "LATITUDE": "latitude", "PROVIDER": "provider", @@ -438,7 +438,7 @@ def test_list_events_on_entity(http_request, _generate_token): "COUNTRY_NAME": "Israel", "AS_NAME": "As Name", "AS_NUMBER": "11111", - "CITY": "a citytel", + "CITY": "a city", "LONGITUDE": "longitude", "LATITUDE": "latitude", "PROVIDER": "provider", From bac95f6af589899e7bbf5368ddfb99638cae1cbb Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 12 Mar 2024 16:52:22 +0000 Subject: [PATCH 41/62] Add gem threat url --- ...lassifier-mapper-incoming-Gem-webhook.json | 24 +++++++++++++++++-- .../classifier-mapper-incoming-Gem.json | 24 +++++++++++++++++-- .../ResolveGemThreat/ResolveGemAlert.py | 3 ++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index e8ab98fa28fc..e75cb55a8a64 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -40,8 +40,28 @@ "Gem Events Count": { "simple": "event.events_total_count" }, - "Gem URL": { - "simple": "link" + "Gem Url": { + "complex": { + "accessor": "threat_id", + "filters": [], + "root": "event", + "transformers": [ + { + "args": { + "prefix": { + "isContext": false, + "value": { + "simple": "https://app.gem.security/threats/" + } + }, + "suffix": { + "isContext": false + } + }, + "operator": "concat" + } + ] + } }, "Gem Main Entity ID": { "simple": "event.main_entity.id" diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index bc31fd6f7166..5e6b60e4137f 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -54,8 +54,28 @@ "Gem Title": { "simple": "title" }, - "Gem URL": { - "simple": "link" + "Gem Url": { + "complex": { + "accessor": "threat_id", + "filters": [], + "root": "metadata", + "transformers": [ + { + "args": { + "prefix": { + "isContext": false, + "value": { + "simple": "https://app.gem.security/threats/" + } + }, + "suffix": { + "isContext": false + } + }, + "operator": "concat" + } + ] + } }, "name": { "simple": "title" diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py index c01f690be58c..073dcb845088 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py +++ b/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py @@ -3,7 +3,7 @@ def main(): incident = demisto.incident() - # incident.get("closeReason", "") + close_reason = incident.get("closeReason", "") close_notes = incident.get("closeNotes", "") close_notes = close_notes if close_notes else demisto.args().get("closeNotes", "") @@ -20,6 +20,7 @@ def main(): demisto.executeCommand("gem-update-threat-status", { "verdict": verdict, "reason": f"Closed from XSOAR, incident id: {incident_id}\n" + f"\nClose Reason:\n{close_reason}" f"\nClose Notes:\n{close_notes}", "threat_id": threat_id, "status": status}) From 96b7c9bbea1d55caacfa66611b678b47beb15514 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Wed, 13 Mar 2024 13:21:26 +0000 Subject: [PATCH 42/62] format and first playbook --- .../Gem/Classifiers/classifier-GemAlert.json | 2 +- .../incidentfield-Gem_Account_ID.json | 29 +--- .../incidentfield-Gem_Account_Name.json | 81 ++++------- .../incidentfield-Gem_Account_Provider.json | 81 ++++------- .../incidentfield-Gem_Alert_ID.json | 29 +--- .../incidentfield-Gem_Alert_Source.json | 81 ++++------- .../incidentfield-Gem_Events_Count.json | 81 ++++------- .../incidentfield-Gem_Main_Entity_ID.json | 81 ++++------- .../incidentfield-Gem_Main_Entity_Name.json | 81 ++++------- .../incidentfield-Gem_Main_Entity_Region.json | 81 ++++------- .../incidentfield-Gem_Main_Entity_Type.json | 81 ++++------- .../incidentfield-Gem_Severity.json | 81 ++++------- .../incidentfield-Gem_TTP_ID.json | 81 ++++------- .../incidentfield-Gem_Threat_ID.json | 29 +--- .../incidentfield-Gem_Title.json | 81 ++++------- .../IncidentFields/incidentfield-Gem_Url.json | 81 ++++------- .../incidentfield-Gem_Verdict.json | 28 +--- Packs/Gem/Integrations/Gem/Gem.yml | 2 +- .../Layouts/layoutscontainer-Gem_Layout.json | 22 +-- Packs/Gem/Playbooks/Gem_Handle_ec2_README.md | 39 ++++++ .../Playbooks/Gem_Stop_ec2_and_Resolve.yml | 129 ------------------ 21 files changed, 388 insertions(+), 893 deletions(-) create mode 100644 Packs/Gem/Playbooks/Gem_Handle_ec2_README.md delete mode 100644 Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml diff --git a/Packs/Gem/Classifiers/classifier-GemAlert.json b/Packs/Gem/Classifiers/classifier-GemAlert.json index abb8ac67aeb7..e29a7d1a3bdc 100644 --- a/Packs/Gem/Classifiers/classifier-GemAlert.json +++ b/Packs/Gem/Classifiers/classifier-GemAlert.json @@ -4,7 +4,7 @@ "type": "classification", "defaultIncidentType": "Gem Alert", "description": "Classifies Gem Alerts.", - "fromVersion": "6.0.0", + "fromVersion": "6.10.0", "keyTypeMap": {}, "transformer": { "complex": null, diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json index e119d7acb743..65f7611d64aa 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_ID.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, "associatedToAll": false, "associatedTypes": [ "Gem Alert" ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemaccountid", "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", + "content": true, "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", "group": 0, "hidden": false, "id": "incident_gemaccountid", "isReadOnly": true, - "itemVersion": "", "locked": false, - "mergeStrategy": "", "name": "Gem Account ID", "neverSetAsRequired": false, "openEnded": false, - "orgType": "shortText", "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": [], "sla": 0, "system": false, - "systemAssociatedTypes": null, - "template": "", "threshold": 72, - "toServerVersion": "", "type": "shortText", "unmapped": false, "unsearchable": false, "useAsKpi": false, - "validatedError": "", - "validationRegex": "", "version": -1, - "x2_fields": "" + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json index 0715238b99b9..be377e2d003d 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Name.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemaccountname", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemaccountname", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Account Name", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemaccountname", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemaccountname", + "isReadOnly": true, + "locked": false, + "name": "Gem Account Name", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json index 3181cb4aa5f0..981b144c0707 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Account_Provider.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemaccountprovider", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemaccountprovider", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Account Provider", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemaccountprovider", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemaccountprovider", + "isReadOnly": true, + "locked": false, + "name": "Gem Account Provider", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json index 70efb0e84f3d..3d6a667bce81 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_ID.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, "associatedToAll": false, "associatedTypes": [ "Gem Alert" ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemalertid", "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", + "content": true, "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", "group": 0, "hidden": false, "id": "incident_gemalertid", "isReadOnly": true, - "itemVersion": "", "locked": false, - "mergeStrategy": "", "name": "Gem Alert ID", "neverSetAsRequired": false, "openEnded": false, - "orgType": "shortText", "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, "sla": 0, "system": false, - "systemAssociatedTypes": null, - "template": "", "threshold": 72, - "toServerVersion": "", "type": "shortText", "unmapped": false, "unsearchable": false, "useAsKpi": false, - "validatedError": "", - "validationRegex": "", "version": -1, - "x2_fields": "" + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json index abd45a14157e..6377d35d9ed8 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Alert_Source.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemalertsource", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemalertsource", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Alert Source", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemalertsource", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemalertsource", + "isReadOnly": true, + "locked": false, + "name": "Gem Alert Source", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json index 26a2d92c7494..e9c5b303cebf 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Events_Count.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemeventscount", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemeventscount", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Events Count", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "number", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "number", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemeventscount", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemeventscount", + "isReadOnly": true, + "locked": false, + "name": "Gem Events Count", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "number", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json index 13504217006c..02c53f8ad847 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_ID.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemmainentityid", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemmainentityid", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Main Entity ID", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemmainentityid", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemmainentityid", + "isReadOnly": true, + "locked": false, + "name": "Gem Main Entity ID", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json index bfc219c899ed..b66cb9abe615 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Name.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemmainentityname", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemmainentityname", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Main Entity Name", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemmainentityname", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemmainentityname", + "isReadOnly": true, + "locked": false, + "name": "Gem Main Entity Name", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json index 6499ef2e8a90..374f96127645 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Region.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemmainentityregion", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemmainentityregion", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Main Entity Region", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemmainentityregion", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemmainentityregion", + "isReadOnly": true, + "locked": false, + "name": "Gem Main Entity Region", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json index 4316556643a1..dadc34693c96 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Main_Entity_Type.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemmainentitytype", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemmainentitytype", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Main Entity Type", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemmainentitytype", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemmainentitytype", + "isReadOnly": true, + "locked": false, + "name": "Gem Main Entity Type", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json index eb3f823c337b..452c0d44c431 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Severity.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemseverity", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemseverity", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Severity", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "number", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "number", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemseverity", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemseverity", + "isReadOnly": true, + "locked": false, + "name": "Gem Severity", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "number", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json index d9b215728bd9..b0e9ff324966 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_TTP_ID.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemttpid", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemttpid", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem TTP ID", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemttpid", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemttpid", + "isReadOnly": true, + "locked": false, + "name": "Gem TTP ID", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json index 9a35a0405fa9..182de788d2b1 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Threat_ID.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, "associatedToAll": false, "associatedTypes": [ "Gem Alert" ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemthreatid", "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", + "content": true, "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", "group": 0, "hidden": false, "id": "incident_gemthreatid", "isReadOnly": true, - "itemVersion": "", "locked": false, - "mergeStrategy": "", "name": "Gem Threat ID", "neverSetAsRequired": false, "openEnded": false, - "orgType": "shortText", "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, "sla": 0, "system": false, - "systemAssociatedTypes": null, - "template": "", "threshold": 72, - "toServerVersion": "", "type": "shortText", "unmapped": false, "unsearchable": false, "useAsKpi": false, - "validatedError": "", - "validationRegex": "", "version": -1, - "x2_fields": "" + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json index f2a5d2e86d16..499854e27240 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Title.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemtitle", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemtitle", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem Title", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "shortText", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "shortText", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemtitle", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemtitle", + "isReadOnly": true, + "locked": false, + "name": "Gem Title", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "shortText", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json index e073b19cb89d..faf0289723eb 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Url.json @@ -1,55 +1,30 @@ { - "aliasTo": "", - "aliases": null, - "associatedToAll": false, - "associatedTypes": [ - "Gem Alert" - ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, - "caseInsensitive": true, - "cliName": "gemurl", - "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", - "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", - "group": 0, - "hidden": false, - "id": "incident_gemurl", - "isReadOnly": true, - "itemVersion": "", - "locked": false, - "mergeStrategy": "", - "name": "Gem URL", - "neverSetAsRequired": false, - "openEnded": false, - "orgType": "url", - "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", - "required": false, - "runScriptAfterUpdate": false, - "script": "", - "selectValues": null, - "sla": 0, - "system": false, - "systemAssociatedTypes": null, - "template": "", - "threshold": 72, - "toServerVersion": "", - "type": "url", - "unmapped": false, - "unsearchable": false, - "useAsKpi": false, - "validatedError": "", - "validationRegex": "", - "version": -1, - "x2_fields": "" + "associatedToAll": false, + "associatedTypes": [ + "Gem Alert" + ], + "caseInsensitive": true, + "cliName": "gemurl", + "closeForm": true, + "content": true, + "editForm": true, + "group": 0, + "hidden": false, + "id": "incident_gemurl", + "isReadOnly": true, + "locked": false, + "name": "Gem URL", + "neverSetAsRequired": false, + "openEnded": false, + "ownerOnly": false, + "required": false, + "sla": 0, + "system": false, + "threshold": 72, + "type": "url", + "unmapped": false, + "unsearchable": false, + "useAsKpi": false, + "version": -1, + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json index 2d154edfd682..6ea2b0e76a0a 100644 --- a/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json +++ b/Packs/Gem/IncidentFields/incidentfield-Gem_Verdict.json @@ -1,42 +1,23 @@ { - "aliasTo": "", - "aliases": null, "associatedToAll": false, "associatedTypes": [ "Gem Alert" ], - "autoCompleteTags": null, - "breachScript": "", - "cacheVersn": 0, "caseInsensitive": true, "cliName": "gemverdict", "closeForm": true, - "columns": null, - "content": false, - "defaultRows": null, - "definitionId": "", - "description": "", + "content": true, "editForm": true, - "fieldCalcScript": "", - "fromServerVersion": "", "group": 0, "hidden": false, "id": "incident_gemverdict", "isReadOnly": false, - "itemVersion": "", "locked": false, - "mergeStrategy": "", "name": "Gem Verdict", "neverSetAsRequired": false, "openEnded": false, - "orgType": "singleSelect", "ownerOnly": false, - "packID": "", - "packName": "", - "placeholder": "", "required": false, - "runScriptAfterUpdate": false, - "script": "", "selectValues": [ "Inconclusive", "Malicious", @@ -46,16 +27,11 @@ ], "sla": 0, "system": false, - "systemAssociatedTypes": null, - "template": "", "threshold": 72, - "toServerVersion": "", "type": "singleSelect", "unmapped": false, "unsearchable": false, "useAsKpi": false, - "validatedError": "", - "validationRegex": "", "version": -1, - "x2_fields": "" + "fromVersion": "6.10.0" } \ No newline at end of file diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index d5de08d18a3b..18464e2949c3 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -875,7 +875,7 @@ script: - resolved - name: verdict description: The verdict of the threat. - required: true + required: false auto: PREDEFINED predefined: - malicious diff --git a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json index f328adf99799..382bec54966a 100644 --- a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json +++ b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json @@ -1,5 +1,4 @@ { - "cacheVersn": 0, "close": { "sections": [ { @@ -38,12 +37,7 @@ } ] }, - "definitionId": "", - "description": "", - "detached": false, - "details": null, "detailsV2": { - "TypeName": "", "tabs": [ { "id": "summary", @@ -479,21 +473,11 @@ } ] }, - "edit": null, - "fromServerVersion": "", "group": "incident", "id": "Gem Layout", - "indicatorsDetails": null, - "indicatorsQuickView": null, - "itemVersion": "", - "locked": false, - "mobile": null, "name": "Gem Layout", - "packID": "", - "packName": "", - "quickView": null, - "quickViewV2": null, "system": false, - "toServerVersion": "", - "version": -1 + "version": -1, + "fromVersion": "6.10.0", + "description": "" } \ No newline at end of file diff --git a/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md b/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md new file mode 100644 index 000000000000..398866097116 --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md @@ -0,0 +1,39 @@ +Gem playbook to handle an alert involving an ec2 instance. + +## Dependencies + +This playbook uses the following sub-playbooks, integrations, and scripts. + +### Sub-playbooks + +This playbook does not use any sub-playbooks. + +### Integrations + +* Gem + +### Scripts + +* PrettyPrint +* checkValue + +### Commands + +* gem-update-threat-status +* gem-run-action + +## Playbook Inputs + +--- +There are no inputs for this playbook. + +## Playbook Outputs + +--- +There are no outputs for this playbook. + +## Playbook Image + +--- + +![Gem Handle ec2](../doc_files/Gem_Handle_ec2.png) diff --git a/Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml b/Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml deleted file mode 100644 index f890f916e14b..000000000000 --- a/Packs/Gem/Playbooks/Gem_Stop_ec2_and_Resolve.yml +++ /dev/null @@ -1,129 +0,0 @@ -id: 'Gem Stop ec2 and Resolve' -inputs: [] -name: Gem Stop ec2 and Resolve -outputs: [] -starttaskid: "0" -tasks: - "0": - continueonerrortype: "" - id: "0" - ignoreworker: false - isautoswitchedtoquietmode: false - isoversize: false - nexttasks: - '#none#': - - "2" - note: false - quietmode: 0 - separatecontext: false - skipunavailable: false - task: - brand: "" - id: 4e30bc53-839e-475a-8995-370d20bbb09d - iscommand: false - name: "" - version: -1 - taskid: 4e30bc53-839e-475a-8995-370d20bbb09d - timertriggers: [] - type: start - view: |- - { - "position": { - "x": 450, - "y": 50 - } - } - "2": - continueonerrortype: "" - id: "2" - ignoreworker: false - isautoswitchedtoquietmode: false - isoversize: false - nexttasks: - '#none#': - - "3" - note: false - quietmode: 0 - scriptarguments: - action: - simple: stop - alert_id: - simple: ${incident.gemalertid} - entity_id: - simple: ${incident.gemmainentityid} - entity_type: - simple: ${incident.gemmainentitytype} - resource_id: - simple: ${incident.gemmainentityid} - separatecontext: false - skipunavailable: false - task: - brand: Gem - description: Run an action on an entity. - id: 785239f0-3684-4c2c-8fae-b5dce369186b - iscommand: true - name: gem-run-action - script: Gem|||gem-run-action - type: regular - version: -1 - taskid: 785239f0-3684-4c2c-8fae-b5dce369186b - timertriggers: [] - type: regular - view: |- - { - "position": { - "x": 450, - "y": 410 - } - } - "3": - continueonerrortype: "" - id: "3" - ignoreworker: false - isautoswitchedtoquietmode: false - isoversize: false - note: false - quietmode: 0 - scriptarguments: - reason: - simple: 'Stopped ec2 instance ' - status: - simple: resolved - threat_id: - simple: ${incident.gemthreatid} - verdict: - simple: inconclusive - separatecontext: false - skipunavailable: false - task: - brand: Gem - description: Set a threat's status to open, in progress or resolved. - id: 3b839c36-4127-4df4-859b-a4e35856f947 - iscommand: true - name: gem-update-threat-status - script: Gem|||gem-update-threat-status - type: regular - version: -1 - taskid: 3b839c36-4127-4df4-859b-a4e35856f947 - timertriggers: [] - type: regular - view: |- - { - "position": { - "x": 450, - "y": 590 - } - } -version: -1 -view: |- - { - "linkLabelsPosition": {}, - "paper": { - "dimensions": { - "height": 635, - "width": 380, - "x": 450, - "y": 50 - } - } - } From a23d2e93bab4da2c4626924164c81bac27980cf6 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Wed, 13 Mar 2024 15:22:58 +0000 Subject: [PATCH 43/62] Add timeline comment command and playbook --- Packs/Gem/Integrations/Gem/Gem.py | 34 +++ Packs/Gem/Integrations/Gem/Gem.yml | 17 ++ Packs/Gem/Playbooks/Gem_Handle_ec2.yml | 353 +++++++++++++++++++++++++ 3 files changed, 404 insertions(+) create mode 100644 Packs/Gem/Playbooks/Gem_Handle_ec2.yml diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 1b44fa0de013..4c0a1bd33b98 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -25,6 +25,7 @@ INVENTORY_ENDPOINT = '/v1/inventory' INVENTORY_ITEM_ENDPOINT = '/v1/inventory/{id}' +ALERTS_ENDPOINT = '/triage/investigation/timeline/configuration' BREAKDOWN_ENDPOINT = '/triage/investigation/timeline/breakdown' EVENTS_ENDPOINT = '/triage/investigation/entity/events' FETCH_ENDPOINT = '/integrations/notification' @@ -32,6 +33,7 @@ UPDATE_THREAT_ENDPOINT = '/v1/threats/{id}/status' RUN_ACTION_ENDPOINT = '/triage/containment/entity/run-action' +ADD_TIMELINE_EVENT_ENDPOINT = '/detection/threats/{id}/add_timeline_event' ''' CLIENT CLASS ''' @@ -304,6 +306,7 @@ def update_threat_status(self, threat_id: str, status: Optional[str], verdict: O ) return response + def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, alert_id: str, resource_id: str) -> dict: params = {'action': action, 'entity_id': entity_id, 'entity_type': entity_type, @@ -317,6 +320,16 @@ def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, al return response + def add_timeline_event(self, threatid: str, comment: str, timestamp: str) -> dict: + params = {'title': "XSOAR comment", "description": comment, "timeline_event_type": "xsoar", "timestamp": timestamp} + response = self.http_request( + method='POST', + url_suffix=ADD_TIMELINE_EVENT_ENDPOINT.format(id=threatid), + json_data={k: v for k, v in params.items() if v is not None} + ) + + return response + ''' HELPER FUNCTIONS ''' @@ -651,6 +664,25 @@ def run_action_on_entity(client: GemClient, args: dict[str, Any]) -> CommandResu ) +def add_timeline_event(client: GemClient, args: dict[str, Any]) -> CommandResults: + + threatid = args.get('threat_id') + comment = args.get('comment') + + if not threatid: + raise DemistoException('Threat ID is a required parameter.') + if not comment: + raise DemistoException('Comment is a required parameter.') + + result = client.add_timeline_event(threatid=threatid, comment=comment, timestamp=datetime.now().strftime(DATE_FORMAT)) + return CommandResults( + readable_output=tableToMarkdown('AddTimelineEvent Result', result), + outputs_prefix='Gem.AddTimelineEvent', + outputs_key_field='', + outputs=result + ) + + ''' MAIN FUNCTION ''' @@ -702,6 +734,8 @@ def main() -> None: return_results(update_threat_status(client, args)) elif command == 'gem-run-action': return_results(run_action_on_entity(client, args)) + elif command == 'gem-add-timeline-event': + return_results(add_timeline_event(client, args)) elif command == 'fetch-incidents': # How much time before the first fetch to retrieve alerts first_fetch_time = arg_to_datetime( diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 18464e2949c3..8d679d88f578 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -469,6 +469,13 @@ script: description: "" type: String + - name: gem-get-alert-details + description: Get details about a specific alert + arguments: + - name: alert_id + description: The ID of the alert to get details for. + required: true + - name: gem-list-inventory-resources description: List inventory resources in Gem arguments: @@ -905,6 +912,16 @@ script: - name: resource_id description: The ID of the resource to run the action on. required: true + + - name: gem-add-timeline-event + description: Add a timeline event to a threat. + arguments: + - name: threat_id + description: The ID of the threat to add the timeline event to. + required: true + - name: comment + description: The comment to add to the timeline event. + required: true isfetch: true runonce: false script: "-" diff --git a/Packs/Gem/Playbooks/Gem_Handle_ec2.yml b/Packs/Gem/Playbooks/Gem_Handle_ec2.yml new file mode 100644 index 000000000000..5c68bac97c35 --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Handle_ec2.yml @@ -0,0 +1,353 @@ +description: Gem playbook to handle an alert involving an ec2 instance. +id: "Gem Handle ec2" +inputs: [] +name: Gem Handle ec2 +outputs: [] +starttaskid: "0" +fromversion: 6.8.0 +tasks: + "0": + continueonerrortype: "" + id: "0" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "7" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + id: 858a615f-7cd9-467b-8766-2186642cecf0 + iscommand: false + name: "" + version: -1 + description: "" + taskid: 858a615f-7cd9-467b-8766-2186642cecf0 + timertriggers: [] + type: start + view: |- + { + "position": { + "x": 450, + "y": -60 + } + } + "1": + continueonerrortype: "" + id: "1" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + message: + bcc: + body: + simple: "Hi, \nWe've detected some suspicious activity related to your ec2 instance: \n${incident.gemmainentityname}\nWould you like to take a containment action?" + cc: + defaultOption: Ignore + format: "" + methods: + - SlackV3 + replyOptions: + - Stop + - Isolate + - Terminate + - Ignore + subject: + timings: + completeafterreplies: 1 + completeaftersla: false + completeafterv2: true + retriescount: 2 + retriesinterval: 360 + to: + simple: Administrator,lior@gem.security + nexttasks: + Ignore: + - "8" + Isolate: + - "5" + Stop: + - "2" + Terminate: + - "4" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + sla: + days: 3 + hours: 0 + minutes: 0 + weeks: 2 + task: + brand: "" + description: Ask using Slack if the user wants to take a containment action + id: 060e59f3-79e2-4bda-840d-33dc6b1ed26d + iscommand: false + name: Ask + type: condition + version: -1 + taskid: 060e59f3-79e2-4bda-840d-33dc6b1ed26d + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 450, + "y": 260 + } + } + "2": + continueonerrortype: "" + id: "2" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "6" + note: false + quietmode: 0 + scriptarguments: + action: + simple: stop + alert_id: + simple: ${incident.gemalertid} + entity_id: + simple: ${incident.gemmainentityid} + entity_type: + simple: ec2_instance + resource_id: + simple: ${incident.gemmainentityid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Run an action on an entity. + id: 10d46260-c266-4f58-806f-404813c01b0e + iscommand: true + name: Run stop + script: Gem|||gem-run-action + type: regular + version: -1 + taskid: 10d46260-c266-4f58-806f-404813c01b0e + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 880, + "y": 440 + } + } + "4": + continueonerrortype: "" + id: "4" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "6" + note: false + quietmode: 0 + scriptarguments: + action: + simple: terminate + alert_id: + simple: ${incident.gemalertid} + entity_id: + simple: ${incident.gemmainentityid} + entity_type: + simple: ec2_instance + resource_id: + simple: ${incident.gemmainentityid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Run an action on an entity. + id: 59382a0b-2f19-46c3-8084-c9ccd28d6355 + iscommand: true + name: Run terminate + script: Gem|||gem-run-action + type: regular + version: -1 + taskid: 59382a0b-2f19-46c3-8084-c9ccd28d6355 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 10, + "y": 440 + } + } + "5": + continueonerrortype: "" + id: "5" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "6" + note: false + quietmode: 0 + scriptarguments: + action: + simple: isolate_instance_traffic + alert_id: + simple: ${incident.gemalertid} + entity_id: + simple: ${incident.gemmainentityid} + entity_type: + simple: ec2_instance + resource_id: + simple: ${incident.gemmainentityid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Run an action on an entity. + id: f6be5c84-d347-40a5-8db6-3ccd73d16002 + iscommand: true + name: Run Isolate + script: Gem|||gem-run-action + type: regular + version: -1 + taskid: f6be5c84-d347-40a5-8db6-3ccd73d16002 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 440 + } + } + "6": + continueonerrortype: "" + id: "6" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + scriptarguments: + status: + simple: in_progress + threat_id: + simple: ${incident.gemthreatid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Set a threat's status to open, in progress or resolved. + id: db885934-e2ab-4824-8570-4df2f60992ef + iscommand: true + name: Update status to "in progress" + script: Gem|||gem-update-threat-status + type: regular + version: -1 + taskid: db885934-e2ab-4824-8570-4df2f60992ef + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 780 + } + } + "7": + continueonerrortype: "" + id: "7" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + ec2_instance: + - "1" + note: false + quietmode: 0 + scriptarguments: + value: + simple: ${incident.gemmainentitytype} + separatecontext: false + skipunavailable: false + task: + brand: "" + description: "Gets a value and return it. This is to be used in playbook conditional tasks - get a value from incident field, label or context, and act accordingly. \nIf an array is returned. the first value will be the decision making value." + id: 3c7d05ef-aad4-4d97-80c3-86d1d9075791 + iscommand: false + name: Validate ec2 instance + script: checkValue + type: condition + version: -1 + taskid: 3c7d05ef-aad4-4d97-80c3-86d1d9075791 + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 450, + "y": 90 + } + } + "8": + continueonerrortype: "" + id: "8" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + scriptarguments: + value: + simple: No containment action was taken. + separatecontext: false + skipunavailable: false + task: + brand: "" + description: |- + Pretty-print data using Python's pprint library. This is useful for seeing the structure of incident and context data. Here's how to use it: + + !PrettyPrint value=${incident} + id: 65cf5c36-5edb-4e89-84c3-594451ce1967 + iscommand: false + name: Ignore + script: PrettyPrint + type: regular + version: -1 + taskid: 65cf5c36-5edb-4e89-84c3-594451ce1967 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 1340, + "y": 440 + } + } +version: -1 +view: |- + { + "linkLabelsPosition": { + "1_4_Terminate": 0.78 + }, + "paper": { + "dimensions": { + "height": 935, + "width": 1710, + "x": 10, + "y": -60 + } + } + } +tests: + - No tests (auto formatted) From bdf9e4fb67b5459eac0722ec0825a60e11dd56d6 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 09:26:47 +0000 Subject: [PATCH 44/62] Add get alert details and validating playbook --- Packs/Gem/Integrations/Gem/Gem.py | 50 +++ Packs/Gem/Integrations/Gem/Gem.yml | 126 ++++++- Packs/Gem/Integrations/Gem/Gem_test.py | 105 ++++++ Packs/Gem/Playbooks/Gem_Handle_ec2.yml | 2 +- .../Gem_Validate_triggering_event.yml | 349 ++++++++++++++++++ .../Gem_Validate_triggering_event_README.md | 40 ++ Packs/Gem/pack_metadata.json | 4 + 7 files changed, 674 insertions(+), 2 deletions(-) create mode 100644 Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml create mode 100644 Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 4c0a1bd33b98..a731dffb2782 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -1,3 +1,4 @@ +import re import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 from CommonServerUserPython import * # noqa @@ -146,6 +147,20 @@ def get_threat_details(self, threat_id: str): return response + def get_alert_details(self, alert_id: str): + """ Get alert details + :param alert_id: id of the alert to get + :return: alert details + """ + params = {"alert_id": alert_id} + response = self.http_request( + method='GET', + url_suffix=ALERTS_ENDPOINT, + params={k: v for k, v in params.items() if v is not None} + ) + + return response + def list_threats(self, limit, time_start=None, time_end=None, ordering=None, status=None, ttp_id=None, title=None, severity=None, entity_type=None, cloud_provider=None) -> list[dict]: """ List threats @@ -332,6 +347,23 @@ def add_timeline_event(self, threatid: str, comment: str, timestamp: str) -> dic ''' HELPER FUNCTIONS ''' +# as per recommendation from @freylis, compile once only +CLEANR = re.compile('<.*?>') + + +def _cleanhtml(raw_html): + cleantext = re.sub(CLEANR, '', raw_html) + return cleantext.replace("\n", "") + + +def _clean_description(alert: dict) -> dict: + if alert['triage_configuration']['event_groups']: + i = 0 + for e in alert['triage_configuration']['event_groups']: + clean_description = _cleanhtml(e['description']) + alert['triage_configuration']['event_groups'][i]['description'] = clean_description + i += 1 + return alert def init_client(params: dict) -> GemClient: @@ -431,6 +463,22 @@ def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResult ) +def get_alert_details(client: GemClient, args: dict[str, Any]) -> CommandResults: + alert_id = args.get('alert_id') + + if not alert_id: + raise DemistoException('Alert ID is a required parameter.') + result = client.get_alert_details(alert_id=alert_id) + result = _clean_description(result) + + return CommandResults( + readable_output=tableToMarkdown('Alert', result), + outputs_prefix='Gem.Alert', + outputs_key_field='id', + outputs=result + ) + + def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> CommandResults: limit = arg_to_number(args.get("limit")) or PAGE_SIZE include_deleted = args.get('include_deleted') @@ -712,6 +760,8 @@ def main() -> None: return_results(list_threats(client, args)) elif command == 'gem-get-threat-details': return_results(get_threat_details(client, args)) + elif command == 'gem-get-alert-details': + return_results(get_alert_details(client, args)) elif command == 'gem-list-inventory-resources': return_results(list_inventory_resources(client, args)) elif command == 'gem-get-resource-details': diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 8d679d88f578..2919d396cf5c 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -475,6 +475,130 @@ script: - name: alert_id description: The ID of the alert to get details for. required: true + outputs: + - contextPath: Gem.Alert.alert_context.account_db_id + description: "" + type: String + - contextPath: Gem.Alert.alert_context.alert_id + description: "" + type: String + - contextPath: Gem.Alert.alert_context.alert_source + description: "" + type: String + - contextPath: Gem.Alert.alert_context.alert_source_id + description: "" + type: String + - contextPath: Gem.Alert.alert_context.alert_source_url + description: "" + type: String + - contextPath: Gem.Alert.alert_context.cloud_provider + description: "" + type: String + - contextPath: Gem.Alert.alert_context.created_at + description: "" + type: Date + - contextPath: Gem.Alert.alert_context.description + description: "" + type: String + - contextPath: Gem.Alert.alert_context.description_template + description: "" + type: String + - contextPath: Gem.Alert.alert_context.general_cloud_provider + description: "" + type: String + - contextPath: Gem.Alert.alert_context.mitre_techniques.id + description: "" + type: String + - contextPath: Gem.Alert.alert_context.mitre_techniques.technique_name + description: "" + type: String + - contextPath: Gem.Alert.alert_context.resolved + description: "" + type: Boolean + - contextPath: Gem.Alert.alert_context.severity + description: "" + type: Number + - contextPath: Gem.Alert.alert_context.status + description: "" + type: String + - contextPath: Gem.Alert.alert_context.timeframe_end + description: "" + type: Date + - contextPath: Gem.Alert.alert_context.timeframe_start + description: "" + type: Date + - contextPath: Gem.Alert.alert_context.title + description: "" + type: String + - contextPath: Gem.Alert.alert_context.ttp_id + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.analysis + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.entities.activity_by_provider + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.entities.cloud_provider + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.entities.id + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.entities.is_main_entity + description: "" + type: Boolean + - contextPath: Gem.Alert.triage_configuration.entities.is_secondary_entity + description: "" + type: Boolean + - contextPath: Gem.Alert.triage_configuration.entities.resource_id + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.entities.type + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.description + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.end_time + description: "" + type: Date + - contextPath: Gem.Alert.triage_configuration.event_groups.error_code + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.event_name + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.event_type + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.events + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.start_time + description: "" + type: Date + - contextPath: Gem.Alert.triage_configuration.event_groups.time_indicator_text + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.timeline_item_type + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.title + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.event_groups.type + description: "" + type: String + - contextPath: Gem.Alert.triage_configuration.resolve_params.include_data_events + description: "" + type: Boolean + - contextPath: Gem.Alert.triage_configuration.resolve_params.timeframe_lookup_window_hours + description: "" + type: Number + - contextPath: Gem.Alert.triage_configuration.state + description: "" + type: String - name: gem-list-inventory-resources description: List inventory resources in Gem @@ -509,7 +633,7 @@ script: type: String - contextPath: Gem.InventoryItems.account.hierarchy_path description: "" - type: Unknown + type: String - contextPath: Gem.InventoryItems.account.id description: "" type: Number diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py index bbe77eb32b49..e67faa83dea3 100644 --- a/Packs/Gem/Integrations/Gem/Gem_test.py +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -116,6 +116,111 @@ def test_list_threats(http_request, _generate_token): assert res.outputs == test_list_threats_data['results'] +test_get_alert_details_data = { + "alert_context": { + "alert_id": "00000000-0000-0000-0000-000000000000", + "title": "A title", + "timeframe_start": "2023-03-09T12:41:33.000000", + "timeframe_end": "2023-03-09T12:41:33.000000", + "severity": 6, + "resolved": False, + "description": "A description", + "description_template": "A description", + "general_cloud_provider": "aws", + "cloud_provider": "aws", + "status": "open", + "mitre_techniques": [ + { + "technique_name": "A technique", + "id": "1111" + } + ], + "ttp_id": "WS/DefenseEvasion:S3/PublicAccessBlockPolicyModified", + "account_db_id": "8", + "alert_source": "GemDetection", + "alert_source_id": None, + "alert_source_url": None, + "created_at": "2024-01-29T13:35:49.417627Z" + }, + "triage_configuration": { + "analysis": "", + "entities": [ + { + "id": "Example IAM", + "type": "iam_user", + "metadata": { + "name": "Example IAM", + "region": "global", + "account_id": None, + "context_from_event": None, + "arn_id": "Example IAM", + "access_key": None, + "user_name": "Example IAM" + }, + "resource_id": None, + "is_main_entity": False, + "is_secondary_entity": True, + "activity_by_provider": {}, + "cloud_provider": "aws" + } + ], + "event_groups": [ + { + "type": "triggering", + "title": "A title", + "description": "A description", + "event_name": "An event", + "events": [ + "00000000-0000-0000-0000-000000000000" + ], + "event_type": "CloudTrail", + "start_time": "2023-03-09T12:41:33.000000", + "end_time": "2023-03-09T12:41:33.000000", + "time_indicator_text": None, + "timeline_item_type": "event_group", + "events_metadata": { + "00000000-0000-0000-0000-000000000000": { + "source_entity": { + "id": "Example IAM", + "metadata": {}, + "type": "iam_user", + "name": None + }, + "target_entities": [ + { + "id": "Example RDS", + "type": "rds_cluster", + "metadata": {}, + "name": None + } + ] + } + }, + "metadata": {}, + "error_code": None + } + ], + "state": "extended", + "resolve_params": { + "timeframe_lookup_window_hours": 24, + "include_data_events": True + } + } +} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_get_alert_details_data) +def test_get_alert_details(http_request, _generate_token): + from Gem import get_alert_details, init_client + client = init_client(params) + args = { + "alert_id": "00000000-0000-0000-0000-000000000000" + } + res = get_alert_details(client, args) + assert res.outputs == test_get_alert_details_data + + test_get_resource_details_data = { "resource_id": "11111111-1111-1111-1111-111111111111", "account": { diff --git a/Packs/Gem/Playbooks/Gem_Handle_ec2.yml b/Packs/Gem/Playbooks/Gem_Handle_ec2.yml index 5c68bac97c35..1ab44620c866 100644 --- a/Packs/Gem/Playbooks/Gem_Handle_ec2.yml +++ b/Packs/Gem/Playbooks/Gem_Handle_ec2.yml @@ -64,7 +64,7 @@ tasks: retriescount: 2 retriesinterval: 360 to: - simple: Administrator,lior@gem.security + simple: Administrator nexttasks: Ignore: - "8" diff --git a/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml b/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml new file mode 100644 index 000000000000..9882806271a1 --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml @@ -0,0 +1,349 @@ +description: |- + Get the triggering events of a Gem Alert and send a validation Slack message to the dev team. + The response will be added to the Gem Timeline. +id: "Gem Validate triggering events" +inputs: [] +name: Gem Validate triggering events +outputs: [] +quiet: true +starttaskid: "0" +fromversion: 6.8.0 +tasks: + "0": + continueonerrortype: "" + id: "0" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "2" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + id: cde9852c-cbdf-4280-8943-a77b98985c8c + iscommand: false + name: "" + version: -1 + description: "" + taskid: cde9852c-cbdf-4280-8943-a77b98985c8c + timertriggers: [] + type: start + view: |- + { + "position": { + "x": 450, + "y": 50 + } + } + "1": + continueonerrortype: "" + id: "1" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + message: + bcc: + body: + simple: "Hi, \nWe've detected some suspicious activity related to your user: ${Gem.Alert.alert_context.title}\n\nWe wanted to verify you're familiar with the following actions (Showing only first 3) :\n• ${zipped_list.[0]}\n• ${zipped_list.[1]}\n• ${zipped_list.[2]}\n" + cc: + format: "" + methods: + - SlackV3 + replyOptions: + - Yes, it's me + - No, I didn't do any of these + subject: + timings: + completeafterreplies: 1 + completeaftersla: false + completeafterv2: true + retriescount: 2 + retriesinterval: 360 + to: + simple: Administrator + nexttasks: + No, I didn't do any of these: + - "9" + Yes, it's me: + - "8" + note: false + quietmode: 1 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Send a Slack validation message. + id: 7cb4f004-f9a7-4c0c-89a5-7294f046dc35 + iscommand: false + name: | + Validate + type: condition + version: -1 + taskid: 7cb4f004-f9a7-4c0c-89a5-7294f046dc35 + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 450, + "y": 775 + } + } + "2": + continueonerrortype: "" + id: "2" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "6" + - "5" + note: false + quietmode: 1 + scriptarguments: + alert_id: + simple: ${incident.gemalertid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Get details about a specific alert + id: 3b67c20b-90e3-4d62-82f2-78a93ed115e6 + iscommand: true + name: Get alert details + script: Gem|||gem-get-alert-details + type: regular + version: -1 + taskid: 3b67c20b-90e3-4d62-82f2-78a93ed115e6 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 200 + } + } + "5": + continueonerrortype: "" + id: "5" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "7" + note: false + quietmode: 1 + scriptarguments: + key: + simple: Triggering_events.start_time + value: + complex: + accessor: start_time + filters: + - - left: + iscontext: true + value: + simple: Gem.Alert.triage_configuration.event_groups.type + operator: isEqualString + right: + value: + simple: triggering + root: Gem.Alert.triage_configuration.event_groups + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Set a value in context under the key you entered. + id: 0ef039b7-3e5c-4e07-8094-55a6eff528d7 + iscommand: false + name: Filter triggering events start_time + script: Set + type: regular + version: -1 + taskid: 0ef039b7-3e5c-4e07-8094-55a6eff528d7 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 760, + "y": 450 + } + } + "6": + continueonerrortype: "" + id: "6" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "7" + note: false + quietmode: 0 + scriptarguments: + key: + simple: Triggering_events.descriptions + value: + complex: + accessor: description + filters: + - - left: + iscontext: true + value: + simple: Gem.Alert.triage_configuration.event_groups.type + operator: isEqualString + right: + value: + simple: triggering + root: Gem.Alert.triage_configuration.event_groups + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Set a value in context under the key you entered. + id: 27442459-b46d-433e-8d56-4d9588713261 + iscommand: false + name: Filter triggering events description + script: Set + type: regular + version: -1 + taskid: 27442459-b46d-433e-8d56-4d9588713261 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 140, + "y": 450 + } + } + "7": + continueonerrortype: "" + id: "7" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "1" + note: false + quietmode: 0 + scriptarguments: + format: + simple: "{1} -- Preformed at {2}" + list1: + simple: ${Triggering_events.descriptions} + list2: + simple: ${Triggering_events.start_time} + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Joins values from two lists by index according to a given format. + id: 667f260f-22c1-4cd2-81c0-814c951ff413 + iscommand: false + name: ZipStrings + script: ZipStrings + type: regular + version: -1 + taskid: 667f260f-22c1-4cd2-81c0-814c951ff413 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 630 + } + } + "8": + continueonerrortype: "" + id: "8" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + scriptarguments: + comment: + simple: "User Response: ${Ask.Answers.0}" + threat_id: + simple: ${incident.gemthreatid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Add a timeline event to a threat. + id: 4514fb07-026f-413c-8710-ba88e3b14695 + iscommand: true + name: gem-add-timeline-event + script: Gem|||gem-add-timeline-event + type: regular + version: -1 + taskid: 4514fb07-026f-413c-8710-ba88e3b14695 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 90, + "y": 1030 + } + } + "9": + continueonerrortype: "" + id: "9" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + scriptarguments: + comment: + simple: "User Response: ${Ask.Answers.0}" + threat_id: + simple: ${incident.gemthreatid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Add a timeline event to a threat. + id: 4c3e70a7-57c7-487d-8f3b-e33d1ec96887 + iscommand: true + name: gem-add-timeline-event + script: Gem|||gem-add-timeline-event + type: regular + version: -1 + taskid: 4c3e70a7-57c7-487d-8f3b-e33d1ec96887 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 710, + "y": 1030 + } + } +version: -1 +view: |- + { + "linkLabelsPosition": {}, + "paper": { + "dimensions": { + "height": 1075, + "width": 1050, + "x": 90, + "y": 50 + } + } + } +tests: + - No tests (auto formatted) diff --git a/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md b/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md new file mode 100644 index 000000000000..fa7600c6a66b --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md @@ -0,0 +1,40 @@ +Get the triggering events of a Gem Alert and send a validation Slack message to the dev team. +The response will be added to the Gem Timeline. + +## Dependencies + +This playbook uses the following sub-playbooks, integrations, and scripts. + +### Sub-playbooks + +This playbook does not use any sub-playbooks. + +### Integrations + +* Gem + +### Scripts + +* Set +* ZipStrings + +### Commands + +* gem-get-alert-details +* gem-add-timeline-event + +## Playbook Inputs + +--- +There are no inputs for this playbook. + +## Playbook Outputs + +--- +There are no outputs for this playbook. + +## Playbook Image + +--- + +![Gem Validate triggering events](../doc_files/Gem_Validate_triggering_events.png) diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index 2ef3ee63eb7c..6adc24addf66 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -59,6 +59,10 @@ "GenericWebhook": { "mandatory": false, "name": "Generic Webhook" + }, + "CommonScripts": { + "mandatory": false, + "name": "Common Scripts" } }, "marketplaces": [ From a5dceffdefd1c8fd4d597a744dc775c283e09b12 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 09:46:48 +0000 Subject: [PATCH 45/62] Add slack user input --- Packs/Gem/Playbooks/Gem_Handle_ec2.yml | 9 ++++- Packs/Gem/Playbooks/Gem_Handle_ec2_README.md | 5 ++- .../Gem_Validate_triggering_event.yml | 40 ++++++++++--------- .../Gem_Validate_triggering_event_README.md | 11 +++-- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/Packs/Gem/Playbooks/Gem_Handle_ec2.yml b/Packs/Gem/Playbooks/Gem_Handle_ec2.yml index 1ab44620c866..004390c28b25 100644 --- a/Packs/Gem/Playbooks/Gem_Handle_ec2.yml +++ b/Packs/Gem/Playbooks/Gem_Handle_ec2.yml @@ -1,6 +1,11 @@ description: Gem playbook to handle an alert involving an ec2 instance. id: "Gem Handle ec2" -inputs: [] +inputs: + - description: Slack user to send message for + key: User + playbookInputQuery: + required: true + value: {} name: Gem Handle ec2 outputs: [] starttaskid: "0" @@ -64,7 +69,7 @@ tasks: retriescount: 2 retriesinterval: 360 to: - simple: Administrator + simple: Administrator,${inputs.User} nexttasks: Ignore: - "8" diff --git a/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md b/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md index 398866097116..485319e51c86 100644 --- a/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md +++ b/Packs/Gem/Playbooks/Gem_Handle_ec2_README.md @@ -25,7 +25,10 @@ This playbook does not use any sub-playbooks. ## Playbook Inputs --- -There are no inputs for this playbook. + +| **Name** | **Description** | **Default Value** | **Required** | +| --- | --- | --- | --- | +| User | Slack user to send message for | | Required | ## Playbook Outputs diff --git a/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml b/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml index 9882806271a1..1012ceff2f03 100644 --- a/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml +++ b/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml @@ -1,11 +1,15 @@ description: |- Get the triggering events of a Gem Alert and send a validation Slack message to the dev team. The response will be added to the Gem Timeline. -id: "Gem Validate triggering events" -inputs: [] -name: Gem Validate triggering events +id: "Gem Validate triggering event" +inputs: + - description: Slack user to send validation for + key: User + playbookInputQuery: + required: true + value: {} +name: Gem Validate triggering event outputs: [] -quiet: true starttaskid: "0" fromversion: 6.8.0 tasks: @@ -64,7 +68,7 @@ tasks: retriescount: 2 retriesinterval: 360 to: - simple: Administrator + simple: Administrator,${inputs.User} nexttasks: No, I didn't do any of these: - "9" @@ -77,13 +81,13 @@ tasks: task: brand: "" description: Send a Slack validation message. - id: 7cb4f004-f9a7-4c0c-89a5-7294f046dc35 + id: 57a572c7-8228-4e13-82b3-2be5538f3aed iscommand: false name: | Validate type: condition version: -1 - taskid: 7cb4f004-f9a7-4c0c-89a5-7294f046dc35 + taskid: 57a572c7-8228-4e13-82b3-2be5538f3aed timertriggers: [] type: condition view: |- @@ -282,20 +286,20 @@ tasks: task: brand: Gem description: Add a timeline event to a threat. - id: 4514fb07-026f-413c-8710-ba88e3b14695 + id: a25b9d9d-5965-405c-89a5-94bc079ee2e2 iscommand: true name: gem-add-timeline-event script: Gem|||gem-add-timeline-event type: regular version: -1 - taskid: 4514fb07-026f-413c-8710-ba88e3b14695 + taskid: a25b9d9d-5965-405c-89a5-94bc079ee2e2 timertriggers: [] type: regular view: |- { "position": { - "x": 90, - "y": 1030 + "x": 240, + "y": 1020 } } "9": @@ -316,20 +320,20 @@ tasks: task: brand: Gem description: Add a timeline event to a threat. - id: 4c3e70a7-57c7-487d-8f3b-e33d1ec96887 + id: 2729d13f-bd1b-476e-8fdc-24ed2665d243 iscommand: true name: gem-add-timeline-event script: Gem|||gem-add-timeline-event type: regular version: -1 - taskid: 4c3e70a7-57c7-487d-8f3b-e33d1ec96887 + taskid: 2729d13f-bd1b-476e-8fdc-24ed2665d243 timertriggers: [] type: regular view: |- { "position": { - "x": 710, - "y": 1030 + "x": 700, + "y": 1010 } } version: -1 @@ -338,9 +342,9 @@ view: |- "linkLabelsPosition": {}, "paper": { "dimensions": { - "height": 1075, - "width": 1050, - "x": 90, + "height": 1065, + "width": 1000, + "x": 140, "y": 50 } } diff --git a/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md b/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md index fa7600c6a66b..8a9e7e63f0f9 100644 --- a/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md +++ b/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md @@ -15,18 +15,21 @@ This playbook does not use any sub-playbooks. ### Scripts -* Set * ZipStrings +* Set ### Commands -* gem-get-alert-details * gem-add-timeline-event +* gem-get-alert-details ## Playbook Inputs --- -There are no inputs for this playbook. + +| **Name** | **Description** | **Default Value** | **Required** | +| --- | --- | --- | --- | +| User | Slack user to send validation for | | Required | ## Playbook Outputs @@ -37,4 +40,4 @@ There are no outputs for this playbook. --- -![Gem Validate triggering events](../doc_files/Gem_Validate_triggering_events.png) +![Gem Validate triggering event](../doc_files/Gem_Validate_triggering_event.png) From af5fff02e17e33101793257a72e1494bfbf06d8d Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 12:19:08 +0000 Subject: [PATCH 46/62] Finish slack refactoring --- .../Gem_Validate_triggering_event.yml | 185 +++++++++++++++--- .../Gem_Validate_triggering_event_README.md | 6 +- 2 files changed, 157 insertions(+), 34 deletions(-) diff --git a/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml b/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml index 1012ceff2f03..383b602bdc23 100644 --- a/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml +++ b/Packs/Gem/Playbooks/Gem_Validate_triggering_event.yml @@ -3,15 +3,15 @@ description: |- The response will be added to the Gem Timeline. id: "Gem Validate triggering event" inputs: - - description: Slack user to send validation for + - description: Extra Slack user to send validation to key: User playbookInputQuery: - required: true + required: false value: {} name: Gem Validate triggering event outputs: [] -starttaskid: "0" fromversion: 6.8.0 +starttaskid: "0" tasks: "0": continueonerrortype: "" @@ -21,7 +21,7 @@ tasks: isoversize: false nexttasks: "#none#": - - "2" + - "10" note: false quietmode: 0 separatecontext: false @@ -39,8 +39,8 @@ tasks: view: |- { "position": { - "x": 450, - "y": 50 + "x": 690, + "y": -120 } } "1": @@ -52,14 +52,14 @@ tasks: message: bcc: body: - simple: "Hi, \nWe've detected some suspicious activity related to your user: ${Gem.Alert.alert_context.title}\n\nWe wanted to verify you're familiar with the following actions (Showing only first 3) :\n• ${zipped_list.[0]}\n• ${zipped_list.[1]}\n• ${zipped_list.[2]}\n" + simple: "Hi, \nWe've detected some suspicious activity related to your user: *${Gem.Alert.alert_context.title}*\n\nWe wanted to verify you're familiar with the following actions (Showing only first 10) :\n${zipped_list.[0]}\n${zipped_list.[1]}\n${zipped_list.[2]}\n${zipped_list.[3]}\n${zipped_list.[4]}\n${zipped_list.[5]}\n${zipped_list.[6]}\n${zipped_list.[7]}\n${zipped_list.[8]}\n${zipped_list.[9]}\n" cc: format: "" methods: - SlackV3 replyOptions: - - Yes, it's me - - No, I didn't do any of these + - "*Yes, it's me*" + - "*No, I didn't do any of these*" subject: timings: completeafterreplies: 1 @@ -68,11 +68,11 @@ tasks: retriescount: 2 retriesinterval: 360 to: - simple: Administrator,${inputs.User} + simple: Administrator,${inputs.User},${Triggering_events.user.[0]},${Triggering_events.user} nexttasks: - No, I didn't do any of these: + "*No, I didn't do any of these*": - "9" - Yes, it's me: + "*Yes, it's me*": - "8" note: false quietmode: 1 @@ -81,20 +81,20 @@ tasks: task: brand: "" description: Send a Slack validation message. - id: 57a572c7-8228-4e13-82b3-2be5538f3aed + id: 1f78b5cf-6a7c-4694-8d29-1f6ef688ab10 iscommand: false name: | Validate type: condition version: -1 - taskid: 57a572c7-8228-4e13-82b3-2be5538f3aed + taskid: 1f78b5cf-6a7c-4694-8d29-1f6ef688ab10 timertriggers: [] type: condition view: |- { "position": { - "x": 450, - "y": 775 + "x": 440, + "y": 1020 } } "2": @@ -107,6 +107,7 @@ tasks: "#none#": - "6" - "5" + - "12" note: false quietmode: 1 scriptarguments: @@ -242,7 +243,7 @@ tasks: quietmode: 0 scriptarguments: format: - simple: "{1} -- Preformed at {2}" + simple: • {1} *Preformed at* {2} list1: simple: ${Triggering_events.descriptions} list2: @@ -252,13 +253,13 @@ tasks: task: brand: "" description: Joins values from two lists by index according to a given format. - id: 667f260f-22c1-4cd2-81c0-814c951ff413 + id: 4a779354-0f2d-471a-82c5-3d69efd12c18 iscommand: false name: ZipStrings script: ZipStrings type: regular version: -1 - taskid: 667f260f-22c1-4cd2-81c0-814c951ff413 + taskid: 4a779354-0f2d-471a-82c5-3d69efd12c18 timertriggers: [] type: regular view: |- @@ -278,7 +279,7 @@ tasks: quietmode: 0 scriptarguments: comment: - simple: "User Response: ${Ask.Answers.0}" + simple: "User: ${Triggering_events.user} Responded: Yes, it's me" threat_id: simple: ${incident.gemthreatid} separatecontext: false @@ -286,20 +287,20 @@ tasks: task: brand: Gem description: Add a timeline event to a threat. - id: a25b9d9d-5965-405c-89a5-94bc079ee2e2 + id: f42206cb-fd97-410c-889f-76cf6f6e3cfa iscommand: true name: gem-add-timeline-event script: Gem|||gem-add-timeline-event type: regular version: -1 - taskid: a25b9d9d-5965-405c-89a5-94bc079ee2e2 + taskid: f42206cb-fd97-410c-889f-76cf6f6e3cfa timertriggers: [] type: regular view: |- { "position": { "x": 240, - "y": 1020 + "y": 1270 } } "9": @@ -312,7 +313,7 @@ tasks: quietmode: 0 scriptarguments: comment: - simple: "User Response: ${Ask.Answers.0}" + simple: "User: ${Triggering_events.user} Responded: No, I didn't do any of these" threat_id: simple: ${incident.gemthreatid} separatecontext: false @@ -320,32 +321,154 @@ tasks: task: brand: Gem description: Add a timeline event to a threat. - id: 2729d13f-bd1b-476e-8fdc-24ed2665d243 + id: 2f068162-1f84-4cc7-852c-7d02c7535fe3 iscommand: true name: gem-add-timeline-event script: Gem|||gem-add-timeline-event type: regular version: -1 - taskid: 2729d13f-bd1b-476e-8fdc-24ed2665d243 + taskid: 2f068162-1f84-4cc7-852c-7d02c7535fe3 timertriggers: [] type: regular view: |- { "position": { "x": 700, - "y": 1010 + "y": 1260 + } + } + "10": + conditions: + - condition: + - - left: + iscontext: true + value: + simple: incident.gemmainentitytype + operator: isEqualString + right: + value: + simple: external_user + label: "yes" + continueonerrortype: "" + id: "10" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#default#": + - "11" + "yes": + - "2" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Check if an external user is involved in the alert + id: b467bcb6-29ec-4c30-8b09-d1021cd28b46 + iscommand: false + name: Is external user involved + type: condition + version: -1 + taskid: b467bcb6-29ec-4c30-8b09-d1021cd28b46 + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 450, + "y": 10 + } + } + "11": + continueonerrortype: "" + id: "11" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: No external user, end playbook + id: 3e14f3d3-8fc5-44b6-815e-b3f13a80530a + iscommand: false + name: Ignore + type: regular + version: -1 + taskid: 3e14f3d3-8fc5-44b6-815e-b3f13a80530a + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 960, + "y": 200 + } + } + "12": + continueonerrortype: "" + id: "12" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "1" + note: false + quietmode: 0 + scriptarguments: + key: + simple: Triggering_events.user + value: + complex: + accessor: id + filters: + - - left: + iscontext: true + value: + simple: Gem.Alert.triage_configuration.entities.type + operator: isEqualString + right: + value: + simple: external_user + root: Gem.Alert.triage_configuration.entities + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Set a value in context under the key you entered. + id: e443f84d-99b8-497f-8e14-4170141def44 + iscommand: false + name: Filter external_user + script: Set + type: regular + version: -1 + taskid: e443f84d-99b8-497f-8e14-4170141def44 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 1290, + "y": 630 } } version: -1 view: |- { - "linkLabelsPosition": {}, + "linkLabelsPosition": { + "10_11_#default#": 0.57 + }, "paper": { "dimensions": { - "height": 1065, - "width": 1000, + "height": 1485, + "width": 1530, "x": 140, - "y": 50 + "y": -120 } } } diff --git a/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md b/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md index 8a9e7e63f0f9..39a3d138e5a5 100644 --- a/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md +++ b/Packs/Gem/Playbooks/Gem_Validate_triggering_event_README.md @@ -15,13 +15,13 @@ This playbook does not use any sub-playbooks. ### Scripts -* ZipStrings * Set +* ZipStrings ### Commands -* gem-add-timeline-event * gem-get-alert-details +* gem-add-timeline-event ## Playbook Inputs @@ -29,7 +29,7 @@ This playbook does not use any sub-playbooks. | **Name** | **Description** | **Default Value** | **Required** | | --- | --- | --- | --- | -| User | Slack user to send validation for | | Required | +| User | Extra Slack user to send validation to | | Optional | ## Playbook Outputs From daa4e1008794a14c2c5d1527970eac2a17b34914 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 13:38:54 +0000 Subject: [PATCH 47/62] Gem handle root usage alert playbook --- Packs/Gem/Integrations/Gem/Gem.yml | 4 +- .../Gem_Handle_Alert_for_Root_Usage.yml | 648 ++++++++++++++++++ .../Gem_Handle_Alert_for_Root_Usage_README.md | 42 ++ 3 files changed, 692 insertions(+), 2 deletions(-) create mode 100644 Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage.yml create mode 100644 Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage_README.md diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 2919d396cf5c..b544f634a50f 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -897,10 +897,10 @@ script: description: "Timeframe end (ISO format). Examples: 2023-01-01, 2023-01-01T01:01:01Z, 2023-01-01T01:01:01+00:00" required: true outputs: - - contextPath: Gem.Entity.Accessing.USER_COUNT + - contextPath: Gem.Entity.Using.ENTITY_COUNT description: "" type: String - - contextPath: Gem.Entity.Accessing.USER_ID + - contextPath: Gem.Entity.Using.ENTITY_ID description: "" type: String diff --git a/Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage.yml b/Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage.yml new file mode 100644 index 000000000000..d6fd2fa5e88f --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage.yml @@ -0,0 +1,648 @@ +description: Find all the users who might’ve performed the actions using root (via the source IP), validate it with them using Slack and resolve the alert in case these actions were planned. +id: "Gem Handle Alert for Root Usage" +inputs: [] +name: Gem Handle Alert for Root Usage +outputs: [] +fromversion: 6.8.0 +starttaskid: "0" +tasks: + "0": + continueonerrortype: "" + id: "0" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "1" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + id: 0dc56a28-3e8f-4a90-8a1a-4001bfd85c4e + iscommand: false + name: "" + version: -1 + description: "" + taskid: 0dc56a28-3e8f-4a90-8a1a-4001bfd85c4e + timertriggers: [] + type: start + view: |- + { + "position": { + "x": 450, + "y": 50 + } + } + "1": + conditions: + - condition: + - - left: + iscontext: true + value: + simple: incident.gemmainentitytype + operator: isEqualString + right: + value: + simple: root_user + label: "yes" + continueonerrortype: "" + id: "1" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#default#": + - "3" + "yes": + - "4" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Check if the alert is a root action + id: 0a7ff91d-e2e8-44a0-8067-a629bf57fa72 + iscommand: false + name: Is root user used + type: condition + version: -1 + taskid: 0a7ff91d-e2e8-44a0-8067-a629bf57fa72 + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 450, + "y": 220 + } + } + "2": + continueonerrortype: "" + id: "2" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "12" + note: false + quietmode: 0 + scriptarguments: + end_time: + simple: ${TimeNow.[1]} + entity_id: + simple: ${Triggering_events.source_ip} + entity_type: + simple: external_ip + start_time: + simple: ${TimeNow.[0]} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: List all entities that used an entity in a specific timeframe. The results are sorted by activity volume. + id: fc5a50e1-3fe1-4872-83f9-04520d1be298 + iscommand: true + name: Get users using the source ip + script: Gem|||gem-list-using-entities + type: regular + version: -1 + taskid: fc5a50e1-3fe1-4872-83f9-04520d1be298 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 890 + } + } + "3": + continueonerrortype: "" + id: "3" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Not root action + id: 803b71de-fddd-465a-8a19-9fb2cc503fa4 + iscommand: false + name: Ignore + type: regular + version: -1 + taskid: 803b71de-fddd-465a-8a19-9fb2cc503fa4 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": -60, + "y": 420 + } + } + "4": + continueonerrortype: "" + id: "4" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "5" + - "11" + note: false + quietmode: 0 + scriptarguments: + alert_id: + simple: ${incident.gemalertid} + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Get details about a specific alert + id: 267d7ec2-0d90-433c-8ad7-530d4990a7f3 + iscommand: true + name: gem-get-alert-details + script: Gem|||gem-get-alert-details + type: regular + version: -1 + taskid: 267d7ec2-0d90-433c-8ad7-530d4990a7f3 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 420 + } + } + "5": + continueonerrortype: "" + id: "5" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "9" + note: false + quietmode: 0 + scriptarguments: + key: + simple: Triggering_events.events + value: + complex: + filters: + - - left: + iscontext: true + value: + simple: Gem.Alert.triage_configuration.event_groups.type + operator: isEqualString + right: + value: + simple: triggering + root: Gem.Alert.triage_configuration.event_groups + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Set a value in context under the key you entered. + id: b7d48485-00fe-4f7f-8e35-92c683ebcb90 + iscommand: false + name: Set triggering events + script: Set + type: regular + version: -1 + taskid: b7d48485-00fe-4f7f-8e35-92c683ebcb90 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 580 + } + } + "6": + continueonerrortype: "" + id: "6" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "no": + - "13" + "yes": + - "7" + note: false + quietmode: 0 + scriptarguments: + first: + complex: + accessor: names + root: users + transformers: + - operator: count + - args: + keys: {} + operator: DedupBy + second: + simple: "3" + separatecontext: false + skipunavailable: false + task: + brand: "" + description: |- + Checks if one number(float) as bigger than the other(float) + Returns yes: if first > second + Returns no: if first <= second + Returns exception if one of the inputs is not a number + id: 1f11c324-8648-42f2-8f15-8bed9362e125 + iscommand: false + name: More then 3 Users + script: IsGreaterThan + type: condition + version: -1 + taskid: 1f11c324-8648-42f2-8f15-8bed9362e125 + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 450, + "y": 1250 + } + } + "7": + continueonerrortype: "" + id: "7" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Probably an office + id: 295aba05-c923-4255-8026-a6b342d164e9 + iscommand: false + name: Ignore, all good + type: regular + version: -1 + taskid: 295aba05-c923-4255-8026-a6b342d164e9 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": -60, + "y": 1440 + } + } + "8": + continueonerrortype: "" + id: "8" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + message: + bcc: + body: + simple: "Hi, \nWe've detected some suspicious activity related to your user: *${Gem.Alert.alert_context.title}*\n\nWe wanted to verify you're familiar with the following actions (Showing only first 10) :\n${zipped_list.[0]}\n${zipped_list.[1]}\n${zipped_list.[2]}\n${zipped_list.[3]}\n${zipped_list.[4]}\n${zipped_list.[5]}\n${zipped_list.[6]}\n${zipped_list.[7]}\n${zipped_list.[8]}\n${zipped_list.[9]}" + cc: + format: "" + methods: + - SlackV3 + replyOptions: + - "*Yes, it's me*" + - "*No, I didn't do any of these*" + subject: + timings: + completeafterreplies: 1 + completeaftersla: false + completeafterv2: true + retriescount: 2 + retriesinterval: 360 + to: + simple: ${users.names.[0]},${users.names.[1]},${users.names.[2]},${users.names} + nexttasks: + "*No, I didn't do any of these*": + - "15" + "*Yes, it's me*": + - "14" + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Send a slack message to all involved users + id: 4d5bee4e-91d9-4b86-88da-bdd6213093cf + iscommand: false + name: Validate with users + type: condition + version: -1 + taskid: 4d5bee4e-91d9-4b86-88da-bdd6213093cf + timertriggers: [] + type: condition + view: |- + { + "position": { + "x": 460, + "y": 1630 + } + } + "9": + continueonerrortype: "" + id: "9" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "2" + note: false + quietmode: 0 + scriptarguments: + key: + simple: Triggering_events.source_ip + value: + complex: + accessor: ip_address + root: Triggering_events.events.metadata.source_ip + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Set a value in context under the key you entered. + id: ae6f9cc1-b46d-4443-8916-29d5533cd642 + iscommand: false + name: Set source ip + script: Set + type: regular + version: -1 + taskid: ae6f9cc1-b46d-4443-8916-29d5533cd642 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 720 + } + } + "10": + continueonerrortype: "" + id: "10" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "2" + note: false + quietmode: 0 + scriptarguments: + dateFormat: + simple: ISO + separatecontext: false + skipunavailable: false + task: + brand: "" + description: | + Retrieves the current date and time. + id: 68857cdf-fe1b-4fb2-86ea-c4a549dd1cba + iscommand: false + name: Get time + script: GetTime + type: regular + version: -1 + taskid: 68857cdf-fe1b-4fb2-86ea-c4a549dd1cba + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 1010, + "y": 720 + } + } + "11": + continueonerrortype: "" + id: "11" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "10" + note: false + quietmode: 0 + scriptarguments: + dateFormat: + simple: ISO + daysAgo: + simple: "7" + separatecontext: false + skipunavailable: false + task: + brand: "" + description: | + Retrieves the current date and time. + id: 2062b3b7-0099-42f9-88f8-e0aea917479f + iscommand: false + name: Get a week ago time + script: GetTime + type: regular + version: -1 + taskid: 2062b3b7-0099-42f9-88f8-e0aea917479f + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 1010, + "y": 580 + } + } + "12": + continueonerrortype: "" + id: "12" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "6" + note: false + quietmode: 0 + scriptarguments: + key: + simple: users.names + value: + complex: + filters: + - - left: + iscontext: true + value: + simple: Gem.Entity.Using.ENTITY_ID + operator: containsString + right: + value: + simple: "@" + root: Gem.Entity.Using.ENTITY_ID + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Set a value in context under the key you entered. + id: 3883ca17-9446-4b10-86d1-c42b216c4d31 + iscommand: false + name: Get users using + script: Set + type: regular + version: -1 + taskid: 3883ca17-9446-4b10-86d1-c42b216c4d31 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 1090 + } + } + "13": + continueonerrortype: "" + id: "13" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + nexttasks: + "#none#": + - "8" + note: false + quietmode: 0 + scriptarguments: + format: + simple: • {1} *Preformed at* {2} + list1: + simple: ${Triggering_events.events.description} + list2: + simple: ${Triggering_events.events.start_time} + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Joins values from two lists by index according to a given format. + id: 3c12f16b-d0fa-4db7-8ef3-f2db18d9f956 + iscommand: false + name: Format slack message + script: ZipStrings + type: regular + version: -1 + taskid: 3c12f16b-d0fa-4db7-8ef3-f2db18d9f956 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 450, + "y": 1440 + } + } + "14": + continueonerrortype: "" + id: "14" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + scriptarguments: + reason: + simple: Root action planned, verified using XSOAR + status: + simple: resolved + threat_id: + simple: ${incident.gemthreatid} + verdict: + simple: planned_action + separatecontext: false + skipunavailable: false + task: + brand: Gem + description: Set a threat's status to open, in progress or resolved. + id: db875a13-13d0-4568-8a9e-9b94d3e0388a + iscommand: true + name: A planned action, resolve + script: Gem|||gem-update-threat-status + type: regular + version: -1 + taskid: db875a13-13d0-4568-8a9e-9b94d3e0388a + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 680, + "y": 1940 + } + } + "15": + continueonerrortype: "" + id: "15" + ignoreworker: false + isautoswitchedtoquietmode: false + isoversize: false + note: false + quietmode: 0 + separatecontext: false + skipunavailable: false + task: + brand: "" + description: Not a planned action, don't resolve + id: 5f50aa16-4b63-49ba-8877-602bf2461880 + iscommand: false + name: Not a planned action + type: regular + version: -1 + taskid: 5f50aa16-4b63-49ba-8877-602bf2461880 + timertriggers: [] + type: regular + view: |- + { + "position": { + "x": 140, + "y": 1940 + } + } +version: -1 +view: |- + { + "linkLabelsPosition": { + "8_14_*Yes, it's me*": 0.74, + "8_15_*No, I didn't do any of these*": 0.79 + }, + "paper": { + "dimensions": { + "height": 1985, + "width": 1450, + "x": -60, + "y": 50 + } + } + } +tests: + - No tests (auto formatted) diff --git a/Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage_README.md b/Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage_README.md new file mode 100644 index 000000000000..8e1222b6ff0c --- /dev/null +++ b/Packs/Gem/Playbooks/Gem_Handle_Alert_for_Root_Usage_README.md @@ -0,0 +1,42 @@ +Find all the users who might’ve performed the actions using root (via the source IP), validate it with them using Slack and resolve the alert in case these actions were planned. + +## Dependencies + +This playbook uses the following sub-playbooks, integrations, and scripts. + +### Sub-playbooks + +This playbook does not use any sub-playbooks. + +### Integrations + +* Gem + +### Scripts + +* Set +* IsGreaterThan +* ZipStrings +* GetTime + +### Commands + +* gem-list-using-entities +* gem-get-alert-details +* gem-update-threat-status + +## Playbook Inputs + +--- +There are no inputs for this playbook. + +## Playbook Outputs + +--- +There are no outputs for this playbook. + +## Playbook Image + +--- + +![Gem Handle Alert for Root Usage](../doc_files/Gem_Handle_Alert_for_Root_Usage.png) From ece85d0a1500250f82923f4160778f4385777368 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 15:02:41 +0000 Subject: [PATCH 48/62] Add function docs --- Packs/Gem/Integrations/Gem/Gem.py | 388 ++++++++++++++++++++++++- Packs/Gem/Integrations/Gem/Gem.yml | 3 + Packs/Gem/Integrations/Gem/Gem_test.py | 16 + 3 files changed, 400 insertions(+), 7 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index a731dffb2782..43dd09d864c5 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -41,6 +41,9 @@ class GemClient(BaseClient): + """This class defines a client to interact with the Gem API + """ + def __init__(self, base_url: str, verify: bool, proxy: bool, client_id: str, client_secret: str): super().__init__(base_url=base_url, verify=verify, proxy=proxy, ok_codes=OK_CODES) self._client_id = client_id @@ -51,6 +54,15 @@ def __init__(self, base_url: str, verify: bool, proxy: bool, client_id: str, cli raise DemistoException(f'Failed to get token. Error: {str(e)}') def _get_token(self): + """ + Retrieves the authentication token for the Gem integration. + + If the token is not found in the integration context or if it is expired, + a new token is generated and returned. + + Returns: + str: The authentication token. + """ ctx = get_integration_context() if not ctx or not ctx.get('auth_token'): @@ -69,6 +81,26 @@ def _get_token(self): return auth_token def http_request(self, method: str, url_suffix='', full_url=None, headers=None, json_data=None, params=None, auth=True): + """ + Sends an HTTP request to the specified URL, adding the required headers and authentication token. + + Args: + method (str): The HTTP method to use (e.g., GET, POST, PUT, DELETE). + url_suffix (str, optional): The URL suffix to append to the base URL. Defaults to ''. + full_url (str, optional): The full URL to send the request to. If provided, `url_suffix` will be ignored. + Defaults to None. + headers (dict, optional): Additional headers to include in the request. Defaults to None. + json_data (dict, optional): JSON data to include in the request body. Defaults to None. + params (dict, optional): Query parameters to include in the request URL. Defaults to None. + auth (bool, optional): Whether to include authentication headers. Defaults to True. + + Returns: + dict: The response from the HTTP request. + + Raises: + Exception: If the request fails. + + """ if auth: headers = headers or {} headers['Authorization'] = f'Bearer {self._auth_token}' @@ -117,6 +149,16 @@ def _generate_token(self) -> str: return token_res.get('access_token') def fetch_threats(self, maxincidents=None, start_time=None) -> list[dict]: + """ + Fetches a list of threats from the Gem API. + + Args: + maxincidents (int, optional): The maximum number of incidents to fetch. Defaults to None. + start_time (str, optional): The start time to fetch incidents from. Defaults to None. + + Returns: + list[dict]: A list of threat incidents. + """ params = {'limit': maxincidents, 'created__gt': start_time, 'ordering': 'created'} return self.http_request( method='GET', @@ -126,9 +168,11 @@ def fetch_threats(self, maxincidents=None, start_time=None) -> list[dict]: ) def get_resource_details(self, resource_id: str) -> dict: - """ Get inventory item details - :param resource_id: id of the item to get - :return: inventory item + """ + Get inventory item details. + + :param resource_id: ID of the item to get. + :return: Inventory item. """ return self.http_request( method='GET', @@ -136,7 +180,9 @@ def get_resource_details(self, resource_id: str) -> dict: ) def get_threat_details(self, threat_id: str): - """ Get threat details + """ + Get threat details + :param threat_id: id of the threat to get :return: threat details """ @@ -148,7 +194,9 @@ def get_threat_details(self, threat_id: str): return response def get_alert_details(self, alert_id: str): - """ Get alert details + """ + Get alert details + :param alert_id: id of the alert to get :return: alert details """ @@ -163,7 +211,8 @@ def get_alert_details(self, alert_id: str): def list_threats(self, limit, time_start=None, time_end=None, ordering=None, status=None, ttp_id=None, title=None, severity=None, entity_type=None, cloud_provider=None) -> list[dict]: - """ List threats + """ + List threats :param time_start: time of first threat :param time_end: time of last threat :param limit: amount of threats @@ -281,38 +330,142 @@ def _breakdown(self, breakdown_by, entity_id=None, entity_type=None, read_only=N def list_ips_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + """ + Retrieves a dictionary of IP addresses associated with the specified entity. + + Args: + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + read_only (bool): Whether to retrieve read-only IP addresses. + start_time (str): The start time for filtering IP addresses. + end_time (str): The end time for filtering IP addresses. + + Returns: + dict: A dictionary of IP addresses associated with the entity. + """ return self._breakdown(breakdown_by='source_ip', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def list_services_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + """ + Retrieves a list of services associated with a specific entity. + + Args: + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + read_only (bool): Whether to retrieve read-only services only. + start_time (str): The start time for filtering services. + end_time (str): The end time for filtering services. + + Returns: + dict: A dictionary containing the list of services associated with the entity. + """ return self._breakdown(breakdown_by='service', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def list_events_by_entity(self, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + """ + Retrieves a list of events associated with a specific entity. + + Args: + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + read_only (bool): Whether to retrieve read-only events only. + start_time (str): The start time of the events. + end_time (str): The end time of the events. + + Returns: + dict: A dictionary containing the list of events. + """ return self._breakdown(breakdown_by='entity_event_out', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def list_accessing_entities(self, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + """ + Retrieves a list of accessing entities based on the provided parameters. + + Args: + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + read_only (bool): Specifies if the entity is read-only. + start_time (datetime): The start time for filtering the accessing entities. + end_time (datetime): The end time for filtering the accessing entities. + + Returns: + dict: A dictionary containing the list of accessing entities. + """ return self._breakdown(breakdown_by='user_in', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def list_using_entities(self, entity_id=None, entity_type=None, read_only=None, start_time=None, end_time=None) -> dict: + """ + Retrieves a list of entities using the specified parameters. + + Args: + entity_id (str, optional): The ID of the entity. Defaults to None. + entity_type (str, optional): The type of the entity. Defaults to None. + read_only (bool, optional): Specifies if the entity is read-only. Defaults to None. + start_time (str, optional): The start time for filtering entities. Defaults to None. + end_time (str, optional): The end time for filtering entities. Defaults to None. + + Returns: + dict: A dictionary containing the list of entities. + + """ return self._breakdown(breakdown_by='using_entities', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def list_events_on_entity(self, entity_id=None, entity_type=None, start_time=None, end_time=None, read_only=None) -> dict: + """ + Retrieves a list of events associated with a specific entity. + + Args: + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + start_time (str): The start time of the events. + end_time (str): The end time of the events. + read_only (bool): Whether to retrieve read-only events only. + + Returns: + dict: A dictionary containing the list of events. + """ return self._breakdown(breakdown_by='entity_event_in', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def list_accessing_ips(self, entity_id=None, entity_type=None, start_time=None, end_time=None, read_only=None) -> dict: + """ + Retrieves a breakdown of accessing IPs for a given entity. + + Args: + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + start_time (str): The start time of the breakdown. + end_time (str): The end time of the breakdown. + read_only (bool): Whether to include read-only access in the breakdown. + + Returns: + dict: A breakdown of accessing IPs. + """ return self._breakdown(breakdown_by='ip_access', entity_id=entity_id, entity_type=entity_type, read_only=read_only, start_time=start_time, end_time=end_time) def update_threat_status(self, threat_id: str, status: Optional[str], verdict: Optional[str], reason: Optional[str] = None): + """ + Update the threat status for a given threat ID. + + Args: + threat_id (str): The ID of the threat to update. + status (str): The new status of the threat. + verdict (str): The new verdict of the threat. + reason (str, optional): Additional information or reason for the update. + + Returns: + dict: The response from the API call. + """ json_data = {'verdict': verdict, 'additional_info': reason, 'status': status} response = self.http_request( method='PATCH', @@ -324,6 +477,20 @@ def update_threat_status(self, threat_id: str, status: Optional[str], verdict: O def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, alert_id: str, resource_id: str) -> dict: + """ + Runs an action on a specific entity. + + Args: + action (str): The action to be performed on the entity. + entity_id (str): The ID of the entity. + entity_type (str): The type of the entity. + alert_id (str): The ID of the alert associated with the entity. + resource_id (str): The ID of the resource associated with the entity. + + Returns: + dict: The response from the API. + + """ params = {'action': action, 'entity_id': entity_id, 'entity_type': entity_type, 'alert_id': alert_id, 'resource_id': resource_id} @@ -336,6 +503,17 @@ def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, al return response def add_timeline_event(self, threatid: str, comment: str, timestamp: str) -> dict: + """ + Adds a timeline event to a threat. + + Args: + threatid (str): The ID of the threat. + comment (str): The comment for the timeline event. + timestamp (str): The timestamp of the timeline event. + + Returns: + dict: The response from the API. + """ params = {'title': "XSOAR comment", "description": comment, "timeline_event_type": "xsoar", "timestamp": timestamp} response = self.http_request( method='POST', @@ -352,11 +530,29 @@ def add_timeline_event(self, threatid: str, comment: str, timestamp: str) -> dic def _cleanhtml(raw_html): + """ + Cleans HTML tags from the given raw HTML string. + + Args: + raw_html (str): The raw HTML string to be cleaned. + + Returns: + str: The cleaned text without HTML tags. + """ cleantext = re.sub(CLEANR, '', raw_html) return cleantext.replace("\n", "") def _clean_description(alert: dict) -> dict: + """ + Cleans the description of the alert by removing HTML tags. + + Args: + alert (dict): The alert dictionary. + + Returns: + dict: The modified alert dictionary with cleaned description. + """ if alert['triage_configuration']['event_groups']: i = 0 for e in alert['triage_configuration']['event_groups']: @@ -368,7 +564,7 @@ def _clean_description(alert: dict) -> dict: def init_client(params: dict) -> GemClient: """ - Initializes a new Client object + Initializes a new GemClient object """ return GemClient( base_url=params['api_endpoint'], @@ -383,6 +579,18 @@ def init_client(params: dict) -> GemClient: def fetch_threats(client: GemClient, max_results: int, last_run: dict, first_fetch_time: str) -> tuple[dict, list[dict]]: + """ + Fetches threats from the Gem platform within a specified time range. + + Args: + client (GemClient): The Gem client object. + max_results (int): Maximum number of results to fetch. + last_run (dict): A dictionary containing information about the last run of the fetch. + first_fetch_time (str): The earliest time from which to fetch threats, if there is no last run. + + Returns: + tuple[dict, list[dict]]: A tuple containing the new last run and a list of incidents (threats). + """ last_fetch = last_run.get('last_fetch', None) if last_fetch is None: # if missing, use what provided via first_fetch_time @@ -434,6 +642,19 @@ def test_module(params: dict[str, Any]) -> str: def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Retrieves details of a specific resource from the Gem API. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, must contain 'resource_id'. + + Returns: + CommandResults: Object containing the resource details for display in Cortex XSOAR. + + Raises: + DemistoException: If 'resource_id' is not provided in the arguments. + """ resource_id = args.get('resource_id') if not resource_id: raise DemistoException('Resource ID is a required parameter.') @@ -449,6 +670,19 @@ def get_resource_details(client: GemClient, args: dict[str, Any]) -> CommandResu def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Retrieves details of a specific threat from the Gem API. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, must contain 'threat_id'. + + Returns: + CommandResults: Object containing the threat details for display in Cortex XSOAR. + + Raises: + DemistoException: If 'threat_id' is not provided in the arguments. + """ threat_id = args.get('threat_id') if not threat_id: @@ -464,6 +698,19 @@ def get_threat_details(client: GemClient, args: dict[str, Any]) -> CommandResult def get_alert_details(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Retrieves details of a specific alert from the Gem API. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, must contain 'alert_id'. + + Returns: + CommandResults: Object containing the alert details for display in Cortex XSOAR. + + Raises: + DemistoException: If 'alert_id' is not provided in the arguments. + """ alert_id = args.get('alert_id') if not alert_id: @@ -480,6 +727,17 @@ def get_alert_details(client: GemClient, args: dict[str, Any]) -> CommandResults def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists inventory resources from the Gem API based on provided arguments. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, may include 'limit', 'include_deleted', 'region', + 'resource_type', and 'search'. + + Returns: + CommandResults: Object containing the list of inventory resources for display in Cortex XSOAR. + """ limit = arg_to_number(args.get("limit")) or PAGE_SIZE include_deleted = args.get('include_deleted') region = args.get('region') @@ -498,6 +756,21 @@ def list_inventory_resources(client: GemClient, args: dict[str, Any]) -> Command def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists threats from the Gem API based on provided time range and other optional filters. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, must include 'time_start' and 'time_end', and may include + 'limit', 'ordering', 'status', 'ttp_id', 'title', 'severity', 'entity_type', + and 'cloud_provider'. + + Returns: + CommandResults: Object containing the list of threats for display in Cortex XSOAR. + + Raises: + DemistoException: If 'time_start' or 'time_end' is not provided in the arguments. + """ time_start = args.get('time_start') time_end = args.get('time_end') limit = arg_to_number(args.get("limit")) or PAGE_SIZE @@ -529,6 +802,20 @@ def list_threats(client: GemClient, args: dict[str, Any]) -> CommandResults: def _breakdown_validate_params(client: GemClient, args: dict[str, Any]) -> tuple[Any, Any, Any | None, Any, Any]: + """ + Validates and extracts parameters required for breakdown-related API requests. + + Args: + client (GemClient): The Gem client object (unused in this function but included for consistency). + args (dict): Command arguments, must include 'entity_id', 'entity_type', 'start_time', and 'end_time'. + + Returns: + tuple: A tuple containing extracted parameters. + + Raises: + DemistoException: If any of the required parameters ('entity_id', 'entity_type', 'start_time', 'end_time') + is not provided in the arguments. + """ entity_id = args.get('entity_id') entity_type = args.get('entity_type') read_only = args.get('read_only') @@ -551,6 +838,15 @@ def _breakdown_validate_params(client: GemClient, args: dict[str, Any]) -> tuple def _parse_breakdown_result(result: dict) -> tuple[list[str], list[list[str]], list[dict]]: + """ + Parses the result from a breakdown API response. + + Args: + result (dict): The API response containing the breakdown results. + + Returns: + tuple: A tuple containing parsed headers, rows for table display, and raw output data. + """ new_t = [] for r in result['rows']: @@ -560,6 +856,16 @@ def _parse_breakdown_result(result: dict) -> tuple[list[str], list[list[str]], l def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists IP addresses associated with a specific entity. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + + Returns: + CommandResults: Object containing a list of IP addresses for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) @@ -576,7 +882,16 @@ def list_ips_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResult def list_services_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists services associated with a specific entity. + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + + Returns: + CommandResults: Object containing a list of services for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) result = client.list_services_by_entity(entity_id=entity_id, entity_type=entity_type, read_only=read_only, @@ -592,7 +907,16 @@ def list_services_by_entity(client: GemClient, args: dict[str, Any]) -> CommandR def list_events_by_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists events associated with a specific entity. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + Returns: + CommandResults: Object containing a list of events for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) result = client.list_events_by_entity(entity_id=entity_id, entity_type=entity_type, read_only=read_only, @@ -608,6 +932,16 @@ def list_events_by_entity(client: GemClient, args: dict[str, Any]) -> CommandRes def list_accessing_entities(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists entities that have accessed a specific entity. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + + Returns: + CommandResults: Object containing a list of accessing entities for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) @@ -624,6 +958,16 @@ def list_accessing_entities(client: GemClient, args: dict[str, Any]) -> CommandR def list_using_entities(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists entities using a specific entity. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + + Returns: + CommandResults: Object containing a list of using entities for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) @@ -640,6 +984,16 @@ def list_using_entities(client: GemClient, args: dict[str, Any]) -> CommandResul def list_events_on_entity(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists events occurring on a specific entity. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + + Returns: + CommandResults: Object containing a list of events on the entity for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) @@ -656,6 +1010,16 @@ def list_events_on_entity(client: GemClient, args: dict[str, Any]) -> CommandRes def list_accessing_ips(client: GemClient, args: dict[str, Any]) -> CommandResults: + """ + Lists IP addresses that have accessed a specific entity. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, including 'entity_id', 'entity_type', 'read_only', 'start_time', and 'end_time'. + + Returns: + CommandResults: Object containing a list of accessing IP addresses for display in Cortex XSOAR. + """ entity_id, entity_type, read_only, start_time, end_time = _breakdown_validate_params(client, args) @@ -672,6 +1036,16 @@ def list_accessing_ips(client: GemClient, args: dict[str, Any]) -> CommandResult def update_threat_status(client: GemClient, args: dict[str, Any]): + """ + Updates the status of a specified threat in the Gem system. + + Args: + client (GemClient): The Gem client object. + args (dict): Command arguments, must include 'threat_id', 'status', 'verdict', and optionally 'reason'. + + Raises: + DemistoException: If 'threat_id' is not provided in the arguments. + """ threat_id = args.get('threat_id') status = args.get('status') verdict = args.get('verdict') diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index b544f634a50f..055aaeb871af 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -821,6 +821,7 @@ script: - contextPath: Gem.Entity.By.Services.SERVICE description: "" type: String + - name: gem-list-events-by-entity description: List all events performed by an entity in a specific timeframe. The results are sorted by activity volume. arguments: @@ -848,6 +849,7 @@ script: - contextPath: Gem.Entity.By.Events.EVENTNAME_COUNT description: "" type: String + - name: gem-list-accessing-entities description: List all entities that accessed an entity in a specific timeframe. The results are sorted by activity volume. arguments: @@ -1046,6 +1048,7 @@ script: - name: comment description: The comment to add to the timeline event. required: true + isfetch: true runonce: false script: "-" diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py index e67faa83dea3..45d940b37dde 100644 --- a/Packs/Gem/Integrations/Gem/Gem_test.py +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -585,3 +585,19 @@ def test_list_accessing_ips(http_request, _generate_token): } res = list_accessing_ips(client, args) assert res.outputs[0] == test_list_accessing_ips_data['table']['rows'][0]['row'] + + +test_update_threat_status_data = None + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_update_threat_status_data) +def test_update_threat_status(http_request, _generate_token): + from Gem import update_threat_status, init_client + client = init_client(params) + args = { + "threat_id": "11111111-1111-1111-1111-111111111111", + "status": "open" + } + res = update_threat_status(client, args) + assert res is None From 3c148c13bedae155ffe1a0c84271b6aca4358664 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 15:15:38 +0000 Subject: [PATCH 49/62] Add 3 tests --- Packs/Gem/Integrations/Gem/Gem.py | 12 ++++----- Packs/Gem/Integrations/Gem/Gem_test.py | 35 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index 43dd09d864c5..ed7f04f75a82 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -502,12 +502,12 @@ def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, al return response - def add_timeline_event(self, threatid: str, comment: str, timestamp: str) -> dict: + def add_timeline_event(self, threat_id: str, comment: str, timestamp: str) -> dict: """ Adds a timeline event to a threat. Args: - threatid (str): The ID of the threat. + threat_id (str): The ID of the threat. comment (str): The comment for the timeline event. timestamp (str): The timestamp of the timeline event. @@ -517,7 +517,7 @@ def add_timeline_event(self, threatid: str, comment: str, timestamp: str) -> dic params = {'title': "XSOAR comment", "description": comment, "timeline_event_type": "xsoar", "timestamp": timestamp} response = self.http_request( method='POST', - url_suffix=ADD_TIMELINE_EVENT_ENDPOINT.format(id=threatid), + url_suffix=ADD_TIMELINE_EVENT_ENDPOINT.format(id=threat_id), json_data={k: v for k, v in params.items() if v is not None} ) @@ -1088,15 +1088,15 @@ def run_action_on_entity(client: GemClient, args: dict[str, Any]) -> CommandResu def add_timeline_event(client: GemClient, args: dict[str, Any]) -> CommandResults: - threatid = args.get('threat_id') + threat_id = args.get('threat_id') comment = args.get('comment') - if not threatid: + if not threat_id: raise DemistoException('Threat ID is a required parameter.') if not comment: raise DemistoException('Comment is a required parameter.') - result = client.add_timeline_event(threatid=threatid, comment=comment, timestamp=datetime.now().strftime(DATE_FORMAT)) + result = client.add_timeline_event(threat_id=threat_id, comment=comment, timestamp=datetime.now().strftime(DATE_FORMAT)) return CommandResults( readable_output=tableToMarkdown('AddTimelineEvent Result', result), outputs_prefix='Gem.AddTimelineEvent', diff --git a/Packs/Gem/Integrations/Gem/Gem_test.py b/Packs/Gem/Integrations/Gem/Gem_test.py index 45d940b37dde..48f1e91ed6a3 100644 --- a/Packs/Gem/Integrations/Gem/Gem_test.py +++ b/Packs/Gem/Integrations/Gem/Gem_test.py @@ -601,3 +601,38 @@ def test_update_threat_status(http_request, _generate_token): } res = update_threat_status(client, args) assert res is None + + +test_run_action_on_entity_data = {} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_run_action_on_entity_data) +def test_run_action_on_entity(http_request, _generate_token): + from Gem import run_action_on_entity, init_client + client = init_client(params) + args = { + "action": "stop", + "entity_id": "ec2 instance id", + "entity_type": "ec2_instance", + "alert_id": "00000000-0000-0000-0000-000000000000", + "resource_id": "ec2 instance id", + } + res = run_action_on_entity(client, args) + assert res.outputs == test_run_action_on_entity_data + + +test_add_timeline_event_data = {} + + +@patch('Gem.GemClient._generate_token', return_value=mock_auth_token) +@patch('Gem.GemClient.http_request', return_value=test_add_timeline_event_data) +def test_add_timeline_event(http_request, _generate_token): + from Gem import add_timeline_event, init_client + client = init_client(params) + args = { + "threat_id": "11111111-1111-1111-1111-111111111111", + "comment": "A comment", + } + res = add_timeline_event(client, args) + assert res.outputs == test_add_timeline_event_data From 16c528006e871e1c4931409cab010a125d8344b6 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Thu, 14 Mar 2024 16:53:56 +0000 Subject: [PATCH 50/62] generated readme --- Packs/Gem/Integrations/Gem/Gem.yml | 70 ++-- Packs/Gem/Integrations/Gem/README.md | 354 ++++++++++++++++-- .../Gem/Integrations/Gem/command_exapmles.txt | 29 ++ 3 files changed, 387 insertions(+), 66 deletions(-) create mode 100644 Packs/Gem/Integrations/Gem/command_exapmles.txt diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 055aaeb871af..3bb794507ab0 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -36,11 +36,11 @@ configuration: type: 4 section: Connect required: true - - display: Sync incidents 30 days back - name: firstFetch - type: 8 - section: Collect + - display: First fetch timestamp (

%_JIvOQjr7Y)Giy?ek;9E-h1n2fiv4++@*F`zRb4U0Q* z-X}D_##4K5pvV4AlcoZuJ@oiDErSJ^b`|k&+AP3GxhXbTKW+GqD^~l>Hw&La#xr~WjR1;Ht=~oq zvl+Gjp{9l9k@Eu|4V@AK)#WEQ?G|SPpB?;v?kD^=6m&jV=zMV%zsfQ5de@D$$~5ji F`9G;eNX!5L diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json index e75cb55a8a64..2dbc2b2c5b9e 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem-webhook.json @@ -1,17 +1,6 @@ { - "brands": null, - "cacheVersn": 0, - "defaultIncidentType": "", - "definitionId": "", "feed": false, - "fromVersion": "6.8.0", - "incidentSamples": null, - "indicatorSamples": null, - "instanceIds": null, - "itemVersion": "", - "keyTypeMap": {}, - "locked": false, - "logicalVersion": 3, + "fromVersion": "6.10.0", "mapping": { "Gem Alert": { "dontMapEventToLabels": false, @@ -130,12 +119,5 @@ "name": "Gem Mapper Webhook", "type": "mapping-incoming", "description": "Maps incoming Gem Alert fields when received via webhook.", - "packID": "", - "packName": "", - "sourceClassifierId": "", - "system": false, - "toServerVersion": "", - "transformer": {}, - "unclassifiedCases": null, "version": -1 } \ No newline at end of file diff --git a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json index 5e6b60e4137f..8212b50bbe40 100644 --- a/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json +++ b/Packs/Gem/Classifiers/classifier-mapper-incoming-Gem.json @@ -3,7 +3,7 @@ "name": "Gem Mapper", "type": "mapping-incoming", "description": "Maps incoming Gem Alert fields.", - "fromVersion": "6.8.0", + "fromVersion": "6.10.0", "defaultIncidentType": "Gem Alert", "mapping": { "Gem Alert": { diff --git a/Packs/Gem/IncidentTypes/incidenttype-GemAlert.json b/Packs/Gem/IncidentTypes/incidenttype-GemAlert.json index 43370797b74d..f8959c94109a 100644 --- a/Packs/Gem/IncidentTypes/incidenttype-GemAlert.json +++ b/Packs/Gem/IncidentTypes/incidenttype-GemAlert.json @@ -1,5 +1,5 @@ { - "fromVersion": "5.0.0", + "fromVersion": "6.10.0", "autorun": true, "closureScript": "ResolveGemAlert", "color": "#32EAC2", @@ -12,11 +12,8 @@ "id": "Gem Alert", "locked": false, "name": "Gem Alert", - "playbookId": "", - "preProcessingScript": "", "readonly": false, "reputationCalc": 0, - "sortValues": null, "system": false, "version": -1, "weeks": 0, diff --git a/Packs/Gem/Integrations/Author_image.png b/Packs/Gem/Integrations/Author_image.png new file mode 100644 index 0000000000000000000000000000000000000000..a8dbc8fdaf8a46ddd58ca602b3538235c82d8250 GIT binary patch literal 1907 zcmV-(2aNcMP)aR_j5&LVPRomVPRomVPRomVPRo0 zCvd1FzB>7(_V34!9bDE1LS!#|FB-k2M$m8j@~@wENXk|bnU3o=pWXcSkSr#SQUp(f z+*pn!c`7JO@HEMdFOs*pXlFqg!Ov)NL&Q8`?lO)-@>8%PO9yrojm4tE8 z^l9!+4`04;#iL4CISK%pQ=CiiIGQUcT<$G4dgsZKSD?_;lQtJh}`1AqjpdC&^7V!5FEYptF!@8*aeEZP9AhuQ_txQ;A7u3h$xHL%mxlxK2#@r%BY#KSub7J?FMgx?(kd`R$f0rfI_Q@dx3Z#E+xrbdGlmV3VNtXKm`2!_Wf3}iOF#s z=gy#ue3|Z31k0};w;@N1rqihxeD86}#B$2BK~sRz_Kr4Q9^f|8=@&L+8=E8kPj1C+ z&>02FRjeAM_{tjj(eqw)Q@JDWyuP2Npiuv#Q^R1;I;S?6pwoJO>pN|ND_C@?FS`HP z)vJwP7rypsg1C3`v>u*?9W2J+kEAve7JL=vxs!a37tFMi$3%J*wu)iu4_!d6^og5T?Qgn(J8j8ZO(}0*TGGH~1;vMtL>~ zPwxi8CFMd6cetC;^>S;kRc7yd_UQvt@% zvnnUeOrKQ2q?v4kpFN^ULDGV$8To5oF~+BaHiE6Z@+sdN^4YlrGnnLiub-}m6n0_( z6C!zBpR0CxS2LlKHbGXqY&8iRV<)Y26{>WNot+#jkU4-^Q%m72BHRde30Q~n1T%hH z{H6zz8Ejr8Gr^i(1)P6=^ttNkZavE`4 zN`w0-s>v5cE`t}4%Y{Rw!UU2p-Wic|T*y|!AiKtuG_G<*l`dF=j9fe~Ql2VCBAAg$ z@}EzJOx{IQs2H3Ifrtic6_rC&A<8=oX3b&Qc^fDVjtx}hsZg*t4U9}MW0++4Tp4P) z<3*9%2NMCJn!K=z=*-29f-_0m>hz^sL^f)?OZ-ea@Jh?&S~b^$XMOlTk`GRUeX^jl zgD@29(+;Rc0avkz&1pr=BaBR@KdxpO

%_JIvOQjr7Y)Giy?ek;9E-h1n2fiv4++@*F`zRb4U0Q* z-X}D_##4K5pvV4AlcoZuJ@oiDErSJ^b`|k&+AP3GxhXbTKW+GqD^~l>Hw&La#xr~WjR1;Ht=~oq zvl+Gjp{9l9k@Eu|4V@AK)#WEQ?G|SPpB?;v?kD^=6m&jV=zMV%zsfQ5de@D$$~5ji F`9G;eNX!5L diff --git a/Packs/Gem/Scripts/ResolveGemThreat/README.md b/Packs/Gem/Scripts/ResolveGemAlert/README.md similarity index 100% rename from Packs/Gem/Scripts/ResolveGemThreat/README.md rename to Packs/Gem/Scripts/ResolveGemAlert/README.md diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py b/Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.py similarity index 100% rename from Packs/Gem/Scripts/ResolveGemThreat/ResolveGemAlert.py rename to Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.py diff --git a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemAlert.yml b/Packs/Gem/Scripts/ResolveGemAlert/ResovleGemAlert.yml similarity index 77% rename from Packs/Gem/Scripts/ResolveGemThreat/ResovleGemAlert.yml rename to Packs/Gem/Scripts/ResolveGemAlert/ResovleGemAlert.yml index 02541dc0f1fa..8ea1f0cc7393 100644 --- a/Packs/Gem/Scripts/ResolveGemThreat/ResovleGemAlert.yml +++ b/Packs/Gem/Scripts/ResolveGemAlert/ResovleGemAlert.yml @@ -2,7 +2,7 @@ comment: "Post Processing Script that will resolve the relevant Alert in the Gem commonfields: id: ResolveGemAlert version: -1 -dockerimage: demisto/python3:3.10.12.63474 +dockerimage: demisto/python3:3.10.13.89873 enabled: true name: ResolveGemAlert runas: DBotWeakRole @@ -11,7 +11,8 @@ scripttarget: 0 subtype: python3 tags: - post-processing + - field-change-triggered type: python -fromversion: 6.8.0 +fromversion: 6.10.0 tests: - No tests (auto formatted) From 7267ebeaa8af4b30046a40ab0d9ffd9e32a4a721 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Sun, 17 Mar 2024 12:38:28 +0000 Subject: [PATCH 53/62] Fix docs --- Packs/Gem/Integrations/Gem/Gem.yml | 2049 +++++++++++++------------- Packs/Gem/Integrations/Gem/README.md | 440 +++--- 2 files changed, 1244 insertions(+), 1245 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.yml b/Packs/Gem/Integrations/Gem/Gem.yml index 93c432652dd7..b9b1bb7da4eb 100644 --- a/Packs/Gem/Integrations/Gem/Gem.yml +++ b/Packs/Gem/Integrations/Gem/Gem.yml @@ -1,1053 +1,1052 @@ category: Cloud Services sectionOrder: -- Connect -- Collect + - Connect + - Collect commonfields: id: Gem version: -1 defaultmapperin: Gem Mapper defaultclassifier: Gem Classifier configuration: -- display: Incident type - name: incidentType - type: 13 - defaultvalue: Gem Alert - section: Connect - required: false -- display: API Endpoint - defaultvalue: "https://app.gem.security/api" - additionalinfo: "The API endpoint to use for connection (US or EU)" - name: api_endpoint - type: 15 - section: Connect - required: true - options: - - "https://app.gem.security/api" - - "https://eu-west-1.app.gem.security/api" -- display: Service Account ID - additionalinfo: The Service Account ID to use for connection - name: client_id - type: 0 - section: Connect - required: true -- display: Service Account Secret - additionalinfo: The Service Account Secret to use for connection - name: client_secret - type: 4 - section: Connect - required: true -- display: First fetch timestamp (

*y_O@PcP%;Vf2@iJ- zFh)JRB@yEQLc3r-rf_@|NJwD>4-1YaWNz24#as=?H43K)Yf9k?x66MJx2msu?-U%O z`lia`LqYo*D-;*C5o=aKccy4Nr+Cq%QIc0OT&+XcVFJ|zAKK53Fj5- zOx&5l$&$^i%T2!~cuvjZ6S*B9RD5WcS-~O_S)Fw4a13XW->1%D7li1saxzvDCJ>B} zUjfdsqsifW!my8RJy-wPJR(w4T+~J_*N=RnnKMM5{~A&phP9 zSApoK^ah?+$KSgV2bzUtAYa4f&AdqDv}PL4H2h9A+b*!fR#4jERM%sorh>cZk%wj1)Hs3F~ z+gV=E_^K|H5yDAH@yU5uBkNwi$;j3HI}b!?Da@1xgh-|I=i~VqEgb60w9z-uHN|a^llZ~doxndXpTclpxQmpQFQj0)IxFn3Ag;NJk1<%1ss@ zE*dUZwUqLG>Os`lkplTnzBwzY9w=K%Qb=E1#43f?xn9Mjlqp=+%2fZuk`$TRMG4Of zFv(BfZoMFX!uEHa-ME>(PuJ)5Y8an2Yrw}{LhkTU@};SXU;`@0t@uNw0?VO9nG_64 zQ2IZ$jt$@Xr>CR8NPg}S-+R=Rg=&~4-l3_yOZOZ`pVEAs`%XSfpT$rzjA&S8hwJH}c|(4NE!&QeB7;wMUF!bV z*513YOffNeW$0q(#+%{e;|qJdjaZ!wHoLvqnhkpHb!AU2mp!oh5J7bOOqkmpxLjP&$}p8Ze#_QZSSj6I4WB+!ifM$06;ww` z=sXBLJJX{ePPCw4^@%HGWs5>m~g_}6o2AA%lz zGHcxbj{=aw>T@;TXvQBhI<5ZCN}WUwqYvLdD^Yu9S|?7fgk6|%L3qaF%?tG~GAXNf zho=<&gQEeH*m960_-CCWvDiws)%!P%R{33rI~EE>C3cN}0k7Ua!{Nh@K8Oj_zjnNE z*9oQ-BsonRCgNPeaZMimTSD3{(wcf%VLFiC(sEz{f2((1H7|{7?OCkTSQ*cWrJj{! zbG_2HGO?ynp(9Ikzj6Djzpn^jsWiiRr?d#5Sp4v{T`FK(PUX+>yg8i1h0H2WhoLMj zcN-HnQT&r^F6CuB%3oU-(djX6o+k~K+ly6<~t zdAre8BU{*-#O~=N;aRr8*{|xJvFh_rjG?n*dvE9U0ioT{ASsP(7FbJ=Hl^O~>K*Rf z4@NsGy8CUTEP<^)(Gt~vS8LO+?z}(9G`t$A3~Ea%QFh+=d&p=PqTmA88)VcL5;ujC z4mI4v;*0(3^#{uhai(y@-E7~Gd;HiGt>W6xF&^OR8*HV$poT7df4(vdckW6kYzq&T z+LMPoLHSx1)n`FS3_67+fwe zD+5ii*Y<9zgda81;R$IC6%w9s_rdQayF~1Ti4oCe+vRXjW#r`)Z_<&!dV*U`i3)7b zPoXy0_-wDeke}_Ls+;>uFznwtu5O`mAJbmG*cDLn!M3hMox`+aH-CmLIh@;s!Bm=+ zIT%j$37q+gw4|&jwi~nbNIVjg-d!OhQMxU&w^zG2<=$~#cn^6kIk?n0a{hUN{Do&V zYid#-iQoM*y~Gb&cMFXBvfV1u{I{+E(}NkqOFWcqpA8$cX-6B{_PIXVMYUPhmFie& zipav{1#q6thll12$Qp_-!VXFc!OM6z#e+}luK+eTB_ksQpjtIp1&YFDC>(_)nQ5?)oi0%YEDZQmwb=P4%e7-_v^J{e5ZlTW3C{DRn z=F!AY;+$a<8C7~~?(2b^b$@IS|0}fF1UMwG3o0JYy~2Y;{Oyq3;)OUg`jGc*UyyqG z{^(>vjoHy*f5!s%zxji)dC)5^wQvX@OlT*vXT|u7IW{tc1G#O!|m}WSOr82vP8azI!9y}H06qTgYTibT453y z4VF{e@Hv5%gtNBN2EbTJL&Fq=Aw}Hx3KMXKJ<3a(4h$0BnWlRVpzP@pKmuH*5sjIcq0fXx z#S$Y&vcFl5VF9kOPgO+xjW1-wW_SVrCOg?2X~@bH$)PWAWO2nsHQ|$y-_dg2hF5vl zCKo}E=v$F@a4p2bHz5_FHNo2PcZFU7p#l1Q_nV?-XJ^GQ({Y>T=CT`nQ!7Z@D4|EM zpyLobq!@B|VWE8f_d=PG7B;=rD@yDm-x%&PcPLYy)p?C{W(*6XxSP!|QbX|PV8jXI zust3qCnjcriGFu=g6f5_0 zzhdSA8laj8aNViTMwQgmSdd0U(LB{ zLDoW0dCC(SmE2=^^yTF{ScluqBX6eE*zGo)##=DE<-8`tPz<0A$z`*x-|jUV4%-)$ z>m8LIn@xu5{S1DfKRIvS{P_*Q?KjJvbhN{UfFlIJDWAcC<^AJ9_ov_3-GCyO1*n}; zJ8Y=BbTiCxQNSUxvNM+<4ME{Yd-J=GMlVX#A4fj!BO)1=9(NVlxm+Ar>7-sQwo;aq zZj?ne|MqtW9Z8IO`kZ;`A0#t3=V)6RVb{!S2Au@LG#W>24biu3tpi@H3@s&C76!`k zK268WSWaf=rS_- zNoasE-;XBVzOVfVZ@eTo;n14AJmC;>cqb!W2Edd}U=EfrjUHWEzP!KYJu8}+>IIHW z`){~H5y)w@pF<3|JXX<}!Sf5gE_rkP<+Jge!DY5f1rND9gCU z2DWm|MZCNgA-e|0-33Ozb5oE+_t)54(dAvpRnTdzxYtc@iYJ|+9*y?_?c<30^Rp@* z0HBkX4m-pFV4O&3i(s-;{a5nW3h_DdzqaMcRYZauR#GXrxD@wUphM6HLMjFcY8zMR zZ}g>QMrOjDnC2=WVR+i=TLoW1E6?fa5=d%471}cmJxjqM2?U2h7F9M5D`Umb*++s; zoLC=1zj|`!_CwprPg9z1#8UBF*8-6~4FMTBoBB0N%DHh`L$PSt4c^>*m5WMmdEY`u zoz62-^X8q#7UTVf-SGhw)ay&o?JIOw--nXByK&BGIEVG={_Y3{<-`7hH8H|I+w$~F z4c<{_Y%y$Z!Gky{GPTXka*JLXtIeG?=%QodJBw3(xhU z^v|vxyy{3LRYJ;ip>a)L&rWQhayg%D-_|UB^M*s+8c)p?^W4T<-__ybr8?H)vv*@F z)_!BX3T-DGoZslb8nGW$(G)y-;mCNs1}E-8O1VCA!62b*$p~!b3!T(X|&VP82cw>e|N;$vz1UkX3Ty2TAmR9lRqf{ZuCh8QKTYIz zPr3T1k^O_smEKq(ki+hmjUkIMp9D4HgBiJ% z<`V1ijRBLp(Ou@#!==Tkss-IUd#}kvd?~q`y|+3Dp=A-(_FuX5Ph`Hr>KrA|geURQ z4Vx`;;(~YITHbd}McK(xJN=RB=-y9rHjd-eoC#8p<#JI~RSmy@;z}GWR~Fg+-fN z!h*8ezHoxZ`iFgmwB1ibTdUD^nXjsTrf66?Z3OZBkn@ZEnu?q99+xmEMBVoJ#*lT% zUQ3tq0L|$=L%xupS^NTe>ENGgN?``Blp#U5WmjGw8kG}R`f#g=m#O}6Xs)WS`!`g` z48#*Zo}S(<(l<@0>P>mL^Ftu!>=B%F0zuA-^C zD<@1(flFmK7&6|oIY>o$O4mtUV;`#kVdM?fi!^SoHrP)sHZToQ7A!TafZ`I73^4invxVM*R_G{;-^n}aX_wG&a0|=5ljd$StPgFef1Y<1bs)!sDiaO#BkM;LZ+NJzMoy`III zt52VX{yRxslfPALfu3K%3kRn?9h-aoa3hxg?g|f*6AZ4kS2CyXm09ZYr;)18O)NRt z{q(-hH#5iBP{-&rG|2d{#ZF>?sA#g^aKdGG2{xsX!L*~C5{k3<+pBkq9Cv0g^cq_~ z$TdT>)SapbyX})MrzO;M&6Mpfa>rJ$B}G#Fnm6`g;NKiH7gE#T-)t^kWZx{`>EtnY26bQ zpsznKd5G-$8yv4-NP$gx*7&4a|@Qu(hv2Zl!q0Y z=B}=Hk@xe0h7D@ep1{;pQTG!x84{&cWkyrMUnCelV=tV2W^nD`nq{{RG2c_w&DB=S zKvdID#H(`rw^v0+KzE$y}7ct^uW~sGhsXk{Dur&}n-^42TU)M)T{? z#F4nqoNSlR^1IITVKHu*72+kChU@GytJ@QmLhz29>^$r${1T&{CZ&W*# z(e4OKMFwh=Goa?qUg7LDr7}_F~FB!`@#Fy^vwmc_xTtz%e zWxD2d|m zpKP4zmdp&4-3hZ_UF*==pFcaerv6;-S!LL;`TX8$iM12e#7M*3T ziKew4vT^sO+MN-_I@oI!Rr+$f!~R!M=?9&Hkpt%EC^ZJ#O*QL!;LTvAVO7;-RklRw zwIrSyoVVObuIvX2-7YL zVj9vi=VRUzeKLu*L;Z3IS9jbkhHjoO7N4~z{q*jpG#(;g>xv86WX+Fhq;QKikv-ktP>%U;FL}IN9ZpI6<@;0fkIQW~YW$!6r^Bwm z_B$m6ZX4Ak`F)(Ja(JcC3}+nJuRm$|3iS&}DLOsrsi-cCTl-rR?eBiDLcU$+hl#c^ zOBj|mo~VDCWvA<~&0M2OEX~s}I6g9*vAVtoeXO|K5%{7Q+vnYxb?z^W9tM($EV1cl%wCSNb&wn z(cl~~;7>n@HvELeT`JM1EVmc-!mf$aZ2GHvEih)Vm6vUDo6ROAeyNZVPLxyZa(-Oi z5TfSjR&>Y74y&MeX*=(0t29@hgF2L13NrW!tZ;8Ph&myl?;L$iN-}Kj^0F+ysfj&T z%W|}P+Su^llz}D%rI9cpwe->rzU>8*Ma~e?U7MLZ=ic8|+rT*Pk@cZ1Q*0i;^CgN9 zwDYxmK1Q+l}4tOT$f0d>(*WPw#owjnAJc*e%&ZUi8O)Q@1k?8+eeJg!G|ZxWLwlqdqM;g+ ztpD|wo;q}BIkiT#{0_Kf4W;GVX{QI)Fu$N(7b^otJ7dw#P!-D^l5k-smvz^khQ{sL zwA*Xv2JhG{GL0N;6#Z(j(cH;xm1faJu?np*VsD%s#Yk&alO5P4Io}51%r;Un4YKDSw9&A`sdbj z(8N@Afjs9Py~hzu4@w#MJ`| z!?@m8-8c9Mh1Ne!Dtst{v!XxqYxiu`xKOM4 z+NxQ86>r7}`F?7*k9mEr#(EA#;gHU$%vkY-SI@guiM2gO63sEMLY0N7E+?N%kX6ax zGn1)$LfDZzk}J2)uAYV+i3`BHAI51*z_`is#C7v<8Sq_2A?k8vUlNj;5V1Nve$AA5 zGLyxOO2rx1u;~%+22ard+M;_qPQk%!rs5tpLUDex;<@V_Ns@TGTZ-Fa+Vdi__{*o! z&;hu|hvQ1O-LAgr0vBmvQC;ShBY)~8T$@i7V|eTkmpB`%@6ew*w?D>3I5Q%>MyybX zvzRTOBa_4WL~uIhbbDfgUx~3`sREl%S7KDcT@|($6nzB@^)BIQiF8jaSZK~XLLGuX1PfVw@+ss#~oiHVegy~9z*0&E6Ae)@VswVKIJ%fLcdSnySeu>C#WE`pu|}wjB-^)!d!%?!%;@m;|f}pM#7v632UtM^OnPV3`}Y7VgukKp3WN)c4>*-;n2~9VFx(Zh0Go zD7<7fI^>Z>Qbb}#v$7QLMYQ3$*9O)(4tI@q96rCg^fC-lbFNQevZ;d7#UviVF#i8< zi}Y_y#)t2~90)=2oIjdQTRQS0pq`Obrr7V@d!v)XnACev_lU1eS%^f)^-S8;5B8_v zGGv2bGEzvVY>^;;_xln1!>r&j0%KC(2zAlE6d}-)BfKX-aQziMjCwuDbxL)X-hTbl zr9z~p0OBaK&+$@`6tkxc?LdW3w8`(??a9<9J0S;_FsK0hW~AWemJ6~ejCx&N*T*bBErUJ!xc{C~#t zmpp9iZkkH#;Ya4UIIhn7U5)rBsX#^<>eZ9|>sVJcFkh+f_a6LvJm$mlznRoQbrXzd0lxb^U@ULt>sF zB_h8wps(X&e{vn^DI7Tv!nY2;E+0mmpJ9Pt;6o$CLP)S^7@`&8;x6guz#8yrCE3a$ ziWvE|>`5%{MBLS*AG;#QS-?R`8acL-r*pYY4WBLJ>F+Ivrl#^K6Mk05Q`b>5gK}k4d zOS2;_j_#u^fmbhvv)W(%%N-sEquj8CwfwepO_t4PE~=}u`triN!HUJ6EOQRE zK7Y;*au^M4b<1hak?F0iw5#JC@VvRRglL~!SjP4QO;JSUfUqD(`TOD@?ZbUCa`DD0 zh~(FDd}v6$UBKd&qgFaXMvy#%iC0)rF(R8Lrb-)FVLbPV zQM&=y=HAWJa#8)BjOZ3JFIhFNw{fu5Z;C5cNY}aw>!cv^J|AKzwe_Ew1u35?DKQk! zXM4>9+gADj7>4#tEMy&^bQUoT=-oqapB9Z3ii66_aFodBev8qJxKy~UCOaFn0PlsXuXC!vlY?h>C*Znh;AlyvA`}^2oI57=#+MNa&Bov7izuly|8IY zB$n@8InYp8Oq}x|i!+$tX6ng;&HF)@2?jcp+ayZgAJ>>p!uQeTZ+$H3zz;_(v{iv) z3OUSd%)zeL2b1QH6-`N%|2rl;gNu@(DZLRsH8f@z_!fgKqrLNw?oFDD1r=$jo7D3A z)dTi^mAEj$7bmImxEyvYI-G%~q5=B(23Tov#C2rKE-hHqUUiq0l9HOw!9m?QqkAN2 z|F#Qo0@_F=xq+^2`d%M;{Egg~pAAw9#`BiK1)s7P+cyi{6&$>E;1TCs0GKZY)U;L)e;Tq4hhVf>tBMw zy``ycsh#L$@2NY_KAym;ywJLv-xSHO48>yOUK)FvgZP{dZ{Nw<+9V0iusb|VI>=(2 z!Y_gv&=)tEnVW86ajSYLABp)7M9k9<;y4lQqm2V`T8c@G5=DsM(#)R{r|=Jk0|w-h z1y3*+cD)^h3wq!E4E@yHj$xK#V4Z-5gsx&0W!Dwi=(-xf;}%?zi55%#8t(h9Lx)c$ zl)btrsbsa8A2?>BYZr@`SfK~X?K%9xKOS$7z=0yK;qcz?_{@O=65|mpf_53`CO%+L z9k#0_t8u*j&cTms%7YuzW_&IFvqOAK8}VD}_n(oyazP5A)@EXx1N5y7p@ zP9)_}Tc;~n%E-*CpLb-O%#Yf4uw^6WrYWD;`aSiZ5eLoG5I9v-X@uDa(TTg9cTlAc zANBcS2iD#{)oKn%r<3y>kgyvm*`5q%H|V_aywo-iVTUwGjm`j%(BteC4oRW>-~}LB zG^;p?mutOgPjnK8{e0$9X?LsyF)y^93KWWz8cm?dFDPK+ZsIa!{#70wDH%b788-bd z^9%S$$i$b?ApwvK z?+p}0Zs1yt1~*T0?LUf+J)n(O!|SCn*)&XB7tT6Z&v2@9A!De0x4qi59|I{;IzmFi zZ{_nQ#zxSm>8%KB>G&rrn)k$D19Y)=_7N_`#@8L9#DW|%RaVZy&Ghj*o57AX(hnbw zLw9qo-D{@O*VbP=_7?VwU~Js}yTpuS?h$~|5tOqsB?Qo479U!934WSH?cZ_j$Pka1 z11GflFxDdt`HjGeG@T)%K8`WIa`umDOHMy>J}pk?dtMEUn{piSbKnXOrI!w=mu4%y zKDOB>F&xD$w?QSWPQ*7I)5|(HH#gBjEO%fp zG9O_Tu&CyH_-aB(GsUJqY4O&-t~|Hc|JRiV?keV17mw}kd3mrIGA)K3so`-Gfd%$* zZDmfX=-2@Rh7sn-ln*h&0D4-5eg6XBenxvSIx{I(pg^g?XH5A!vQ&THj#X zme}cuI6nQ+N$#gUf^ulzt>h71{R~VE0b4D^6PZQbi9SOpK5REnCW@oZUY$)}b^mV- z023G!ONF__fD8p6N`LXPjr!Ox3%t$rrsC&9C0dQ@y1%isv}6Y|t{fkSXs%uCjzl@~ zQpSi6li0ZSwwL+9eW`*5xCoHx_c=%rDm%4PfU2WqMFPH+31&B^(h(kZ)&KSznKZ&~M1q~_^oB$f2&-Mw-@)w&acEUDt7M1hXyh$jr(TiGI zN1&|#aCAVQQMqj3pps+1s_sXqs!5WlHMAe^fO+^v>Wds*pIfSB zFM#WY5#lNSvAzQGKo?A34$+z>`qz-LXD{Awe^XPp{JUzv9A5}j?85m>i6W>iYI>p4 zA1@t}yE%SkJz-?&Ublk#0$9y|rQu8wOPwOD51l`0NiMr=z%s>!gmB#|WJ|L{^WKwY z-VKXM(_H@DTn!s9B8Iaj|AepwZM}qg_r}3Cb0ilOZ>Wi&>%*c$~F?_lL z5-7esh1(6M`chXu(oPa|+4GRuga3=Y_Y8|_Yt}^-0YOwSA}E3)C?d2H1tgdV0wSP9 z0RuTSIcHHY5k(N1s05XqV-rLrCy|_UXmZY+n%&@X?Qie%oafy8++X+4T8m!YW6m+> z7&WTidfzJJ+-F5>ue?aMeNQ0ju^sIcXGGkO5hTD)YqUz|Da&jlNyR>XVfkfLv^D3G z^qq=a3B4>=xh8vmi^-HYEK3sn+$Dz^)Ag=8%pwY-t`8+-F49&2rRK-A#^36Nc?%Z3 z0JXFj_p6h4^j-ZQPA~R7S-R!*D!|-*Q3S2!tH^k;n)kPa?t~zXz_HXG2Tp3A_V>x| za*_e$a+<)96Ul}X@LOYeIbYJ-*u}qO z-Qa#G`8e0Y?6h#eySovL;J@)ns%mMO0R)FvLc1TJWHQ2~ zLgJpL&=U@QstX}-t=@P(XuJTn=pg*i>}7c(n1K@DBT0*uFHCk~iV{lfp6wyfPJC3s zKkcwf<;A;pMC2n{58Jbh13}eh?q-J7_;nel=ZcW)M0|i)+fZ1ViSE3J6wH|H%)=Z) zL(TKICKPgFW{HH`J_qpzlgspR#8G58K?Fu4BSYfN!W(^aNy++f3&~wIDIAQU?c-}%qi)m|&rd=}K|Jx1SP@oG zwqt1!GHYLI7|AVD!C+qL9rrJ3H{Q^0G+Tq^YUL#;x98)PjPM|e(upqku_wZvbh7ntu9&h!m8km;ur z(S9DK#|C1&&}kan&(oS;WX^D1GH^Yw9)yx+YftO)HsAYRjlWVt?5#Qblhdx}b_+-~ z$QtqoOW)*Kdk}afm+jTt?e$N57g&DPZ!adZ57tWuY2r;48P zpvxYWF15Um*}U{iL&4J4{`{KUgN^)6hswo3jm5yuXw#KhOp3|-OItSb_Lb)bheh{) z2`E{j^EFe;rI>3}7Zh3uL8BZB)P&YHF4{r(#3k&_rHNBhGjckubtGHQp0}xy=BT}M*NrZNR*l8(EQk40_toP;3&o^U zHI*h4hxYCd?7g|Fz5Hdl`b%J6JoQBM!!5^0TWhTcTRF(v#=o*G7KZZ`j^l!yr`j6B zR#+FrHnilp5!e|AC_<%(KZ-%4Xn(~E5uaT`@5~@;qlC&?eeprVgyUjwwx=7wgOjP% zv*qsY*>lEIm;%APGJiL*8DR!a;{9^imfgzk(r??ZrC?X@|1ymEzA+-00H0Sdgtbkv0vaq`ev*L@j!w6V{Cws%aJUlij`8japx8%(RE8EqK z+mkgL=8@b( znHfhyy^%m4|Ftu~o24)v{>4QYl}cPA0%xzuZD-JN*80dE$x6ZD3%~2m=G*Blr#EoV$-rnBG z{Vz)aP#{MD3gGXD#IzVyt)`ES+7kp}mRTU1@;~!%DH;Zg5UzTekU4IO5rGEX$T^Ww;eCBe8UZTx865o5T5 z+26Onrg!H-yHderUPK(xBibHy06~JBGskJRmktW<{X_q0?mi^#7Hdi(=uh#-Xk$$Z7w`yV2JigJ;=FOH0cssv3BysL3$P0 zv4Ktc{1-|hb>v2_h+bD=cEW^Thog{O0M+SD`EUfyoWBc#oC5_0Q zCVL6@A;SNcz}#p8J1rewlrsFE?sb$*}GM{cV_!9j0sui19I?- zz~FHpK@+|MwGCWVxmJU=VKx^L0T`lAH4=$hD9`qLC zs2=W=V%&ayyIe!S%nbU!3*FgQEr?&(^eLTyrNIzog)qdXC*RK2BvyhUib6}jY(JY_ zM0Dr=LG6crS5{U=Lu;cr?PTF~4i*MjT>sV+!RlQmK`+~`F)2P=KfFHuCW&my8d;la zXJ!nL#a?hWzZ+CfZ>(Q@Pm+#Bvgy#pCn_)+XFBP%E|SlQhwZ0{k9OL&d)|DXm_zdE#3T{yc>N|En}g#}Xa`GVgfm|HxYWE5Y!u zXd4{e6C~?IS(h_|c>Ww6WSZw;9fZ<{?`ZA*&RXHEu+LstI@cmnCAU{6nK!&tn^iv$ z0wCK8{_z4#KdV1iDFFlo;1)@kJ(e2I{i5;W{~Zx z5pE*7b6DI$4vXJ3A^%9-sNg#kiQyAZkTc<0`bqk|izGu@r0p#nW#UBti~yWRGx5OZN#+BuPkd zZ5T_+7+%qTE%++<#E%F{p1w3?m=~;{< zk>7a`yND1je?DKzj-Y#61z7v|&z@mH5+5$5s@wapXbYay=G0R!d_091De)|LL%Fw= z>9?=349xjz#m@5LKW}UT&i^L%DnkUrL{9WnB!#DH@3pbL3P3-07lO3@@m7xQF*IFa z%;Oe^^YF?CbRcw*QqRMD_ot=Rh5OEl;g;{$_p zV=hE!;jBK`_PZ~5>9ex39bFfie?v5Tc@Jde{3Ub|86x>HHxF|7_sl)!$lEXs)BXLY zne%^3-f>mEdDCq?@heB3oUAenw5dF8#kzSmp0aSc@lYpn9M(TL1esQ&;*wXLM-+n7d zcJF9N`#F-Jm1h>XJvsuQUYuK`rljcVu|zAk0$_4ZHfD;~lw38=LDe&C?a<(#c@B=dX)Ph~eKh z7v9yK{Vh3!V~Q?f`zFYt|57QM&CyV znwC7we)``H*F3mq30W%q26Cl@J^L@EVw);zF3^bUI))mQiZNa%FTL-)lYgm(W9M>E zl^pSx@9CI--u{S6_0hslH4cN`wiZuz^H>?7hobu@M^leh|MQdU$WP>q&Et1|!sK(O zMLX$j9iU==yj>9yu(hA}Y(HGGc$YBI)$fv$4QA`qVf+50?rto_7gF@7gKkeu z@kz>^SGvn}o7KUGC>4u%iS|;S-cR?&oS*9*Iq_Ly^%S&UvYq^c?;XF@y-wU`Ij_nq z+vDm&?HUpiQum~0v`&h7`-Z?ikaeVH;#&SvDhiqOxY!!i-XwFqMdY2IEKYlJ>AcFh z(aet@+090)KKVJ(8xtP))`PZwR3s!MLxIol-&fL5zvwVT4@$*$yizd;l#2Xf*p^Ri zv?otS7eroH5n2xNm(obR1d9-_R8-L2IGAt-BQ&h)%w;3VY|%d~JG^YG*-VA6eb6(A z*n#}tudw?U{2Ukj@g9Y!!6l*@3^30+*BH(Qonf7Z++dNzCjv$?b)>Bltquties5F zCAtA|YZMr3tPmU4Wm30qQ z-u#9XZP&@O;V}lvC2(XbU-JRZO+sYV({xV*)tPGzA)VZueFiC-f2?|;|m!BwW@tKYQ+>-*x6x;KxlOT7>cr=^I zoGvSUl8O~yXaxB=a<;$leUGBu>5|0YckU{p|*bawX1!j^a}sUt?eB+r-qO zDFsX#EJy6;`O)QFSBs5KrtdgdYhcYX3i(v=`&1kWo@l9*Av{P|e)P^V%?%Vb!SZeW z2~i(E-hd)!mmCjw)Pa{8c6yFrFw4+zl#fpeFCxS#vUvFUqr9*^Vi7k<=8rB8Rt8D} zO4~|_jnl0S6Rg(dq3eY5Tu;ygsRqsL=1-~BJ_B2T!)m}sENg9PpZ(esv*n;>m)oww* zeu@=)=G#E|yK0u$8eXbwKJE|Ods`UU+oO_Rh&My#4>uc;i*dUhQ9{C{398kw90g3+ zS$+`y)So<=EogD8qwmL?+fz5bGWK#=m!Aly$ksfQ7^37RM&yR~I;)G% z*7Xv>o_`OD!k_!AJFF5@Qe=_pg5Pp|8O17~vFc6ZGbR+WmtFBLol6oN1rCj&r}o3L zr#c0Xv1guJ?6rs(#R%Q4ZfIgxUS95d_xGMO2EZ zewVgYidL`|w8Vr{0`U*;5KQtALq4P#-ja_rnvFF@!bQBWXh8na~RF`4D6wZU?ZbGGpzR0zP^1S6mY7(LS-f9pH9@tG|*c z$;SX227vTYDDA7Ng^?qs8&E?{xC8#yC<`gG}Ua$*ShG@(kcUwAmErtI`vPPaw| zlNuphTO>{O*rQodXbKTc|nat@Mh6|b!o%BTyc zNn|j2%YNSFONC2n=54{TyqYUF)|RGtn}1ZymONS#_~O!~W>FKur>%+cGBFn#zh^X5 z6{H=7aYx%-{Nj#=p61$ZG}(05Z0>DtOgUo?#p#5Yx+@=p9F_leShWt}&ro>5fH-1y zM98C9P2|%Bw${yV@K+JCAfHEPDSQvkYL3!{BK=M(q4OF-D}uVY4WHPrCRsZ<=nUTBtG;36dLl|gchyG3E9@HIQRYN-tf-aZRDfR7OCiUWwYm;NWu@Lhm)&~?Y*^2w zEXfA8W}AM>pB;<)cwH^L%h4hrC#(so3RiJCpXoU|O`F|1m2&gy8n-Kkt(X%zmUaMAIu9nHLuSY0F}IM7FPq(3t@?(vV;$7WxkoFu}W#w1u!DDS+s zuU{{&%qpUN7)8AU)Uo#EbG3yG;mhAkwPHZa*QK#pvG4b$0nul)LY>u*!9a;Zr;Qu9 zwjA?Vhw=XK!h3U8JDc-A9-p4cx44saA#idBtN~upvt#BKkq<8Uw zRpsoHp;k)OeC05w+8r=gBdGXC&-d%qdF5D&Oqpa_esSj18%32Y(fr?xs)M;7$G-nb z+xwFxTDg93{2bv$=z(pLq+n#lg9y6Dt`?-|+$p;~FT4uEFr+%P*92F-_q)rBJsJ%? zG~v5YI;i-;(ZuU*!_rtr@8;%m|7>3OX4AOGWVh|G27~ZMxwqDMOUlQ`f$sWC z-Ako)pL5@^7u+hCk47=)Z-%J$ERLsb`ILs++&G=RCDiGeEEZps@HzP&^e$T)3Rbnd z*h6Vtcr(m#NRP8(B0v@W{#Ro3tT1o4Vbh!&eHVJdfVVal=WY~2?Rv;0Pw!c?LAGhb z^CJKKdkN^FOVrWqQPctyvT#p{h$vd04SmgmtCW0EyUzG#Q&->&Bz>6V1%FGHHcRI2 z;hosRKN^+7wGH|ku9z@=+kR<{jK%Q??k5JZ>kBCFAbBoS{>YP@<-RvnmLDw&Dbr8; zsG_kCCfEAut2!y=$ve_BldzL^Ea^^(8g`@S2R}UZA`kUi*=R?n#mrUda(5;QZBBa# z2iHFVL8cdZ2eZ|MoOMNzIiite6wq|E6v*5VZ%U! zA^`~wNCHqA=xnRq(>G z^ODCiuQ@Hh_$yc*s!>7(0ZL`(4=qe92P8E%U( z8#k1z-!{2F&*F^W0n4U%#epxeVX290nF@py^|eb?pbm1g~vzZf1uG z?%8~I8hW3sg2E7O_C!kJ&82z@l;2+ZYz@R`Lwa>~pgpPbM}MA7a1>xDTrLzCwC~0~ zKy><32W!c0k?YcpF6=fpGaGn*!N{(2*SD^g@Ys{^7k=!k8@7N(5vd?jHh1$L zZHV>Q{KVf_l)&jE++LbgJ5FC{{BN{^5CKfSL~sq%$^*|yA9CuaS>jpQLwn$koK?U02hYPK>%;2hzW+9eQ>jQTM8}IpML^Y;H z;k}m#jW~eE=!~EOgiMfOXEtMyhm$*Za)S=tnOMfb@x5@K^iJe(ZeBB+BYL8&A8` z)In%7w($@|Ix2k7*sMDA)&l*QU8M7x|1W61c;ocuT=<}B_qzKj$NBmp(Y5ok462Gu%wla;RForDVA`MEZ&lNzt**6%xO*4=yP|^iyuv%BsJ;m zL`k1)=Y!3lxG=A4J5sxLG)7~kBCz_vel9NirB3Sv%#l<4KR7u|8uAi_W(MAw6|W3q zT%^7G1-9%Z@At&;KEAs3%)251BzkaXA?tJDTmBlGW6iTE-fB;XcpbyLWFPFgkr0~H zVe;veePH7j*_AI2^uflC`KYZ6;~ zReEzJX}F3k3%E)_4VQSK_=DQTk7ahMUVMYUPLnKFuqIW2d#aV#`?cAaj$`2RN$0WaGX0_9{cJgY2&J6H1C;uUsJVQ z3sd%hS?-Q+3O}Ku4IacB;ex0mG={b15I(pCrtPt8%b0p2-_oS5>}CO1eUsz3NFzJ7 z3xd^L!otFazR&|cr~$RMIB}Av+bMEO@~f-TK&beHm7t}3b0niJ*MPYY*L1^#KGg{v zGg*z6C4apWe_*50kjiycSzl7edhd(4+>~6@B6rHiK$CFu%7pIsN8)8IXdOnJ^cZ3z zd$LWR-gJ##Q&BowM#TR_TFhNRQSl^cf+Af`%%{uTQVqVLtF5gW27zC$;Db=+j;2*F zhbaDUY-W!6+fbrw4P?HW_*Px9_$i9ZG0?fH>KttM8+c?&Nu;Xt@2$?Yex0*PZyvx zlPGRQ((RLkhl|&(MqfX>+%&IKjk0L|HffnpO*&a%XE0O~+t-OjuCsX39?2vStHX8J zrd@WE+JJ~#6S$Z|t2WSS9gYm%b49eL?8Fdo(}FVDk?>wQAan?zQEbAy9X^jCNZr3D z4UjrrYWPp9$J&g9YozDFHS*r2UB|zC3j~_D>1zq0=64Dbt zoPmxoBsb3mq(22%R!q&(>(`dLYt3~?>I&zR{=Qi{S>*6k2Z}Rgol)=tP@Mms!WdyB zg#`erhsi-#TuXzsY$ghPx1R#lHq+(f>URM zT-rFLk=dnj0AuJ^ZkMxNFlbn_MOcA7M;T1a^)C}9>f#JPUT+9Ig;ZRoy5O2gisr6# zLM`CJB+9=^wla(g4YoJ2#O{$(p)^M33)us>OT;#=Lm{!DTBpI!$Y0$Q=}abZYBMgs z6KtR+bk{8dfb3u%b9b6{SXdAbM`Dv?-7G2rIaz8}OB zc)lMN=P@zpnEg7gw%ni;x33y!+A)DwH^qg`CET+gcpj$S=2*eYs56IDXq*O;(NNH9 zl5JG-BABQ6F?K6F2eat7_(c-|8xbq4O-4G;czXBgxtv3xCb$Kv5aj_1ywKOeczRrSVc+U<*} zAQzk9w?YUJWSJryuBx5E=cBBCY>*dQ5I~zuVe`Z}ttvgNz24xw{gccqN04V0alIY- zSZG4HNltlLSXcuZXI$o6pDyWV7wb75=uS#_wy7!rFUIA0ha$<9XRJO_Jqio63#o<7 zGs15f_wZ&xL$p~zFRb)FJ86rWC-5vBE=Dl6L2SfMn>+f+da6rKS(!yG&x-p~I}m?0 zy9*ps&4=$olQf=6|G>aXD9RQUe`$5{Co$UnWg+1(pALmJHI?hX2f?bJo$28=X)l}- z{1Uvtr08FU%W92%r%$DL&vry~U&fTsVRJ#IlA3p^rp@0CpF$DQWwA#MsXKh}`3 z3kjK-Xw9g0wiJDgfNW$u21+i&#x{ zu^~!kKkc~der7X$0FNi zG?$@`(3!WYJwr}{S*J$LyEw_Su0yh0Gs#6g%c%b2ZMpmR&z%pmdD240jkSFyG(Ru5 z7CAT19=%%XbXBY@)Z&)}02qeBWF3ZQ!U*ebIuPDc;p)3j$kr!fgtru@yn6DB##Zff z_8MH4UUrjQhSVJ~M~?Z^Yj)^J8s8&1YEiX(GNLtuP}+L=R*?|XeHq3^SU;5Z1DLK? z_iysjk;Kl;UjfzD@W)im^24@U8%tW>Umk*1(U%)Udyb2K-*)#L5JVA^I3R*d@ew&p zaZF+3w!WfJ2vuppm1mBgh_Y!3lufojuu;RKOH3W4o{-VN5}~m3ej}Y?p^OdVpKN4I;4VP&++R^&>7c5E_@u{d$a~tq4M0 zeA=qSpr>hm^I>aR&*HMu6_pTI3~q!6xADT!D`2t#?U@oYpfjqcv vTV@L?8#cz@ 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 z%0D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

lq(o4CVd#~p7S0W7GgW=)Tv$3p)mCV(O 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 RT%{6td_4U<>fF%R{s6nmWB~vG literal 0 HcmV?d00001 diff --git a/Packs/Gem/doc_files/Gem_Handle_ec2.png b/Packs/Gem/doc_files/Gem_Handle_ec2.png new file mode 100644 index 0000000000000000000000000000000000000000..76cff790dd596107d9aeff52557873bcfbbb0347 GIT binary patch literal 227882 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

r<07rKF|vQXS;g3+P`o^~7Do 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 literal 0 HcmV?d00001 diff --git a/Packs/Gem/doc_files/Gem_Validate_triggering_event.png b/Packs/Gem/doc_files/Gem_Validate_triggering_event.png new file mode 100644 index 0000000000000000000000000000000000000000..891fbce632cf530aed064d257190e0b058964e21 GIT binary patch literal 231789 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

8_CWRAMqkA&2@3q z6r>R~Mm;Mw6dX(i=C?+_5Y+b_OuWDz-m_$eCJ`|THeH!P@bKjN9>IXk2pHN&<#g2Q#3tQAFZBd?)aP(@=an8(}7un6Ko6 zlg3@N^Sm`@AjE1xXl~Y7zdCa3=Q~rYSY4!qK+VGP^4slE6rsY%!a`h?wBTY^bn!|Q zWhBe0_J%h3c(DyrFDZ80&s_ywAYtHZXryvogD z_B`KDJ4Tvl0w}-)7Az#pFGb1Pf5_ZJ%NO~lzc-y>UMpDpSO;Rg<#2pu^kMILLf9$N zXY@sTi^(S%VMOhstX>^ z;)YOfM~kF`4`^rrJz@r+nJ@#RZiIpBY%ZHYeqk(JP)iE&V_~VrGV{152A|@V5My4S z6HvW@w{snEOMkZTPe0$bwzZ$Dc=PeS^&=k(zv^cjT@APtG{=W0u_KaOKW&i=xhkvb zmPsWy`t&UupIAt2g6#pinvd93@$ZyV&s(#Hcir7I$eWroTKhz@(|R5ofLR=Qp?YRf za~(x^fjB&(a(NrOf!<=o###|=7S8nnKeVcd!dFW=Zaeqcmcnv(`qqYY_(%>1Lk3CA(w=97|S;KE0;gr32y%hSERcK6oHuHQ+Q)%S;{orT3 zd*YE2YJwYl6zG&uAzjMc;og*lLoV zOucHmoR=m#Qu})o0-`C9A0Q<%#?{QV6FddM25Eb0g9^W^Qh6TP2VIo?_a1e>Z<+0L&x3!}|dWF?CbIHHwzcy+HO< zQRCnk!euydx@sV{d}_75BJ0;OLLl2ytE*hkWLI*gQZTJ9xuE@|5oX3Xl5FO@y}bv$ ztliy>7e{MF$HvAwJ#pep`5cB2ogvq^d^;`}2t-mFsxhl7?lgP{c?aJSVu?4amiIRO z#IG9lteDwGu;h*xK9K2B`FWp)M59qcMOIexkbs3h>Hu^%7D{4$?>-fAkeOMlqBcMO zJPwc797%=7HhlXQrR2M=eF=;`-ropdYIbey2u4Jh1$%0Ymh#Zo`2pJ77a~Ccf7+~# zIn;*pz4@h&_@pYV-G2t(5oc^}$E~^G>m_dK72G#Ce=#+tmlt`xTYl_Ldgi3qUz5pb zg2~TOMGqsh$Smtby6ayWOStTV#%`GjNwlw)@WY2&aXhtuo zsS#sfU??dovp$hO@x3+_h_Jt|tG!?V8GOQ7L@65t-vjP_g|BSa0hvHdf%oUq|07Eu zmGPmsH|}XfMDv#~@UrDGPtRE+Hz3~BsoRt<71p(q28&_R?A--}tl^CmFtq>P;WXIz zqemgTdA2erig&5PPWOS-@{UaJiRKG5-l>--^_nv5nk$nEn@gXfu?H zS18Ak1qN9Fm!M0pnSSU03u%K#rtK*K)MQtB?>eNay|Pli0Cvfl^>M3IxDZQrY*Oq_ zuoqPUc5v0pZs5$$o$3;e0;g&4c^kBYZ%`)3&(HVd(Stddi&uA(PJje{Ds7QUUQYUC zeZE@BX;ofvme~AK^4RY!i`Q9Y(!QHfRdk1JS?oQeDUS!y17_p+{@saAZ#hmgz-Q%s zA5}sb;EDC_*0(gkM5FBVx>4fSbqYoWM=neAdb<#PzHUoCb!XSFn`Ni79&5~6CA2Boqf@M5+rgkKdkEYBV2_IYiJLOF;gxprJ&$d2KvgI zSFfKEZ>R@2#?n#JPM}0NOFg+{DOym_iHAu@h(D^TG55I|f5n#hSobSA;LTf0!`{;w z&JthmjCBe2XIs7uF+#JO@6>=IbJ&zRkaj_%O&dFVh`)# z@N9+7nuMse~RoFk2AF-DLfmvCw&wd zeIP_#@77p;>c-D0VIeCCxFz{B>_4`CY`N-b{YtvDde{si`2^ll&nuX7N-z_{?=UwV zb#p9|Wzy}@lHOm^{2x+io}!C;Gzb>wEOaFDhyhoRNMBwPw485cz&-m0h| zzS#0zO{|GRT4TdgwJaNT{ZBoA*Q7h^1K!ce8#H1YL52nw4xdI|9gp0ugu@dr0?@?1 zA9+s1=M01D>{Yh#o(fMB6BBD+2a#)#SFZ{q0?jTbUoEp~HD3GfHaXXmlRsn4?AcWH zH6&!3@13V-r^}a9W}{9#bE5A2Itsl1i?FKztE$=Bf*@g#igc$mQi6bh0)mLBGzTQ5 zQ=~(s8x%wkB$e(ygwic2ok}SoB^~~=58;99z5ny^@c^DZduGkdig&%UMsz3a44t__ z$})FF0X2>n(f9~kc{E4duh6U>H7(L8X3;{t9pP18!cI?O9M`=~nL8=V34X#)>aSCD z?|ObEzAP$mUwi@OBgBrp?`^U--Zgo=f@Y;s@Vo@mHO@*O4+@W))QmP=X(n z><_AdU-hP#K%L5(((ecU%oAhHnfSdQp+T|(d6i7lv3oW48$u%ALziTOM_WI=akjM) zh~-ZoT+k3^Wjp_{vM3au#K?jD_K(|!AI$dAa%9D(e=NBkq1OYC4?kLHLRrqFy0Od} zJd)mR*Mq6Gv!09UFm~Q_dhuuclQX(&DkbGahg|p{!)2+xog^>d%2YWlJ)~OBw~ja{ z((SQB$k}m9v14YAYDJFb;kg060VS&+Ee=z}lDBJ|&0L#vlmPY!0H#IM`o>0noEsoT3k#=Le|k9Lhl z%;PbKF?|1~6%SM*1<%+%H-mVlJwZESKM8aS5<5x{LiD|j?5vjhDJ4IX{aYqe}#yzb5TCGG?G?th$zn4l>&tX{3eGO7ZL>@wS z8799(OR&r8H_Rz_tTm=q_RRHNE&^DWwOTdn#)r3@?{)oeOxf=2#Ecm69bV162HNhd zyti_|qM3N_u6oMaQOU`yz2z>-8eoF1NoYHmNdWm|FEpqp?@)|xZ8@Z7G08ey&w%i4 zPW0CAA;!^PmO64*T6>oc6VI4*1i-q=c{?0vpD`J#%2R}+L7FmoAQD1UC$Bxb)6IyZ z_gIIzQYd}ky4jQEz}_JJZoXVDh_8ZbfXC#D^L=}KaH-|X5%qTtSi}C*&---OQ>adt z-kmBiyaodpF+1w>@s$KW$^IRMy7-Z`Ez=RnqVwQJAxZZHh1hd+<@*M-8U^5D*TkGh z4mn~7v$2D<)3CnKywMs~MKu4VYyJ-J^3xIF(z^@wgGb&1VjQW!Hs5XwRz65;Bb=3L z5$u3F98GazL0UO6f$mO0BEGOBoAET{MWH*%yBQH?9_6$y=!L|tH1GfPFYJsgU)Tc z3+tDVUWWt+vIO)>p!cJ2lMX&{_aLkg0}O?re!?QU|``k7 z4>WCUSsw8Epws!|Yl2)WyR4p#&`;RQR}s=Cy02`DzTWZ|@4l!X)M7ZkS8vV=BtjaE zQEUX78sf$m0zq(OpK!??@cQo&p?#a6SG7|g&ECM1Vu`fSY2^EF@4jSX@0_+%5$a$B zy$~e#wE?e}k@K{{fu;s|Qe@XA_06qrD)rECU(09cs3a@^?4t#J#Hj%0YL^b-Gr*aP!E3h3vU0MPEpO|s#Jkrh-qZ$OS(jWB6LGl1Gsd7d^ zt83~p>&G_IX%HOQj!9IXLGD&H3NUTg#!$xQk$a&12lQaRN^s#YF^3pmKRwu=<@L`q zj|gR;D;_Q-mPgrgr*1BE~hWKdA>9lIZxn;JAgkd|?nz(9<|S_XLY?17gC_xWN7 zeGA-JJYZTb-8%5e5B?~~3ZD1I2)=U&=|Wn{qXGzaAeuD$;B4r=*4Tlb7u9WwMINlX z6c8aryvnh1`O8Y+{UaCHgpTP1c_2X~>=^MPanR-iCfYXFzd;3vUg#G$hrxolAT{`e zm%7wGq2>*u<_==c5Z@FqL0j05UiO26*ngGkXEc%W>ol_Iq@9&-(ySdeAG|-piw_o4 z$O3q7+2uvQDDrdCxEnv}LtgaqC+=RHOkUn9jeVj2<8QOjPs^%cL?XfL+s8&!gu39m zCs|bdG+_nRL&srSCvM*Q5W+u@?iEX8_xIVpFoI0)Yn({nG-009P9xIXYmX5002LkKRZbRB<-eCLfBW@G) zTo>D~1L6p_|!|+1SrtW;#1La42*RS(b_6t@TFK)nRm_H4OPeciucvu=ieZj{w zgLJYQl?DlDv;+}RD0ZAhr(siceD0o1!HMnXn6gvQNV!S-FEb$fXhPrlk?f`3qCzU$ ztG$g)l?Is|nKxkAv>YrLgfT-wUbUN$?eI;t{6)<%QTGq+b>9b4HQxz& z4F?~N`4?zN`gC?8V1&62meCBL2W+%QFs>~E2W>R-jyiTdF{WOAb>r8tA-8Mf!?j}X zRQ&vESuT-_er45U(uX~hYLIVkaZVAmHVqF2Ok zR6@KZ@*}!@D-C{{PQfHEVM2%64>l9f*pbi%wpQt9M&7`j=smRR%bUaZR7d;#?7Dkj zOnk!Hg-Iwc1UBt-tvC_9ihR{r7yed}f|W}dIzWls;8UnUbLoC+~nY7o1cFqPEX8Fz9mm)Tr>b<_}(F6Y?2o7WtR;GYvx84 zu)CN%fOwmIAL-B{o7-yt>WLx0A;$tI-;$IvY(ck-;TBnfh*D=K$p~fsj6L0oJ0J&O zQV1%n9(D)%>EEJ?sNPXj$r>TeAJG4ZUus(^<>&90AtFj3B-Amn%Msh$(*urAoMpV0 zRLP+CA1yuvBFhRQ8$3jm5uJ~y2H=5)8>e|;cWpG$1(_VWcdMIb85X8Z-n|%wk*Pdk zU!!E83PyiB=b>>4*x#1Kh9cxJ%Dq-gNj?^314HRYNuM%F|ngPu>c4v1Fcq zs784nd0mT9MWTTWT2XN^J-)BxI>+U6x2Zw~ikE;XaJ_Kpe;cG}s%37zeAcHJDFuNJ zKOemRs`SdlB`vght^cBL5GAo47A|GNIb(QrOV98^ z@->PpCU~2_dvexXGYjbzwTN*=D2-TSNm7HPcA|4CTPZA-M$FCXpD$UqNY6Qg0qd-c z@j-Z(`YoMl;4b3>FZ!o=>sj;!x>TlGF@;ld_?Q3}^ZfH|-;5!Eu`@vRv*UFdfX^qO ze@YH*aUdqs3X!VmsDc~(no730j?cou8;#ZRvu|{9E5+GXS6cn4%^hE|d9!b4ZQuAg z(UOnjZL?M`oX69{PURbkep7 zOzLaf%Etz@n{aG2`+Fy4TrJK1vQ===;jyWyc?(8wtg-A`QEyY|uUnZN7POj!hLs$% zvauLnntl?C?)*)i{sYk5k8}`Th251SzVtsWIDNNZ{U?{7q||*@e4{H#Ct_^{uusldsUDWbL+I$FyJI6?jELW=4QM_JZR~|z zW4&3wazi-wI>F}0R}D1v`I|pXQ$q>7-?T9tl2G?;1)!b)r7#fxs0MitRTGw6=cFg# zX)(BuT2CyoaM|#Je$BY%xLktScmT~xXU_w+_uJ~NC)-kj+G>9EDDgyFn~%j)rj*)J z&;p&#R~QZ1Fhx@=kgn7DU0!G4rer(+%6d&Yx_{!>rR2Dc*MQDb<)_`T@hl}2WYx|*JF%Zy=To)aR2axJDL=ZlWP6RaK` z3qj4Fmdm=cGBBG>49ha@_~f0fO;nV6X?jw+A4awSQ>YY;bzCo~LqSiAbPhSPZq>%p zsJu?ol1{2ro|2{k6M04I8PV}8pt-Br{84&Yo*YbYSbrW-b>_%GyNmHb>e%a^Ht8{G z;cskA>Rc=TVb_l^qm z>tZcuemGLUCcLUKdNK5Mbz27dQp#=v-QH$A-Br7aLBO4#V{B%vs_N@J>70Giml1$c zPZ+5kPRH~o{bEh}U40vqLE~aRrKYHwOeG;AM)T{jFPr)=ntYL!MP2UklsGA_v3H!bws?2M|maORAu74kysma979+qAC)#9XqxF8OY z#2X)0Vv$Bjg?mxqCiO!yKNs7=p5~>Il)kK(xJpq0TH0{`0oM-zN4|8zZTNR96)`bo z85(nm#TCFR^Vi!=w*5~0rV6yx=QSx!b9qg>pub5LXbS%s<)Wwt1GA)c&KQ4J^L$tD zz3kOV_3@@Y__=^qqw>}IvlYOv>fCyaq^fG4SZn& z(50GIC7&0=rHOB!Gm4zD-_C|MFDqsSA8>pQS7l(yER6 zO0;$LD<-Z^I_cUP%lx|jw#RPe)fY`gP1TguPNby-78N)B-(aka?W48=s>j!?R|qr+ zLSg;~8q~nXakga^axv#U-*2fWRivuT@{pR(f~!ilV$5bq<5VMrPTwDxiu-91_NMvW zqJymN($~hKrNGh0MZt0Jm!hP5K%hXcD)N0AFca|OeD%!03&SR9T`3%z{=hd_a6M}t zMMb-~GQT*0siKy;feqZmItPr+M4hVp`1A3ae?&UrtQ`6NCd+lZR`WLvgNtNjU6Ol< z2BnKC`zGP?hT~f)Q_7Q5HCSduWu&sn<%v-p>W~2{?-y~6tw+E@AwuRV5oeQcDKtWZOK@Qbt)gd~ z;s$?yt-81z;|qz!>bB}$oMJsaS_PTkT8pK#rE?!+O=TnqakusQ*24h47I$tN24p!G z{%EwE(jm7zU;uLUl{L+)?r~LY=elrNOgnME9h_cYc7pNoy&Zf%61=*!QYZVXRUZt2 zD}QV<3be){$Q20*y7gJ4A!rRgQLB-HyYf9^=`Um*WDiA5_cKj0;3akk_lb*fpRrk|jc)Aa4_Q2F|OwR5;$Tqg7vH zmbOYMQkj6`AUuefk!jJ~!0%NcDCIn}E9feCd~Q=Bx3FJ10F=Z4S__wS;;TWOE=!aHvj29ug|n zQB$OzMJU6l;I%1Z!R}riK8Isj0<<+ckjA=e3g17Ff8b2Zd8h|7>Ra2@nUX|?pKVkp zx}a*tph&dwt^0jmX`xx>hr-<3?PTVK1Beosf2YwEM6sJEt|HDs%M!gD8Rf~Ft_f43 zv4~j!PXVu`X7+hrWv+f^PHL8TJEckSe>4SF!{$-NI<3!U<%hKZ_J<3a9U%?hOwQ@f z!bG23%^y~Z_Wga<+1W;==M$bu-70{^EE8%@It2C?0axSU@mmqA@i*q$Kd@$IsLz9? z>M&^=*=;~$gBocO+_*gBwR(p4;pFmis(gCe(TNd+2Q_vRBkVq7`KfQ3+1aWNsXR*5!4#H{HMfJTM;mlWHi+@3DRig(QOvOU?6! z6eKI26NkE><-`)&W;V;FPQo%d7s{93R=an0$oVSueVgW0Y(Vw87AZ9TE zwIlX=IHd+Lu0zpTV54XmFYqqdaXuMC1zClbA78tE*%A6W&nLSwvv4!mBW*u01AJih zn=1T39y&@W+jv0ydH|2N4(0XvC)Ne!Tt)srS@G-zgs(`9pB?Cdo5jdH(22QM`5AYelb&6(O#l9G_p6Jpo>%3d&ndh_|e_olUF0Jsj$y3%Ls@y0XaVdHc0dN|8r zHs568``*C3cWZ+a8fRq;%}?Gd z#)4pO{^69w%1!Ij!-S-IXez zn#uCiC36@xfI~EUpBHfuI3Fk09>(ULuc7=9qrf4539%!niqWScK3UI?ye=Xz3@W&7 zBJrw6inbVyVOnXTCsD>MQA@a!`aEx{i_<-I>SJ(2BjmaX3YwZ8ki8J9^e4gVSglv2 zIE)1sV?}$|?>xDvMj1Fn_*zvZd={s^Fi`Yq!5xs1Ej(^O6;vQAWdiS4M~YjndieHV zEZtQRt(kac9N3JTNO63~KlDkMJhI@dbTX`%<0_X^(+z|v4dSqP5>6ds>I3hKe-@m3g8 zVulLG%RtXw=U%w|bg~E*A(4s8Rcr}uCqt=`ie<^c{$E9Ef<0f7jyv6eumbdT+;}tW z;N%h%X1v21a=FH)dtX*b>)yRk=lMz3^ft+F*gIqSC=P3LQRtsLfv&{iRW~~p3sQ+f zDDrek9-z1&Y!viO1+|#+ZgcINUpG55b3`%6Z(z!C?H6VU`UeJbsRl^WCjhv4!njSu zK@uXpzlQ7;$d1+5U`54h6+#%_X7kw!DCU#%z^T0aGO#hC|K-%yZNaAnZ71~pCX~Oc zst>O~vTW7(C3bEaQ^{IB09ryWu>QCli=BbgSlJe8!{-YxE`MLLJK3pVs8htU zYshfD>{v4ZwKZVH0}n6iFV94=Ll4QL#*L7KzA8L#VrTZG6mFaMa}L>2s5xG~ethmd@%RwIA}2>gI0p6NpW#?jApCIs@`jMJ@men{(RQ}c zb$(mlktzCi+-d!1LBJh0RSVSz59qXVCIMZ^B9OlQdYo6m1>C zA)?fJbXE}>X=XHRXOrLGvjL~-pTvd32o;C|prL&q^^OsdF5IGm=js!BpDE;5_M`@h zKM%1K^w^-bmhn)*d9x$kdCV=!QwMmXT`-P1k`-`g$RP=8WaRfQtlZBJqyuF}6@IAC zo&0;-?PT?tKAcc-bHJXwtkA8AIHuxQGtCO)|3_Cut76X@foP(0F{5XFKR$;Z3JF9t znT=jv3Zyps0&un47EW(ZNb3S%Ky-fGTKRRXSEmzgmi265v)j%76^cq~3DD|_Mh7gi ziRUKI2N>3#^vJpyK0nzMpk{Y|>|bd=))Y=)zL!@3prKP*Xw8L(iCLKveZib~QQfl^ z1Yh4IFjIF5$oB~%F(f!{)}KR!l||j^OMfjW71cpBk|ha2>@$%GG`i0)Pz6~Q!MzLs zW=9D%EEoEG6ulhYO^WCZ21qgg5bJX|sEmn_n;rT=tkjLi*?!rvLBPfb19g*TG0Tdf zv&iaJ=;mXKw21q=Y$x)k0;eE!*1cUF$>Gq(K8WB9?mtULaagHC0I|zA$97Hb(&v?$ z&C7#qbIkQFgX5U0$1ddHRgJ)rv+5DmL^$>Oc8}VO0Z+A=blM3D1}CDcy?ed&Ty(z- zWY(8qJA6|qKY<#r-38L$Q(ciqlD-OR+$edt=OhTu4-j^!sq|{bVlVwCY&!EWL~uNp zb3Ev;-opfVmYIcxEZy=B(WW*hlZO~pa;6>x^5Onht0D(uAEgKd;L_Pj1O(r0RQQ(R za&T*acQ~jVHJ-b^bQs>(cE7p-!h2(M#d_U^@%S^SqB|L zIyw}asGEC@ak7#H{lKz3My8g?SirJGUUUDd%F`$2CtlYQTo~WG5+LQ+@SFp#dhhqu zP~V+l;C5V@73$drlYM#p+f3nrD+70~i*xJ}59(H40ETGxZ%H}}0L6w0Q*UX2FbnC| zA@NpZ>i8F&Yoct+QhWah#3+`-D&ZQHLe%Q&@#VOKRmM$T#$4x14Tz8E}_F{ajt$&E@XMt&+FFHblfYblAeg(UBgZf@bxk9KUZntMgPGweus64rB?29 zOx`1mx1mS8FS>)k)pWMSziJ(r+C!;Sk3ej_;UHxsZG@C_SOPhRZjf{61mk|{5t>S0 z`o~sHees`Zhkudj#0XSWV38nCXY6vAO@I*I5%hY)h{^Wqmut`b8HJLw$}~<4a1TNt z`Nxmjx&!<_b72mc^HhX6cXxO5NZou`x@jry^zCfJU~+De_{pXq1ad_O%=A%|a1~|G zKGW*6800oQ;yLCvU~2&D?}6by{Ff%!SAHt8YM`7vTe3R)RHW7KEA@wUyC6Bz0Yme0 z$h-7Vpx{q^*a7lvO%(t*hbzlJm3g8cg|Kv8j5+W!YJf*Rz9MY(LG_yYN$h+KaF`p1 zedzyo6!$aQLDr~eeE^{5tQ-haF1CfP)XP5^PAW0r7rb`$_FeUpW;qO4_}jl~G>`}F z!Kk~!&B^_KwPHy;`z3}f0=W+nJOs|y&KzdFpvnIGpdr{t?R>3Bai180{Z-*B&&SWI zjRHtn#z;mCA@V4qzM+8#N|;Mp#XaCCko`1=94@4_=3W8Lj5!fGA~|WF4>w=WI@rR= zB_+~`rnVV#@>k@beZS_lzgJ~W%&ISNtnlyrIM%BZkU1t*2svt+bdulAsl@#>|2wQ?<&YXb=iPR0 zS<&91bk$yw!B9El>W7x5)RtxkhmgomE&h=j0&Eg6#g-N)<+w(`l&KpWP@y-xP^@NF z1?-0LxCh{#1pODJi{cgJ?pq45+T`bV^738fyUj#s4J-E+1OXxrSMDV!7Q=q-jRh3A zaBZy`L_EH7j)I|4_R-|z$HjzJ)(o{KrYl!MvmspGoM0k3XZh1KZ85EQT%7Ot`0`t; z{(+I};U7}76ah&8WwcNC3c+B*v{CQ|pFbDHj&Px`=YJb;fJP%AG)8;ylv_VKwdwvS zDB_P{eI(@%S4BWBJf0bAZrKQH{NC(UNN_R!9o)5O(AX)eF?o0LtTyb{11+zmw)Qx; z)A#XwP3JH9&X|Z>18-i$o7b2GA=TZqgWq1AI0K#Wz|8aOO4W z!uXm1JsTV^^SS?3;3nHoJPLm310~XQW*{>bc9qJC2RdEuFWJQarcLHFKL3~2mcRy{ zyu7uYu4d!V{e*z>P}i?JHZI08?45JJE>@wrl2t+ZN)SE;qKsdL4PW;%No$^*y#KZd z7R$+D2N>^I!dc`SRy$>0bOtCu^g7?iu7M8un@HiB(9&^YM^cce5`2Mk^l|4h1l$?d*6*!-89QY^9JB6Mg zPT{h)e?>ZC&Ewnu8MyCjYOX#X;dNWkNza16xLD~E$cd1ZRJTbHaPt-$n@QzdrLw5B zZ#)LKh{c1P7t7aB!>Yggm(}B`s2k1Tppa5|W~!R}da(+GWC0x297nFH7Gx0!{*^@# zqlQ|ly=NHrwiHa|5GX4CkwWkg2WOHV zJf>~m`)dpvy{xk1aRQt!)QN0en@z6Dr$#spjS?Onoq`VB*RtpPl>?mcUlFe}d`C)M zictfoi6yDiK9kcva}*>}VoTBpbBKC-c-K6JcPMwY2T6?@^phRwDG_A*A^Yq}%Xz?nBX>Pyz#&JYjSv}rQy^`Q;K-2xA#z0y z3qOV2W0xcB9K_YwceSm}Z<=3!^VM#rj)1&NfuQS{Q3$bshG!<(PkA&vlsnpwb#72x z__^X)fgKV1h7HtQ(<;U|Ni{&-x-_&>5pK!hb5wD_&`*AOoX7Fk6u+r< z8Q-I!t#`SlLrE0Cb9zRQhbjWP9E1}M&~dC+M_wCP*ZQ1|(`}KgS_iq;bXK9y)Y_NpbrO131CdL4AV#aLBz2zv7^(F&vV*`6Mcc`CMv+ z@j*oJl+#>3Yc6}h)Ri)rR2b(@ePo;)6q6+^1CTO>jFdfg2NO9b{>v`&P5J0GDDKLruLQR|2;Bsy3&0`yI z)=V?TIY|pC;E5Q^{kYo`I=|hrX0^l6VzDE<92N_g^Lt#R8x8R&Wl`eS@4M9hGA){gyDm?&zOL`-*?*?I!b1i^5SrSsuhh@5k9)YTF zD!zLs96|@V4$;Bj=b|D|>VHU4C51>yzqKSrV<#~=Ua?GlHmSX&AZ8R}+-Y%~RLCFz zV;m16W6Dh>C&ATHE`8$WeIIuxsVKFkWKJX8s=xHixYoOpMk^kkQWruwvVL+yPKq7p zeP2WzW~%e8?3hGaYR_YFk|j_--5abC^OVNh519i38MCz%0fz%Gr8P&>Iyq{oG0Y`1jm zpYw`zw_L@hFhzOVd z55zS|N`8*aeKNvTFhnymUy$?{iB_-A=c+IwbdMEXXw0~GSxrr5M>k`$=VE-<4`PX# zsU^g1r@Oe9x!Pf5u^J(Tiz(xS50xWi?rSE$B=JlP6U$v9+gR>@O!_7HmX=i*PY{`M z>$yW60jzTuAWAUZ3CV!Y`!*(t)ox7fG=t-37N67ILfbN@J3=|)0xQkNancYk6373* zQ<X*H1=g`Djk-E>?tX5CDf?2NVCj4K5_$~ftVdP;(?yTT*^JYE}#;_)fZc5hKVMY9Xw z*ls1MOCTO!ehpH^dyGNoQ$Jf@jbkc0cO`t`4GROXr-0agkIE58=HU+CFVfUs^u!fz zNu5exNb8e7M+RPbMCbIC)bPdAtKHJ-x)1Z}ULzp!kVn9n5uY(wg_Li2b>DC60#3cB zZH}uAoh0MY4`&|i04FY$zmhk5?{V{AgMje#PI;ITDby|A9G|)De}%NZDu?y*x^cdc ze_qc9JRSQcd0TgXrK~A*wGZ-vjz$BNCxKfS5&KM`_-jyAu|9s#;P$OHQm}{Ov1^IE2Lhul(!MKLS>1~d%Na$;1?ig#>I}ur zUP}4KXI7hnD|q{!@*(+|7^?Du@<0iy^70xrZkYHL{dj@Hiq)27`iJfFh$Z#cZbLt5 zYS)$w4FOu5lA-_7=4Qr{;2VU9#SDN^)~|n62sw||vr9>G^+UER(oYkATj$>iL-Gy5 zi+~&w-OD&SK^DNoHF!yI>%)@6K`UDT`A8mp$qTiz{8&%vOv5Es->o+x8UmeH(`WpLtTBez|@Vb|Nc_ zaH#2sN)C>Vc(TXNy#&kt;8UP3389Z7zutMo3|g*qCdsvBs<<2^P);Dp2yum-&B(Yp z@kPC+N1W|^{jN_CxO@BT3oOuOs`E&hP>aJ%DAr*nl%8mr`+5~{B;{429W#n$%G6CV ziv(|gvS9y<;Ihx8lmk{KGUjy)WC#tY_Z(~;0ZlflsH}tBEZpmj^`3~4??&91{kZ)~ zILR_N3I~qP9UPi&Q;^V2d?8LP>Tp{nV)a`jt{)vaFqL$^QlB!OH@9><>2iZTV}3Vp z`vUpbHF_~Y=s>i^h0dIL=vW-zve z@Q!g%v!!GS90QnEO1#0$aV5039aJ&=&RTRH$`coTwEO{lqdIDmqG2G1zB4uPAUr4X ze%xmVxUM>+=e*^C9LN$L4MHbS%s4COhDJt0?*=&GWm=ftbRr3K+M!s;@|U+c8=z;s zwjwYhFaoh$Wnuds;2Kvv;{G*lr|BrT+kEN=EsgF2rZ?)bA^?az&x|ch68q}olIIV# zuS8s<&bi8{b!%FUa!Z-^f{=+rs#VtbvU=|O8)qxGA+_BrhGj`*39ZLMUc^oXRU`;h zV1pqo#kVqu;)Dhm+E!m3(BzLHo>#$vkm4w>${oJ@`^lP=w)ZD@J!p%l#7LvZWu~R2 z?CE}#>!d}TjX1{U0~9X}CKv-a11?g@MF%o(oxJ-bnt`hsua2Dv-`64dmt!?vVm#-$ z7ogyfs&TFN^f^eii1|UA6>VY?{9L`(9t3xq^hIC#v}9+Lk$ECjgJ?#~7?tO&iS_Qs zU&+Ix4ynQ0xXHJg)1kOEUQ7}b+Ra2BovF!5vZm%{P@>r+YA@>yRs>px-Oh_^7i0g! zzF_`9Z4z;l3g{R)%@tRHLmF2h8}7WOWHPl<{7d#M&{{qKGCip3=tH2QHXPDnzA$o* z$Gj+es^xuoQc7NHuZha#ef5UWanLspaon+$r_=%5+u&SzKjg$k-+FEas;^{REZGHc zoPo09KqW{S3%Zo>CO=s`yjBkMe!q!jRVwnhD)qpQQNxX$w;f!MMu95210>aj)?^HR ztU`|n%=ck`Z-1%t3OLl$9drHV=#57U2xa#7n^a>^_V2IGK_RXV8@QYfi)+9n(DkaH5dP>3Cjt%kEswkI~>9b=E?&zX_<|ovf=?1 z^&@^r=0^ht-pwU2;^r5KGAfH;#Ek^|7aw$>uOXh1bo|?~{ht;YtEVm8V64#l=Wc?8 z9_*|Ac~nfojA~eAU2VSvIw_GI8S*PYjgVke=e-eHG7gB!>?*^EDgJ_Q|{g(a&%6s!%!>JCT%K7A)1pvvJ#5pi2+3si=9 z12ACV9A4=_a0b<_>K25^&IHIHjT|I0TGGjotxV`C`J_XgaR_9Ef!{@4xuCLV{N z|5eN5u+)d(20UqbQ>ec$%^_gnW3a{CWkB+jf)2_Z7PQhwE@;KEy%IU6E@wUp({avs zbJo1jnUqhgRnLzISHVFHBHyGt(9r)C&F=qmo9zVstBz3_{`S{VLG%7DI6VzZP+)pk zYeRJ3EI>!i{m&;ImGO*AcgWqo6h7E5VO(YN#7(!Mwc{#?7Ek{(r+WOnK4dZh-$}k~ zS!aE-9K^=$6h^Yn_bIRc91vMyQ>AP`=CsN&EJKGB%rW=RzjdI`Rn|?|t>N08T%J^8 zcftDHgR4NynME3~ZT#_DpcN^DCQ>2DdgYt6t#6uw0_^(WTRkHKBqq!LDzAp2ZR}JK z@xma>A^K&^&6fXWyCX5C!|qqBFm9r6wnfi|kCj85N@$8ra6x5}zD@?b>zTV$)SnW5=hA z@}8k==I^53`?4PT8C^hF9F9B>NIWl# zImjZmK+*h_Q;}~r1~yRG$$wTnC&c^t%UXBQDOun6E?XOVJn;+3ze><%jc84K6YP1zLHPI#*&a0a@6wFVJ zf=_kwO9=Pfu9-JXn_Su*?fctP=n3|eD5j!VA@2UCGzOG22Y)>!r&gZA{H48{;AGC+ z7Gi^^*PH-8d*W+O)_twmW!sCF76so2I{WcGy{cagyp9r$Q&4kl{!*#qsurbSf|J0L znFn3(rp^=kCiq7sho8aBLTc1<{Ia4_ax~V}sUf1%N%^8u@5S0p#L_I%+;d8~t=|Ui3b9 z9GjbqYpQCl3is%%VlecR;`R7}_imT`dJ$_BBrtJ^Zu-C)9)u=cy@ZClZvT_NYA}!d zyveI^N6Df&VkN(mVwI*+K`p3yPG7$R^)N&jEFyXw!x2x=fESv`X4U9q^|x@oj3{Z3 zA=Ttg@<~%w{(m&$j`oaNY+LBETB|HH%qA(24PMTjdJDQ_DyiM!p_`{O&qvzLWb|-m zSnZbI#m3OzXu&7u1^U%p0`v2powQW$8_A~d4{)c1_0sp7=q#FLwqXo+-sHT? z6<$7TaLNj93752nv;HwppWEHG=e)__G?K8HFS|R~tX9V1M!DmnLc;V%|GWJ+@ZZuM z_bQw{5$E8bBtrq104yvBdlZmd1z^YjGA9BP*|ziF+3dg?J)iS2O57pu_FLmR&kmvI z3+Kv%MSFtX?mj2(UJ`&k!}kH#jxb6EliicEnQEpd<}oetID!S78APlvhY}Q`=+mt!Rdjq74Ivm6*6mAwUFV7AMG7d5h5e)B0 z0_cbT|1a^uM2!8TPgtfR#nD%m9o|Qdx>rf;xV+fgKBc@&E9zFo(P7hhnWKovXK#01 z>+S`SDyh@B=v;9nr(?C<7I8GHZ|F3K#Eeh&zIAJPO1l2~m-*=MAj_rj=&TOPoM%l< z9NPMDJ?-6%_3DRt|1cNO;~metK#1qfnPXBi7{>j7iik6%zez4>Zr@r&hH$cuH`*$B>Ws@ zu%&9f()H{}kW)~kTokuMi^1k=Lx)hyF|6BEx7mrV+`ZShQqG~%^iWi59mh6iHBnag z9hZ(s#}aZiS<#_fGa>^oiXS|fHp?pZe5FA;hRS0$2@ zb&z$)6L%=hG%d9*nd-;<5MJVj6;xyn`Y)WzO_K6h&7AVS(%5m0|84k=&iX=r_}qfH zLl)260=I^u#2-#J^UdwR;ZY8+Q``L3yU`*pj>T0RBXbL4qUDc&ODUkPuWOv6l#|NG^6gEG}@Ww+hM1$1pM7&17_Hav)5O9 zRM~XQz^B1hc}6|f*0W~E`kFf`68c>j>+{|k-KPbx7nY>O2KyY(o^jN&xbNq0hDLK8 zudc^tbcg)i@Aa3@>bIdbBddSf5KZpBA|>l~H&|B+V}`z6PmZc0q?)FpEDFH&**TDspZwTkb*(*|`Q zC}r1dB}ivgn(7u%KS7~EdOXl;=GU`f#DfwsKB)3sG^~seNTA)$zMJ6RS*sVsE zusdJEuIITw^U$AfRb#C^1>$`jGlRwQf?7`T?pu+}7u4RX{OJg#x<6q-G^ePU!0krX zKfCB*|;eFgEM2&~70(QC!}dacrk;UOj&k5(HDq7IEl?sg~@<|E4Q zxWZoYae}lC){}}jj9u?#-;Wq~TV&tL;8(%@Yb|S;QCcg0$IRwYpZiuvM)q7RNdyZk z>4 z@zO(7yDa8ull;i{z;j$yh7FL7iF71pdN z|7&J|g)e!Wu~}lc0Ha6KEU~-+ZlPRYz&GNc!MrI===c-N)?IUcfsnxG zH>sTCJT)6`eERK3mRHNy>q(G?L5AB`sq1Y#nR@>{-E(T(Z>K#lXYp>(ffuOJ`JJXS zrGX}~mJr3vNmq7TD5WeS@W?N-yo@3QydM_a8@yi#z#VmuOY;po(%6&5CUQdCW`Gvi ze~mzdd+a+3QCAIaajNFm_k1OPQsEL)VoL_it0~1m-6cd}!|mLgazC1KDvy`++EUwt z6sV!p7c{SmOb77#gaAl(PHb}cXtut4L(N`y{7R3je^oNU_Gee=r`AX3X&iCuI$mqb zg3syri{X3ttUWb-!l^ECxPr$nquLcznbG2Ea$b@VaodB>$bqg9f5~7vT&?akSU<34 zLTROj&}b?y;0gP*&f*HfOEW|ek{|~~De>kPN=VO`avnW#9<#3#v2ILozS)GLhMxCg zN=NJ#XrJL)p#4T$UHn#q+ClC7`8N092XJxL)c#t z*`mHC_?S*&!)`w(7UQ9C+KNF<=B@$``8B#IZhgfO2?Gzz)oQZyPsB9E-~RczC1otq zwEQVLIGl3xCl_vOMAhi$IjuH<A|`Hq6qPneS3K6Bzq0R?z0w1#;mJ45{EUvWN$NuJ4SY z@e-!Ny$%<8wGkSq$4`wpZwGEh5PUN8a`q-!hn;rpOI{PDCjHhba4A?K?CVl1!OXfC zDjq{yL*Uj8s^(WhPa9W6HLIlC7*%2RD^|eGxqjwZ|MGe?*JTZvr1hepC4s$1x8c>hq-=rxHE`KXP(s zb0zH~W`6{~1#FV|C7U|m#gR5rEPJAlEtn&>Fwx%=WU)O=d#Uks_{o;S=RqJ7iB>_L zq?g?uxT%{Jm6R>x_MN&Pn^Y_SGBbf2P2F5EDw(53Hs<-&Z)^;Tzr0gTGwJB4ENrZ}2ZY+Wyj1OsI=n z{RKwhYFbRdomWheBW8Z^K|w*^zU3Uw-27m1OPt$Ys=S10no4d$^*G~eNe`yOn4%rJ zH^RZCp5!PPdvVKs?djqWcu7Zq^3hmA-04x>{_GZ;_T}7|yeUuujP+T`1nCsFy-g`T zi;)cRHJv*NEDzH#;jS4B*pf;zT$E6^1)#$GhHIoI`>qJ21IR##_i?GKlo{6uf9Oax zhKQkIX=lD$o$XD>$CLl%MQZM&{qxt&w<0cTSoiwG>C#{oWlm>AM*(}*qvk$hKc5Cc zRh<}P9@fzwcZEDV|Aqw_a7o+JBHf|fPGO97pr5_;68j>H3X2D7D7{>(B&0EeKn&QJtJ&apBq$Xs;8&s2 ziK_nX)BX;@#RlZcjT=D}*ICf92^D5hJr!>;^~PL#avQp%Q#nf`)Oxa6rZeH@=}QtG zOjI-m2z4(7Ql}F?e(6pgO)M%1@ySmqxPKw^K|S@|=tv{tV|rDC3)b|&4TfRN_Zd=E z^HY*!!Wmw-)U;zqI*3w9`Ofmkr#4Ns{_k95VD=c#!M4h3-mu;|bp!(SXKD|a+FUSFk4`3|^& z?e^toVlNf3xL#LnPLV!wvd7bJkLfpj2;?eRLx7lT0%)!!`Sb9O=9&WSv76H=tfedH z3Ai7Zxc>@gk#2D^QVV-TC+%LM*Fb!~o-5nNmr znWx{f#rg&{^zK#R8_+Cs-2frBoGmRW;x~lEZU8q7BLuffkqR4+i~|WP;PI&Xv!~8y z+D8R$U5r#WFRgQKo~?vQ-;a9%E<#)F#US*fVwnf`>`tbG#ak)dw6?J{o@YLMO(ssH z;%kBWN?sO140C3MyW+|!}k6!whDeU(`0&nSOb zy^2`5+aK2(8ci7o!qC2p8qH@GR<*Y!>o8kw(x7$C@%INYs^thO{8uawn+KVf;O$y4 z!W@G(5#8x-M5Qv zmUi@8dNR578Wo_J=J)KNGRuP!W^+q45+1A5&&~tOXUXc3UA3py9w*AdYtr*_Hmkhd zLa2Z!BwMZ$?kkK=GqEy#vp~P)Qortw*13;ZI$_12)1((EpegX^qt?cNJQ~}E`&8iZg}_uIPmoD=|?QE3r~6ugaI^+#Pj& z#(OR!DeYl;V|q3`ArIVvFunYS+Lmgv{jK_lR*BgBtee1%Zn~jjTB%C)$osC)y3gNGt0muG%!)}<`T7o_M_Xg zyB9|SlKzJq=}KwhJN@sWT4ffofsPxmp>`=VIM=UBk9^%*AcNlC2E|%3-UjT--G>W&PoniGIp)y0^XRrE zaH09pKsP~c%M7`__?JunquBmf+nS$a-4yFE!C-%ejLbBD-Gv%4t&}$knvRP>K*B3q zVZNvKl;<#}FhM_v<-)*P~QnHYI+ z%{zgz6-b=Hd)sYJay1gQZA0#S{}K8jR-{_<_KV=IN(o4T(@+PGDQ{aJKR)C3? zO4!&NKOXk8-s4O~au_UXnUmecJHvmH1^oi~_&zvzLq7T71=vi1=s&awV)aN%rPUow zQ4k%J?O*1Rf93Z$4O{j)%?yuIDB%saS(;yv@N~V8TDrK!`SMJiP5zPR_+_h%Sy9za zqm216wC{45FLGBKjLI1}WWD%#$!oy2ZL^*RSA*gOn4FQbIyW7*qL){ier|Pt@z5K? zsHcxkLZ!}bsq;aJzwdvg#Mu}gUpmcRDci{_+6q)x`}!P3DiaKX8-=AOoHkT5d>#bI zCvs=BGI}be(8Ku}$?vU6qDo(#9UGIfTR60%C_OvcRU;0_9hZ4BdN}6{|8>k~OykJA zjm6RU?H4se(LILQEzDKO>cNuR91Qam3%AopYIb|iIoW3H_{qcw7s)xv*;t9mUKGQO z?Y=*ig7*tfm-O#HGe&X*{Yt_G+z!`Q1*!xW_joa11q*_TqxvEVA*vD4UaO`A#iflT zC=m2(h-wR-W@XH-3UWkiKClTMbXR6Ga+!6ZK-Ln|U!s`X0@>QImJE+ag`iEZ(k?d6 zM#Rr1ILQ-IF67Q8CNNSi5+m>B}*GmE0tz?g=P;UJbbN%5_&M7>+)luY!_X zSIt!)4l`A4@gG%0d$>SmgTJZf^2dny<8+i;O$;6|$V5j5k-n&W{K{tLR)wO|tJ^8Y zorB*?44cKdY-Zly%XpnCYWw|lO~{XTV@gNn9CCJKU6NWP(9hKDSP4BggVyX z)lltuTr@Id8@UzxwkLr>yWCopim;NJDlV#K_O5z)x8{qkZNp}r>3oDGs1-hD4Qn{+ z_9pdWj&H^qjC%Zd^XaMPu0SKTsJs6&pIY-v0?h;VU~MYgA+hhw2#y4H%X0S$r+nxo+oo=|qR@Aps?QE9lT!J%vrgVS zCM*34CSbah*Fv=VOT@5z$Mi_8;Ats^VdG?$a%EN%;-vYPtwFgI#@N{VD;*I`CXGHH zN<1%I$1H*#{75tFOYH}@u$ECpKc4IonBCn|PUj}PPY%a1kcIN?ED$JX*qM}VZ6qs1 zvqbeqdoae{$D=gH-*}nz;E7s$ze3FS=`L{DFGCCsB8FL8joW!O8~%0AX!?ADg4-eB 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 Date: Sun, 17 Mar 2024 13:47:54 +0000 Subject: [PATCH 55/62] Fix mypy error --- Packs/Gem/Integrations/Gem/Gem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index f2720654f108..e11576722853 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -73,7 +73,7 @@ def _get_token(self): else: # Token exists, check if it's expired and generate a new one if needed auth_token = ctx.get('auth_token') - decoded_jwt = jwt.decode(auth_token, options={"verify_signature": False}) + decoded_jwt = jwt.decode(auth_token, options={"verify_signature": False}) # type: ignore token_expiration = datetime.fromtimestamp(decoded_jwt['exp']) From 21917e971d410c9ec13996f9acabf616ea39331c Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Sun, 17 Mar 2024 15:17:38 +0000 Subject: [PATCH 56/62] Add deps --- Packs/Gem/pack_metadata.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index 6adc24addf66..12caa774f68f 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -61,8 +61,16 @@ "name": "Generic Webhook" }, "CommonScripts": { - "mandatory": false, + "mandatory": true, "name": "Common Scripts" + }, + "CommonTypes": { + "mandatory": true, + "display_name": "Common Types" + }, + "FiltersAndTransformers": { + "mandatory": true, + "display_name": "Filters And Transformers" } }, "marketplaces": [ From d065bed3486e3fb699ebdbfd9eca4cb2efafa7b2 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Sun, 17 Mar 2024 16:00:53 +0000 Subject: [PATCH 57/62] Fix layout validation --- Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json index 382bec54966a..1e73142b31e9 100644 --- a/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json +++ b/Packs/Gem/Layouts/layoutscontainer-Gem_Layout.json @@ -479,5 +479,8 @@ "system": false, "version": -1, "fromVersion": "6.10.0", - "description": "" + "description": "Gem Alert layout", + "marketplaces": [ + "xsoar" + ] } \ No newline at end of file From 545937adadb9d00e80c6c21ca893a310fdf3286a Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Mon, 18 Mar 2024 11:40:36 +0000 Subject: [PATCH 58/62] Fix stuff and add test --- Packs/Gem/Integrations/Author_image.png | Bin 1907 -> 0 bytes Packs/Gem/Integrations/Gem/Gem_test.py | 7 ---- ...63-8856-37a2fbbe722b-Gem_Alert_Merger.json | 8 ++--- Packs/Gem/README.md | 1 + .../ResolveGemAlert/ResolveGemAlert.py | 31 +++++++++++------- ...esovleGemAlert.yml => ResolveGemAlert.yml} | 0 .../ResolveGemAlert/ResolveGemAlert_test.py | 18 ++++++++++ Packs/Gem/pack_metadata.json | 18 +++++----- 8 files changed, 49 insertions(+), 34 deletions(-) delete mode 100644 Packs/Gem/Integrations/Author_image.png rename Packs/Gem/Scripts/ResolveGemAlert/{ResovleGemAlert.yml => ResolveGemAlert.yml} (100%) create mode 100644 Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert_test.py diff --git a/Packs/Gem/Integrations/Author_image.png b/Packs/Gem/Integrations/Author_image.png deleted file mode 100644 index a8dbc8fdaf8a46ddd58ca602b3538235c82d8250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1907 zcmV-(2aNcMP)aR_j5&LVPRomVPRomVPRomVPRo0 zCvd1FzB>7(_V34!9bDE1LS!#|FB-k2M$m8j@~@wENXk|bnU3o=pWXcSkSr#SQUp(f z+*pn!c`7JO@HEMdFOs*pXlFqg!Ov)NL&Q8`?lO)-@>8%PO9yrojm4tE8 z^l9!+4`04;#iL4CISK%pQ=CiiIGQUcT<$G4dgsZKSD?_;lQtJh}`1AqjpdC&^7V!5FEYptF!@8*aeEZP9AhuQ_txQ;A7u3h$xHL%mxlxK2#@r%BY#KSub7J?FMgx?(kd`R$f0rfI_Q@dx3Z#E+xrbdGlmV3VNtXKm`2!_Wf3}iOF#s z=gy#ue3|Z31k0};w;@N1rqihxeD86}#B$2BK~sRz_Kr4Q9^f|8=@&L+8=E8kPj1C+ z&>02FRjeAM_{tjj(eqw)Q@JDWyuP2Npiuv#Q^R1;I;S?6pwoJO>pN|ND_C@?FS`HP z)vJwP7rypsg1C3`v>u*?9W2J+kEAve7JL=vxs!a37tFMi$3%J*wu)iu4_!d6^og5T?Qgn(J8j8ZO(}0*TGGH~1;vMtL>~ zPwxi8CFMd6cetC;^>S;kRc7yd_UQvt@% zvnnUeOrKQ2q?v4kpFN^ULDGV$8To5oF~+BaHiE6Z@+sdN^4YlrGnnLiub-}m6n0_( z6C!zBpR0CxS2LlKHbGXqY&8iRV<)Y26{>WNot+#jkU4-^Q%m72BHRde30Q~n1T%hH z{H6zz8Ejr8Gr^i(1)P6=^ttNkZavE`4 zN`w0-s>v5cE`t}4%Y{Rw!UU2p-Wic|T*y|!AiKtuG_G<*l`dF=j9fe~Ql2VCBAAg$ z@}EzJOx{IQs2H3Ifrtic6_rC&A<8=oX3b&Qc^fDVjtx}hsZg*t4U9}MW0++4Tp4P) z<3*9%2NMCJn!K=z=*-29f-_0m>hz^sL^f)?OZ-ea@Jh?&S~b^$XMOlTk`GRUeX^jl zgD@29(+;Rc0avkz&1pr=BaBR@KdxpO Date: Tue, 19 Mar 2024 08:51:55 +0000 Subject: [PATCH 59/62] Fix comment --- Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.yml b/Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.yml index 8ea1f0cc7393..fa74af9af173 100644 --- a/Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.yml +++ b/Packs/Gem/Scripts/ResolveGemAlert/ResolveGemAlert.yml @@ -1,4 +1,4 @@ -comment: "Post Processing Script that will resolve the relevant Alert in the Gem platform." +comment: "Post Processing Script that will resolve the relevant Threat in the Gem platform." commonfields: id: ResolveGemAlert version: -1 From 30394af035990a2ad07943c769965e17c15e0307 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 19 Mar 2024 09:06:59 +0000 Subject: [PATCH 60/62] Fix docs --- Packs/Gem/README.md | 11 ++++++++++- Packs/Gem/pack_metadata.json | 8 ++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Packs/Gem/README.md b/Packs/Gem/README.md index c613e1077298..7c4edfbd975c 100644 --- a/Packs/Gem/README.md +++ b/Packs/Gem/README.md @@ -1 +1,10 @@ -Placeholder readme \ No newline at end of file +The Gem Cortex XSOAR content pack adds a special playbook trigger for Gem alerts, as well as built-in Gem actions and pre-defined playbooks to use with specific cloud incidents. +Use Gem alerts as a trigger for Cortex XSOAR’s custom playbooks, and automate response to specific TTPs and scenarios. +This pack contains enables the following: +Import/subscribe to Gem alerts and use them as playbook triggers, including all the cloud-related context from involved entities to triggering events +Run Gem API actions using XSOAR commands to automatically manage incidents, sync status bi-directionally and effectively contain suspicious activity, all in a cloud-native seamless way +Respond automatically using pre-defined playbooks for specific scenarios like a compromised machine and root user activity + +For more information, visit https://gem.security. + +![Gem Logo](https://raw.githubusercontent.com/demisto/content/master/Packs/Gem/Author_image.png) \ No newline at end of file diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index 0b7a559abcad..e06706b77827 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -1,17 +1,13 @@ { "name": "Gem", - "description": "Integrate with Gem Security for bidirectional threat management", + "description": "Integrate with Gem to use alerts as a trigger for Cortex XSOAR’s custom playbooks, and automate response to specific TTPs and scenarios.", "support": "partner", "currentVersion": "1.0.0", "author": "Gem Security", "url": "https://gem.security/", "email": "support@gem.security", "categories": [ - "Analytics & SIEM", - "Data Enrichment & Threat Intelligence", - "Forensics & Malware Analysis", - "Network Security", - "Cloud Services" + "Analytics & SIEM" ], "tags": [ "Alerts", From 8a8d22ecb6be59c7336ea9e7afd614b6459d9620 Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 19 Mar 2024 13:55:11 +0000 Subject: [PATCH 61/62] Fix --- Packs/Gem/README.md | 2 +- Packs/Gem/pack_metadata.json | 4 + package-lock.json | 1036 ++++++++++------------------------ 3 files changed, 301 insertions(+), 741 deletions(-) diff --git a/Packs/Gem/README.md b/Packs/Gem/README.md index 7c4edfbd975c..ae1c2051a285 100644 --- a/Packs/Gem/README.md +++ b/Packs/Gem/README.md @@ -7,4 +7,4 @@ Respond automatically using pre-defined playbooks for specific scenarios like a For more information, visit https://gem.security. -![Gem Logo](https://raw.githubusercontent.com/demisto/content/master/Packs/Gem/Author_image.png) \ No newline at end of file +![Gem Logo](https://static.wixstatic.com/media/5af59e_6dfcae71f83c464eb22bb63846fc4fb4~mv2.png) \ No newline at end of file diff --git a/Packs/Gem/pack_metadata.json b/Packs/Gem/pack_metadata.json index e06706b77827..bb01e80b437c 100644 --- a/Packs/Gem/pack_metadata.json +++ b/Packs/Gem/pack_metadata.json @@ -67,6 +67,10 @@ "FiltersAndTransformers": { "mandatory": true, "display_name": "Filters And Transformers" + }, + "Slack": { + "mandatory": false, + "display_name": "Slack" } }, "marketplaces": [ diff --git a/package-lock.json b/package-lock.json index 16fc85fa6084..fd73e88d80d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,38 +1,23 @@ { "name": "content", "version": "1.0.0", - "lockfileVersion": 3, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "content", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@mdx-js/mdx": "^1.6.22", - "commander": "^5.1.0", - "fs-extra": "^8.1.0", - "markdownlint": "^0.26.2", - "markdownlint-rule-helpers": "^0.17.2" - } - }, - "node_modules/@babel/code-frame": { + "dependencies": { + "@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { + "requires": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/core": { + "@babel/core": { "version": "7.12.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { + "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.5", "@babel/helper-module-transforms": "^7.12.1", @@ -49,240 +34,166 @@ "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/generator": { + "@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dependencies": { + "requires": { "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-environment-visitor": { + "@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" }, - "node_modules/@babel/helper-function-name": { + "@babel/helper-function-name": { "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { + "requires": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { + "@babel/helper-hoist-variables": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { + "requires": { "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { + "@babel/helper-module-imports": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { + "requires": { "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { + "@babel/helper-module-transforms": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dependencies": { + "requires": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { + "@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "engines": { - "node": ">=6.9.0" - } + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" }, - "node_modules/@babel/helper-simple-access": { + "@babel/helper-simple-access": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { + "requires": { "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { + "@babel/helper-split-export-declaration": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { + "requires": { "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/helper-string-parser": { + "@babel/helper-string-parser": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" - } + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" }, - "node_modules/@babel/helper-validator-identifier": { + "@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, - "node_modules/@babel/helpers": { + "@babel/helpers": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dependencies": { + "requires": { "@babel/template": "^7.23.9", "@babel/traverse": "^7.23.9", "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { + "@babel/highlight": { "version": "7.23.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { + "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { + "@babel/parser": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==" }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { + "@babel/plugin-proposal-object-rest-spread": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", - "dependencies": { + "requires": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { + "@babel/plugin-syntax-jsx": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dependencies": { + "requires": { "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { + "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { + "requires": { "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { + "@babel/plugin-transform-parameters": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dependencies": { + "requires": { "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { + "@babel/template": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dependencies": { + "requires": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.23.9", "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { + "@babel/traverse": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dependencies": { + "requires": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", @@ -293,72 +204,57 @@ "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@babel/types": { + "@babel/types": { "version": "7.23.9", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dependencies": { + "requires": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" } }, - "node_modules/@jridgewell/gen-mapping": { + "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { + "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { + "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" }, - "node_modules/@jridgewell/set-array": { + "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, - "node_modules/@jridgewell/sourcemap-codec": { + "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, - "node_modules/@jridgewell/trace-mapping": { + "@jridgewell/trace-mapping": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dependencies": { + "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mdx-js/mdx": { + "@mdx-js/mdx": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { + "requires": { "@babel/core": "7.12.9", "@babel/plugin-syntax-jsx": "7.12.1", "@babel/plugin-syntax-object-rest-spread": "7.8.3", @@ -378,318 +274,230 @@ "unified": "9.2.0", "unist-builder": "2.0.3", "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/@mdx-js/util": { + "@mdx-js/util": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" }, - "node_modules/@types/hast": { + "@types/hast": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.9.tgz", "integrity": "sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==", - "dependencies": { + "requires": { "@types/unist": "^2" } }, - "node_modules/@types/mdast": { + "@types/mdast": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dependencies": { + "requires": { "@types/unist": "^2" } }, - "node_modules/@types/parse5": { + "@types/parse5": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, - "node_modules/@types/unist": { + "@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, - "node_modules/ansi-styles": { + "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { + "requires": { "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/argparse": { + "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/babel-plugin-apply-mdx-type-prop": { + "babel-plugin-apply-mdx-type-prop": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "dependencies": { + "requires": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "1.6.22" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/babel-plugin-extract-import-names": { + "babel-plugin-extract-import-names": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dependencies": { + "requires": { "@babel/helper-plugin-utils": "7.10.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/bail": { + "bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" }, - "node_modules/camelcase-css": { + "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, - "node_modules/ccount": { + "ccount": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" }, - "node_modules/chalk": { + "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { + "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/character-entities": { + "character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" }, - "node_modules/character-entities-legacy": { + "character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" }, - "node_modules/character-reference-invalid": { + "character-reference-invalid": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" }, - "node_modules/collapse-white-space": { + "collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" }, - "node_modules/color-convert": { + "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { + "requires": { "color-name": "1.1.3" } }, - "node_modules/color-name": { + "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/comma-separated-tokens": { + "comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" }, - "node_modules/commander": { + "commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" }, - "node_modules/convert-source-map": { + "convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "node_modules/debug": { + "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { + "requires": { "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, - "node_modules/detab": { + "detab": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dependencies": { + "requires": { "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/escape-string-regexp": { + "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, - "node_modules/extend": { + "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/fs-extra": { + "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { + "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" } }, - "node_modules/function-bind": { + "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, - "node_modules/gensync": { + "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, - "node_modules/globals": { + "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "node_modules/graceful-fs": { + "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, - "node_modules/has-flag": { + "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, - "node_modules/hasown": { + "hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { + "requires": { "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" } }, - "node_modules/hast-to-hyperscript": { + "hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dependencies": { + "requires": { "@types/unist": "^2.0.3", "comma-separated-tokens": "^1.0.0", "property-information": "^5.3.0", @@ -697,43 +505,31 @@ "style-to-object": "^0.3.0", "unist-util-is": "^4.0.0", "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-from-parse5": { + "hast-util-from-parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dependencies": { + "requires": { "@types/parse5": "^5.0.0", "hastscript": "^6.0.0", "property-information": "^5.0.0", "vfile": "^4.0.0", "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-parse-selector": { + "hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" }, - "node_modules/hast-util-raw": { + "hast-util-raw": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dependencies": { + "requires": { "@types/hast": "^2.0.0", "hast-util-from-parse5": "^6.0.0", "hast-util-to-parse5": "^6.0.0", @@ -744,298 +540,198 @@ "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-parse5": { + "hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dependencies": { + "requires": { "hast-to-hyperscript": "^9.0.0", "property-information": "^5.0.0", "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/hastscript": { + "hastscript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dependencies": { + "requires": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/html-void-elements": { + "html-void-elements": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" }, - "node_modules/inherits": { + "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/inline-style-parser": { + "inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, - "node_modules/is-alphabetical": { + "is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" }, - "node_modules/is-alphanumerical": { + "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { + "requires": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-buffer": { + "is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, - "node_modules/is-core-module": { + "is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { + "requires": { "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { + "is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" }, - "node_modules/is-hexadecimal": { + "is-hexadecimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" }, - "node_modules/is-plain-obj": { + "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" }, - "node_modules/is-whitespace-character": { + "is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" }, - "node_modules/is-word-character": { + "is-word-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" }, - "node_modules/js-tokens": { + "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/jsesc": { + "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "node_modules/json5": { + "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, - "node_modules/jsonfile": { + "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "optionalDependencies": { + "requires": { "graceful-fs": "^4.1.6" } }, - "node_modules/lodash": { + "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.uniq": { + "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, - "node_modules/markdown-escapes": { + "markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" }, - "node_modules/markdownlint": { + "markdownlint": { "version": "0.26.2", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.26.2.tgz", "integrity": "sha512-2Am42YX2Ex5SQhRq35HxYWDfz1NLEOZWWN25nqd2h3AHRKsGRE+Qg1gt1++exW792eXTrR4jCNHfShfWk9Nz8w==", - "dependencies": { + "requires": { "markdown-it": "13.0.1" }, - "engines": { - "node": ">=14" + "dependencies": { + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" + }, + "linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "markdown-it": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", + "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "requires": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + } } }, - "node_modules/markdownlint-rule-helpers": { + "markdownlint-rule-helpers": { "version": "0.17.2", "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.17.2.tgz", - "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/markdownlint/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/markdownlint/node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/markdownlint/node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } + "integrity": "sha512-XaeoW2NYSlWxMCZM2B3H7YTG6nlaLfkEZWMBhr4hSPlq9MuY2sy83+Xr89jXOqZMZYjvi5nBCGoFh7hHoPKZmA==" }, - "node_modules/mdast-squeeze-paragraphs": { + "mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dependencies": { + "requires": { "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-definitions": { + "mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dependencies": { + "requires": { "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-hast": { + "mdast-util-to-hast": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dependencies": { + "requires": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "mdast-util-definitions": "^4.0.0", @@ -1044,75 +740,59 @@ "unist-util-generated": "^1.0.0", "unist-util-position": "^3.0.0", "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/mdurl": { + "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, - "node_modules/ms": { + "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/parse-entities": { + "parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { + "requires": { "character-entities": "^1.0.0", "character-entities-legacy": "^1.0.0", "character-reference-invalid": "^1.0.0", "is-alphanumerical": "^1.0.0", "is-decimal": "^1.0.0", "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parse5": { + "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, - "node_modules/path-parse": { + "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, - "node_modules/property-information": { + "property-information": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { + "requires": { "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/remark-footnotes": { + "remark-footnotes": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" }, - "node_modules/remark-mdx": { + "remark-mdx": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dependencies": { + "requires": { "@babel/core": "7.12.9", "@babel/helper-plugin-utils": "7.10.4", "@babel/plugin-proposal-object-rest-spread": "7.12.1", @@ -1122,21 +802,19 @@ "remark-parse": "8.0.3", "unified": "9.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/remark-parse": { + "remark-parse": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { + "requires": { "ccount": "^1.0.0", "collapse-white-space": "^1.0.2", "is-alphabetical": "^1.0.0", @@ -1153,348 +831,226 @@ "unist-util-remove-position": "^2.0.0", "vfile-location": "^3.0.0", "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/remark-squeeze-paragraphs": { + "remark-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dependencies": { + "requires": { "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/repeat-string": { + "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, - "node_modules/resolve": { + "resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { + "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semver": { + "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, - "node_modules/source-map": { + "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" }, - "node_modules/space-separated-tokens": { + "space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" }, - "node_modules/state-toggle": { + "state-toggle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" }, - "node_modules/style-to-object": { + "style-to-object": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dependencies": { + "requires": { "inline-style-parser": "0.1.1" } }, - "node_modules/supports-color": { + "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { + "requires": { "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/supports-preserve-symlinks-flag": { + "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, - "node_modules/to-fast-properties": { + "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, - "node_modules/trim": { + "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", - "deprecated": "Use String.prototype.trim() instead" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, - "node_modules/trim-trailing-lines": { + "trim-trailing-lines": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" }, - "node_modules/trough": { + "trough": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" }, - "node_modules/uc.micro": { + "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, - "node_modules/unherit": { + "unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { + "requires": { "inherits": "^2.0.0", "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/unified": { + "unified": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { + "requires": { "bail": "^1.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/unist-builder": { + "unist-builder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" }, - "node_modules/unist-util-generated": { + "unist-util-generated": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" }, - "node_modules/unist-util-is": { + "unist-util-is": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" }, - "node_modules/unist-util-position": { + "unist-util-position": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" }, - "node_modules/unist-util-remove": { + "unist-util-remove": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dependencies": { + "requires": { "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { + "unist-util-remove-position": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dependencies": { + "requires": { "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-stringify-position": { + "unist-util-stringify-position": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { + "requires": { "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-visit": { + "unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { + "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0", "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-visit-parents": { + "unist-util-visit-parents": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dependencies": { + "requires": { "@types/unist": "^2.0.0", "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/universalify": { + "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "node_modules/vfile": { + "vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { + "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^2.0.0", "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/vfile-location": { + "vfile-location": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" }, - "node_modules/vfile-message": { + "vfile-message": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { + "requires": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" } }, - "node_modules/web-namespaces": { + "web-namespaces": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, - "node_modules/xtend": { + "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, - "node_modules/zwitch": { + "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" } } } From 35d610b1c81dc9a373975b5a5a1c67ccc0b3e9ed Mon Sep 17 00:00:00 2001 From: Lior Maman Date: Tue, 19 Mar 2024 15:32:51 +0000 Subject: [PATCH 62/62] Fix CR --- Packs/Gem/Integrations/Gem/Gem.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Packs/Gem/Integrations/Gem/Gem.py b/Packs/Gem/Integrations/Gem/Gem.py index e11576722853..0e26cfec9582 100644 --- a/Packs/Gem/Integrations/Gem/Gem.py +++ b/Packs/Gem/Integrations/Gem/Gem.py @@ -150,6 +150,9 @@ def _generate_token(self) -> str: return token_res.get('access_token') + def _filter_non_empty_params(self, params): + return {k: v for k, v in params.items() if v is not None} + def fetch_threats(self, maxincidents=None, start_time=None) -> list[dict]: """ Fetches a list of threats from the Gem API. @@ -165,7 +168,7 @@ def fetch_threats(self, maxincidents=None, start_time=None) -> list[dict]: return self.http_request( method='GET', url_suffix=FETCH_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) @@ -206,7 +209,7 @@ def get_alert_details(self, alert_id: str): response = self.http_request( method='GET', url_suffix=ALERTS_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) return response @@ -243,7 +246,7 @@ def list_threats(self, limit, time_start=None, time_end=None, ordering=None, sta response = self.http_request( method='GET', url_suffix=THREATS_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) results_fetched = limit @@ -256,7 +259,7 @@ def list_threats(self, limit, time_start=None, time_end=None, ordering=None, sta response = self.http_request( method='GET', url_suffix=THREATS_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) if len(response['results']) < PAGE_SIZE: @@ -294,7 +297,7 @@ def list_inventory_resources(self, limit, include_deleted=None, region=None, res response = self.http_request( method='GET', url_suffix=INVENTORY_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) results_fetched += len(response['results']) @@ -308,7 +311,7 @@ def list_inventory_resources(self, limit, include_deleted=None, region=None, res response = self.http_request( method='GET', url_suffix=INVENTORY_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) results_fetched += len(response['results']) @@ -325,7 +328,7 @@ def _breakdown(self, breakdown_by, entity_id=None, entity_type=None, read_only=N response = self.http_request( method='GET', url_suffix=BREAKDOWN_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) return response['table'] @@ -499,7 +502,7 @@ def run_action_on_entity(self, action: str, entity_id: str, entity_type: str, al response = self.http_request( method='POST', url_suffix=RUN_ACTION_ENDPOINT, - params={k: v for k, v in params.items() if v is not None} + params=self._filter_non_empty_params(params) ) return response @@ -520,7 +523,7 @@ def add_timeline_event(self, threat_id: str, comment: str, timestamp: str) -> di response = self.http_request( method='POST', url_suffix=ADD_TIMELINE_EVENT_ENDPOINT.format(id=threat_id), - json_data={k: v for k, v in params.items() if v is not None} + json_data=self._filter_non_empty_params(params) ) return response