From 20fb8879945b2d60de64a6d63f5172bbcbee1493 Mon Sep 17 00:00:00 2001 From: Dympna Laverty <118898375+dlaverty-r7@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:05:40 +0000 Subject: [PATCH] Decommission unused plugins (#2940) Co-authored-by: Dympna Laverty --- plugins/aws_workspaces/.CHECKSUM | 15 - plugins/aws_workspaces/.dockerignore | 9 - plugins/aws_workspaces/Dockerfile | 26 - plugins/aws_workspaces/Makefile | 53 - .../aws_workspaces/bin/icon_aws_workspaces | 32 - plugins/aws_workspaces/extension.png | Bin 4089 -> 0 bytes plugins/aws_workspaces/help.md | 89 - plugins/aws_workspaces/icon.png | Bin 19688 -> 0 bytes .../icon_aws_workspaces/__init__.py | 1 - .../icon_aws_workspaces/actions/__init__.py | 2 - .../actions/create_workspace/__init__.py | 2 - .../actions/create_workspace/action.py | 99 - .../actions/create_workspace/schema.py | 211 -- .../connection/__init__.py | 2 - .../connection/connection.py | 35 - .../icon_aws_workspaces/connection/schema.py | 66 - .../icon_aws_workspaces/triggers/__init__.py | 1 - .../icon_aws_workspaces/util/__init__.py | 1 - plugins/aws_workspaces/plugin.spec.yaml | 152 -- plugins/aws_workspaces/requirements.txt | 4 - plugins/aws_workspaces/setup.py | 14 - plugins/mcafee_atd/.CHECKSUM | 35 - plugins/mcafee_atd/.dockerignore | 9 - plugins/mcafee_atd/Dockerfile | 26 - plugins/mcafee_atd/Makefile | 53 - plugins/mcafee_atd/bin/icon_mcafee_atd | 42 - plugins/mcafee_atd/extension.png | Bin 12124 -> 0 bytes plugins/mcafee_atd/help.md | 406 --- plugins/mcafee_atd/icon.png | Bin 21956 -> 0 bytes .../mcafee_atd/icon_mcafee_atd/__init__.py | 1 - .../icon_mcafee_atd/actions/__init__.py | 7 - .../actions/check_analysis_status/__init__.py | 2 - .../actions/check_analysis_status/action.py | 27 - .../actions/check_analysis_status/schema.py | 212 -- .../actions/get_report/__init__.py | 2 - .../actions/get_report/action.py | 33 - .../actions/get_report/schema.py | 101 - .../list_analyzer_profiles/__init__.py | 2 - .../actions/list_analyzer_profiles/action.py | 22 - .../actions/list_analyzer_profiles/schema.py | 401 --- .../actions/submit_file/__init__.py | 2 - .../actions/submit_file/action.py | 21 - .../actions/submit_file/schema.py | 297 --- .../actions/submit_hash/__init__.py | 2 - .../actions/submit_hash/action.py | 28 - .../actions/submit_hash/schema.py | 69 - .../actions/submit_url/__init__.py | 2 - .../actions/submit_url/action.py | 21 - .../actions/submit_url/schema.py | 281 -- .../icon_mcafee_atd/connection/__init__.py | 2 - .../icon_mcafee_atd/connection/connection.py | 32 - .../icon_mcafee_atd/connection/schema.py | 82 - .../icon_mcafee_atd/triggers/__init__.py | 1 - .../icon_mcafee_atd/util/__init__.py | 1 - .../mcafee_atd/icon_mcafee_atd/util/api.py | 125 - .../icon_mcafee_atd/util/mcafee_request.py | 51 - plugins/mcafee_atd/plugin.spec.yaml | 693 ----- plugins/mcafee_atd/requirements.txt | 4 - plugins/mcafee_atd/setup.py | 14 - plugins/sonicwall_capture_client/.CHECKSUM | 15 - .../sonicwall_capture_client/.dockerignore | 9 - plugins/sonicwall_capture_client/Dockerfile | 26 - plugins/sonicwall_capture_client/Makefile | 53 - .../bin/icon_sonicwall_capture_client | 46 - .../sonicwall_capture_client/extension.png | Bin 29872 -> 0 bytes plugins/sonicwall_capture_client/help.md | 493 ---- plugins/sonicwall_capture_client/icon.png | Bin 29024 -> 0 bytes .../icon_sonicwall_capture_client/__init__.py | 1 - .../actions/__init__.py | 2 - .../actions/get_agent_details/__init__.py | 2 - .../actions/get_agent_details/action.py | 64 - .../actions/get_agent_details/schema.py | 2338 ----------------- .../connection/__init__.py | 2 - .../connection/connection.py | 26 - .../connection/schema.py | 58 - .../triggers/__init__.py | 1 - .../util/__init__.py | 1 - .../icon_sonicwall_capture_client/util/api.py | 91 - .../sonicwall_capture_client/plugin.spec.yaml | 790 ------ .../sonicwall_capture_client/requirements.txt | 4 - plugins/sonicwall_capture_client/setup.py | 14 - plugins/threat_connect/.CHECKSUM | 47 - plugins/threat_connect/.dockerignore | 9 - plugins/threat_connect/Dockerfile | 17 - plugins/threat_connect/Makefile | 53 - .../threat_connect/bin/komand_threat_connect | 62 - plugins/threat_connect/extension.png | Bin 14235 -> 0 bytes plugins/threat_connect/help.md | 247 -- plugins/threat_connect/icon.png | Bin 19389 -> 0 bytes .../komand_threat_connect/__init__.py | 1 - .../komand_threat_connect/actions/__init__.py | 10 - .../bulk_indicator_download/__init__.py | 2 - .../actions/bulk_indicator_download/action.py | 90 - .../actions/bulk_indicator_download/schema.py | 190 -- .../actions/create_adversary/__init__.py | 2 - .../actions/create_adversary/action.py | 53 - .../actions/create_adversary/schema.py | 90 - .../actions/create_task/__init__.py | 2 - .../actions/create_task/action.py | 81 - .../actions/create_task/schema.py | 157 -- .../actions/delete_adversary/__init__.py | 2 - .../actions/delete_adversary/action.py | 37 - .../actions/delete_adversary/schema.py | 66 - .../actions/emails_retrieve/__init__.py | 2 - .../actions/emails_retrieve/action.py | 85 - .../actions/emails_retrieve/schema.py | 191 -- .../actions/incidents_retrieve/__init__.py | 2 - .../actions/incidents_retrieve/action.py | 85 - .../actions/incidents_retrieve/schema.py | 179 -- .../actions/signatures_retrieve/__init__.py | 2 - .../actions/signatures_retrieve/action.py | 92 - .../actions/signatures_retrieve/schema.py | 172 -- .../actions/threats_retrieve/__init__.py | 2 - .../actions/threats_retrieve/action.py | 90 - .../actions/threats_retrieve/schema.py | 172 -- .../actions/victims_retrieve/__init__.py | 2 - .../actions/victims_retrieve/action.py | 86 - .../actions/victims_retrieve/schema.py | 185 -- .../connection/__init__.py | 2 - .../connection/connection.py | 27 - .../connection/schema.py | 74 - .../triggers/__init__.py | 1 - .../komand_threat_connect/util/__init__.py | 1 - plugins/threat_connect/plugin.spec.yaml | 576 ---- plugins/threat_connect/requirements.txt | 5 - plugins/threat_connect/setup.py | 14 - 126 files changed, 11224 deletions(-) delete mode 100644 plugins/aws_workspaces/.CHECKSUM delete mode 100644 plugins/aws_workspaces/.dockerignore delete mode 100755 plugins/aws_workspaces/Dockerfile delete mode 100755 plugins/aws_workspaces/Makefile delete mode 100755 plugins/aws_workspaces/bin/icon_aws_workspaces delete mode 100644 plugins/aws_workspaces/extension.png delete mode 100644 plugins/aws_workspaces/help.md delete mode 100644 plugins/aws_workspaces/icon.png delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/__init__.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/actions/__init__.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/__init__.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/action.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/schema.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/connection/__init__.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/connection/connection.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/connection/schema.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/triggers/__init__.py delete mode 100755 plugins/aws_workspaces/icon_aws_workspaces/util/__init__.py delete mode 100644 plugins/aws_workspaces/plugin.spec.yaml delete mode 100755 plugins/aws_workspaces/requirements.txt delete mode 100755 plugins/aws_workspaces/setup.py delete mode 100644 plugins/mcafee_atd/.CHECKSUM delete mode 100644 plugins/mcafee_atd/.dockerignore delete mode 100644 plugins/mcafee_atd/Dockerfile delete mode 100644 plugins/mcafee_atd/Makefile delete mode 100644 plugins/mcafee_atd/bin/icon_mcafee_atd delete mode 100644 plugins/mcafee_atd/extension.png delete mode 100644 plugins/mcafee_atd/help.md delete mode 100644 plugins/mcafee_atd/icon.png delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/action.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/action.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/action.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/action.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/action.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/action.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/connection/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/connection/connection.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/connection/schema.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/triggers/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/util/__init__.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/util/api.py delete mode 100644 plugins/mcafee_atd/icon_mcafee_atd/util/mcafee_request.py delete mode 100644 plugins/mcafee_atd/plugin.spec.yaml delete mode 100644 plugins/mcafee_atd/requirements.txt delete mode 100644 plugins/mcafee_atd/setup.py delete mode 100644 plugins/sonicwall_capture_client/.CHECKSUM delete mode 100644 plugins/sonicwall_capture_client/.dockerignore delete mode 100644 plugins/sonicwall_capture_client/Dockerfile delete mode 100644 plugins/sonicwall_capture_client/Makefile delete mode 100644 plugins/sonicwall_capture_client/bin/icon_sonicwall_capture_client delete mode 100644 plugins/sonicwall_capture_client/extension.png delete mode 100644 plugins/sonicwall_capture_client/help.md delete mode 100644 plugins/sonicwall_capture_client/icon.png delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/__init__.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/__init__.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/__init__.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/action.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/schema.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/__init__.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/connection.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/schema.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/triggers/__init__.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/__init__.py delete mode 100644 plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/api.py delete mode 100644 plugins/sonicwall_capture_client/plugin.spec.yaml delete mode 100644 plugins/sonicwall_capture_client/requirements.txt delete mode 100644 plugins/sonicwall_capture_client/setup.py delete mode 100644 plugins/threat_connect/.CHECKSUM delete mode 100644 plugins/threat_connect/.dockerignore delete mode 100755 plugins/threat_connect/Dockerfile delete mode 100755 plugins/threat_connect/Makefile delete mode 100755 plugins/threat_connect/bin/komand_threat_connect delete mode 100644 plugins/threat_connect/extension.png delete mode 100644 plugins/threat_connect/help.md delete mode 100644 plugins/threat_connect/icon.png delete mode 100755 plugins/threat_connect/komand_threat_connect/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/create_adversary/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/create_adversary/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/create_adversary/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/create_task/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/create_task/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/create_task/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/delete_adversary/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/delete_adversary/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/delete_adversary/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/action.py delete mode 100755 plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/connection/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/connection/connection.py delete mode 100755 plugins/threat_connect/komand_threat_connect/connection/schema.py delete mode 100755 plugins/threat_connect/komand_threat_connect/triggers/__init__.py delete mode 100755 plugins/threat_connect/komand_threat_connect/util/__init__.py delete mode 100644 plugins/threat_connect/plugin.spec.yaml delete mode 100755 plugins/threat_connect/requirements.txt delete mode 100755 plugins/threat_connect/setup.py diff --git a/plugins/aws_workspaces/.CHECKSUM b/plugins/aws_workspaces/.CHECKSUM deleted file mode 100644 index 0f0c89996f..0000000000 --- a/plugins/aws_workspaces/.CHECKSUM +++ /dev/null @@ -1,15 +0,0 @@ -{ - "spec": "f6882889520d23957aa9349586c2678b", - "manifest": "8a2a347035eb1167767c00c2c46ece6a", - "setup": "e29d88d1703a1dc4919a6b5cf5e9548a", - "schemas": [ - { - "identifier": "create_workspace/schema.py", - "hash": "d640f34f6c0b4647311922855768becb" - }, - { - "identifier": "connection/schema.py", - "hash": "856e5a7d197dd71cdddcd2d6b6e88c87" - } - ] -} \ No newline at end of file diff --git a/plugins/aws_workspaces/.dockerignore b/plugins/aws_workspaces/.dockerignore deleted file mode 100644 index 93dc53fb01..0000000000 --- a/plugins/aws_workspaces/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -unit_test/**/* -unit_test -examples/**/* -examples -tests -tests/**/* -**/*.json -**/*.tar -**/*.gz \ No newline at end of file diff --git a/plugins/aws_workspaces/Dockerfile b/plugins/aws_workspaces/Dockerfile deleted file mode 100755 index 336d1728fa..0000000000 --- a/plugins/aws_workspaces/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM komand/python-3-37-slim-plugin:3 -# Refer to the following documentation for available SDK parent images: https://docs.rapid7.com/insightconnect/sdk-guide/#sdk-guide - -LABEL organization=rapid7 -LABEL sdk=python - -# Add any custom package dependencies here -# NOTE: Add pip packages to requirements.txt - -# End package dependencies - -# Add source code -WORKDIR /python/src -ADD ./plugin.spec.yaml /plugin.spec.yaml -ADD . /python/src - -# Install pip dependencies -RUN if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - -# Install plugin -RUN python setup.py build && python setup.py install - -# User to run plugin code. The two supported users are: root, nobody -USER root - -ENTRYPOINT ["/usr/local/bin/icon_aws_workspaces"] diff --git a/plugins/aws_workspaces/Makefile b/plugins/aws_workspaces/Makefile deleted file mode 100755 index cb85f96b6c..0000000000 --- a/plugins/aws_workspaces/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# Include other Makefiles for improved functionality -INCLUDE_DIR = ../../tools/Makefiles -MAKEFILES := $(wildcard $(INCLUDE_DIR)/*.mk) -# We can't guarantee customers will have the include files -# - prefix to ignore Makefiles when not present -# https://www.gnu.org/software/make/manual/html_node/Include.html --include $(MAKEFILES) - -ifneq ($(MAKEFILES),) - $(info [$(YELLOW)*$(NORMAL)] Use ``make menu`` for available targets) - $(info [$(YELLOW)*$(NORMAL)] Including available Makefiles: $(MAKEFILES)) - $(info --) -else - $(warning Makefile includes directory not present: $(INCLUDE_DIR)) -endif - -VERSION?=$(shell grep '^version: ' plugin.spec.yaml | sed 's/version: //') -NAME?=$(shell grep '^name: ' plugin.spec.yaml | sed 's/name: //') -VENDOR?=$(shell grep '^vendor: ' plugin.spec.yaml | sed 's/vendor: //') -CWD?=$(shell basename $(PWD)) -_NAME?=$(shell echo $(NAME) | awk '{ print toupper(substr($$0,1,1)) tolower(substr($$0,2)) }') -PKG=$(VENDOR)-$(NAME)-$(VERSION).tar.gz - -# Set default target explicitly. Make's default behavior is the first target in the Makefile. -# We don't want that behavior due to includes which are read first -.DEFAULT_GOAL := default # Make >= v3.80 (make -version) - - -default: image tarball - -tarball: - $(info [$(YELLOW)*$(NORMAL)] Creating plugin tarball) - rm -rf build - rm -rf $(PKG) - tar -cvzf $(PKG) --exclude=$(PKG) --exclude=tests --exclude=run.sh * - -image: - $(info [$(YELLOW)*$(NORMAL)] Building plugin image) - docker build --pull -t $(VENDOR)/$(NAME):$(VERSION) . - docker tag $(VENDOR)/$(NAME):$(VERSION) $(VENDOR)/$(NAME):latest - -regenerate: - $(info [$(YELLOW)*$(NORMAL)] Regenerating schema from plugin.spec.yaml) - icon-plugin generate python --regenerate - -export: image - $(info [$(YELLOW)*$(NORMAL)] Exporting docker image) - @printf "\n ---> Exporting Docker image to ./$(VENDOR)_$(NAME)_$(VERSION).tar\n" - @docker save $(VENDOR)/$(NAME):$(VERSION) | gzip > $(VENDOR)_$(NAME)_$(VERSION).tar - -# Make will not run a target if a file of the same name exists unless setting phony targets -# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: default tarball image regenerate diff --git a/plugins/aws_workspaces/bin/icon_aws_workspaces b/plugins/aws_workspaces/bin/icon_aws_workspaces deleted file mode 100755 index 1f0e0ad96e..0000000000 --- a/plugins/aws_workspaces/bin/icon_aws_workspaces +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python -# GENERATED BY KOMAND SDK - DO NOT EDIT -import komand -from icon_aws_workspaces import connection, actions, triggers - - -Name = 'AWS WorkSpaces' -Vendor = 'rapid7' -Version = '1.0.1' -Description = 'Enables creation of workspaces on Amazons WorkSpace service' - - -class ICONAwsWorkspaces(komand.Plugin): - def __init__(self): - super(self.__class__, self).__init__( - name=Name, - vendor=Vendor, - version=Version, - description=Description, - connection=connection.Connection() - ) - self.add_action(actions.CreateWorkspace()) - - -def main(): - """Run plugin""" - cli = komand.CLI(ICONAwsWorkspaces()) - cli.run() - - -if __name__ == "__main__": - main() diff --git a/plugins/aws_workspaces/extension.png b/plugins/aws_workspaces/extension.png deleted file mode 100644 index c25b2968b269d2f0c1cc16a6963607ed160dbe8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4089 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 z 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 W>$t_@eioRP89ZJ6T-G@yGywpZy&{qT diff --git a/plugins/aws_workspaces/icon_aws_workspaces/__init__.py b/plugins/aws_workspaces/icon_aws_workspaces/__init__.py deleted file mode 100755 index bace8db897..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/aws_workspaces/icon_aws_workspaces/actions/__init__.py b/plugins/aws_workspaces/icon_aws_workspaces/actions/__init__.py deleted file mode 100755 index a69ce25f10..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/actions/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .create_workspace.action import CreateWorkspace diff --git a/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/__init__.py b/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/__init__.py deleted file mode 100755 index a5cf38ffb6..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import CreateWorkspace diff --git a/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/action.py b/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/action.py deleted file mode 100755 index ae06735e48..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/action.py +++ /dev/null @@ -1,99 +0,0 @@ -import komand -from .schema import CreateWorkspaceInput, CreateWorkspaceOutput, Component, Input, Output - -# Custom imports below -from komand.exceptions import PluginException - - -class CreateWorkspace(komand.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="create_workspace", - description=Component.DESCRIPTION, - input=CreateWorkspaceInput(), - output=CreateWorkspaceOutput(), - ) - - def run(self, params={}): - directory_id = params.get(Input.DIRECTORY_ID) - username = params.get(Input.USERNAME) - bundle_id = params.get(Input.BUNDLE_ID) - volume_encryption_key = params.get(Input.VOLUME_ENCRYPTION_KEY) - user_volume_encryption_enabled = params.get(Input.USER_VOLUME_ENCRYPTION_ENABLED) - root_volume_encryption_enabled = params.get(Input.ROOT_VOLUME_ENCRYPTION_ENABLED) - workspace_properties = params.get(Input.WORKSPACE_PROPERTIES) - tags = params.get(Input.TAGS) - result = {} - - payload = { - "DirectoryId": directory_id, - "UserName": username, - "BundleId": bundle_id, - "Tags": tags, - "WorkspaceProperties": { - "ComputeTypeName": workspace_properties["compute_type_name"], - "RootVolumeSizeGib": workspace_properties["root_volume_size"], - "RunningMode": workspace_properties["running_mode"], - "RunningModeAutoStopTimeoutInMinutes": workspace_properties["running_mode_auto_stop_time_out"], - "UserVolumeSizeGib": workspace_properties["user_volume_size"], - }, - } - - if user_volume_encryption_enabled and root_volume_encryption_enabled: - raise PluginException( - cause="Both user and root volume encrypted flags are set.", - assistance="Only one of the encryption flags can be set.", - ) - - if user_volume_encryption_enabled: - payload["UserVolumeEncryptionEnabled"] = user_volume_encryption_enabled - if root_volume_encryption_enabled: - payload["RootVolumeEncryptionEnabled"] = root_volume_encryption_enabled - if user_volume_encryption_enabled or root_volume_encryption_enabled: - if volume_encryption_key: - payload["VolumeEncryptionKey"] = volume_encryption_key - else: - raise PluginException( - cause="Invalid value for Volume Encryption Key input.", - assistance="Please provide a valid value for the input.", - ) - - try: - result = self.connection.aws.client("workspaces").create_workspaces(Workspaces=[payload]) - except: - raise PluginException(cause="An unknown error occurred", data=result) - - try: - if result["FailedRequests"]: - raise PluginException( - cause=result["FailedRequests"][0].get("ErrorCode"), - assistance=result["FailedRequests"][0].get("ErrorMessage"), - data=result, - ) - except KeyError: - raise PluginException( - cause="The output did not contain expected keys.", - assistance="Contact support for help.", - data=result, - ) - - try: - if result["PendingRequests"][0].get("ErrorCode"): - raise PluginException( - cause=result["PendingRequests"][0].get("ErrorCode"), - assistance=result["PendingRequests"][0].get("ErrorMessage"), - data=result, - ) - else: - result = { - "id": result["PendingRequests"][0].get("WorkspaceId"), - "state": result["PendingRequests"][0].get("State"), - } - except (IndexError, KeyError): - raise PluginException( - cause="The output did not contain expected keys.", - assistance="Contact support for help.", - data=result, - ) - - return {Output.WORKSPACE_ID_STATE: result} diff --git a/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/schema.py b/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/schema.py deleted file mode 100755 index 278de6579f..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/actions/create_workspace/schema.py +++ /dev/null @@ -1,211 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import komand -import json - - -class Component: - DESCRIPTION = "Create a workspace" - - -class Input: - BUNDLE_ID = "bundle_id" - DIRECTORY_ID = "directory_id" - ROOT_VOLUME_ENCRYPTION_ENABLED = "root_volume_encryption_enabled" - TAGS = "tags" - USER_VOLUME_ENCRYPTION_ENABLED = "user_volume_encryption_enabled" - USERNAME = "username" - VOLUME_ENCRYPTION_KEY = "volume_encryption_key" - WORKSPACE_PROPERTIES = "workspace_properties" - - -class Output: - WORKSPACE_ID_STATE = "workspace_id_state" - - -class CreateWorkspaceInput(komand.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "bundle_id": { - "type": "string", - "title": "Bundle ID", - "description": "The identifier of the bundle for the workspace", - "order": 3 - }, - "directory_id": { - "type": "string", - "title": "Directory ID", - "description": "The identifier of the AWS Directory Service directory for the workspace", - "order": 1 - }, - "root_volume_encryption_enabled": { - "type": "boolean", - "title": "Root Volume Encryption Enabled", - "description": "Flag indicating whether the data stored on the root volume is encrypted", - "order": 6 - }, - "tags": { - "type": "array", - "title": "Tags", - "description": "Tags", - "items": { - "$ref": "#/definitions/tag" - }, - "order": 8 - }, - "user_volume_encryption_enabled": { - "type": "boolean", - "title": "User Volume Encryption Enabled", - "description": "Flag indicating whether the data stored on the user volume is encrypted", - "order": 5 - }, - "username": { - "type": "string", - "title": "Username", - "description": "The username of the user for the workspace", - "order": 2 - }, - "volume_encryption_key": { - "type": "string", - "title": "Volume Encryption Key", - "description": "The KMS key used to encrypt data stored on your workspace", - "order": 4 - }, - "workspace_properties": { - "$ref": "#/definitions/workspace_properties", - "title": "Workspace Properties", - "description": "Workspace properties", - "order": 7 - } - }, - "required": [ - "bundle_id", - "directory_id", - "username" - ], - "definitions": { - "tag": { - "type": "object", - "title": "tag", - "properties": { - "key": { - "type": "string", - "title": "Key", - "description": "The key in a key-value pair of a tag", - "order": 1 - }, - "value": { - "type": "string", - "title": "Value", - "description": "The value in a key-value pair of a tag", - "order": 2 - } - } - }, - "workspace_properties": { - "type": "object", - "title": "workspace_properties", - "properties": { - "compute_type_name": { - "type": "string", - "title": "Compute Type Name", - "description": "Compute type name", - "enum": [ - "VALUE", - "STANDARD", - "PERFORMANCE", - "POWER", - "GRAPHICS", - "POWERPRO", - "GRAPHICSPRO" - ], - "order": 5 - }, - "root_volume_size": { - "type": "integer", - "title": "Root Volume Size", - "description": "Root volume size in gigabytes", - "default": 80, - "order": 3 - }, - "running_mode": { - "type": "string", - "title": "Running Mode", - "description": "Running mode", - "enum": [ - "ALWAYS_ON", - "AUTO_STOP" - ], - "order": 1 - }, - "running_mode_auto_stop_time_out": { - "type": "integer", - "title": "Running Mode Auto Stop Time Out", - "description": "Running mode auto stop time out in minutes. It should be a multiple of 60", - "default": 60, - "order": 2 - }, - "user_volume_size": { - "type": "integer", - "title": "User Volume Size", - "description": "User volume size in gigabytes", - "default": 10, - "order": 4 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class CreateWorkspaceOutput(komand.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "workspace_id_state": { - "$ref": "#/definitions/workspace_id_state", - "title": "Workspace ID and State", - "description": "ID and state of a created workspace", - "order": 1 - } - }, - "required": [ - "workspace_id_state" - ], - "definitions": { - "workspace_id_state": { - "type": "object", - "title": "workspace_id_state", - "properties": { - "id": { - "type": "string", - "title": "ID", - "description": "ID of a created workspace", - "order": 1 - }, - "state": { - "type": "string", - "title": "State", - "description": "Current status of a created workspace", - "order": 2 - } - }, - "required": [ - "id", - "state" - ] - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/aws_workspaces/icon_aws_workspaces/connection/__init__.py b/plugins/aws_workspaces/icon_aws_workspaces/connection/__init__.py deleted file mode 100755 index a515dcf6b0..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/connection/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .connection import Connection diff --git a/plugins/aws_workspaces/icon_aws_workspaces/connection/connection.py b/plugins/aws_workspaces/icon_aws_workspaces/connection/connection.py deleted file mode 100755 index a5298be897..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/connection/connection.py +++ /dev/null @@ -1,35 +0,0 @@ -import komand -from komand.exceptions import ConnectionTestException - -from .schema import ConnectionSchema - -# Custom imports below -import boto3 - - -class Connection(komand.Connection): - def __init__(self): - super(self.__class__, self).__init__(input=ConnectionSchema()) - - def connect(self, params): - self.logger.info("Connecting") - - region = params.get("region", None) - kwargs = { - "aws_access_key_id": params.get("aws_access_key_id").get("secretKey"), - "aws_secret_access_key": params.get("aws_secret_access_key").get("secretKey"), - } - if region: - kwargs["region_name"] = region - - self.aws = boto3.Session(**kwargs) - - def test(self): - try: - self.aws.client("workspaces").describe_workspaces() - except: - raise ConnectionTestException( - cause="AWS Connection was not successful.", assistance="Please check your API key." - ) - - return {"connection": "successful"} diff --git a/plugins/aws_workspaces/icon_aws_workspaces/connection/schema.py b/plugins/aws_workspaces/icon_aws_workspaces/connection/schema.py deleted file mode 100755 index f6cdecebd1..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/connection/schema.py +++ /dev/null @@ -1,66 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import komand -import json - - -class Input: - AWS_ACCESS_KEY_ID = "aws_access_key_id" - AWS_SECRET_ACCESS_KEY = "aws_secret_access_key" - REGION = "region" - - -class ConnectionSchema(komand.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "aws_access_key_id": { - "$ref": "#/definitions/credential_secret_key", - "title": "AWS Access Key ID", - "description": "The ID of the AWS access key to use for authentication", - "order": 1 - }, - "aws_secret_access_key": { - "$ref": "#/definitions/credential_secret_key", - "title": "AWS Secret Access Key", - "description": "The AWS secret access key used for signing requests with the given AWS access key ID", - "order": 2 - }, - "region": { - "type": "string", - "title": "Region", - "description": "The AWS region to use for requests. An example would be us-east-1", - "order": 3 - } - }, - "required": [ - "aws_access_key_id", - "aws_secret_access_key", - "region" - ], - "definitions": { - "credential_secret_key": { - "id": "credential_secret_key", - "type": "object", - "title": "Credential: Secret Key", - "description": "A shared secret key", - "properties": { - "secretKey": { - "type": "string", - "title": "Secret Key", - "displayType": "password", - "description": "The shared secret key", - "format": "password" - } - }, - "required": [ - "secretKey" - ] - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/aws_workspaces/icon_aws_workspaces/triggers/__init__.py b/plugins/aws_workspaces/icon_aws_workspaces/triggers/__init__.py deleted file mode 100755 index bace8db897..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/triggers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/aws_workspaces/icon_aws_workspaces/util/__init__.py b/plugins/aws_workspaces/icon_aws_workspaces/util/__init__.py deleted file mode 100755 index bace8db897..0000000000 --- a/plugins/aws_workspaces/icon_aws_workspaces/util/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/aws_workspaces/plugin.spec.yaml b/plugins/aws_workspaces/plugin.spec.yaml deleted file mode 100644 index 679a64fe59..0000000000 --- a/plugins/aws_workspaces/plugin.spec.yaml +++ /dev/null @@ -1,152 +0,0 @@ -plugin_spec_version: v2 -extension: plugin -products: [insightconnect] -name: aws_workspaces -title: AWS WorkSpaces -vendor: rapid7 -support: community -status: [] -resources: - source_url: https://github.com/rapid7/insightconnect-plugins/tree/master/plugins/aws_workspaces - license_url: https://github.com/rapid7/insightconnect-plugins/blob/master/LICENSE - vendor_url: https://aws.amazon.com -description: Enables creation of workspaces on Amazons WorkSpace service -version: 1.0.1 -tags: -- aws -- workspaces -hub_tags: - use_cases: [application_management] - keywords: [aws, workspaces] - features: [] -types: - workspace_properties: - running_mode: - title: Running Mode - description: Running mode - type: string - required: false - enum: - - ALWAYS_ON - - AUTO_STOP - running_mode_auto_stop_time_out: - title: Running Mode Auto Stop Time Out - description: Running mode auto stop time out in minutes. It should be a multiple of 60 - type: integer - default: 60 - required: false - root_volume_size: - title: Root Volume Size - description: Root volume size in gigabytes - type: integer - default: 80 - required: false - user_volume_size: - title: User Volume Size - description: User volume size in gigabytes - type: integer - default: 10 - required: false - compute_type_name: - title: Compute Type Name - description: Compute type name - type: string - required: false - enum: - - VALUE - - STANDARD - - PERFORMANCE - - POWER - - GRAPHICS - - POWERPRO - - GRAPHICSPRO - tag: - key: - title: Key - description: The key in a key-value pair of a tag - type: string - required: false - value: - title: Value - description: The value in a key-value pair of a tag - type: string - required: false - workspace_id_state: - id: - title: ID - description: ID of a created workspace - type: string - required: true - state: - title: State - description: Current status of a created workspace - type: string - required: true -connection: - aws_access_key_id: - title: AWS Access Key ID - description: The ID of the AWS access key to use for authentication - type: credential_secret_key - required: true - aws_secret_access_key: - title: AWS Secret Access Key - description: The AWS secret access key used for signing requests with the given - AWS access key ID - type: credential_secret_key - required: true - region: - title: Region - description: The AWS region to use for requests. An example would be us-east-1 - type: string - required: true -actions: - create_workspace: - title: Create Workspace - description: Create a workspace - input: - directory_id: - title: Directory ID - description: The identifier of the AWS Directory Service directory for the workspace - type: string - required: true - username: - title: Username - description: The username of the user for the workspace - type: string - required: true - bundle_id: - title: Bundle ID - description: The identifier of the bundle for the workspace - type: string - required: true - volume_encryption_key: - title: Volume Encryption Key - description: The KMS key used to encrypt data stored on your workspace - type: string - required: false - user_volume_encryption_enabled: - title: User Volume Encryption Enabled - description: Flag indicating whether the data stored on the user volume is encrypted - type: boolean - required: false - root_volume_encryption_enabled: - title: Root Volume Encryption Enabled - description: Flag indicating whether the data stored on the root volume is encrypted - type: boolean - required: false - workspace_properties: - title: Workspace Properties - description: Workspace properties - type: workspace_properties - required: false - tags: - title: Tags - description: Tags - type: '[] tag' - required: false - output: - workspace_id_state: - title: Workspace ID and State - description: ID and state of a created workspace - type: workspace_id_state - required: true diff --git a/plugins/aws_workspaces/requirements.txt b/plugins/aws_workspaces/requirements.txt deleted file mode 100755 index 04203397e6..0000000000 --- a/plugins/aws_workspaces/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# List third-party dependencies here, separated by newlines. -# All dependencies must be version-pinned, eg. requests==1.2.0 -# See: https://pip.pypa.io/en/stable/user_guide/#requirements-files -boto3==1.10.4 \ No newline at end of file diff --git a/plugins/aws_workspaces/setup.py b/plugins/aws_workspaces/setup.py deleted file mode 100755 index 825349640e..0000000000 --- a/plugins/aws_workspaces/setup.py +++ /dev/null @@ -1,14 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from setuptools import setup, find_packages - - -setup(name='aws_workspaces-rapid7-plugin', - version='1.0.1', - description='Enables creation of workspaces on Amazons WorkSpace service', - author='rapid7', - author_email='', - url='', - packages=find_packages(), - install_requires=['komand'], # Add third-party dependencies to requirements.txt, not here! - scripts=['bin/icon_aws_workspaces'] - ) diff --git a/plugins/mcafee_atd/.CHECKSUM b/plugins/mcafee_atd/.CHECKSUM deleted file mode 100644 index 8725fbf078..0000000000 --- a/plugins/mcafee_atd/.CHECKSUM +++ /dev/null @@ -1,35 +0,0 @@ -{ - "spec": "e101be9ac73c82cfc016c7987aadd55c", - "manifest": "ac2b326ba7c1cd42773e0bf83ec4dd9e", - "setup": "395cf100fda41cf67dc7d26dbd719ee0", - "schemas": [ - { - "identifier": "check_analysis_status/schema.py", - "hash": "650a0762031f723ff138e5bfc88cc8ca" - }, - { - "identifier": "get_report/schema.py", - "hash": "04022591f52b0cb8207ce930d1780e5a" - }, - { - "identifier": "list_analyzer_profiles/schema.py", - "hash": "3808b26ee4db200c463dfa2fb8e926f8" - }, - { - "identifier": "submit_file/schema.py", - "hash": "ca13b66430aa659edfe162ca647aa67b" - }, - { - "identifier": "submit_hash/schema.py", - "hash": "4fd541cc8eace97d72b1024349b54310" - }, - { - "identifier": "submit_url/schema.py", - "hash": "99fab53d4df4790faaded4bc1a7ef5d5" - }, - { - "identifier": "connection/schema.py", - "hash": "cf3065c44937151471355195862f8271" - } - ] -} \ No newline at end of file diff --git a/plugins/mcafee_atd/.dockerignore b/plugins/mcafee_atd/.dockerignore deleted file mode 100644 index 93dc53fb01..0000000000 --- a/plugins/mcafee_atd/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -unit_test/**/* -unit_test -examples/**/* -examples -tests -tests/**/* -**/*.json -**/*.tar -**/*.gz \ No newline at end of file diff --git a/plugins/mcafee_atd/Dockerfile b/plugins/mcafee_atd/Dockerfile deleted file mode 100644 index 3a3b08f7b8..0000000000 --- a/plugins/mcafee_atd/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM rapid7/insightconnect-python-3-38-plugin:4 -# Refer to the following documentation for available SDK parent images: https://docs.rapid7.com/insightconnect/sdk-guide/#sdk-guide - -LABEL organization=rapid7 -LABEL sdk=python - -# Add any custom package dependencies here -# NOTE: Add pip packages to requirements.txt - -# End package dependencies - -# Add source code -WORKDIR /python/src -ADD ./plugin.spec.yaml /plugin.spec.yaml -ADD . /python/src - -# Install pip dependencies -RUN if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - -# Install plugin -RUN python setup.py build && python setup.py install - -# User to run plugin code. The two supported users are: root, nobody -USER nobody - -ENTRYPOINT ["/usr/local/bin/icon_mcafee_atd"] diff --git a/plugins/mcafee_atd/Makefile b/plugins/mcafee_atd/Makefile deleted file mode 100644 index cb85f96b6c..0000000000 --- a/plugins/mcafee_atd/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# Include other Makefiles for improved functionality -INCLUDE_DIR = ../../tools/Makefiles -MAKEFILES := $(wildcard $(INCLUDE_DIR)/*.mk) -# We can't guarantee customers will have the include files -# - prefix to ignore Makefiles when not present -# https://www.gnu.org/software/make/manual/html_node/Include.html --include $(MAKEFILES) - -ifneq ($(MAKEFILES),) - $(info [$(YELLOW)*$(NORMAL)] Use ``make menu`` for available targets) - $(info [$(YELLOW)*$(NORMAL)] Including available Makefiles: $(MAKEFILES)) - $(info --) -else - $(warning Makefile includes directory not present: $(INCLUDE_DIR)) -endif - -VERSION?=$(shell grep '^version: ' plugin.spec.yaml | sed 's/version: //') -NAME?=$(shell grep '^name: ' plugin.spec.yaml | sed 's/name: //') -VENDOR?=$(shell grep '^vendor: ' plugin.spec.yaml | sed 's/vendor: //') -CWD?=$(shell basename $(PWD)) -_NAME?=$(shell echo $(NAME) | awk '{ print toupper(substr($$0,1,1)) tolower(substr($$0,2)) }') -PKG=$(VENDOR)-$(NAME)-$(VERSION).tar.gz - -# Set default target explicitly. Make's default behavior is the first target in the Makefile. -# We don't want that behavior due to includes which are read first -.DEFAULT_GOAL := default # Make >= v3.80 (make -version) - - -default: image tarball - -tarball: - $(info [$(YELLOW)*$(NORMAL)] Creating plugin tarball) - rm -rf build - rm -rf $(PKG) - tar -cvzf $(PKG) --exclude=$(PKG) --exclude=tests --exclude=run.sh * - -image: - $(info [$(YELLOW)*$(NORMAL)] Building plugin image) - docker build --pull -t $(VENDOR)/$(NAME):$(VERSION) . - docker tag $(VENDOR)/$(NAME):$(VERSION) $(VENDOR)/$(NAME):latest - -regenerate: - $(info [$(YELLOW)*$(NORMAL)] Regenerating schema from plugin.spec.yaml) - icon-plugin generate python --regenerate - -export: image - $(info [$(YELLOW)*$(NORMAL)] Exporting docker image) - @printf "\n ---> Exporting Docker image to ./$(VENDOR)_$(NAME)_$(VERSION).tar\n" - @docker save $(VENDOR)/$(NAME):$(VERSION) | gzip > $(VENDOR)_$(NAME)_$(VERSION).tar - -# Make will not run a target if a file of the same name exists unless setting phony targets -# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: default tarball image regenerate diff --git a/plugins/mcafee_atd/bin/icon_mcafee_atd b/plugins/mcafee_atd/bin/icon_mcafee_atd deleted file mode 100644 index eb2a7ccbf6..0000000000 --- a/plugins/mcafee_atd/bin/icon_mcafee_atd +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -from icon_mcafee_atd import connection, actions, triggers - - -Name = "McAfee Advanced Threat Defense" -Vendor = "rapid7" -Version = "1.5.0" -Description = "McAfee Advanced Threat Defense provides an API framework for external applications to access core McAfeeATD functions through the REST protocol" - - -class ICONMcafeeAtd(insightconnect_plugin_runtime.Plugin): - def __init__(self): - super(self.__class__, self).__init__( - name=Name, - vendor=Vendor, - version=Version, - description=Description, - connection=connection.Connection() - ) - self.add_action(actions.CheckAnalysisStatus()) - - self.add_action(actions.GetReport()) - - self.add_action(actions.ListAnalyzerProfiles()) - - self.add_action(actions.SubmitFile()) - - self.add_action(actions.SubmitHash()) - - self.add_action(actions.SubmitUrl()) - - -def main(): - """Run plugin""" - cli = insightconnect_plugin_runtime.CLI(ICONMcafeeAtd()) - cli.run() - - -if __name__ == "__main__": - main() diff --git a/plugins/mcafee_atd/extension.png b/plugins/mcafee_atd/extension.png deleted file mode 100644 index 324c204fbb9a2a82fddacef76d642a53a8d2f700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12124 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

TT;T;e041Ia+ggiR@q>88_(4`Y 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 diff --git a/plugins/mcafee_atd/icon_mcafee_atd/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/__init__.py deleted file mode 100644 index bace8db897..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/__init__.py deleted file mode 100644 index 45f5512e11..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .check_analysis_status.action import CheckAnalysisStatus -from .get_report.action import GetReport -from .list_analyzer_profiles.action import ListAnalyzerProfiles -from .submit_file.action import SubmitFile -from .submit_hash.action import SubmitHash -from .submit_url.action import SubmitUrl diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/__init__.py deleted file mode 100644 index a48615f8d3..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import CheckAnalysisStatus diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/action.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/action.py deleted file mode 100644 index fa61100500..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/action.py +++ /dev/null @@ -1,27 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import CheckAnalysisStatusInput, CheckAnalysisStatusOutput, Input, Output, Component - - -# Custom imports below - - -class CheckAnalysisStatus(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="check_analysis_status", - description=Component.DESCRIPTION, - input=CheckAnalysisStatusInput(), - output=CheckAnalysisStatusOutput(), - ) - - def run(self, params={}): - status = self.connection.mcafee_atd_api.check_analysis_status( - params.get(Input.ANALYSIS_ID), params.get(Input.TYPE, "task") - ) - success = status.get("success", False) - - if "task" == params.get(Input.TYPE, "task"): - return {Output.SUCCESS: success, Output.RESULTS: status.get("results")} - - del status["success"] - return {Output.SUCCESS: success, Output.JOB_RESULTS: status} diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/schema.py deleted file mode 100644 index 3441ef142e..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/check_analysis_status/schema.py +++ /dev/null @@ -1,212 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Checks the analysis status" - - -class Input: - ANALYSIS_ID = "analysis_id" - TYPE = "type" - - -class Output: - JOB_RESULTS = "job_results" - RESULTS = "results" - SUCCESS = "success" - - -class CheckAnalysisStatusInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "analysis_id": { - "type": "integer", - "title": "Analysis ID", - "description": "Task ID or job ID value which is returned in submission step", - "order": 1 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type of ID, default value is task", - "default": "task", - "enum": [ - "task", - "job" - ], - "order": 2 - } - }, - "required": [ - "analysis_id" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class CheckAnalysisStatusOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "job_results": { - "$ref": "#/definitions/job", - "title": "Job Results", - "description": "Return information about given Job ID", - "order": 3 - }, - "results": { - "$ref": "#/definitions/output", - "title": "Results", - "description": "Return information about given Task ID", - "order": 2 - }, - "success": { - "type": "boolean", - "title": "Success", - "description": "Success status of analysis ID", - "order": 1 - } - }, - "definitions": { - "job": { - "type": "object", - "title": "job", - "properties": { - "allEngineState": { - "type": "integer", - "title": "All Engine State", - "description": "All engine state", - "order": 2 - }, - "severity": { - "type": "integer", - "title": "Severity", - "description": "Severity", - "order": 3 - }, - "status": { - "type": "integer", - "title": "Status", - "description": "Status", - "order": 1 - } - } - }, - "output": { - "type": "object", - "title": "output", - "properties": { - "PEInfo": { - "type": "string", - "title": "PE info", - "description": "PE info", - "order": 13 - }, - "asmListing": { - "type": "string", - "title": "Asm Listing", - "description": "Asm listing", - "order": 12 - }, - "family": { - "type": "string", - "title": "Family", - "description": "Family", - "order": 14 - }, - "filename": { - "type": "string", - "title": "Filename", - "description": "Filename", - "order": 5 - }, - "istate": { - "type": "integer", - "title": "Istate", - "description": "Istate", - "order": 3 - }, - "jobid": { - "type": "integer", - "title": "Job ID", - "description": "Job ID", - "order": 8 - }, - "md5": { - "type": "string", - "title": "MD5", - "description": "MD5", - "order": 6 - }, - "status": { - "type": "string", - "title": "Status", - "description": "Status", - "order": 4 - }, - "submitTime": { - "type": "string", - "title": "Submit Time", - "description": "Submit time", - "order": 9 - }, - "summaryFiles": { - "type": "string", - "title": "Summary Files", - "description": "Summary files", - "order": 10 - }, - "taskid": { - "type": "integer", - "title": "Task ID", - "description": "Task ID", - "order": 2 - }, - "useLogs": { - "type": "string", - "title": "Use Logs", - "description": "Use logs", - "order": 11 - }, - "userid": { - "type": "integer", - "title": "User ID", - "description": "User ID", - "order": 1 - }, - "vmDesc": { - "type": "string", - "title": "VM Desc", - "description": "VM desc", - "order": 16 - }, - "vmName": { - "type": "string", - "title": "VM Name", - "description": "VM name", - "order": 15 - }, - "vmProfile": { - "type": "string", - "title": "VM Profile", - "description": "VM profile", - "order": 7 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/__init__.py deleted file mode 100644 index 7dc323db1b..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import GetReport diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/action.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/action.py deleted file mode 100644 index 84a94a9d66..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/action.py +++ /dev/null @@ -1,33 +0,0 @@ -import insightconnect_plugin_runtime -from insightconnect_plugin_runtime.exceptions import PluginException -from .schema import GetReportInput, GetReportOutput, Input, Output, Component - -# Custom imports below -import base64 - - -class GetReport(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="get_report", - description=Component.DESCRIPTION, - input=GetReportInput(), - output=GetReportOutput(), - ) - - def run(self, params={}): - analyse_id = params.get(Input.ID) - return_type = params.get(Input.REPORT_TYPE, "html").lower() - type_id = params.get(Input.TYPE_ID, "MD5") - if return_type == "sample" and type_id != "TASK ID": - raise PluginException( - cause="Type report error.", - assistance="API allows use SAMPLE only when Type ID is TASK ID. " - "Please check to ensure all parameters are correct.", - ) - - response = self.connection.mcafee_atd_api.get_report(analyse_id, return_type, type_id) - return { - Output.FILE: base64.b64encode(response.content).decode("utf-8"), - Output.REPORT: self.connection.mcafee_atd_api.get_report(analyse_id, "json", type_id).json(), - } diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/schema.py deleted file mode 100644 index a31032bdb2..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/get_report/schema.py +++ /dev/null @@ -1,101 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Download the report of an analysis" - - -class Input: - ID = "id" - REPORT_TYPE = "report_type" - TYPE_ID = "type_id" - - -class Output: - FILE = "file" - REPORT = "report" - - -class GetReportInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "id": { - "type": "string", - "title": "ID", - "description": "The Task ID, job ID, or MD5 value for the prepared analysis report", - "order": 1 - }, - "report_type": { - "type": "string", - "title": "Report Type", - "description": "The file type of the report to return in the file output", - "default": "HTML", - "enum": [ - "HTML", - "TXT", - "ZIP", - "XML", - "IOC", - "STIX", - "PDF", - "SAMPLE" - ], - "order": 3 - }, - "type_id": { - "type": "string", - "title": "Type ID", - "description": "Type of given ID parameter, the type must match the value of the ID field. The default value is MD5", - "default": "MD5", - "enum": [ - "MD5", - "TASK ID", - "JOB ID" - ], - "order": 2 - } - }, - "required": [ - "id" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class GetReportOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "file": { - "type": "string", - "title": "File", - "displayType": "bytes", - "description": "Prepared analysis report", - "format": "bytes", - "order": 1 - }, - "report": { - "type": "object", - "title": "Report", - "description": "Return report in JSON", - "order": 2 - } - }, - "required": [ - "file" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/__init__.py deleted file mode 100644 index 23449df3a9..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import ListAnalyzerProfiles diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/action.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/action.py deleted file mode 100644 index a864932e09..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/action.py +++ /dev/null @@ -1,22 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import ListAnalyzerProfilesInput, ListAnalyzerProfilesOutput, Output, Component - -# Custom imports below -from insightconnect_plugin_runtime import helper - - -class ListAnalyzerProfiles(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="list_analyzer_profiles", - description=Component.DESCRIPTION, - input=ListAnalyzerProfilesInput(), - output=ListAnalyzerProfilesOutput(), - ) - - def run(self, params={}): - result = self.connection.mcafee_atd_api.list_analyzer_profiles() - return { - Output.PROFILER_RESULTS: helper.clean(result.get("results", [])), - Output.SUCCESS: result.get("success", False), - } diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/schema.py deleted file mode 100644 index 06bdc277dd..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/list_analyzer_profiles/schema.py +++ /dev/null @@ -1,401 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Display the analyzer profiles to which the user has access" - - -class Input: - pass - -class Output: - PROFILER_RESULTS = "profiler_results" - SUCCESS = "success" - - -class ListAnalyzerProfilesInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - {} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class ListAnalyzerProfilesOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "profiler_results": { - "type": "array", - "title": "Profiler Results", - "description": "Displays the analyzer profiles, which the user can access", - "items": { - "$ref": "#/definitions/profiler_results" - }, - "order": 1 - }, - "success": { - "type": "boolean", - "title": "Success", - "description": "Returns true if found information about analyzer profiles", - "order": 2 - } - }, - "required": [ - "profiler_results", - "success" - ], - "definitions": { - "profiler_results": { - "type": "object", - "title": "profiler_results", - "properties": { - "artimas": { - "type": "integer", - "title": "Artimas", - "description": "Artimas", - "order": 1 - }, - "asm": { - "type": "integer", - "title": "Asm", - "description": "Asm", - "order": 2 - }, - "aviraAV": { - "type": "integer", - "title": "Avira AV", - "description": "Avira AV", - "order": 3 - }, - "consoleLog": { - "type": "integer", - "title": "Console Log", - "description": "Console log", - "order": 4 - }, - "createTime": { - "type": "string", - "title": "Create Time", - "description": "Create time", - "order": 5 - }, - "customrules": { - "type": "integer", - "title": "Customrules", - "description": "Customrules", - "order": 6 - }, - "default32OSName": { - "type": "string", - "title": "Default 32OS Name", - "description": "Default 32OS name", - "order": 7 - }, - "default64OSName": { - "type": "string", - "title": "Default 64OS Name", - "description": "Default 64OS name", - "order": 8 - }, - "defaultVM": { - "type": "integer", - "title": "Default VM", - "description": "Default VM", - "order": 9 - }, - "dnnEnable": { - "type": "integer", - "title": "DNN Enable", - "description": "DNN enable", - "order": 10 - }, - "dropZip": { - "type": "integer", - "title": "Drop ZIP", - "description": "Drop ZIP", - "order": 11 - }, - "dumpZip": { - "type": "integer", - "title": "Dump ZIP", - "description": "Dump ZIP", - "order": 12 - }, - "family": { - "type": "integer", - "title": "Family", - "description": "Family", - "order": 13 - }, - "filePassword": { - "type": "string", - "title": "File Password", - "description": "File password", - "order": 14 - }, - "filePassword1": { - "type": "string", - "title": "File Password 1", - "description": "File password 1", - "order": 15 - }, - "flp": { - "type": "integer", - "title": "FLP", - "description": "FLP", - "order": 16 - }, - "gam": { - "type": "integer", - "title": "GAM", - "description": "GAM", - "order": 17 - }, - "gml": { - "type": "integer", - "title": "GML", - "description": "GML", - "order": 18 - }, - "gtiTS": { - "type": "integer", - "title": "GTI TS", - "description": "GTI TS", - "order": 19 - }, - "gtiURLRep": { - "type": "integer", - "title": "GTI URL REP", - "description": "GTI URL REP", - "order": 20 - }, - "heuristic": { - "type": "integer", - "title": "Heuristic", - "description": "Heuristic", - "order": 21 - }, - "imageid": { - "type": "integer", - "title": "Image ID", - "description": "Image ID", - "order": 22 - }, - "internet": { - "type": "integer", - "title": "Internet", - "description": "Internet", - "order": 23 - }, - "lastChange": { - "type": "string", - "title": "Last Change", - "description": "Last change", - "order": 24 - }, - "locBlackList": { - "type": "integer", - "title": "Loc Blacklist", - "description": "Loc blacklist", - "order": 25 - }, - "locWhiteList": { - "type": "integer", - "title": "Loc Whitelist", - "description": "Loc whitelist", - "order": 26 - }, - "logZip": { - "type": "integer", - "title": "Log ZIP", - "description": "Log ZIP", - "order": 27 - }, - "maxExecTime": { - "type": "integer", - "title": "Max Exec Time", - "description": "Max exec time", - "order": 28 - }, - "memorydump": { - "type": "integer", - "title": "Memory Dump", - "description": "Memory dump", - "order": 29 - }, - "mfeAV": { - "type": "integer", - "title": "MFE AV", - "description": "MFE AV", - "order": 30 - }, - "minExecTime": { - "type": "integer", - "title": "Min Exec Time", - "description": "Min exec time", - "order": 31 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 32 - }, - "netLog": { - "type": "integer", - "title": "Net Log", - "description": "Net log", - "order": 33 - }, - "netdriveZip": { - "type": "integer", - "title": "Net Drive ZIP", - "description": "Net drive ZIP", - "order": 34 - }, - "noPDF": { - "type": "integer", - "title": "No PDF", - "description": "No PDF", - "order": 35 - }, - "ntvLog": { - "type": "integer", - "title": "Ntv Log", - "description": "Ntv log", - "order": 36 - }, - "openarchive": { - "type": "integer", - "title": "Openarchive", - "description": "Openarchive", - "order": 37 - }, - "overrideOS": { - "type": "integer", - "title": "Override OS", - "description": "Override OS", - "order": 38 - }, - "pe32": { - "type": "integer", - "title": "PE32", - "description": "PE32", - "order": 39 - }, - "reAnalysis": { - "type": "integer", - "title": "Re Analysis", - "description": "Re analysis", - "order": 40 - }, - "recusiveAnalysis": { - "type": "integer", - "title": "Recusive Analysis", - "description": "Recusive analysis", - "order": 41 - }, - "runtimeArgument": { - "type": "string", - "title": "Runtime Argument", - "description": "Runtime argument", - "order": 42 - }, - "sandbox": { - "type": "integer", - "title": "Sandbox", - "description": "Sandbox", - "order": 43 - }, - "selectedOSName": { - "type": "string", - "title": "Selected OS Name", - "description": "Selected OS name", - "order": 44 - }, - "sophosAV": { - "type": "integer", - "title": "Sophos AV", - "description": "Sophos AV", - "order": 45 - }, - "ssAPIid": { - "type": "integer", - "title": "SS API ID", - "description": "SS API ID", - "order": 46 - }, - "ssKeyid": { - "type": "integer", - "title": "SS Key ID", - "description": "SS key ID", - "order": 47 - }, - "ssLevelid": { - "type": "integer", - "title": "SS Level ID", - "description": "SS level ID", - "order": 48 - }, - "summary": { - "type": "integer", - "title": "Summary", - "description": "Summary", - "order": 49 - }, - "userLog": { - "type": "integer", - "title": "User Log", - "description": "User log", - "order": 50 - }, - "userid": { - "type": "integer", - "title": "User ID", - "description": "User ID", - "order": 51 - }, - "vmDesc": { - "type": "string", - "title": "VM Desc", - "description": "VM desc", - "order": 52 - }, - "vmProfileid": { - "type": "integer", - "title": "VM Profileid", - "description": "VM profileid", - "order": 53 - }, - "xMode": { - "type": "integer", - "title": "X Mode", - "description": "X mode", - "order": 54 - }, - "yaraScan": { - "type": "integer", - "title": "Yara Scan", - "description": "Yara scan", - "order": 55 - }, - "yararules": { - "type": "integer", - "title": "Yara Rules", - "description": "Yara rules", - "order": 56 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/__init__.py deleted file mode 100644 index e3b99e6f86..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import SubmitFile diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/action.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/action.py deleted file mode 100644 index a19530b799..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/action.py +++ /dev/null @@ -1,21 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import SubmitFileInput, SubmitFileOutput, Input, Output, Component - -# Custom imports below - - -class SubmitFile(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="submit_file", - description=Component.DESCRIPTION, - input=SubmitFileInput(), - output=SubmitFileOutput(), - ) - - def run(self, params={}): - return { - Output.SUBMIT_FILE_INFO: self.connection.mcafee_atd_api.submit_file( - params.get(Input.FILE), params.get(Input.URL_FOR_FILE) - ) - } diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/schema.py deleted file mode 100644 index ca35e8a399..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_file/schema.py +++ /dev/null @@ -1,297 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Upload file for dynamic analysis" - - -class Input: - FILE = "file" - URL_FOR_FILE = "url_for_file" - - -class Output: - SUBMIT_FILE_INFO = "submit_file_info" - - -class SubmitFileInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "file": { - "$ref": "#/definitions/file", - "title": "File", - "description": "File for analysis", - "order": 1 - }, - "url_for_file": { - "type": "string", - "title": "File URL", - "description": "You can also submit the URL from which the file is downloaded. In this case, a McAfee GTI URL look up is done on the submitted URL in addition to file analysis", - "order": 2 - } - }, - "required": [ - "file" - ], - "definitions": { - "file": { - "id": "file", - "type": "object", - "title": "File", - "description": "File Object", - "properties": { - "content": { - "type": "string", - "title": "Content", - "description": "File contents", - "format": "bytes" - }, - "filename": { - "type": "string", - "title": "Filename", - "description": "Name of file" - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class SubmitFileOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "submit_file_info": { - "$ref": "#/definitions/submit_info", - "title": "Submit File Info", - "description": "Information about submitted file", - "order": 1 - } - }, - "definitions": { - "results": { - "type": "object", - "title": "results", - "properties": { - "cache": { - "type": "integer", - "title": "Cache", - "description": "Cache", - "order": 1 - }, - "destIp": { - "type": "string", - "title": "Destination IP", - "description": "Destination IP", - "order": 2 - }, - "file": { - "type": "string", - "title": "File", - "description": "File", - "order": 3 - }, - "md5": { - "type": "string", - "title": "MD5", - "description": "MD5", - "order": 4 - }, - "messageId": { - "type": "string", - "title": "Message ID", - "description": "Message ID", - "order": 5 - }, - "sha1": { - "type": "string", - "title": "SHA1", - "description": "SHA1", - "order": 6 - }, - "sha256": { - "type": "string", - "title": "SHA256", - "description": "SHA256", - "order": 7 - }, - "size": { - "type": "string", - "title": "Size", - "description": "Size", - "order": 8 - }, - "srcIp": { - "type": "string", - "title": "Source IP", - "description": "Source IP", - "order": 9 - }, - "submitType": { - "type": "string", - "title": "Submit Type", - "description": "Submit type", - "order": 10 - }, - "taskId": { - "type": "integer", - "title": "Task ID", - "description": "Task ID", - "order": 11 - }, - "url": { - "type": "string", - "title": "URL", - "description": "URL", - "order": 12 - } - } - }, - "submit_info": { - "type": "object", - "title": "submit_info", - "properties": { - "estimatedTime": { - "type": "integer", - "title": "Estimated Time", - "description": "Estimated time", - "order": 1 - }, - "fileId": { - "type": "string", - "title": "File ID", - "description": "File ID", - "order": 2 - }, - "filesWait": { - "type": "integer", - "title": "Files Wait", - "description": "Files wait", - "order": 3 - }, - "mimeType": { - "type": "string", - "title": "MIME Type", - "description": "MIME type", - "order": 4 - }, - "results": { - "type": "array", - "title": "Results", - "description": "Results", - "items": { - "$ref": "#/definitions/results" - }, - "order": 5 - }, - "subId": { - "type": "integer", - "title": "Sub ID", - "description": "Sub ID", - "order": 6 - }, - "success": { - "type": "boolean", - "title": "Success", - "description": "Success", - "order": 7 - } - }, - "definitions": { - "results": { - "type": "object", - "title": "results", - "properties": { - "cache": { - "type": "integer", - "title": "Cache", - "description": "Cache", - "order": 1 - }, - "destIp": { - "type": "string", - "title": "Destination IP", - "description": "Destination IP", - "order": 2 - }, - "file": { - "type": "string", - "title": "File", - "description": "File", - "order": 3 - }, - "md5": { - "type": "string", - "title": "MD5", - "description": "MD5", - "order": 4 - }, - "messageId": { - "type": "string", - "title": "Message ID", - "description": "Message ID", - "order": 5 - }, - "sha1": { - "type": "string", - "title": "SHA1", - "description": "SHA1", - "order": 6 - }, - "sha256": { - "type": "string", - "title": "SHA256", - "description": "SHA256", - "order": 7 - }, - "size": { - "type": "string", - "title": "Size", - "description": "Size", - "order": 8 - }, - "srcIp": { - "type": "string", - "title": "Source IP", - "description": "Source IP", - "order": 9 - }, - "submitType": { - "type": "string", - "title": "Submit Type", - "description": "Submit type", - "order": 10 - }, - "taskId": { - "type": "integer", - "title": "Task ID", - "description": "Task ID", - "order": 11 - }, - "url": { - "type": "string", - "title": "URL", - "description": "URL", - "order": 12 - } - } - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/__init__.py deleted file mode 100644 index 6b3785e59a..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import SubmitHash diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/action.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/action.py deleted file mode 100644 index 10d8bf1c80..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/action.py +++ /dev/null @@ -1,28 +0,0 @@ -import insightconnect_plugin_runtime -from insightconnect_plugin_runtime.exceptions import PluginException -from .schema import SubmitHashInput, SubmitHashOutput, Input, Output, Component - -# Custom imports below -import validators - - -class SubmitHash(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="submit_hash", - description=Component.DESCRIPTION, - input=SubmitHashInput(), - output=SubmitHashOutput(), - ) - - def run(self, params={}): - if validators.md5(params.get(Input.HASH)): - return { - Output.SUCCESS: True, - Output.RESULTS: self.connection.mcafee_atd_api.submit_hash(params.get(Input.HASH)), - } - - raise PluginException( - cause="The McAfee ATD API only supports MD5 Hash. ", - assistance="Please enter MD5 Hash and try again.", - ) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/schema.py deleted file mode 100644 index a437b78fd7..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_hash/schema.py +++ /dev/null @@ -1,69 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Check if a MD5 hash is blacklisted or whitelisted" - - -class Input: - HASH = "hash" - - -class Output: - RESULTS = "results" - SUCCESS = "success" - - -class SubmitHashInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "hash": { - "type": "string", - "title": "MD5 Hash", - "description": "MD5 Hash to submit", - "order": 1 - } - }, - "required": [ - "hash" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class SubmitHashOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "results": { - "type": "object", - "title": "Results", - "description": "Return information about given MD5 Hash", - "order": 2 - }, - "success": { - "type": "boolean", - "title": "Success", - "description": "Success status of submit Hash request", - "order": 1 - } - }, - "required": [ - "results", - "success" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/__init__.py deleted file mode 100644 index 1c5ef172f0..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import SubmitUrl diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/action.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/action.py deleted file mode 100644 index 41784455b7..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/action.py +++ /dev/null @@ -1,21 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import SubmitUrlInput, SubmitUrlOutput, Input, Output, Component - -# Custom imports below - - -class SubmitUrl(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="submit_url", - description=Component.DESCRIPTION, - input=SubmitUrlInput(), - output=SubmitUrlOutput(), - ) - - def run(self, params={}): - return { - Output.SUBMIT_URL_INFO: self.connection.mcafee_atd_api.submit_url( - params.get(Input.URL), params.get(Input.SUBMIT_TYPE) - ) - } diff --git a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/schema.py deleted file mode 100644 index 5c645d42ed..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/actions/submit_url/schema.py +++ /dev/null @@ -1,281 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Upload URL for dynamic analysis" - - -class Input: - SUBMIT_TYPE = "submit_type" - URL = "url" - - -class Output: - SUBMIT_URL_INFO = "submit_url_info" - - -class SubmitUrlInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "submit_type": { - "type": "string", - "title": "Submit Type", - "description": "URL to submit for analysis (https://www.example.com) or file to analyze from a URL (e.g. https://www.example.com/PDF/14274les19.pdf)", - "default": "URL submission", - "enum": [ - "URL submission", - "File from URL" - ], - "order": 2 - }, - "url": { - "type": "string", - "title": "URL", - "description": "URL for analysis", - "order": 1 - } - }, - "required": [ - "url" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class SubmitUrlOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "submit_url_info": { - "$ref": "#/definitions/submit_info", - "title": "Submit URL Info", - "description": "Information about submitted URL", - "order": 1 - } - }, - "definitions": { - "results": { - "type": "object", - "title": "results", - "properties": { - "cache": { - "type": "integer", - "title": "Cache", - "description": "Cache", - "order": 1 - }, - "destIp": { - "type": "string", - "title": "Destination IP", - "description": "Destination IP", - "order": 2 - }, - "file": { - "type": "string", - "title": "File", - "description": "File", - "order": 3 - }, - "md5": { - "type": "string", - "title": "MD5", - "description": "MD5", - "order": 4 - }, - "messageId": { - "type": "string", - "title": "Message ID", - "description": "Message ID", - "order": 5 - }, - "sha1": { - "type": "string", - "title": "SHA1", - "description": "SHA1", - "order": 6 - }, - "sha256": { - "type": "string", - "title": "SHA256", - "description": "SHA256", - "order": 7 - }, - "size": { - "type": "string", - "title": "Size", - "description": "Size", - "order": 8 - }, - "srcIp": { - "type": "string", - "title": "Source IP", - "description": "Source IP", - "order": 9 - }, - "submitType": { - "type": "string", - "title": "Submit Type", - "description": "Submit type", - "order": 10 - }, - "taskId": { - "type": "integer", - "title": "Task ID", - "description": "Task ID", - "order": 11 - }, - "url": { - "type": "string", - "title": "URL", - "description": "URL", - "order": 12 - } - } - }, - "submit_info": { - "type": "object", - "title": "submit_info", - "properties": { - "estimatedTime": { - "type": "integer", - "title": "Estimated Time", - "description": "Estimated time", - "order": 1 - }, - "fileId": { - "type": "string", - "title": "File ID", - "description": "File ID", - "order": 2 - }, - "filesWait": { - "type": "integer", - "title": "Files Wait", - "description": "Files wait", - "order": 3 - }, - "mimeType": { - "type": "string", - "title": "MIME Type", - "description": "MIME type", - "order": 4 - }, - "results": { - "type": "array", - "title": "Results", - "description": "Results", - "items": { - "$ref": "#/definitions/results" - }, - "order": 5 - }, - "subId": { - "type": "integer", - "title": "Sub ID", - "description": "Sub ID", - "order": 6 - }, - "success": { - "type": "boolean", - "title": "Success", - "description": "Success", - "order": 7 - } - }, - "definitions": { - "results": { - "type": "object", - "title": "results", - "properties": { - "cache": { - "type": "integer", - "title": "Cache", - "description": "Cache", - "order": 1 - }, - "destIp": { - "type": "string", - "title": "Destination IP", - "description": "Destination IP", - "order": 2 - }, - "file": { - "type": "string", - "title": "File", - "description": "File", - "order": 3 - }, - "md5": { - "type": "string", - "title": "MD5", - "description": "MD5", - "order": 4 - }, - "messageId": { - "type": "string", - "title": "Message ID", - "description": "Message ID", - "order": 5 - }, - "sha1": { - "type": "string", - "title": "SHA1", - "description": "SHA1", - "order": 6 - }, - "sha256": { - "type": "string", - "title": "SHA256", - "description": "SHA256", - "order": 7 - }, - "size": { - "type": "string", - "title": "Size", - "description": "Size", - "order": 8 - }, - "srcIp": { - "type": "string", - "title": "Source IP", - "description": "Source IP", - "order": 9 - }, - "submitType": { - "type": "string", - "title": "Submit Type", - "description": "Submit type", - "order": 10 - }, - "taskId": { - "type": "integer", - "title": "Task ID", - "description": "Task ID", - "order": 11 - }, - "url": { - "type": "string", - "title": "URL", - "description": "URL", - "order": 12 - } - } - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/connection/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/connection/__init__.py deleted file mode 100644 index a515dcf6b0..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/connection/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .connection import Connection diff --git a/plugins/mcafee_atd/icon_mcafee_atd/connection/connection.py b/plugins/mcafee_atd/icon_mcafee_atd/connection/connection.py deleted file mode 100644 index fa7bb63343..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/connection/connection.py +++ /dev/null @@ -1,32 +0,0 @@ -import insightconnect_plugin_runtime - -# Custom imports below -from .schema import ConnectionSchema, Input -from ..util.api import McAfeeATDAPI -from ..util.mcafee_request import McAfeeRequest - - -class Connection(insightconnect_plugin_runtime.Connection): - def __init__(self): - super(self.__class__, self).__init__(input=ConnectionSchema()) - self.authentication_header = None - self.mcafee_atd_api = None - - def connect(self, params={}): - self.logger.info("Connect: Connecting...") - credentials = params.get(Input.CREDENTIALS) - - self.mcafee_atd_api = McAfeeATDAPI( - McAfeeRequest( - params.get(Input.URL).rstrip("/"), - params.get(Input.PORT, 443), - params.get(Input.VERIFY_SSL, True), - self.logger, - ), - credentials.get("username"), - credentials.get("password"), - self.logger, - ) - - def test(self): - return {"success": self.mcafee_atd_api.get_login_headers().get("VE-SDK-API") is not None} diff --git a/plugins/mcafee_atd/icon_mcafee_atd/connection/schema.py b/plugins/mcafee_atd/icon_mcafee_atd/connection/schema.py deleted file mode 100644 index 246f85bbf9..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/connection/schema.py +++ /dev/null @@ -1,82 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Input: - CREDENTIALS = "credentials" - PORT = "port" - URL = "url" - VERIFY_SSL = "verify_ssl" - - -class ConnectionSchema(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "credentials": { - "$ref": "#/definitions/credential_username_password", - "title": "Credentials", - "description": "Username and password", - "order": 2 - }, - "port": { - "type": "integer", - "title": "Port", - "description": "The port number for provided host", - "default": 443, - "order": 4 - }, - "url": { - "type": "string", - "title": "URL", - "description": "Base URL for the McAfee Advanced Threat Defense server", - "order": 1 - }, - "verify_ssl": { - "type": "boolean", - "title": "Verify TLS/SSL", - "description": "Verify the server's TLS/SSL certificate", - "default": true, - "order": 3 - } - }, - "required": [ - "credentials", - "url" - ], - "definitions": { - "credential_username_password": { - "id": "credential_username_password", - "type": "object", - "title": "Credential: Username and Password", - "description": "A username and password combination", - "properties": { - "password": { - "type": "string", - "title": "Password", - "displayType": "password", - "description": "The password", - "format": "password", - "order": 2 - }, - "username": { - "type": "string", - "title": "Username", - "description": "The username to log in with", - "order": 1 - } - }, - "required": [ - "username", - "password" - ] - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/triggers/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/triggers/__init__.py deleted file mode 100644 index bace8db897..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/triggers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/mcafee_atd/icon_mcafee_atd/util/__init__.py b/plugins/mcafee_atd/icon_mcafee_atd/util/__init__.py deleted file mode 100644 index bace8db897..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/util/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/mcafee_atd/icon_mcafee_atd/util/api.py b/plugins/mcafee_atd/icon_mcafee_atd/util/api.py deleted file mode 100644 index f2191c152e..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/util/api.py +++ /dev/null @@ -1,125 +0,0 @@ -from insightconnect_plugin_runtime.exceptions import PluginException, ConnectionTestException -import json -import base64 -from .mcafee_request import McAfeeRequest - - -class McAfeeATDAPI: - def __init__(self, mc_afee_request: McAfeeRequest, username: str, password: str, logger: object): - self.mc_afee_request = mc_afee_request - self.username = username - self.password = password - self.logger = logger - self.STATUSES = { - "w": "Whitelisted", - "b": "Blacklisted", - "0": "Not found", - "j": "Previously submitted", - "Invalid input data": "Invalid hash value", - } - - def get_report(self, id: str, return_type: str, type_id: str): - param = "md5" - if type_id == "TASK ID": - param = "iTaskId" - elif type_id == "JOB ID": - param = "jobId" - - return self._make_login_request( - "GET", "showreport.php", params={param: id, "iType": return_type}, full_response=True - ) - - def list_analyzer_profiles(self): - return self._make_login_request("GET", "vmprofiles.php") - - def submit_file(self, file: dict, url_for_file: str) -> dict: - type_number = "0" - if url_for_file: - type_number = "2" - return self._make_login_request( - "POST", - "fileupload.php", - json_data={"data": json.dumps({"data": {"url": url_for_file, "submitType": type_number}})}, - files={"amas_filename": base64.decodebytes(file.get("content").encode("utf-8"))}, - ) - - def submit_url(self, url: str, submit_type: str) -> dict: - number_type = "1" - if submit_type == "File from URL": - number_type = "3" - return self._make_login_request( - "POST", - "fileupload.php", - {"data": json.dumps({"data": {"url": url, "submitType": number_type}})}, - ) - - def check_analysis_status(self, task_id: int, type: str): - param = "iTaskId" - if "job" == type: - param = "jobId" - - return self._make_login_request("GET", "samplestatus.php", params={param: task_id}) - - def submit_hash(self, md5_hash: str): - submit_hash = self._make_login_request("POST", "atdHashLookup.php", {"data": json.dumps({"md5": md5_hash})}) - - if not submit_hash.get("success", False): - raise PluginException( - cause="Unknown error occurred. ", - assistance="Please contact support or try again later.", - ) - - results = {} - statuses = submit_hash.get("results", {}) - for submitted_hash, status in statuses.items(): - results[submitted_hash.lower()] = self.STATUSES.get(status, status) - - return results - - def _get_login_headers(self): - session_response = self.mc_afee_request.make_json_request( - "POST", - "session.php", - headers={ - "Accept": "application/vnd.ve.v1.0+json", - "Content-Type": "application/json", - "VE-SDK-API": base64.encodebytes(f"{self.username}:{self.password}".encode()).decode("utf-8").rstrip(), - }, - ) - - if session_response.get("success", False): - session = session_response.get("results", {}).get("session") - user_id = session_response.get("results", {}).get("userId") - return { - "Accept": "application/vnd.ve.v1.0+json", - "VE-SDK-API": base64.encodebytes(f"{session}:{user_id}".encode()).decode("utf-8").rstrip(), - } - - raise ConnectionTestException(ConnectionTestException.Preset.USERNAME_PASSWORD) - - def _make_login_request( - self, - method: str, - path: str, - json_data: dict = None, - params: dict = None, - files: dict = None, - full_response: bool = False, - ): - headers = None - try: - headers = self._get_login_headers() - response = self.mc_afee_request.make_json_request( - method, - path, - params=params, - data=json_data, - files=files, - headers=headers, - full_response=full_response, - ) - return response - except ConnectionTestException as e: - raise PluginException(cause=e.cause, assistance=e.assistance, data=e.data) - finally: - self.mc_afee_request.make_json_request("DELETE", "session.php", headers=headers) diff --git a/plugins/mcafee_atd/icon_mcafee_atd/util/mcafee_request.py b/plugins/mcafee_atd/icon_mcafee_atd/util/mcafee_request.py deleted file mode 100644 index bc689a3381..0000000000 --- a/plugins/mcafee_atd/icon_mcafee_atd/util/mcafee_request.py +++ /dev/null @@ -1,51 +0,0 @@ -import requests -from insightconnect_plugin_runtime.exceptions import PluginException -import json - - -class McAfeeRequest: - def __init__(self, url: str, port: int, verify_ssl: bool, logger: object): - self.url = f"{url}:{str(port)}/php" - self.verify_ssl = verify_ssl - self.logger = logger - - def make_json_request( - self, - method, - path, - params=None, - data=None, - headers=None, - files=None, - full_response: bool = False, - ): - response = {"text": ""} - - try: - response = requests.request( - method, - f"{self.url}/{path}", - data=data, - params=params, - files=files, - headers=headers, - verify=self.verify_ssl, - ) - - if response.status_code == 403: - raise PluginException(preset=PluginException.Preset.API_KEY) - if response.status_code >= 400: - raise PluginException(preset=PluginException.Preset.UNKNOWN, data=response.text) - if 200 <= response.status_code < 300: - if full_response: - return response - - return response.json() - - raise PluginException(preset=PluginException.Preset.UNKNOWN, data=response.text) - except json.decoder.JSONDecodeError as e: - self.logger.info(f"Invalid JSON: {e}") - raise PluginException(preset=PluginException.Preset.INVALID_JSON, data=response.text) - except requests.exceptions.HTTPError as e: - self.logger.info(f"Call to McAfee ATD API failed: {e}") - raise PluginException(preset=PluginException.Preset.UNKNOWN, data=response.text) diff --git a/plugins/mcafee_atd/plugin.spec.yaml b/plugins/mcafee_atd/plugin.spec.yaml deleted file mode 100644 index 38a9fc6739..0000000000 --- a/plugins/mcafee_atd/plugin.spec.yaml +++ /dev/null @@ -1,693 +0,0 @@ -plugin_spec_version: v2 -extension: plugin -products: [insightconnect] -name: mcafee_atd -title: McAfee Advanced Threat Defense -description: McAfee Advanced Threat Defense provides an API framework for external applications to access core McAfeeATD functions through the REST protocol -version: 1.5.0 -vendor: rapid7 -support: rapid7 -status: [] -resources: - source_url: https://github.com/rapid7/insightconnect-plugins/tree/master/plugins/mcafee_atd - license_url: https://github.com/rapid7/insightconnect-plugins/blob/master/LICENSE - vendor_url: https://www.mcafee.com -tags: - - mcafee - - atd - - advanced - - threat - - defense -hub_tags: - use_cases: [threat_detection_and_response, reporting_and_analytics] - keywords: [mcafee, atd, advanced, threat, defense] - features: [] -types: - output: - userid: - title: User ID - type: integer - description: User ID - required: false - taskid: - title: Task ID - type: integer - description: Task ID - required: false - istate: - title: Istate - type: integer - description: Istate - required: false - status: - title: Status - type: string - description: Status - required: false - filename: - title: Filename - type: string - description: Filename - required: false - md5: - title: MD5 - type: string - description: MD5 - required: false - vmProfile: - title: VM Profile - type: string - description: VM profile - required: false - jobid: - title: Job ID - type: integer - description: Job ID - required: false - submitTime: - title: Submit Time - type: string - description: Submit time - required: false - summaryFiles: - title: Summary Files - type: string - description: Summary files - required: false - useLogs: - title: Use Logs - type: string - description: Use logs - required: false - asmListing: - title: Asm Listing - type: string - description: Asm listing - required: false - PEInfo: - title: PE info - type: string - description: PE info - required: false - family: - title: Family - type: string - description: Family - required: false - vmName: - title: VM Name - type: string - description: VM name - required: false - vmDesc: - title: VM Desc - type: string - description: VM desc - required: false - job: - status: - title: Status - type: integer - description: Status - required: false - allEngineState: - title: All Engine State - type: integer - description: All engine state - required: false - severity: - title: Severity - type: integer - description: Severity - required: false - results: - cache: - title: Cache - type: integer - description: Cache - required: false - destIp: - title: Destination IP - type: string - description: Destination IP - required: false - file: - title: File - type: string - description: File - required: false - md5: - title: MD5 - type: string - description: MD5 - required: false - messageId: - title: Message ID - type: string - description: Message ID - required: false - sha1: - title: SHA1 - type: string - description: SHA1 - required: false - sha256: - title: SHA256 - type: string - description: SHA256 - required: false - size: - title: Size - type: string - description: Size - required: false - srcIp: - title: Source IP - type: string - description: Source IP - required: false - submitType: - title: Submit Type - type: string - description: Submit type - required: false - taskId: - title: Task ID - type: integer - description: Task ID - required: false - url: - title: URL - type: string - description: URL - required: false - submit_info: - estimatedTime: - title: Estimated Time - type: integer - description: Estimated time - required: false - fileId: - title: File ID - type: string - description: File ID - required: false - filesWait: - title: Files Wait - type: integer - description: Files wait - required: false - mimeType: - title: MIME Type - type: string - description: MIME type - required: false - results: - title: Results - type: "[]results" - description: Results - required: false - subId: - title: Sub ID - type: integer - description: Sub ID - required: false - success: - title: Success - type: boolean - description: Success - required: false - profiler_results: - artimas: - title: Artimas - type: integer - description: Artimas - required: false - asm: - title: Asm - type: integer - description: Asm - required: false - aviraAV: - title: Avira AV - type: integer - description: Avira AV - required: false - consoleLog: - title: Console Log - type: integer - description: Console log - required: false - createTime: - title: Create Time - type: string - description: Create time - required: false - customrules: - title: Customrules - type: integer - description: Customrules - required: false - default32OSName: - title: Default 32OS Name - type: string - description: Default 32OS name - required: false - default64OSName: - title: Default 64OS Name - type: string - description: Default 64OS name - required: false - defaultVM: - title: Default VM - type: integer - description: Default VM - required: false - dnnEnable: - title: DNN Enable - type: integer - description: DNN enable - required: false - dropZip: - title: Drop ZIP - type: integer - description: Drop ZIP - required: false - dumpZip: - title: Dump ZIP - type: integer - description: Dump ZIP - required: false - family: - title: Family - type: integer - description: Family - required: false - filePassword: - title: File Password - type: string - description: File password - required: false - filePassword1: - title: File Password 1 - type: string - description: File password 1 - required: false - flp: - title: FLP - type: integer - description: FLP - required: false - gam: - title: GAM - type: integer - description: GAM - required: false - gml: - title: GML - type: integer - description: GML - required: false - gtiTS: - title: GTI TS - type: integer - description: GTI TS - required: false - gtiURLRep: - title: GTI URL REP - type: integer - description: GTI URL REP - required: false - heuristic: - title: Heuristic - type: integer - description: Heuristic - required: false - imageid: - title: Image ID - type: integer - description: Image ID - required: false - internet: - title: Internet - type: integer - description: Internet - required: false - lastChange: - title: Last Change - type: string - description: Last change - required: false - locBlackList: - title: Loc Blacklist - type: integer - description: Loc blacklist - required: false - locWhiteList: - title: Loc Whitelist - type: integer - description: Loc whitelist - required: false - logZip: - title: Log ZIP - type: integer - description: Log ZIP - required: false - maxExecTime: - title: Max Exec Time - type: integer - description: Max exec time - required: false - memorydump: - title: Memory Dump - type: integer - description: Memory dump - required: false - mfeAV: - title: MFE AV - type: integer - description: MFE AV - required: false - minExecTime: - title: Min Exec Time - type: integer - description: Min exec time - required: false - name: - title: Name - type: string - description: Name - required: false - netLog: - title: Net Log - type: integer - description: Net log - required: false - netdriveZip: - title: Net Drive ZIP - type: integer - description: Net drive ZIP - required: false - noPDF: - title: No PDF - type: integer - description: No PDF - required: false - ntvLog: - title: Ntv Log - type: integer - description: Ntv log - required: false - openarchive: - title: Openarchive - type: integer - description: Openarchive - required: false - overrideOS: - title: Override OS - type: integer - description: Override OS - required: false - pe32: - title: PE32 - type: integer - description: PE32 - required: false - reAnalysis: - title: Re Analysis - type: integer - description: Re analysis - required: false - recusiveAnalysis: - title: Recusive Analysis - type: integer - description: Recusive analysis - required: false - runtimeArgument: - title: Runtime Argument - type: string - description: Runtime argument - required: false - sandbox: - title: Sandbox - type: integer - description: Sandbox - required: false - selectedOSName: - title: Selected OS Name - type: string - description: Selected OS name - required: false - sophosAV: - title: Sophos AV - type: integer - description: Sophos AV - required: false - ssAPIid: - title: SS API ID - type: integer - description: SS API ID - required: false - ssKeyid: - title: SS Key ID - type: integer - description: SS key ID - required: false - ssLevelid: - title: SS Level ID - type: integer - description: SS level ID - required: false - summary: - title: Summary - type: integer - description: Summary - required: false - userLog: - title: User Log - type: integer - description: User log - required: false - userid: - title: User ID - type: integer - description: User ID - required: false - vmDesc: - title: VM Desc - type: string - description: VM desc - required: false - vmProfileid: - title: VM Profileid - type: integer - description: VM profileid - required: false - xMode: - title: X Mode - type: integer - description: X mode - required: false - yaraScan: - title: Yara Scan - type: integer - description: Yara scan - required: false - yararules: - title: Yara Rules - type: integer - description: Yara rules - required: false -connection: - url: - title: URL - description: Base URL for the McAfee Advanced Threat Defense server - type: string - required: true - example: https://www.example.com - credentials: - title: Credentials - description: Username and password - type: credential_username_password - required: true - example: '{"username":"user1", "password":"mypassword"}' - verify_ssl: - title: Verify TLS/SSL - type: boolean - description: Verify the server's TLS/SSL certificate - default: true - required: false - example: true - port: - title: Port - description: The port number for provided host - type: integer - default: 443 - required: false - example: 443 -actions: - submit_hash: - title: Check Hash Status - description: Check if a MD5 hash is blacklisted or whitelisted - input: - hash: - title: MD5 Hash - description: MD5 Hash to submit - type: string - required: true - example: 9de5069c5afe602b2ea0a04b66beb2c0 - output: - success: - title: Success - description: Success status of submit Hash request - type: boolean - required: true - results: - title: Results - description: Return information about given MD5 Hash - type: object - required: true - check_analysis_status: - title: Check Analysis Status - description: Checks the analysis status - input: - analysis_id: - title: Analysis ID - description: Task ID or job ID value which is returned in submission step - type: integer - required: true - example: 13 - type: - title: Type - description: Type of ID, default value is task - type: string - required: false - default: task - enum: - - task - - job - output: - success: - title: Success - description: Success status of analysis ID - type: boolean - required: false - results: - title: Results - description: Return information about given Task ID - type: output - required: false - job_results: - title: Job Results - description: Return information about given Job ID - type: job - required: false - submit_url: - title: Submit URL - description: Upload URL for dynamic analysis - input: - url: - title: URL - description: URL for analysis - type: string - required: true - example: https://www.example.com - submit_type: - title: Submit Type - description: URL to submit for analysis (https://www.example.com) or file to analyze from a URL (e.g. https://www.example.com/PDF/14274les19.pdf) - type: string - required: false - default: URL submission - enum: - - URL submission - - File from URL - output: - submit_url_info: - title: Submit URL Info - description: Information about submitted URL - type: submit_info - required: false - submit_file: - title: Submit File - description: Upload file for dynamic analysis - input: - file: - title: File - description: File for analysis - type: file - required: true - example: '{"filename": "setup.exe", "content": "UmFwaWQ3IEluc2lnaHRDb25uZWN0Cg=="}' - url_for_file: - title: File URL - description: You can also submit the URL from which the file is downloaded. In this case, a McAfee GTI URL look up is done on the submitted URL in addition to file analysis - type: string - required: false - example: https://www.example.com/download/latest - output: - submit_file_info: - title: Submit File Info - description: Information about submitted file - type: submit_info - required: false - list_analyzer_profiles: - title: List Analyzer Profiles - description: Display the analyzer profiles to which the user has access - output: - profiler_results: - title: Profiler Results - description: Displays the analyzer profiles, which the user can access - type: "[]profiler_results" - required: true - success: - title: Success - description: Returns true if found information about analyzer profiles - type: boolean - required: true - get_report: - title: Get Report - description: Download the report of an analysis - input: - id: - title: ID - description: The Task ID, job ID, or MD5 value for the prepared analysis report - type: string - required: true - example: 13 - type_id: - title: Type ID - description: Type of given ID parameter, the type must match the value of the ID field. The default value is MD5 - type: string - required: false - default: MD5 - example: TASK ID - enum: - - MD5 - - TASK ID - - JOB ID - report_type: - title: Report Type - description: The file type of the report to return in the file output - type: string - required: false - default: HTML - example: HTML - enum: - - HTML - - TXT - - ZIP - - XML - - IOC - - STIX - - PDF - - SAMPLE - output: - file: - title: File - description: Prepared analysis report - type: bytes - required: true - report: - title: Report - description: Return report in JSON - type: object - required: false diff --git a/plugins/mcafee_atd/requirements.txt b/plugins/mcafee_atd/requirements.txt deleted file mode 100644 index 0aa2d806e0..0000000000 --- a/plugins/mcafee_atd/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# List third-party dependencies here, separated by newlines. -# All dependencies must be version-pinned, eg. requests==1.2.0 -# See: https://pip.pypa.io/en/stable/user_guide/#requirements-files -validators==0.15.0 \ No newline at end of file diff --git a/plugins/mcafee_atd/setup.py b/plugins/mcafee_atd/setup.py deleted file mode 100644 index 0a12456676..0000000000 --- a/plugins/mcafee_atd/setup.py +++ /dev/null @@ -1,14 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from setuptools import setup, find_packages - - -setup(name="mcafee_atd-rapid7-plugin", - version="1.5.0", - description="McAfee Advanced Threat Defense provides an API framework for external applications to access core McAfeeATD functions through the REST protocol", - author="rapid7", - author_email="", - url="", - packages=find_packages(), - install_requires=['insightconnect-plugin-runtime'], # Add third-party dependencies to requirements.txt, not here! - scripts=['bin/icon_mcafee_atd'] - ) diff --git a/plugins/sonicwall_capture_client/.CHECKSUM b/plugins/sonicwall_capture_client/.CHECKSUM deleted file mode 100644 index 0125d4bcb7..0000000000 --- a/plugins/sonicwall_capture_client/.CHECKSUM +++ /dev/null @@ -1,15 +0,0 @@ -{ - "spec": "a9acc2509e0e39df64c05035d14111b2", - "manifest": "5096b5a5be7203dc2983723837ffc8c3", - "setup": "9a27e7de615d6b9fc57d5593611ebac4", - "schemas": [ - { - "identifier": "get_agent_details/schema.py", - "hash": "a3014f4f47d3b31e4d6b20eedea4985f" - }, - { - "identifier": "connection/schema.py", - "hash": "efaf899d805cc6ca326a5b945276275b" - } - ] -} \ No newline at end of file diff --git a/plugins/sonicwall_capture_client/.dockerignore b/plugins/sonicwall_capture_client/.dockerignore deleted file mode 100644 index 93dc53fb01..0000000000 --- a/plugins/sonicwall_capture_client/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -unit_test/**/* -unit_test -examples/**/* -examples -tests -tests/**/* -**/*.json -**/*.tar -**/*.gz \ No newline at end of file diff --git a/plugins/sonicwall_capture_client/Dockerfile b/plugins/sonicwall_capture_client/Dockerfile deleted file mode 100644 index 1e28bc3373..0000000000 --- a/plugins/sonicwall_capture_client/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM rapid7/insightconnect-python-3-38-plugin:4 -# Refer to the following documentation for available SDK parent images: https://docs.rapid7.com/insightconnect/sdk-guide/#sdk-guide - -LABEL organization=rapid7 -LABEL sdk=python - -# Add any custom package dependencies here -# NOTE: Add pip packages to requirements.txt - -# End package dependencies - -# Add source code -WORKDIR /python/src -ADD ./plugin.spec.yaml /plugin.spec.yaml -ADD . /python/src - -# Install pip dependencies -RUN if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - -# Install plugin -RUN python setup.py build && python setup.py install - -# User to run plugin code. The two supported users are: root, nobody -USER nobody - -ENTRYPOINT ["/usr/local/bin/icon_sonicwall_capture_client"] diff --git a/plugins/sonicwall_capture_client/Makefile b/plugins/sonicwall_capture_client/Makefile deleted file mode 100644 index cb85f96b6c..0000000000 --- a/plugins/sonicwall_capture_client/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# Include other Makefiles for improved functionality -INCLUDE_DIR = ../../tools/Makefiles -MAKEFILES := $(wildcard $(INCLUDE_DIR)/*.mk) -# We can't guarantee customers will have the include files -# - prefix to ignore Makefiles when not present -# https://www.gnu.org/software/make/manual/html_node/Include.html --include $(MAKEFILES) - -ifneq ($(MAKEFILES),) - $(info [$(YELLOW)*$(NORMAL)] Use ``make menu`` for available targets) - $(info [$(YELLOW)*$(NORMAL)] Including available Makefiles: $(MAKEFILES)) - $(info --) -else - $(warning Makefile includes directory not present: $(INCLUDE_DIR)) -endif - -VERSION?=$(shell grep '^version: ' plugin.spec.yaml | sed 's/version: //') -NAME?=$(shell grep '^name: ' plugin.spec.yaml | sed 's/name: //') -VENDOR?=$(shell grep '^vendor: ' plugin.spec.yaml | sed 's/vendor: //') -CWD?=$(shell basename $(PWD)) -_NAME?=$(shell echo $(NAME) | awk '{ print toupper(substr($$0,1,1)) tolower(substr($$0,2)) }') -PKG=$(VENDOR)-$(NAME)-$(VERSION).tar.gz - -# Set default target explicitly. Make's default behavior is the first target in the Makefile. -# We don't want that behavior due to includes which are read first -.DEFAULT_GOAL := default # Make >= v3.80 (make -version) - - -default: image tarball - -tarball: - $(info [$(YELLOW)*$(NORMAL)] Creating plugin tarball) - rm -rf build - rm -rf $(PKG) - tar -cvzf $(PKG) --exclude=$(PKG) --exclude=tests --exclude=run.sh * - -image: - $(info [$(YELLOW)*$(NORMAL)] Building plugin image) - docker build --pull -t $(VENDOR)/$(NAME):$(VERSION) . - docker tag $(VENDOR)/$(NAME):$(VERSION) $(VENDOR)/$(NAME):latest - -regenerate: - $(info [$(YELLOW)*$(NORMAL)] Regenerating schema from plugin.spec.yaml) - icon-plugin generate python --regenerate - -export: image - $(info [$(YELLOW)*$(NORMAL)] Exporting docker image) - @printf "\n ---> Exporting Docker image to ./$(VENDOR)_$(NAME)_$(VERSION).tar\n" - @docker save $(VENDOR)/$(NAME):$(VERSION) | gzip > $(VENDOR)_$(NAME)_$(VERSION).tar - -# Make will not run a target if a file of the same name exists unless setting phony targets -# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: default tarball image regenerate diff --git a/plugins/sonicwall_capture_client/bin/icon_sonicwall_capture_client b/plugins/sonicwall_capture_client/bin/icon_sonicwall_capture_client deleted file mode 100644 index 6e11f1ccdb..0000000000 --- a/plugins/sonicwall_capture_client/bin/icon_sonicwall_capture_client +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -# GENERATED BY KOMAND SDK - DO NOT EDIT -import os -import json -from sys import argv - -Name = "SonicWall Capture Client" -Vendor = "rapid7" -Version = "1.0.1" -Description = "SonicWall Capture Client is a unified client platform that delivers multiple endpoint protection capabilities, including next-generation malware protection and application vulnerability intelligence" - - -def main(): - if 'http' in argv: - if os.environ.get("GUNICORN_CONFIG_FILE"): - with open(os.environ.get("GUNICORN_CONFIG_FILE")) as gf: - gunicorn_cfg = json.load(gf) - if gunicorn_cfg.get("worker_class", "sync") == "gevent": - from gevent import monkey - monkey.patch_all() - elif 'gevent' in argv: - from gevent import monkey - monkey.patch_all() - - import insightconnect_plugin_runtime - from icon_sonicwall_capture_client import connection, actions, triggers - - class ICONSonicwallCaptureClient(insightconnect_plugin_runtime.Plugin): - def __init__(self): - super(self.__class__, self).__init__( - name=Name, - vendor=Vendor, - version=Version, - description=Description, - connection=connection.Connection() - ) - self.add_action(actions.GetAgentDetails()) - - - """Run plugin""" - cli = insightconnect_plugin_runtime.CLI(ICONSonicwallCaptureClient()) - cli.run() - - -if __name__ == "__main__": - main() diff --git a/plugins/sonicwall_capture_client/extension.png b/plugins/sonicwall_capture_client/extension.png deleted file mode 100644 index 12cb2a8d6a10a84868c475424c8274a019d2c59a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29872 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 diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/__init__.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/__init__.py deleted file mode 100644 index bace8db897..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/__init__.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/__init__.py deleted file mode 100644 index 2af779fac9..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .get_agent_details.action import GetAgentDetails diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/__init__.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/__init__.py deleted file mode 100644 index 5c8ec82e32..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import GetAgentDetails diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/action.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/action.py deleted file mode 100644 index 0ccd2c241c..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/action.py +++ /dev/null @@ -1,64 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import GetAgentDetailsInput, GetAgentDetailsOutput, Input, Output, Component - -# Custom imports below -from insightconnect_plugin_runtime.exceptions import PluginException - - -class GetAgentDetails(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="get_agent_details", - description=Component.DESCRIPTION, - input=GetAgentDetailsInput(), - output=GetAgentDetailsOutput(), - ) - - def run(self, params={}): - all_endpoints = self.connection.client.get_endpoints_list() - agent = params.get(Input.AGENT) - searched_agents = [] - - for e in all_endpoints: - if self._is_agent_found(agent, e): - searched_agents.append(e) - - if len(searched_agents) > 1: - self.logger.info( - f"Multiple agents found that matched the query: {searched_agents}." f"We will act upon the first match." - ) - - if len(searched_agents) > 0: - device_id = searched_agents[0].get("deviceId") - install_token = searched_agents[0].get("installToken") - - return { - Output.AGENT: insightconnect_plugin_runtime.helper.clean( - self.connection.client.get_endpoint(device_id, install_token) - ) - } - - raise PluginException( - cause="Unable to return information about provided agent.", - assistance="Please provide an existed agent information.", - ) - - @staticmethod - def _is_agent_found(agent, e): - return ( - e.get("deviceId") == agent - or e.get("name") == agent - or e.get("domain") == agent - or e.get("localIp") == agent - or e.get("ip") == agent - or GetAgentDetails._is_mac(agent, e) - ) - - @staticmethod - def _is_mac(agent, e): - if e.get("macAddress") == agent: - return True - - normalize_mac = e.get("macAddress").lower().replace("-", "").replace(":", "") - normalize_agent = agent.lower().replace("-", "").replace(":", "") - return normalize_mac == normalize_agent diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/schema.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/schema.py deleted file mode 100644 index 91547f62d4..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/actions/get_agent_details/schema.py +++ /dev/null @@ -1,2338 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Get details for an agent" - - -class Input: - AGENT = "agent" - - -class Output: - AGENT = "agent" - - -class GetAgentDetailsInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "agent": { - "type": "string", - "title": "Agent", - "description": "Agent to retrieve device information from. Accepts IP address, MAC address, hostname, or device ID", - "order": 1 - } - }, - "required": [ - "agent" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class GetAgentDetailsOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "agent": { - "$ref": "#/definitions/agent_information", - "title": "Agent", - "description": "Information about an agent", - "order": 1 - } - }, - "required": [ - "agent" - ], - "definitions": { - "activeDirectory": { - "type": "object", - "title": "activeDirectory", - "properties": { - "computerMemberOf": { - "type": "array", - "title": "Computer Member of", - "description": "Computer member of", - "items": { - "type": "object" - }, - "order": 1 - }, - "lastUserMemberOf": { - "type": "array", - "title": "Last User Member of", - "description": "Last user member of", - "items": { - "type": "object" - }, - "order": 2 - } - } - }, - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - }, - "agent_information": { - "type": "object", - "title": "agent_information", - "properties": { - "activeDirectory": { - "$ref": "#/definitions/activeDirectory", - "title": "Active Directory", - "description": "Active directory", - "order": 1 - }, - "activeThreats": { - "type": "integer", - "title": "Active Threats", - "description": "Active threats", - "order": 2 - }, - "agentVersion": { - "type": "string", - "title": "Agent Version", - "description": "Agent version", - "order": 3 - }, - "alerts": { - "type": "array", - "title": "Alerts", - "description": "Alerts", - "items": { - "type": "object" - }, - "order": 4 - }, - "applications": { - "type": "array", - "title": "Applications", - "description": "Applications", - "items": { - "$ref": "#/definitions/applications" - }, - "order": 5 - }, - "clientState": { - "type": "string", - "title": "Client State", - "description": "Client state", - "order": 6 - }, - "clientStateTs": { - "type": "integer", - "title": "Client State TS", - "description": "Clientstate TS", - "order": 7 - }, - "clientVersion": { - "type": "string", - "title": "Client Version", - "description": "Client version", - "order": 8 - }, - "createdAt": { - "type": "string", - "title": "Created At", - "description": "Created at", - "order": 9 - }, - "currentFirewallSn": { - "type": "string", - "title": "Current Firewall SN", - "description": "Current firewall SN", - "order": 10 - }, - "currentUser": { - "type": "string", - "title": "Current User", - "description": "Current user", - "order": 11 - }, - "deviceId": { - "type": "string", - "title": "Device ID", - "description": "Device ID", - "order": 12 - }, - "deviceSettingsTs": { - "type": "integer", - "title": "Device Settings TS", - "description": "Device settings TS", - "order": 13 - }, - "deviceType": { - "type": "string", - "title": "Device Type", - "description": "Device type", - "order": 14 - }, - "domain": { - "type": "string", - "title": "Domain", - "description": "Domain", - "order": 15 - }, - "encryptedApplications": { - "type": "boolean", - "title": "Encrypted Applications", - "description": "Encrypted applications", - "order": 16 - }, - "enforcedPolicy": { - "type": "array", - "title": "Enforced Policy", - "description": "Enforced policy", - "items": { - "$ref": "#/definitions/enforcedPolicy" - }, - "order": 17 - }, - "externalIp": { - "type": "string", - "title": "External IP", - "description": "Externali IP", - "order": 18 - }, - "firewallProtectionMode": { - "type": "string", - "title": "Firewall Protection Mode", - "description": "Firewall protection mode", - "order": 19 - }, - "geoLocation": { - "$ref": "#/definitions/geoLocation", - "title": "GEO Location", - "description": "GEO Location", - "order": 20 - }, - "groups": { - "type": "array", - "title": "Groups", - "description": "Groups", - "items": { - "type": "object" - }, - "order": 21 - }, - "hwModel": { - "type": "string", - "title": "HW Model", - "description": "HW model", - "order": 22 - }, - "infected": { - "type": "boolean", - "title": "Infected", - "description": "Infected", - "order": 23 - }, - "installToken": { - "type": "string", - "title": "Install Token", - "description": "Install token", - "order": 24 - }, - "ip": { - "type": "string", - "title": "IP", - "description": "IP", - "order": 25 - }, - "isActive": { - "type": "boolean", - "title": "Is Active", - "description": "Is active", - "order": 26 - }, - "isMobile": { - "type": "boolean", - "title": "Is Mobile", - "description": "Is mobile", - "order": 27 - }, - "isPendingUninstall": { - "type": "boolean", - "title": "Is Pending Uninstall", - "description": "Is pending uninstall", - "order": 28 - }, - "lastPolicyId": { - "type": "string", - "title": "Last Policy ID", - "description": "Last policy ID", - "order": 29 - }, - "lastPolicyUpdateTs": { - "type": "integer", - "title": "Last Policy Update TS", - "description": "Last policy update TS", - "order": 30 - }, - "licenses": { - "type": "array", - "title": "Licenses", - "description": "Licenses", - "items": { - "$ref": "#/definitions/licenses" - }, - "order": 31 - }, - "localIp": { - "type": "string", - "title": "Local IP", - "description": "Local IP", - "order": 32 - }, - "location": { - "$ref": "#/definitions/location", - "title": "Location", - "description": "Location", - "order": 33 - }, - "locationTs": { - "type": "integer", - "title": "Location TS", - "description": "Location TS", - "order": 34 - }, - "macAddress": { - "type": "string", - "title": "MAC Address", - "description": "MAC address", - "order": 35 - }, - "mitigationMode": { - "type": "string", - "title": "Mitigation Mode", - "description": "Mitigation mode", - "order": 36 - }, - "mitigationModeSuspicious": { - "type": "string", - "title": "Mitigation Mode Suspicious", - "description": "Mitigation mode suspicious", - "order": 37 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 38 - }, - "network": { - "$ref": "#/definitions/network", - "title": "Network", - "description": "Network", - "order": 39 - }, - "networkStatus": { - "type": "string", - "title": "Network Status", - "description": "Network status", - "order": 40 - }, - "onlineStatus": { - "type": "string", - "title": "Online Status", - "description": "Online status", - "order": 41 - }, - "os": { - "type": "string", - "title": "OS", - "description": "OS", - "order": 42 - }, - "osVersion": { - "type": "string", - "title": "OS Version", - "description": "OS version", - "order": 43 - }, - "processTs": { - "type": "integer", - "title": "Process TS", - "description": "Process TS", - "order": 44 - }, - "processes": { - "type": "array", - "title": "Processes", - "description": "Processes", - "items": { - "$ref": "#/definitions/processes" - }, - "order": 45 - }, - "processorType": { - "type": "string", - "title": "Processor Type", - "description": "Processor type", - "order": 46 - }, - "releaseGuids": { - "type": "array", - "title": "Release GUIDS", - "description": "Release GUIDS", - "items": { - "type": "object" - }, - "order": 47 - }, - "s1AgentId": { - "type": "string", - "title": "S1 Agent ID", - "description": "S1 agent ID", - "order": 48 - }, - "s1GroupId": { - "type": "string", - "title": "S1 Group ID", - "description": "S1 group ID", - "order": 49 - }, - "s1Passphrase": { - "type": "string", - "title": "S1 Passphrase", - "description": "S1 passphrase", - "order": 50 - }, - "s1PassphraseTs": { - "type": "integer", - "title": "S1 Passphrase TS", - "description": "S1 passphrase TS", - "order": 51 - }, - "scanAbortedAt": { - "type": "string", - "title": "Scan Aborted At", - "description": "Scan aborted at", - "order": 52 - }, - "scanFinishedAt": { - "type": "string", - "title": "Scan Finished At", - "description": "Scan finished at", - "order": 53 - }, - "scanStartedAt": { - "type": "string", - "title": "Scan Started At", - "description": "Scan started at", - "order": 54 - }, - "scanStatus": { - "type": "string", - "title": "Scan Status", - "description": "Scan status", - "order": 55 - }, - "scanStatusTs": { - "type": "integer", - "title": "Scan Status TS", - "description": "Scan status TS", - "order": 56 - }, - "serverType": { - "type": "string", - "title": "Server Type", - "description": "Server type", - "order": 57 - }, - "telemetryTs": { - "type": "integer", - "title": "Telemetry TS", - "description": "Telemetry TS", - "order": 58 - }, - "tenant": { - "$ref": "#/definitions/tenant", - "title": "Tenant", - "description": "Tenant", - "order": 59 - }, - "timezoneName": { - "type": "string", - "title": "Timezone Name", - "description": "Timezone name", - "order": 60 - }, - "timezoneOffset": { - "type": "string", - "title": "Timezone Offset", - "description": "Timezone offset", - "order": 61 - }, - "uninstallPwd": { - "type": "string", - "title": "Uninstall PWD", - "description": "Uninstall PWD", - "order": 62 - }, - "updatedAt": { - "type": "string", - "title": "Updated At", - "description": "Updated at", - "order": 63 - }, - "userActionsNeeded": { - "type": "array", - "title": "User ctions Needed", - "description": "User actions needed", - "items": { - "type": "object" - }, - "order": 64 - }, - "users": { - "type": "array", - "title": "Users", - "description": "Users", - "items": { - "$ref": "#/definitions/users" - }, - "order": 65 - } - }, - "definitions": { - "activeDirectory": { - "type": "object", - "title": "activeDirectory", - "properties": { - "computerMemberOf": { - "type": "array", - "title": "Computer Member of", - "description": "Computer member of", - "items": { - "type": "object" - }, - "order": 1 - }, - "lastUserMemberOf": { - "type": "array", - "title": "Last User Member of", - "description": "Last user member of", - "items": { - "type": "object" - }, - "order": 2 - } - } - }, - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - }, - "applications": { - "type": "object", - "title": "applications", - "properties": { - "installedDate": { - "type": "string", - "title": "Installed Date", - "description": "Installed date", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 2 - }, - "publisher": { - "type": "string", - "title": "Publisher", - "description": "Publisher", - "order": 3 - }, - "size": { - "type": "integer", - "title": "Size", - "description": "Size", - "order": 4 - }, - "version": { - "type": "string", - "title": "Version", - "description": "Version", - "order": 5 - } - } - }, - "enforcedPolicy": { - "type": "object", - "title": "enforcedPolicy", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "policy": { - "$ref": "#/definitions/policy", - "title": "Policy", - "description": "Policy", - "order": 2 - }, - "policyTs": { - "type": "integer", - "title": "Policy TS", - "description": "Policy TS", - "order": 3 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 4 - } - }, - "definitions": { - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - }, - "policy": { - "type": "object", - "title": "policy", - "properties": { - "agentPolicySettings": { - "$ref": "#/definitions/agentPolicySettings", - "title": "Agent Policy Settings", - "description": "Agent policy settings", - "order": 1 - }, - "enforced": { - "type": "boolean", - "title": "Enforced", - "description": "Enforced", - "order": 2 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 3 - }, - "policyId": { - "type": "string", - "title": "Policy ID", - "description": "Policy ID", - "order": 4 - }, - "policyTs": { - "type": "integer", - "title": "Policy TS", - "description": "Policy TS", - "order": 5 - }, - "releaseGuid": { - "type": "string", - "title": "Release GUID", - "description": "Release GUID", - "order": 6 - }, - "tenant": { - "type": "string", - "title": "Tenant", - "description": "Tenant", - "order": 7 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 8 - }, - "typeDescription": { - "type": "string", - "title": "Type Description", - "description": "Type description", - "order": 9 - }, - "uninstall": { - "type": "boolean", - "title": "Uninstall", - "description": "Uninstall", - "order": 10 - } - }, - "definitions": { - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - } - } - } - } - }, - "geoLocation": { - "type": "object", - "title": "geoLocation", - "properties": { - "coordinates": { - "type": "array", - "title": "Coordinates", - "description": "Coordinates", - "items": { - "type": "number" - }, - "order": 1 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 2 - } - } - }, - "interfaces": { - "type": "object", - "title": "interfaces", - "properties": { - "dnsServers": { - "type": "array", - "title": "DNS Servers", - "description": "DNS Servers", - "items": { - "type": "string" - }, - "order": 1 - }, - "ipV4Addresses": { - "type": "array", - "title": "IPv4 Addresses", - "description": "IPv4 addresses", - "items": { - "type": "string" - }, - "order": 2 - }, - "ipV6Addresses": { - "type": "array", - "title": "IPv6 Addresses", - "description": "IPv6 addresses", - "items": { - "type": "string" - }, - "order": 3 - }, - "macAddress": { - "type": "string", - "title": "MAC Address", - "description": "MAC address", - "order": 4 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 5 - } - } - }, - "licenses": { - "type": "object", - "title": "licenses", - "properties": { - "__v": { - "type": "integer", - "title": "V", - "description": "V", - "order": 1 - }, - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 2 - }, - "createdAt": { - "type": "string", - "title": "Created At", - "description": "Created at", - "order": 3 - }, - "expiration": { - "type": "integer", - "title": "Expiration", - "description": "Expiration", - "order": 4 - }, - "level": { - "type": "string", - "title": "Level", - "description": "Level", - "order": 5 - }, - "licenseId": { - "type": "string", - "title": "License ID", - "description": "License ID", - "order": 6 - }, - "nbAvailable": { - "type": "integer", - "title": "NB Available", - "description": "NB available", - "order": 7 - }, - "nbTotal": { - "type": "integer", - "title": "NB Total", - "description": "NB total", - "order": 8 - }, - "startDate": { - "type": "integer", - "title": "Start Date", - "description": "Start date", - "order": 9 - }, - "tenant": { - "type": "string", - "title": "Tenant", - "description": "Tenant", - "order": 10 - }, - "trial": { - "type": "boolean", - "title": "Trial", - "description": "Trial", - "order": 11 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 12 - }, - "updatedAt": { - "type": "string", - "title": "Updated At", - "description": "Updated at", - "order": 13 - }, - "vendor": { - "type": "string", - "title": "Vendor", - "description": "Vendor", - "order": 14 - } - } - }, - "location": { - "type": "object", - "title": "location", - "properties": { - "city": { - "type": "string", - "title": "City", - "description": "City", - "order": 1 - }, - "country": { - "type": "string", - "title": "Country", - "description": "Country", - "order": 2 - }, - "countryCode": { - "type": "string", - "title": "Countrycode", - "description": "Countrycode", - "order": 3 - } - } - }, - "network": { - "type": "object", - "title": "network", - "properties": { - "__v": { - "type": "integer", - "title": "V", - "description": "v", - "order": 1 - }, - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 2 - }, - "device": { - "type": "string", - "title": "Device", - "description": "Device", - "order": 3 - }, - "interfaces": { - "type": "array", - "title": "Interfaces", - "description": "Interfaces", - "items": { - "$ref": "#/definitions/interfaces" - }, - "order": 4 - }, - "routes": { - "type": "array", - "title": "Routes", - "description": "Routes", - "items": { - "$ref": "#/definitions/routes" - }, - "order": 5 - } - }, - "definitions": { - "interfaces": { - "type": "object", - "title": "interfaces", - "properties": { - "dnsServers": { - "type": "array", - "title": "DNS Servers", - "description": "DNS Servers", - "items": { - "type": "string" - }, - "order": 1 - }, - "ipV4Addresses": { - "type": "array", - "title": "IPv4 Addresses", - "description": "IPv4 addresses", - "items": { - "type": "string" - }, - "order": 2 - }, - "ipV6Addresses": { - "type": "array", - "title": "IPv6 Addresses", - "description": "IPv6 addresses", - "items": { - "type": "string" - }, - "order": 3 - }, - "macAddress": { - "type": "string", - "title": "MAC Address", - "description": "MAC address", - "order": 4 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 5 - } - } - }, - "routes": { - "type": "object", - "title": "routes", - "properties": { - "dst": { - "type": "string", - "title": "DST", - "description": "DST", - "order": 1 - }, - "gateway": { - "type": "string", - "title": "Gateway", - "description": "Gateway", - "order": 2 - }, - "interface": { - "type": "string", - "title": "Interface", - "description": "Interface", - "order": 3 - } - } - } - } - }, - "policy": { - "type": "object", - "title": "policy", - "properties": { - "agentPolicySettings": { - "$ref": "#/definitions/agentPolicySettings", - "title": "Agent Policy Settings", - "description": "Agent policy settings", - "order": 1 - }, - "enforced": { - "type": "boolean", - "title": "Enforced", - "description": "Enforced", - "order": 2 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 3 - }, - "policyId": { - "type": "string", - "title": "Policy ID", - "description": "Policy ID", - "order": 4 - }, - "policyTs": { - "type": "integer", - "title": "Policy TS", - "description": "Policy TS", - "order": 5 - }, - "releaseGuid": { - "type": "string", - "title": "Release GUID", - "description": "Release GUID", - "order": 6 - }, - "tenant": { - "type": "string", - "title": "Tenant", - "description": "Tenant", - "order": 7 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 8 - }, - "typeDescription": { - "type": "string", - "title": "Type Description", - "description": "Type description", - "order": 9 - }, - "uninstall": { - "type": "boolean", - "title": "Uninstall", - "description": "Uninstall", - "order": 10 - } - }, - "definitions": { - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - } - } - }, - "processes": { - "type": "object", - "title": "processes", - "properties": { - "description": { - "type": "string", - "title": "Description", - "description": "Description", - "order": 1 - }, - "executablePath": { - "type": "string", - "title": "Executable Path", - "description": "Executable path", - "order": 2 - }, - "memoryUsage": { - "type": "integer", - "title": "Memory Usage", - "description": "Memory usage", - "order": 3 - }, - "pid": { - "type": "integer", - "title": "PID", - "description": "PID", - "order": 4 - }, - "processName": { - "type": "string", - "title": "Process Name", - "description": "Process name", - "order": 5 - }, - "startTime": { - "type": "integer", - "title": "Start Time", - "description": "Start time", - "order": 6 - }, - "version": { - "type": "string", - "title": "Version", - "description": "Version", - "order": 7 - } - } - }, - "routes": { - "type": "object", - "title": "routes", - "properties": { - "dst": { - "type": "string", - "title": "DST", - "description": "DST", - "order": 1 - }, - "gateway": { - "type": "string", - "title": "Gateway", - "description": "Gateway", - "order": 2 - }, - "interface": { - "type": "string", - "title": "Interface", - "description": "Interface", - "order": 3 - } - } - }, - "tenant": { - "type": "object", - "title": "tenant", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "s1Settings": { - "type": "string", - "title": "S1 Settings", - "description": "S1 settings", - "order": 2 - }, - "tenantId": { - "type": "string", - "title": "Tenant ID", - "description": "Tenant ID", - "order": 3 - }, - "tenantName": { - "type": "string", - "title": "Tenant Name", - "description": "Tenant name", - "order": 4 - } - } - }, - "tenant_0": { - "type": "object", - "title": "tenant_0", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "tenantId": { - "type": "string", - "title": "Tenant ID", - "description": "Tenant ID", - "order": 2 - }, - "tenantName": { - "type": "string", - "title": "Tenant Name", - "description": "Tenant Name", - "order": 3 - } - } - }, - "users": { - "type": "object", - "title": "users", - "properties": { - "fullName": { - "type": "string", - "title": "Full Name", - "description": "Full name", - "order": 1 - }, - "policies": { - "type": "array", - "title": "Policies", - "description": "Policies", - "items": { - "type": "object" - }, - "order": 2 - }, - "tenant": { - "$ref": "#/definitions/tenant_0", - "title": "Tenant", - "description": "Tenant", - "order": 3 - }, - "userGroups": { - "type": "array", - "title": "User Groups", - "description": "User groups", - "items": { - "type": "object" - }, - "order": 4 - }, - "userId": { - "type": "string", - "title": "User ID", - "description": "User ID", - "order": 5 - }, - "username": { - "type": "string", - "title": "Username", - "description": "Username", - "order": 6 - } - }, - "definitions": { - "tenant_0": { - "type": "object", - "title": "tenant_0", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "tenantId": { - "type": "string", - "title": "Tenant ID", - "description": "Tenant ID", - "order": 2 - }, - "tenantName": { - "type": "string", - "title": "Tenant Name", - "description": "Tenant Name", - "order": 3 - } - } - } - } - } - } - }, - "applications": { - "type": "object", - "title": "applications", - "properties": { - "installedDate": { - "type": "string", - "title": "Installed Date", - "description": "Installed date", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 2 - }, - "publisher": { - "type": "string", - "title": "Publisher", - "description": "Publisher", - "order": 3 - }, - "size": { - "type": "integer", - "title": "Size", - "description": "Size", - "order": 4 - }, - "version": { - "type": "string", - "title": "Version", - "description": "Version", - "order": 5 - } - } - }, - "enforcedPolicy": { - "type": "object", - "title": "enforcedPolicy", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "policy": { - "$ref": "#/definitions/policy", - "title": "Policy", - "description": "Policy", - "order": 2 - }, - "policyTs": { - "type": "integer", - "title": "Policy TS", - "description": "Policy TS", - "order": 3 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 4 - } - }, - "definitions": { - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - }, - "policy": { - "type": "object", - "title": "policy", - "properties": { - "agentPolicySettings": { - "$ref": "#/definitions/agentPolicySettings", - "title": "Agent Policy Settings", - "description": "Agent policy settings", - "order": 1 - }, - "enforced": { - "type": "boolean", - "title": "Enforced", - "description": "Enforced", - "order": 2 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 3 - }, - "policyId": { - "type": "string", - "title": "Policy ID", - "description": "Policy ID", - "order": 4 - }, - "policyTs": { - "type": "integer", - "title": "Policy TS", - "description": "Policy TS", - "order": 5 - }, - "releaseGuid": { - "type": "string", - "title": "Release GUID", - "description": "Release GUID", - "order": 6 - }, - "tenant": { - "type": "string", - "title": "Tenant", - "description": "Tenant", - "order": 7 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 8 - }, - "typeDescription": { - "type": "string", - "title": "Type Description", - "description": "Type description", - "order": 9 - }, - "uninstall": { - "type": "boolean", - "title": "Uninstall", - "description": "Uninstall", - "order": 10 - } - }, - "definitions": { - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - } - } - } - } - }, - "geoLocation": { - "type": "object", - "title": "geoLocation", - "properties": { - "coordinates": { - "type": "array", - "title": "Coordinates", - "description": "Coordinates", - "items": { - "type": "number" - }, - "order": 1 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 2 - } - } - }, - "interfaces": { - "type": "object", - "title": "interfaces", - "properties": { - "dnsServers": { - "type": "array", - "title": "DNS Servers", - "description": "DNS Servers", - "items": { - "type": "string" - }, - "order": 1 - }, - "ipV4Addresses": { - "type": "array", - "title": "IPv4 Addresses", - "description": "IPv4 addresses", - "items": { - "type": "string" - }, - "order": 2 - }, - "ipV6Addresses": { - "type": "array", - "title": "IPv6 Addresses", - "description": "IPv6 addresses", - "items": { - "type": "string" - }, - "order": 3 - }, - "macAddress": { - "type": "string", - "title": "MAC Address", - "description": "MAC address", - "order": 4 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 5 - } - } - }, - "licenses": { - "type": "object", - "title": "licenses", - "properties": { - "__v": { - "type": "integer", - "title": "V", - "description": "V", - "order": 1 - }, - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 2 - }, - "createdAt": { - "type": "string", - "title": "Created At", - "description": "Created at", - "order": 3 - }, - "expiration": { - "type": "integer", - "title": "Expiration", - "description": "Expiration", - "order": 4 - }, - "level": { - "type": "string", - "title": "Level", - "description": "Level", - "order": 5 - }, - "licenseId": { - "type": "string", - "title": "License ID", - "description": "License ID", - "order": 6 - }, - "nbAvailable": { - "type": "integer", - "title": "NB Available", - "description": "NB available", - "order": 7 - }, - "nbTotal": { - "type": "integer", - "title": "NB Total", - "description": "NB total", - "order": 8 - }, - "startDate": { - "type": "integer", - "title": "Start Date", - "description": "Start date", - "order": 9 - }, - "tenant": { - "type": "string", - "title": "Tenant", - "description": "Tenant", - "order": 10 - }, - "trial": { - "type": "boolean", - "title": "Trial", - "description": "Trial", - "order": 11 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 12 - }, - "updatedAt": { - "type": "string", - "title": "Updated At", - "description": "Updated at", - "order": 13 - }, - "vendor": { - "type": "string", - "title": "Vendor", - "description": "Vendor", - "order": 14 - } - } - }, - "location": { - "type": "object", - "title": "location", - "properties": { - "city": { - "type": "string", - "title": "City", - "description": "City", - "order": 1 - }, - "country": { - "type": "string", - "title": "Country", - "description": "Country", - "order": 2 - }, - "countryCode": { - "type": "string", - "title": "Countrycode", - "description": "Countrycode", - "order": 3 - } - } - }, - "network": { - "type": "object", - "title": "network", - "properties": { - "__v": { - "type": "integer", - "title": "V", - "description": "v", - "order": 1 - }, - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 2 - }, - "device": { - "type": "string", - "title": "Device", - "description": "Device", - "order": 3 - }, - "interfaces": { - "type": "array", - "title": "Interfaces", - "description": "Interfaces", - "items": { - "$ref": "#/definitions/interfaces" - }, - "order": 4 - }, - "routes": { - "type": "array", - "title": "Routes", - "description": "Routes", - "items": { - "$ref": "#/definitions/routes" - }, - "order": 5 - } - }, - "definitions": { - "interfaces": { - "type": "object", - "title": "interfaces", - "properties": { - "dnsServers": { - "type": "array", - "title": "DNS Servers", - "description": "DNS Servers", - "items": { - "type": "string" - }, - "order": 1 - }, - "ipV4Addresses": { - "type": "array", - "title": "IPv4 Addresses", - "description": "IPv4 addresses", - "items": { - "type": "string" - }, - "order": 2 - }, - "ipV6Addresses": { - "type": "array", - "title": "IPv6 Addresses", - "description": "IPv6 addresses", - "items": { - "type": "string" - }, - "order": 3 - }, - "macAddress": { - "type": "string", - "title": "MAC Address", - "description": "MAC address", - "order": 4 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 5 - } - } - }, - "routes": { - "type": "object", - "title": "routes", - "properties": { - "dst": { - "type": "string", - "title": "DST", - "description": "DST", - "order": 1 - }, - "gateway": { - "type": "string", - "title": "Gateway", - "description": "Gateway", - "order": 2 - }, - "interface": { - "type": "string", - "title": "Interface", - "description": "Interface", - "order": 3 - } - } - } - } - }, - "policy": { - "type": "object", - "title": "policy", - "properties": { - "agentPolicySettings": { - "$ref": "#/definitions/agentPolicySettings", - "title": "Agent Policy Settings", - "description": "Agent policy settings", - "order": 1 - }, - "enforced": { - "type": "boolean", - "title": "Enforced", - "description": "Enforced", - "order": 2 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Name", - "order": 3 - }, - "policyId": { - "type": "string", - "title": "Policy ID", - "description": "Policy ID", - "order": 4 - }, - "policyTs": { - "type": "integer", - "title": "Policy TS", - "description": "Policy TS", - "order": 5 - }, - "releaseGuid": { - "type": "string", - "title": "Release GUID", - "description": "Release GUID", - "order": 6 - }, - "tenant": { - "type": "string", - "title": "Tenant", - "description": "Tenant", - "order": 7 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Type", - "order": 8 - }, - "typeDescription": { - "type": "string", - "title": "Type Description", - "description": "Type description", - "order": 9 - }, - "uninstall": { - "type": "boolean", - "title": "Uninstall", - "description": "Uninstall", - "order": 10 - } - }, - "definitions": { - "agentPolicySettings": { - "type": "object", - "title": "agentPolicySettings", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "addToKeychain": { - "type": "boolean", - "title": "Add to Keychain", - "description": "Add to keychain", - "order": 2 - }, - "addToWindowsStore": { - "type": "boolean", - "title": "Add to Windows Store", - "description": "Add to windows store", - "order": 3 - }, - "certificates": { - "type": "array", - "title": "Certificates", - "description": "Certificates", - "items": { - "type": "object" - }, - "order": 4 - }, - "firefoxStoreMac": { - "type": "string", - "title": "Firefox Store MAC", - "description": "Firefox store MAC", - "order": 5 - }, - "firefoxStoreWindows": { - "type": "string", - "title": "Firefox Store Windows", - "description": "Firefox store windows", - "order": 6 - }, - "keepAfterUninstallClient": { - "type": "boolean", - "title": "Keep After Uninstall Client", - "description": "Keep after uninstall client", - "order": 7 - } - } - } - } - }, - "processes": { - "type": "object", - "title": "processes", - "properties": { - "description": { - "type": "string", - "title": "Description", - "description": "Description", - "order": 1 - }, - "executablePath": { - "type": "string", - "title": "Executable Path", - "description": "Executable path", - "order": 2 - }, - "memoryUsage": { - "type": "integer", - "title": "Memory Usage", - "description": "Memory usage", - "order": 3 - }, - "pid": { - "type": "integer", - "title": "PID", - "description": "PID", - "order": 4 - }, - "processName": { - "type": "string", - "title": "Process Name", - "description": "Process name", - "order": 5 - }, - "startTime": { - "type": "integer", - "title": "Start Time", - "description": "Start time", - "order": 6 - }, - "version": { - "type": "string", - "title": "Version", - "description": "Version", - "order": 7 - } - } - }, - "routes": { - "type": "object", - "title": "routes", - "properties": { - "dst": { - "type": "string", - "title": "DST", - "description": "DST", - "order": 1 - }, - "gateway": { - "type": "string", - "title": "Gateway", - "description": "Gateway", - "order": 2 - }, - "interface": { - "type": "string", - "title": "Interface", - "description": "Interface", - "order": 3 - } - } - }, - "tenant": { - "type": "object", - "title": "tenant", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "s1Settings": { - "type": "string", - "title": "S1 Settings", - "description": "S1 settings", - "order": 2 - }, - "tenantId": { - "type": "string", - "title": "Tenant ID", - "description": "Tenant ID", - "order": 3 - }, - "tenantName": { - "type": "string", - "title": "Tenant Name", - "description": "Tenant name", - "order": 4 - } - } - }, - "tenant_0": { - "type": "object", - "title": "tenant_0", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "tenantId": { - "type": "string", - "title": "Tenant ID", - "description": "Tenant ID", - "order": 2 - }, - "tenantName": { - "type": "string", - "title": "Tenant Name", - "description": "Tenant Name", - "order": 3 - } - } - }, - "users": { - "type": "object", - "title": "users", - "properties": { - "fullName": { - "type": "string", - "title": "Full Name", - "description": "Full name", - "order": 1 - }, - "policies": { - "type": "array", - "title": "Policies", - "description": "Policies", - "items": { - "type": "object" - }, - "order": 2 - }, - "tenant": { - "$ref": "#/definitions/tenant_0", - "title": "Tenant", - "description": "Tenant", - "order": 3 - }, - "userGroups": { - "type": "array", - "title": "User Groups", - "description": "User groups", - "items": { - "type": "object" - }, - "order": 4 - }, - "userId": { - "type": "string", - "title": "User ID", - "description": "User ID", - "order": 5 - }, - "username": { - "type": "string", - "title": "Username", - "description": "Username", - "order": 6 - } - }, - "definitions": { - "tenant_0": { - "type": "object", - "title": "tenant_0", - "properties": { - "_id": { - "type": "string", - "title": "ID", - "description": "ID", - "order": 1 - }, - "tenantId": { - "type": "string", - "title": "Tenant ID", - "description": "Tenant ID", - "order": 2 - }, - "tenantName": { - "type": "string", - "title": "Tenant Name", - "description": "Tenant Name", - "order": 3 - } - } - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/__init__.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/__init__.py deleted file mode 100644 index a515dcf6b0..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .connection import Connection diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/connection.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/connection.py deleted file mode 100644 index 2351c02474..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/connection.py +++ /dev/null @@ -1,26 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import ConnectionSchema, Input - -# Custom imports below -from icon_sonicwall_capture_client.util.api import SonicWallAPI -from insightconnect_plugin_runtime.exceptions import PluginException, ConnectionTestException - - -class Connection(insightconnect_plugin_runtime.Connection): - def __init__(self): - super(self.__class__, self).__init__(input=ConnectionSchema()) - self.client = None - - def connect(self, params={}): - self.logger.info("Connect: Connecting...") - self.client = SonicWallAPI( - params.get(Input.CREDENTIALS).get("username"), - params.get(Input.CREDENTIALS).get("password"), - self.logger, - ) - - def test(self): - try: - return {"success": len(self.client.get_access_token()) > 0} - except PluginException as e: - raise ConnectionTestException(cause=e.cause, assistance=e.assistance, data=e.data) diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/schema.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/schema.py deleted file mode 100644 index 8397fe35da..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/connection/schema.py +++ /dev/null @@ -1,58 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Input: - CREDENTIALS = "credentials" - - -class ConnectionSchema(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "credentials": { - "$ref": "#/definitions/credential_username_password", - "title": "Credentials", - "description": "Email address and password", - "order": 1 - } - }, - "required": [ - "credentials" - ], - "definitions": { - "credential_username_password": { - "id": "credential_username_password", - "type": "object", - "title": "Credential: Username and Password", - "description": "A username and password combination", - "properties": { - "password": { - "type": "string", - "title": "Password", - "displayType": "password", - "description": "The password", - "format": "password", - "order": 2 - }, - "username": { - "type": "string", - "title": "Username", - "description": "The username to log in with", - "order": 1 - } - }, - "required": [ - "username", - "password" - ] - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/triggers/__init__.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/triggers/__init__.py deleted file mode 100644 index bace8db897..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/triggers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/__init__.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/__init__.py deleted file mode 100644 index bace8db897..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/api.py b/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/api.py deleted file mode 100644 index d3dcdaa427..0000000000 --- a/plugins/sonicwall_capture_client/icon_sonicwall_capture_client/util/api.py +++ /dev/null @@ -1,91 +0,0 @@ -import json -import requests -from collections import OrderedDict -from insightconnect_plugin_runtime.exceptions import PluginException - - -class SonicWallAPI: - def __init__(self, username, password, logger): - self.url = "https://captureclient.sonicwall.com/api/" - self.verify_ssl = True - self.logger = logger - self.username = username - self.password = password - self.token = None - - def get_endpoint(self, device_id: str, install_token: str): - return self._make_request("GET", f"endpoints/{device_id}/{install_token}") - - def get_endpoints_list(self): - return self._run_with_pages_endpoints("endpoints/list") - - def get_access_token(self): - if self.token: - return self.token - - self.token = self._call_api("POST", "login", json_data={"email": self.username, "password": self.password}).get( - "token" - ) - - return self.token - - def logout(self, token): - self._call_api("DELETE", "login", token=token) - - def _run_with_pages_endpoints(self, path: str, value: str = None): - objects = [] - limit = 100 - for page in range(0, 9999): - response = self._make_request("GET", path, params={"limit": limit, "skip": page * limit}) - objects.extend(response.get("devices", [])) - - if value and response.get("value") == value: - return response.get("devices", []) - - if (page + 1) * limit > response.get("pagination", {}).get("totalItems", 0): - break - - return objects - - def _make_request(self, method: str, path: str, json_data: dict = None, params: dict = None): - token = self.get_access_token() - try: - response = self._call_api(method, path, token=token, json_data=json_data, params=params) - except PluginException as e: - raise PluginException(cause=e.cause, assistance=e.assistance, data=e.data) - - return response - - def _call_api(self, method: str, path: str, token: str = None, json_data: dict = None, params: dict = None): - response = {"text": ""} - headers_list = [("Accept", "application/json")] - if token: - headers_list.append(("Authorization", token)) - - try: - response = requests.request( - method, - self.url + path, - json=json_data, - params=params, - headers=OrderedDict(headers_list), - verify=self.verify_ssl, - ) - - if response.status_code == 401: - raise PluginException(preset=PluginException.Preset.USERNAME_PASSWORD) - if response.status_code == 403: - raise PluginException(preset=PluginException.Preset.UNAUTHORIZED) - if response.status_code >= 400: - response_data = response.text - raise PluginException(preset=PluginException.Preset.UNKNOWN, data=response_data) - if 200 <= response.status_code < 300: - return response.json() - - raise PluginException(preset=PluginException.Preset.UNKNOWN, data=response.text) - except json.decoder.JSONDecodeError as e: - self.logger.info(f"Invalid JSON: {e}") - raise PluginException(preset=PluginException.Preset.INVALID_JSON, data=response.text) - except requests.exceptions.HTTPError as e: - self.logger.info(f"Call to SonicWall Capture Client API failed: {e}") - raise PluginException(preset=PluginException.Preset.UNKNOWN, data=response.text) diff --git a/plugins/sonicwall_capture_client/plugin.spec.yaml b/plugins/sonicwall_capture_client/plugin.spec.yaml deleted file mode 100644 index 286b1486ee..0000000000 --- a/plugins/sonicwall_capture_client/plugin.spec.yaml +++ /dev/null @@ -1,790 +0,0 @@ -plugin_spec_version: v2 -extension: plugin -products: [insightconnect] -name: sonicwall_capture_client -title: SonicWall Capture Client -description: SonicWall Capture Client is a unified client platform that delivers multiple endpoint protection capabilities, including next-generation malware protection and application vulnerability intelligence -version: 1.0.1 -vendor: rapid7 -support: community -status: [] -tags: -- sonicwall -- capture_client -hub_tags: - use_cases: [threat_detection_and_response] - keywords: [sonicwall, capture client] - features: [] -resources: - source_url: https://github.com/rapid7/insightconnect-plugins/tree/master/plugins/sonicwall_capture_client - license_url: https://github.com/rapid7/insightconnect-plugins/blob/master/LICENSE - vendor_url: https://www.sonicwall.com/ -enable_cache: false - -types: - activeDirectory: - computerMemberOf: - title: Computer Member of - type: "[]object" - description: Computer member of - required: false - lastUserMemberOf: - title: Last User Member of - type: "[]object" - description: Last user member of - required: false - applications: - installedDate: - title: Installed Date - type: string - description: Installed date - required: false - name: - title: Name - type: string - description: Name - required: false - publisher: - title: Publisher - type: string - description: Publisher - required: false - size: - title: Size - type: integer - description: Size - required: false - version: - title: Version - type: string - description: Version - required: false - agentPolicySettings: - _id: - title: ID - type: string - description: ID - required: false - addToKeychain: - title: Add to Keychain - type: boolean - description: Add to keychain - required: false - addToWindowsStore: - title: Add to Windows Store - type: boolean - description: Add to windows store - required: false - certificates: - title: Certificates - type: "[]object" - description: Certificates - required: false - firefoxStoreMac: - title: Firefox Store MAC - type: string - description: Firefox store MAC - required: false - firefoxStoreWindows: - title: Firefox Store Windows - type: string - description: Firefox store windows - required: false - keepAfterUninstallClient: - title: Keep After Uninstall Client - type: boolean - description: Keep after uninstall client - required: false - policy: - agentPolicySettings: - title: Agent Policy Settings - type: agentPolicySettings - description: Agent policy settings - required: false - enforced: - title: Enforced - type: boolean - description: Enforced - required: false - name: - title: Name - type: string - description: Name - required: false - policyId: - title: Policy ID - type: string - description: Policy ID - required: false - policyTs: - title: Policy TS - type: integer - description: Policy TS - required: false - releaseGuid: - title: Release GUID - type: string - description: Release GUID - required: false - tenant: - title: Tenant - type: string - description: Tenant - required: false - type: - title: Type - type: string - description: Type - required: false - typeDescription: - title: Type Description - type: string - description: Type description - required: false - uninstall: - title: Uninstall - type: boolean - description: Uninstall - required: false - enforcedPolicy: - _id: - title: ID - type: string - description: ID - required: false - policy: - title: Policy - type: policy - description: Policy - required: false - policyTs: - title: Policy TS - type: integer - description: Policy TS - required: false - type: - title: Type - type: string - description: Type - required: false - geoLocation: - coordinates: - title: Coordinates - type: "[]float" - description: Coordinates - required: false - type: - title: Type - type: string - description: Type - required: false - licenses: - __v: - title: V - type: integer - description: V - required: false - _id: - title: ID - type: string - description: ID - required: false - createdAt: - title: Created At - type: string - description: Created at - required: false - expiration: - title: Expiration - type: integer - description: Expiration - required: false - level: - title: Level - type: string - description: Level - required: false - licenseId: - title: License ID - type: string - description: License ID - required: false - nbAvailable: - title: NB Available - type: integer - description: NB available - required: false - nbTotal: - title: NB Total - type: integer - description: NB total - required: false - startDate: - title: Start Date - type: integer - description: Start date - required: false - tenant: - title: Tenant - type: string - description: Tenant - required: false - trial: - title: Trial - type: boolean - description: Trial - required: false - type: - title: Type - type: string - description: Type - required: false - updatedAt: - title: Updated At - type: string - description: Updated at - required: false - vendor: - title: Vendor - type: string - description: Vendor - required: false - location: - city: - title: City - type: string - description: City - required: false - country: - title: Country - type: string - description: Country - required: false - countryCode: - title: Countrycode - type: string - description: Countrycode - required: false - interfaces: - dnsServers: - title: DNS Servers - type: "[]string" - description: DNS Servers - required: false - ipV4Addresses: - title: IPv4 Addresses - type: "[]string" - description: IPv4 addresses - required: false - ipV6Addresses: - title: IPv6 Addresses - type: "[]string" - description: IPv6 addresses - required: false - macAddress: - title: MAC Address - type: string - description: MAC address - required: false - name: - title: Name - type: string - description: Name - required: false - routes: - dst: - title: DST - type: string - description: DST - required: false - gateway: - title: Gateway - type: string - description: Gateway - required: false - interface: - title: Interface - type: string - description: Interface - required: false - network: - __v: - title: V - type: integer - description: v - required: false - _id: - title: ID - type: string - description: ID - required: false - device: - title: Device - type: string - description: Device - required: false - interfaces: - title: Interfaces - type: "[]interfaces" - description: Interfaces - required: false - routes: - title: Routes - type: "[]routes" - description: Routes - required: false - processes: - description: - title: Description - type: string - description: Description - required: false - executablePath: - title: Executable Path - type: string - description: Executable path - required: false - memoryUsage: - title: Memory Usage - type: integer - description: Memory usage - required: false - pid: - title: PID - type: integer - description: PID - required: false - processName: - title: Process Name - type: string - description: Process name - required: false - startTime: - title: Start Time - type: integer - description: Start time - required: false - version: - title: Version - type: string - description: Version - required: false - tenant: - _id: - title: ID - type: string - description: ID - required: false - s1Settings: - title: S1 Settings - type: string - description: S1 settings - required: false - tenantId: - title: Tenant ID - type: string - description: Tenant ID - required: false - tenantName: - title: Tenant Name - type: string - description: Tenant name - required: false - tenant_0: - _id: - title: ID - type: string - description: ID - required: false - tenantId: - title: Tenant ID - type: string - description: Tenant ID - required: false - tenantName: - title: Tenant Name - type: string - description: Tenant Name - required: false - users: - fullName: - title: Full Name - type: string - description: Full name - required: false - policies: - title: Policies - type: "[]object" - description: Policies - required: false - tenant: - title: Tenant - type: tenant_0 - description: Tenant - required: false - userGroups: - title: User Groups - type: "[]object" - description: User groups - required: false - userId: - title: User ID - type: string - description: User ID - required: false - username: - title: Username - type: string - description: Username - required: false - agent_information: - activeDirectory: - title: Active Directory - type: activeDirectory - description: Active directory - required: false - activeThreats: - title: Active Threats - type: integer - description: Active threats - required: false - agentVersion: - title: Agent Version - type: string - description: Agent version - required: false - alerts: - title: Alerts - type: "[]object" - description: Alerts - required: false - applications: - title: Applications - type: "[]applications" - description: Applications - required: false - clientState: - title: Client State - type: string - description: Client state - required: false - clientStateTs: - title: Client State TS - type: integer - description: Clientstate TS - required: false - clientVersion: - title: Client Version - type: string - description: Client version - required: false - createdAt: - title: Created At - type: string - description: Created at - required: false - currentFirewallSn: - title: Current Firewall SN - type: string - description: Current firewall SN - required: false - currentUser: - title: Current User - type: string - description: Current user - required: false - deviceId: - title: Device ID - type: string - description: Device ID - required: false - deviceSettingsTs: - title: Device Settings TS - type: integer - description: Device settings TS - required: false - deviceType: - title: Device Type - type: string - description: Device type - required: false - domain: - title: Domain - type: string - description: Domain - required: false - encryptedApplications: - title: Encrypted Applications - type: boolean - description: Encrypted applications - required: false - enforcedPolicy: - title: Enforced Policy - type: "[]enforcedPolicy" - description: Enforced policy - required: false - externalIp: - title: External IP - type: string - description: Externali IP - required: false - firewallProtectionMode: - title: Firewall Protection Mode - type: string - description: Firewall protection mode - required: false - geoLocation: - title: GEO Location - type: geoLocation - description: GEO Location - required: false - groups: - title: Groups - type: "[]object" - description: Groups - required: false - hwModel: - title: HW Model - type: string - description: HW model - required: false - infected: - title: Infected - type: boolean - description: Infected - required: false - installToken: - title: Install Token - type: string - description: Install token - required: false - ip: - title: IP - type: string - description: IP - required: false - isActive: - title: Is Active - type: boolean - description: Is active - required: false - isMobile: - title: Is Mobile - type: boolean - description: Is mobile - required: false - isPendingUninstall: - title: Is Pending Uninstall - type: boolean - description: Is pending uninstall - required: false - lastPolicyId: - title: Last Policy ID - type: string - description: Last policy ID - required: false - lastPolicyUpdateTs: - title: Last Policy Update TS - type: integer - description: Last policy update TS - required: false - licenses: - title: Licenses - type: "[]licenses" - description: Licenses - required: false - localIp: - title: Local IP - type: string - description: Local IP - required: false - location: - title: Location - type: location - description: Location - required: false - locationTs: - title: Location TS - type: integer - description: Location TS - required: false - macAddress: - title: MAC Address - type: string - description: MAC address - required: false - mitigationMode: - title: Mitigation Mode - type: string - description: Mitigation mode - required: false - mitigationModeSuspicious: - title: Mitigation Mode Suspicious - type: string - description: Mitigation mode suspicious - required: false - name: - title: Name - type: string - description: Name - required: false - network: - title: Network - type: network - description: Network - required: false - networkStatus: - title: Network Status - type: string - description: Network status - required: false - onlineStatus: - title: Online Status - type: string - description: Online status - required: false - os: - title: OS - type: string - description: OS - required: false - osVersion: - title: OS Version - type: string - description: OS version - required: false - processTs: - title: Process TS - type: integer - description: Process TS - required: false - processes: - title: Processes - type: "[]processes" - description: Processes - required: false - processorType: - title: Processor Type - type: string - description: Processor type - required: false - releaseGuids: - title: Release GUIDS - type: "[]object" - description: Release GUIDS - required: false - s1AgentId: - title: S1 Agent ID - type: string - description: S1 agent ID - required: false - s1GroupId: - title: S1 Group ID - type: string - description: S1 group ID - required: false - s1Passphrase: - title: S1 Passphrase - type: string - description: S1 passphrase - required: false - s1PassphraseTs: - title: S1 Passphrase TS - type: integer - description: S1 passphrase TS - required: false - scanAbortedAt: - title: Scan Aborted At - type: string - description: Scan aborted at - required: false - scanFinishedAt: - title: Scan Finished At - type: string - description: Scan finished at - required: false - scanStartedAt: - title: Scan Started At - type: string - description: Scan started at - required: false - scanStatus: - title: Scan Status - type: string - description: Scan status - required: false - scanStatusTs: - title: Scan Status TS - type: integer - description: Scan status TS - required: false - serverType: - title: Server Type - type: string - description: Server type - required: false - telemetryTs: - title: Telemetry TS - type: integer - description: Telemetry TS - required: false - tenant: - title: Tenant - type: tenant - description: Tenant - required: false - timezoneName: - title: Timezone Name - type: string - description: Timezone name - required: false - timezoneOffset: - title: Timezone Offset - type: string - description: Timezone offset - required: false - uninstallPwd: - title: Uninstall PWD - type: string - description: Uninstall PWD - required: false - updatedAt: - title: Updated At - type: string - description: Updated at - required: false - userActionsNeeded: - title: User ctions Needed - type: "[]object" - description: User actions needed - required: false - users: - title: Users - type: "[]users" - description: Users - required: false - -connection: - credentials: - title: Credentials - description: Email address and password - type: credential_username_password - required: true - example: '{"username": "admin", "password": "mypassword"}' -actions: - get_agent_details: - title: Get Agent Details - description: Get details for an agent - input: - agent: - title: Agent - description: Agent to retrieve device information from. Accepts IP address, MAC address, hostname, or device ID - type: string - required: true - example: 198.51.100.100 - output: - agent: - title: Agent - description: Information about an agent - type: agent_information - required: true \ No newline at end of file diff --git a/plugins/sonicwall_capture_client/requirements.txt b/plugins/sonicwall_capture_client/requirements.txt deleted file mode 100644 index 519a7752a6..0000000000 --- a/plugins/sonicwall_capture_client/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# List third-party dependencies here, separated by newlines. -# All dependencies must be version-pinned, eg. requests==1.2.0 -# See: https://pip.pypa.io/en/stable/user_guide/#requirements-files -validators==0.17.0 \ No newline at end of file diff --git a/plugins/sonicwall_capture_client/setup.py b/plugins/sonicwall_capture_client/setup.py deleted file mode 100644 index 630429b831..0000000000 --- a/plugins/sonicwall_capture_client/setup.py +++ /dev/null @@ -1,14 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from setuptools import setup, find_packages - - -setup(name="sonicwall_capture_client-rapid7-plugin", - version="1.0.1", - description="SonicWall Capture Client is a unified client platform that delivers multiple endpoint protection capabilities, including next-generation malware protection and application vulnerability intelligence", - author="rapid7", - author_email="", - url="", - packages=find_packages(), - install_requires=['insightconnect-plugin-runtime'], # Add third-party dependencies to requirements.txt, not here! - scripts=['bin/icon_sonicwall_capture_client'] - ) diff --git a/plugins/threat_connect/.CHECKSUM b/plugins/threat_connect/.CHECKSUM deleted file mode 100644 index ead67c72b1..0000000000 --- a/plugins/threat_connect/.CHECKSUM +++ /dev/null @@ -1,47 +0,0 @@ -{ - "spec": "7fbf426815a5ba11ebccbc65bbb7f479", - "manifest": "a1d9865bb9c222c8b83b5facae75c57a", - "setup": "2b884ad66c40ce580027697b691cf7f7", - "schemas": [ - { - "identifier": "bulk_indicator_download/schema.py", - "hash": "b641b830fc009d3d73d0b0aebb9ad7be" - }, - { - "identifier": "create_adversary/schema.py", - "hash": "1e4d8797c291b2aca70d1f0688112c44" - }, - { - "identifier": "create_task/schema.py", - "hash": "8d9fdbbb2a6810ffb0c362901c2ad9d5" - }, - { - "identifier": "delete_adversary/schema.py", - "hash": "ac7505fee559abd3f0a582556c001d1b" - }, - { - "identifier": "emails_retrieve/schema.py", - "hash": "4baed3af37351ea6f8d282f3d6a9ec64" - }, - { - "identifier": "incidents_retrieve/schema.py", - "hash": "0332daa2662ea3d0dec67e7ef6064a19" - }, - { - "identifier": "signatures_retrieve/schema.py", - "hash": "0d943827a5937a194cf272119e94048a" - }, - { - "identifier": "threats_retrieve/schema.py", - "hash": "c0489d3a30c30d37052bb3126a47ff02" - }, - { - "identifier": "victims_retrieve/schema.py", - "hash": "de1a76738e85a07ce01a154119a65228" - }, - { - "identifier": "connection/schema.py", - "hash": "71caa5c726f332c5f6e1c346b87e83ad" - } - ] -} \ No newline at end of file diff --git a/plugins/threat_connect/.dockerignore b/plugins/threat_connect/.dockerignore deleted file mode 100644 index 93dc53fb01..0000000000 --- a/plugins/threat_connect/.dockerignore +++ /dev/null @@ -1,9 +0,0 @@ -unit_test/**/* -unit_test -examples/**/* -examples -tests -tests/**/* -**/*.json -**/*.tar -**/*.gz \ No newline at end of file diff --git a/plugins/threat_connect/Dockerfile b/plugins/threat_connect/Dockerfile deleted file mode 100755 index f1425cbc5f..0000000000 --- a/plugins/threat_connect/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM rapid7/insightconnect-python-3-38-plugin:5 - -LABEL organization=rapid7 -LABEL sdk=python - -WORKDIR /python/src -ADD ./plugin.spec.yaml /plugin.spec.yaml -ADD . /python/src - -RUN if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - -RUN python setup.py build && python setup.py install - -# User to run plugin code. The two supported users are: root, nobody -USER nobody - -ENTRYPOINT ["/usr/local/bin/komand_threat_connect"] \ No newline at end of file diff --git a/plugins/threat_connect/Makefile b/plugins/threat_connect/Makefile deleted file mode 100755 index cb85f96b6c..0000000000 --- a/plugins/threat_connect/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# Include other Makefiles for improved functionality -INCLUDE_DIR = ../../tools/Makefiles -MAKEFILES := $(wildcard $(INCLUDE_DIR)/*.mk) -# We can't guarantee customers will have the include files -# - prefix to ignore Makefiles when not present -# https://www.gnu.org/software/make/manual/html_node/Include.html --include $(MAKEFILES) - -ifneq ($(MAKEFILES),) - $(info [$(YELLOW)*$(NORMAL)] Use ``make menu`` for available targets) - $(info [$(YELLOW)*$(NORMAL)] Including available Makefiles: $(MAKEFILES)) - $(info --) -else - $(warning Makefile includes directory not present: $(INCLUDE_DIR)) -endif - -VERSION?=$(shell grep '^version: ' plugin.spec.yaml | sed 's/version: //') -NAME?=$(shell grep '^name: ' plugin.spec.yaml | sed 's/name: //') -VENDOR?=$(shell grep '^vendor: ' plugin.spec.yaml | sed 's/vendor: //') -CWD?=$(shell basename $(PWD)) -_NAME?=$(shell echo $(NAME) | awk '{ print toupper(substr($$0,1,1)) tolower(substr($$0,2)) }') -PKG=$(VENDOR)-$(NAME)-$(VERSION).tar.gz - -# Set default target explicitly. Make's default behavior is the first target in the Makefile. -# We don't want that behavior due to includes which are read first -.DEFAULT_GOAL := default # Make >= v3.80 (make -version) - - -default: image tarball - -tarball: - $(info [$(YELLOW)*$(NORMAL)] Creating plugin tarball) - rm -rf build - rm -rf $(PKG) - tar -cvzf $(PKG) --exclude=$(PKG) --exclude=tests --exclude=run.sh * - -image: - $(info [$(YELLOW)*$(NORMAL)] Building plugin image) - docker build --pull -t $(VENDOR)/$(NAME):$(VERSION) . - docker tag $(VENDOR)/$(NAME):$(VERSION) $(VENDOR)/$(NAME):latest - -regenerate: - $(info [$(YELLOW)*$(NORMAL)] Regenerating schema from plugin.spec.yaml) - icon-plugin generate python --regenerate - -export: image - $(info [$(YELLOW)*$(NORMAL)] Exporting docker image) - @printf "\n ---> Exporting Docker image to ./$(VENDOR)_$(NAME)_$(VERSION).tar\n" - @docker save $(VENDOR)/$(NAME):$(VERSION) | gzip > $(VENDOR)_$(NAME)_$(VERSION).tar - -# Make will not run a target if a file of the same name exists unless setting phony targets -# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: default tarball image regenerate diff --git a/plugins/threat_connect/bin/komand_threat_connect b/plugins/threat_connect/bin/komand_threat_connect deleted file mode 100755 index edcbc021fb..0000000000 --- a/plugins/threat_connect/bin/komand_threat_connect +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python -# GENERATED BY KOMAND SDK - DO NOT EDIT -import os -import json -from sys import argv - -Name = "ThreatConnect" -Vendor = "rapid7" -Version = "1.0.2" -Description = "ThreatConnect is a Threat Intelligence Platform (TIP) that empowers large organizations to aggregate, analyze and act on their threat intelligence. The ThreatConnect plugin for Rapid7 InsightConnect allows users to view incidents, emails, threats, victims, and more" - - -def main(): - if 'http' in argv: - if os.environ.get("GUNICORN_CONFIG_FILE"): - with open(os.environ.get("GUNICORN_CONFIG_FILE")) as gf: - gunicorn_cfg = json.load(gf) - if gunicorn_cfg.get("worker_class", "sync") == "gevent": - from gevent import monkey - monkey.patch_all() - elif 'gevent' in argv: - from gevent import monkey - monkey.patch_all() - - import insightconnect_plugin_runtime - from komand_threat_connect import connection, actions, triggers - - class ICONThreatConnect(insightconnect_plugin_runtime.Plugin): - def __init__(self): - super(self.__class__, self).__init__( - name=Name, - vendor=Vendor, - version=Version, - description=Description, - connection=connection.Connection() - ) - self.add_action(actions.BulkIndicatorDownload()) - - self.add_action(actions.CreateAdversary()) - - self.add_action(actions.CreateTask()) - - self.add_action(actions.DeleteAdversary()) - - self.add_action(actions.EmailsRetrieve()) - - self.add_action(actions.IncidentsRetrieve()) - - self.add_action(actions.SignaturesRetrieve()) - - self.add_action(actions.ThreatsRetrieve()) - - self.add_action(actions.VictimsRetrieve()) - - - """Run plugin""" - cli = insightconnect_plugin_runtime.CLI(ICONThreatConnect()) - cli.run() - - -if __name__ == "__main__": - main() diff --git a/plugins/threat_connect/extension.png b/plugins/threat_connect/extension.png deleted file mode 100644 index c4765a4cb42437e3f80da5258c8d3f81b7b79397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14235 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 diff --git a/plugins/threat_connect/help.md b/plugins/threat_connect/help.md deleted file mode 100644 index 5e9cefd899..0000000000 --- a/plugins/threat_connect/help.md +++ /dev/null @@ -1,247 +0,0 @@ -# Description - -[ThreatConnect](https://threatconnect.com) is a Threat Intelligence Platform (TIP) that empowers large - organizations to aggregate, analyze and act on their threat intelligence. The ThreatConnect plugin for Rapid7 -InsightConnect allows users to view incidents, emails, threats, victims, and more. - -ThreatConnect can aid in phishing analysis and general threat intelligence collection through its platform. - -# Key Features - -* View incidents -* View ThreatConnect emails -* Creat tasks - -# Requirements - -* API access ID -* API secret key -* API base URL - -# Documentation - -## Setup - -The connection configuration accepts the following parameters: -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|api_default_org|string|None|False|Enter API Default Org|None| -|api_access_id|string|None|False|Enter API Access ID|None| -|api_secret_key|string|None|False|Enter API Secret Key|None| -|api_base_url|string|None|False|Enter API Base URL|None| - -## Technical Details - -### Actions - -#### Delete Adversary - -This action is used to delete an adversary in the ThreatConnect platform. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|owner|string|None|True|Owner/Organization|None| -|id|integer|None|True|Adversary To Delete|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|status|boolean|False|None| - -#### Create Task - -This action is used to create a task resource in the ThreatConnect platform. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|status|string|None|False|Task status|['In Progress', 'Completed', 'Waiting on Someone', 'Deferred']| -|due_date|date|None|False|Task due date|None| -|name|string|None|True|Task Name|None| -|tags|string|None|False|Task tags comma delimited|None| -|reminder_date|date|None|False|Task reminder date|None| -|reminded|boolean|None|False|Use task Reminder|None| -|escalatee|string|None|False|Task escalatee|None| -|escalated|boolean|None|False|Use task escalation|None| -|security_label|string|None|False|Task security label|None| -|assignee|string|None|False|Task Assignee|None| -|escalation_date|date|None|False|Task escalation date|None| -|attributes|[]object|None|False|Task Attributes|None| -|overdue|boolean|None|False|Is task overdue|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|id|integer|False|None| - -#### Victims Retrieve - -This action is used to retrieve ThreatConnect victims. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|filter|filter|None|False|ThreatConnect filters|None| -|owner|string|None|True|Owner/Organization|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|victims|[]victim_output|False|None| - -#### Threats Retrieve - -This action is used to retrieve ThreatConnect threats. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|filter|filter|None|False|ThreatConnect filters|None| -|owner|string|None|True|Owner/Organization|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|threats|[]signatures_output|False|None| - -#### Create Adversary - -This action is used to create a ThreatConnect adversary. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|owner|string|None|True|Owner/Organization|None| -|attributes|[]object|None|False|Adversary Attributes|None| -|tags|string|None|False|Adversary Tags|None| -|name|string|None|True|Adversary Name|None| -|security_label|string|None|False|Adversary Security Label|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|id|integer|False|None| - -#### Bulk Indicator Download - -This action is used to retrieve ThreatConnect bulk indicator download. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|rating|string|None|False|Indicator rating|None| -|confidence|integer|None|False|Confidence value|None| -|threat_assess_confidence|integer|None|False|Threat Assess Confidence filter|None| -|attribute|string|None|False|Attribute type|None| -|tag|string|None|False|Single tag filter|None| -|last_modified|date|None|False|Last modified date|None| -|owner|string|None|True|Owner/Organization|None| -|date_added|date|None|False|Date indicator added|None| -|type|string|None|False|Indicator type|None| -|threat_assess_rating|string|None|False|Threat Assess Rating filter|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|bulk_indicators|[]bulk_indicator_output|False|None| - -#### Incidents Retrieve - -This action is used to retrieve ThreatConnect incidents. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|filter|filter|None|False|ThreatConnect filters|None| -|owner|string|None|True|Owner/Organization|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|incidents|[]incidents_output|False|None| - -#### Email Retrieve - -This action is used to retrieve ThreatConnect e-mails. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|incident_id|integer|None|False|Filter Groups on associated Incident ID|None| -|indicator|string|None|False|Filter Groups on associated Indicator|None| -|threat_id|integer|None|False|Filter Groups on associated Threat ID|None| -|email_id|integer|None|False|Filter Groups on associated Email ID.|None| -|security_label|string|None|False|Filter Groups on associated Security Label|None| -|tag|string|None|False|Filter Groups on applied Tag|None| -|owner|string|None|True|Owner/Organization|None| -|signature_id|integer|None|False|Filter Groups on applied Security Label|None| -|id|integer|None|False|Filter Groups on associated ID|None| -|document_id|integer|None|False|Filter Groups on associated Document ID|None| -|adversary_id|integer|None|False|Filter Groups on associated Adversary ID|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|emails|[]email_output|False|None| - -#### Signatures Retrieve - -This action is used to retrieve ThreatConnect signatures. - -##### Input - -|Name|Type|Default|Required|Description|Enum| -|----|----|-------|--------|-----------|----| -|filter|filter|None|False|ThreatConnect filters|None| -|owner|string|None|True|Owner/Organization|None| - -##### Output - -|Name|Type|Required|Description| -|----|----|--------|-----------| -|signatures|[]signatures_output|False|None| - -### Triggers - -This plugin does not contain any triggers. - -### Custom Output Types - -_This plugin does not contain any custom output types._ - -## Troubleshooting - -This plugin does not contain any troubleshooting information. - -# Version History - -* 1.0.2 - Updated version of insightconnect-plugin-runtime used and version of requests module -* 1.0.1 - New spec and help.md format for the Extension Library -* 1.0.0 - Update to Python v2 architecture | Support web server mode | Use new credential types | Rename "Threat Connect" plugin title to "ThreatConnect" | Rename "Email's Retrieve" to "Email Retrieve" -* 0.1.1 - SSL bug fix in SDK -* 0.1.0 - Initial plugin - -# Links - -## References - -* [ThreatConnect](https://threatconnect.com) -* [ThreatConnect Python SDK](https://docs.threatconnect.com/en/latest/python/python_sdk.html) - diff --git a/plugins/threat_connect/icon.png b/plugins/threat_connect/icon.png deleted file mode 100644 index c837331ff7c96613337bb1f53b556ea7a9816069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19389 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 diff --git a/plugins/threat_connect/komand_threat_connect/__init__.py b/plugins/threat_connect/komand_threat_connect/__init__.py deleted file mode 100755 index bace8db897..0000000000 --- a/plugins/threat_connect/komand_threat_connect/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/threat_connect/komand_threat_connect/actions/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/__init__.py deleted file mode 100755 index 2e621d1201..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .bulk_indicator_download.action import BulkIndicatorDownload -from .create_adversary.action import CreateAdversary -from .create_task.action import CreateTask -from .delete_adversary.action import DeleteAdversary -from .emails_retrieve.action import EmailsRetrieve -from .incidents_retrieve.action import IncidentsRetrieve -from .signatures_retrieve.action import SignaturesRetrieve -from .threats_retrieve.action import ThreatsRetrieve -from .victims_retrieve.action import VictimsRetrieve diff --git a/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/__init__.py deleted file mode 100755 index 46ea39230a..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import BulkIndicatorDownload diff --git a/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/action.py b/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/action.py deleted file mode 100755 index c5e212b3a9..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/action.py +++ /dev/null @@ -1,90 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import BulkIndicatorDownloadInput, BulkIndicatorDownloadOutput - -# Custom imports below -import datetime - - -class BulkIndicatorDownload(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="bulk_indicator_download", - description="Retrieve ThreatConnect Bulk Indicator Download", - input=BulkIndicatorDownloadInput(), - output=BulkIndicatorDownloadOutput(), - ) - - def run(self, params={}): - indicators = self.connection.threat_connect.bulk_indicators() - indicator_obj_list = [] - - filter1 = indicators.add_filter() - filter1.add_owner(params.get("owner")) - - if params.get("confidence"): - filter1.add_pf_confidence(params.get("confidence")) - - if params.get("attribute"): - filter1.add_pf_attribute(params.get("attribute")) - - if params.get("date_added"): - filter1.add_pf_date_added(params.get("date_added")) - - if params.get("last_modified"): - filter1.add_pf_last_modified(params.get("last_modified")) - - if params.get("rating"): - filter1.add_pf_rating(params.get("rating")) - - if params.get("tag"): - filter1.add_pf_tag(params.get("tag")) - - if params.get("threat_assess_confidence"): - filter1.add_pf_threat_assess_confidence(params.get("threat_assess_confidence")) - - if params.get("threat_assess_rating"): - filter1.add_pf_threat_assess_rating(params.get("threat_assess_rating")) - - if params.get("type"): - filter1.aadd_pf_type(params.get("type")) - - # Retrieve Indicators and Apply Filters - try: - indicators.retrieve() - except Exception as e: - raise e - - # Iterate Through Results - for indicator in indicators: - indicator_obj = { - "id": indicator.id, - "owner_name": (indicator.owner_name or ""), - "date_added": ( - datetime.datetime.strptime(indicator.date_added, "%Y-%d-%mT%H:%M:%SZ").isoformat() or "" - ), - "last_modified": ( - datetime.datetime.strptime(indicator.last_modified, "%Y-%d-%mT%H:%M:%SZ").isoformat() or "" - ), - "rating": (indicator.rating or ""), - "threat_assess_rating": (str(indicator.threat_assess_rating) or ""), - "confidence": (indicator.confidence or ""), - "threat_assess_confidence": (str(indicator.threat_assess_confidence) or ""), - "type": (indicator.type or ""), - "weblink": indicator.weblink, - } - - indicator_obj_list.append(indicator_obj) - - return {"bulk_indicators": indicator_obj_list} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except Exception as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/schema.py b/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/schema.py deleted file mode 100755 index 37df6213f4..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/bulk_indicator_download/schema.py +++ /dev/null @@ -1,190 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Retrieve ThreatConnect Bulk Indicator Download" - - -class Input: - ATTRIBUTE = "attribute" - CONFIDENCE = "confidence" - DATE_ADDED = "date_added" - LAST_MODIFIED = "last_modified" - OWNER = "owner" - RATING = "rating" - TAG = "tag" - THREAT_ASSESS_CONFIDENCE = "threat_assess_confidence" - THREAT_ASSESS_RATING = "threat_assess_rating" - TYPE = "type" - - -class Output: - BULK_INDICATORS = "bulk_indicators" - - -class BulkIndicatorDownloadInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "attribute": { - "type": "string", - "title": "Attribute", - "description": "Attribute type", - "order": 2 - }, - "confidence": { - "type": "integer", - "title": "Confidence", - "description": "Confidence value", - "order": 3 - }, - "date_added": { - "type": "string", - "title": "Date Added", - "displayType": "date", - "description": "Date indicator added", - "format": "date-time", - "order": 4 - }, - "last_modified": { - "type": "string", - "title": "Last Modified", - "displayType": "date", - "description": "Last modified date", - "format": "date-time", - "order": 5 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 1 - }, - "rating": { - "type": "string", - "title": "Rating", - "description": "Indicator rating", - "order": 6 - }, - "tag": { - "type": "string", - "title": "Tag", - "description": "Single tag filter", - "order": 7 - }, - "threat_assess_confidence": { - "type": "integer", - "title": "Threat Assess Confidence", - "description": "Threat Assess Confidence filter", - "order": 8 - }, - "threat_assess_rating": { - "type": "string", - "title": "Threat Assess Rating", - "description": "Threat Assess Rating filter", - "order": 9 - }, - "type": { - "type": "string", - "title": "Type", - "description": "Indicator type", - "order": 10 - } - }, - "required": [ - "owner" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class BulkIndicatorDownloadOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "bulk_indicators": { - "type": "array", - "title": "Bulk Indicators", - "description": "Bulk indicators", - "items": { - "$ref": "#/definitions/bulk_indicator_output" - }, - "order": 1 - } - }, - "definitions": { - "bulk_indicator_output": { - "type": "object", - "title": "bulk_indicator_output", - "properties": { - "confidence": { - "type": "string", - "title": "Confidence", - "order": 7 - }, - "date_added": { - "type": "string", - "title": "Date Added", - "displayType": "date", - "format": "date-time", - "order": 3 - }, - "id": { - "type": "integer", - "title": "ID", - "order": 1 - }, - "last_modified": { - "type": "string", - "title": "Last Modified", - "displayType": "date", - "format": "date-time", - "order": 4 - }, - "owner_name": { - "type": "string", - "title": "Owner Name", - "order": 2 - }, - "rating": { - "type": "string", - "title": "Rating", - "order": 5 - }, - "threat_assess_confidence": { - "type": "string", - "title": "Threat Assess Confidence", - "order": 8 - }, - "threat_assess_rating": { - "type": "string", - "title": "Threat Assess Rating", - "order": 6 - }, - "type": { - "type": "string", - "title": "Type", - "order": 9 - }, - "weblink": { - "type": "string", - "title": "Weblink", - "order": 10 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/create_adversary/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/create_adversary/__init__.py deleted file mode 100755 index 31c65ea9b1..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/create_adversary/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import CreateAdversary diff --git a/plugins/threat_connect/komand_threat_connect/actions/create_adversary/action.py b/plugins/threat_connect/komand_threat_connect/actions/create_adversary/action.py deleted file mode 100755 index 5b32a0a1c1..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/create_adversary/action.py +++ /dev/null @@ -1,53 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import CreateAdversaryInput, CreateAdversaryOutput - -# Custom imports below - - -class CreateAdversary(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="create_adversary", - description="Create Threatconnect Adversary", - input=CreateAdversaryInput(), - output=CreateAdversaryOutput(), - ) - - def run(self, params={}): - adversaries = self.connection.threat_connect.adversaries() - - # name, owner required - adversary = adversaries.add(params.get("name"), params.get("owner")) - - if params.get("attributes"): - a_vals = [list(v.values())[0] for v in params.get("attributes")] - a_keys = [list(k.keys())[0] for k in params.get("attributes")] - for i in range(len(a_keys)): - adversary.add_attribute(a_keys[i], a_vals[i]) - - if params.get("tags"): - result_tags = [tag.strip() for tag in params.get("tags").split(",")] - for r_tag in result_tags: - adversary.add_tag(r_tag) - - if params.get("security_label"): - adversary.set_security_label(params.get("security_label")) - - try: - a = adversary.commit() - return {"id": a.id} - except RuntimeError as e: - self.logger.error("Error: {0}".format(e)) - raise e - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/create_adversary/schema.py b/plugins/threat_connect/komand_threat_connect/actions/create_adversary/schema.py deleted file mode 100755 index a1c23c50ed..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/create_adversary/schema.py +++ /dev/null @@ -1,90 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Create ThreatConnect Adversary" - - -class Input: - ATTRIBUTES = "attributes" - NAME = "name" - OWNER = "owner" - SECURITY_LABEL = "security_label" - TAGS = "tags" - - -class Output: - ID = "id" - - -class CreateAdversaryInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "attributes": { - "type": "array", - "title": "Attributes", - "description": "Adversary Attributes", - "items": { - "type": "object" - }, - "order": 5 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Adversary Name", - "order": 3 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 4 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Adversary Security Label", - "order": 2 - }, - "tags": { - "type": "string", - "title": "Tags", - "description": "Adversary Tags", - "order": 1 - } - }, - "required": [ - "name", - "owner" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class CreateAdversaryOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "id": { - "type": "integer", - "title": "Adversary ID", - "description": "Adversary ID", - "order": 1 - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/create_task/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/create_task/__init__.py deleted file mode 100755 index bee5ed4199..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/create_task/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import CreateTask diff --git a/plugins/threat_connect/komand_threat_connect/actions/create_task/action.py b/plugins/threat_connect/komand_threat_connect/actions/create_task/action.py deleted file mode 100755 index 9cf2e5bd0e..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/create_task/action.py +++ /dev/null @@ -1,81 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import CreateTaskInput, CreateTaskOutput - -# Custom imports below - - -class CreateTask(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="create_task", - description="Create a Task Resource in the ThreatConnect platform", - input=CreateTaskInput(), - output=CreateTaskOutput(), - ) - - def run(self, params={}): # noqa: MC0001 - tasks = self.connection.threat_connect.tasks() - - # name, owner required - task = tasks.add(params.get("name"), params.get("owner")) - - if params.get("attributes"): - a_vals = [list(v.values())[0] for v in params.get("attributes")] - a_keys = [list(k.keys())[0] for k in params.get("attributes")] - for i in range(len(a_keys)): - task.add_attribute(a_keys[i], a_vals[i]) - - if params.get("tags"): - result_tags = [tag.strip() for tag in params.get("tags").split(",")] - for r_tag in result_tags: - task.add_tag(r_tag) - - if params.get("security_label"): - task.set_security_label(params.get("security_label")) - - if params.get("due_date"): - # date - task.set_due_date(params.get("due_date")) - if params.get("escalation_date"): - # date - task.set_escalation_date(params.get("escalation_date")) - if params.get("reminder_date"): - # date - task.set_reminder_date(params.get("reminder_date")) - if params.get("escalated"): - # boolean - task.set_escalated(params.get("escalated")) - if params.get("overdue"): - # boolean - task.set_overdue(params.get("overdue")) - if params.get("reminded"): - # boolean - task.set_reminded(params.get("reminded")) - if params.get("status"): - # In Progress, Completed, Waiting on Someone, Deferred - task.set_status(params.get("status")) - if params.get("assignee"): - # email - task.add_assignee(params.get("assignee")) - if params.get("escalatee"): - # email - task.add_escalatee(params.get("escalatee")) - - try: - a = task.commit() - return {"id": a.id} - except RuntimeError as e: - self.logger.error("Error: {0}".format(e)) - raise e - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/create_task/schema.py b/plugins/threat_connect/komand_threat_connect/actions/create_task/schema.py deleted file mode 100755 index ca4e32a7a5..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/create_task/schema.py +++ /dev/null @@ -1,157 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Create a Task Resource in the ThreatConnect platform" - - -class Input: - ASSIGNEE = "assignee" - ATTRIBUTES = "attributes" - DUE_DATE = "due_date" - ESCALATED = "escalated" - ESCALATEE = "escalatee" - ESCALATION_DATE = "escalation_date" - NAME = "name" - OVERDUE = "overdue" - REMINDED = "reminded" - REMINDER_DATE = "reminder_date" - SECURITY_LABEL = "security_label" - STATUS = "status" - TAGS = "tags" - - -class Output: - ID = "id" - - -class CreateTaskInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "assignee": { - "type": "string", - "title": "Assignee", - "description": "Task Assignee", - "order": 11 - }, - "attributes": { - "type": "array", - "title": "Attributes", - "description": "Task Attributes", - "items": { - "type": "object" - }, - "order": 2 - }, - "due_date": { - "type": "string", - "title": "Due Date", - "displayType": "date", - "description": "Task due date", - "format": "date-time", - "order": 4 - }, - "escalated": { - "type": "boolean", - "title": "Escalated", - "description": "Use task escalation", - "order": 7 - }, - "escalatee": { - "type": "string", - "title": "Escalatee", - "description": "Task escalatee", - "order": 12 - }, - "escalation_date": { - "type": "string", - "title": "Escalation Date", - "displayType": "date", - "description": "Task escalation date", - "format": "date-time", - "order": 5 - }, - "name": { - "type": "string", - "title": "Name", - "description": "Task Name", - "order": 1 - }, - "overdue": { - "type": "boolean", - "title": "Overdue", - "description": "Is task overdue", - "order": 8 - }, - "reminded": { - "type": "boolean", - "title": "Reminded", - "description": "Use task Reminder", - "order": 9 - }, - "reminder_date": { - "type": "string", - "title": "Reminder Date", - "displayType": "date", - "description": "Task reminder date", - "format": "date-time", - "order": 6 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Task security label", - "order": 13 - }, - "status": { - "type": "string", - "title": "Status", - "description": "Task status", - "enum": [ - "In Progress", - "Completed", - "Waiting on Someone", - "Deferred" - ], - "order": 10 - }, - "tags": { - "type": "string", - "title": "Tags", - "description": "Task tags comma delimited", - "order": 3 - } - }, - "required": [ - "name" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class CreateTaskOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "id": { - "type": "integer", - "title": "Task ID", - "description": "Task ID", - "order": 1 - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/__init__.py deleted file mode 100755 index 2ca8543ddb..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import DeleteAdversary diff --git a/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/action.py b/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/action.py deleted file mode 100755 index 4b1225eaee..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/action.py +++ /dev/null @@ -1,37 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import DeleteAdversaryInput, DeleteAdversaryOutput - -# Custom imports below - - -class DeleteAdversary(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="delete_adversary", - description="Delete an Adversary in the ThreatConnect platform", - input=DeleteAdversaryInput(), - output=DeleteAdversaryOutput(), - ) - - def run(self, params={}): - adversaries = self.connection.threat_connect.adversaries() - adversary = adversaries.add("", params.get("owner")) - adversary.set_id(params.get("id")) - - try: - adversary.delete() - return {"status": True} - except RuntimeError: - return {"status": False} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/schema.py b/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/schema.py deleted file mode 100755 index 8cbeef0469..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/delete_adversary/schema.py +++ /dev/null @@ -1,66 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Delete an Adversary in the ThreatConnect platform" - - -class Input: - ID = "id" - OWNER = "owner" - - -class Output: - STATUS = "status" - - -class DeleteAdversaryInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "id": { - "type": "integer", - "title": "ID", - "description": "Adversary To Delete", - "order": 2 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 1 - } - }, - "required": [ - "id", - "owner" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class DeleteAdversaryOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "status": { - "type": "boolean", - "title": "Status", - "description": "Status", - "order": 1 - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/__init__.py deleted file mode 100755 index fe6f997206..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import EmailsRetrieve diff --git a/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/action.py b/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/action.py deleted file mode 100755 index aa1f056de9..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/action.py +++ /dev/null @@ -1,85 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import EmailsRetrieveInput, EmailsRetrieveOutput - -# Custom imports below - - -class EmailsRetrieve(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="emails_retrieve", - description="Retrieve ThreatConnect E-mails", - input=EmailsRetrieveInput(), - output=EmailsRetrieveOutput(), - ) - - def run(self, params={}): - email_obj_list = [] - emails = self.connection.threat_connect.emails() - - filter1 = emails.add_filter() - filter1.add_owner(params.get("owner")) - - if params.get("adversary_id"): - filter1.add_adversary_id(params.get("adversary_id")) - - if params.get("email_id"): - filter1.add_email_id(params.get("email_id")) - - if params.get("document_id"): - filter1.add_document_id(params.get("document_id")) - - if params.get("id"): - filter1.add_id(params.get("id")) - - if params.get("incident_id"): - filter1.add_incident_id(params.get("incident_id")) - - if params.get("indicator"): - filter1.add_indicator(params.get("indicator")) - - if params.get("security_label"): - filter1.add_security_label(params.get("security_label")) - - if params.get("signature_id"): - filter1.add_signature_id(params.get("signature_id")) - - if params.get("threat_id"): - filter1.add_threat_id(params.get("threat_id")) - - if params.get("tag"): - filter1.add_tag(params.get("tag")) - - try: - emails.retrieve() - except RuntimeError as e: - raise e - - for email in emails: - email_obj = { - "id": (email.id or ""), - "name": (email.name or ""), - "date_added": (email.date_added or ""), - "weblink": (email.weblink or ""), - "header": (email.header or ""), - "subject": (email.subject or ""), - "from_address": (email.from_address or ""), - "to": (email.to or ""), - "body": (email.body or ""), - "score": (email.score or ""), - } - email_obj_list.append(email_obj) - - return {"emails": email_obj_list} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/schema.py b/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/schema.py deleted file mode 100755 index 28bc17d081..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/emails_retrieve/schema.py +++ /dev/null @@ -1,191 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Retrieve ThreatConnect emails" - - -class Input: - ADVERSARY_ID = "adversary_id" - DOCUMENT_ID = "document_id" - EMAIL_ID = "email_id" - ID = "id" - INCIDENT_ID = "incident_id" - INDICATOR = "indicator" - OWNER = "owner" - SECURITY_LABEL = "security_label" - SIGNATURE_ID = "signature_id" - TAG = "tag" - THREAT_ID = "threat_id" - - -class Output: - EMAILS = "emails" - - -class EmailsRetrieveInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "adversary_id": { - "type": "integer", - "title": "Adversary ID", - "description": "Filter Groups on associated Adversary ID", - "order": 1 - }, - "document_id": { - "type": "integer", - "title": "Document ID", - "description": "Filter Groups on associated Document ID", - "order": 4 - }, - "email_id": { - "type": "integer", - "title": "Email ID", - "description": "Filter Groups on associated Email ID", - "order": 2 - }, - "id": { - "type": "integer", - "title": "ID", - "description": "Filter Groups on associated ID", - "order": 3 - }, - "incident_id": { - "type": "integer", - "title": "Incident ID", - "description": "Filter Groups on associated Incident ID", - "order": 5 - }, - "indicator": { - "type": "string", - "title": "Indicator", - "description": "Filter Groups on associated Indicator", - "order": 6 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 11 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Filter Groups on associated Security Label", - "order": 7 - }, - "signature_id": { - "type": "integer", - "title": "Signature ID", - "description": "Filter Groups on applied Security Label", - "order": 8 - }, - "tag": { - "type": "string", - "title": "Tag", - "description": "Filter Groups on applied Tag", - "order": 10 - }, - "threat_id": { - "type": "integer", - "title": "Threat ID", - "description": "Filter Groups on associated Threat ID", - "order": 9 - } - }, - "required": [ - "owner" - ] -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class EmailsRetrieveOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "emails": { - "type": "array", - "title": "Emails", - "description": "Emails", - "items": { - "$ref": "#/definitions/email_output" - }, - "order": 1 - } - }, - "definitions": { - "email_output": { - "type": "object", - "title": "email_output", - "properties": { - "body": { - "type": "string", - "title": "Body", - "order": 9 - }, - "date_added": { - "type": "string", - "title": "Date Added", - "displayType": "date", - "format": "date-time", - "order": 3 - }, - "from_address": { - "type": "string", - "title": "From Address", - "order": 7 - }, - "header": { - "type": "string", - "title": "Header", - "order": 5 - }, - "id": { - "type": "integer", - "title": "ID", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "order": 2 - }, - "score": { - "type": "string", - "title": "Score", - "order": 10 - }, - "subject": { - "type": "string", - "title": "Subject", - "order": 6 - }, - "to": { - "type": "string", - "title": "To", - "order": 8 - }, - "weblink": { - "type": "string", - "title": "Weblink", - "order": 4 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/__init__.py deleted file mode 100755 index ed6dec32a4..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import IncidentsRetrieve diff --git a/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/action.py b/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/action.py deleted file mode 100755 index b2639e6fc4..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/action.py +++ /dev/null @@ -1,85 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import IncidentsRetrieveInput, IncidentsRetrieveOutput - -# Custom imports below -import datetime - - -class IncidentsRetrieve(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="incidents_retrieve", - description="Retrieve ThreatConnect Incidents", - input=IncidentsRetrieveInput(), - output=IncidentsRetrieveOutput(), - ) - - def run(self, params={}): - incidents = self.connection.threat_connect.incidents() - incident_obj_list = [] - - filter1 = incidents.add_filter() - - filter1.add_owner(params.get("owner")) - - if params.get("adversary_id"): - filter1.add_adversary_id(params.get("adversary_id")) - - if params.get("email_id"): - filter1.add_email_id(params.get("email_id")) - - if params.get("document_id"): - filter1.add_document_id(params.get("document_id")) - - if params.get("id"): - filter1.add_id(params.get("id")) - - if params.get("incident_id"): - filter1.add_incident_id(params.get("incident_id")) - - if params.get("indicator"): - filter1.add_indicator(params.get("indicator")) - - if params.get("security_label"): - filter1.add_security_label(params.get("security_label")) - - if params.get("signature_id"): - filter1.add_signature_id(params.get("signature_id")) - - if params.get("threat_id"): - filter1.add_threat_id(params.get("threat_id")) - - if params.get("tag"): - filter1.add_tag(params.get("tag")) - - if params.get("victim_id"): - filter1.add_victim_id(params.get("victim_id")) - - try: - incidents.retrieve() - except RuntimeError as e: - raise e - - for incident in incidents: - incident_obj = { - "id": incident.id, - "name": incident.name, - "date_added": (datetime.datetime.strptime(incident.date_added, "%Y-%d-%mT%H:%M:%SZ").isoformat() or ""), - "event_date": (datetime.datetime.strptime(incident.event_date, "%Y-%d-%mT%H:%M:%SZ").isoformat() or ""), - "weblink": incident.weblink, - } - incident_obj_list.append(incident_obj) - - return {"incidents": incident_obj_list} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/schema.py b/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/schema.py deleted file mode 100755 index 79978d1f84..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/incidents_retrieve/schema.py +++ /dev/null @@ -1,179 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Retrieve ThreatConnect Incidents" - - -class Input: - FILTER = "filter" - OWNER = "owner" - - -class Output: - INCIDENTS = "incidents" - - -class IncidentsRetrieveInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "filter": { - "$ref": "#/definitions/filter", - "title": "Filter", - "description": "ThreatConnect filters", - "order": 1 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 2 - } - }, - "required": [ - "owner" - ], - "definitions": { - "filter": { - "type": "object", - "title": "filter", - "properties": { - "adversary_id": { - "type": "integer", - "title": "Adversary ID", - "description": "Filter Groups on associated Adversary ID", - "order": 1 - }, - "document_id": { - "type": "integer", - "title": "Document ID", - "description": "Filter Groups on associated Document ID", - "order": 4 - }, - "email_id": { - "type": "integer", - "title": "Email ID", - "description": "Filter Groups on associated Email ID", - "order": 2 - }, - "id": { - "type": "integer", - "title": "ID", - "description": "Filter Groups on associated ID", - "order": 3 - }, - "incident_id": { - "type": "integer", - "title": "Incident ID", - "description": "Filter Groups on associated Incident ID", - "order": 5 - }, - "indicator": { - "type": "string", - "title": "Indicator", - "description": "Filter Groups on associated Indicator", - "order": 6 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Filter Groups on associated Security Label", - "order": 7 - }, - "signature_id": { - "type": "integer", - "title": "Signature ID", - "description": "Filter Groups on applied Security Label", - "order": 8 - }, - "tag": { - "type": "string", - "title": "Tag", - "description": "Filter Groups on applied Tag", - "order": 10 - }, - "threat_id": { - "type": "integer", - "title": "Threat ID", - "description": "Filter Groups on associated Threat ID", - "order": 9 - }, - "victim_id": { - "type": "integer", - "title": "Victim ID", - "description": "Filter Groups on associated Victim ID", - "order": 11 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class IncidentsRetrieveOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "incidents": { - "type": "array", - "title": "Incidents", - "description": "Incidents", - "items": { - "$ref": "#/definitions/incidents_output" - }, - "order": 1 - } - }, - "definitions": { - "incidents_output": { - "type": "object", - "title": "incidents_output", - "properties": { - "date_added": { - "type": "string", - "title": "Date Added", - "displayType": "date", - "format": "date-time", - "order": 3 - }, - "event_date": { - "type": "string", - "title": "Event Date", - "displayType": "date", - "format": "date-time", - "order": 4 - }, - "id": { - "type": "integer", - "title": "ID", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "order": 2 - }, - "weblink": { - "type": "string", - "title": "Weblink", - "order": 5 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/__init__.py deleted file mode 100755 index 0a150a01cf..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import SignaturesRetrieve diff --git a/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/action.py b/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/action.py deleted file mode 100755 index a0c0aa1dc7..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/action.py +++ /dev/null @@ -1,92 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import SignaturesRetrieveInput, SignaturesRetrieveOutput - -# Custom imports below -import datetime - - -class SignaturesRetrieve(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="signatures_retrieve", - description="Retrieve ThreatConnect Signatures", - input=SignaturesRetrieveInput(), - output=SignaturesRetrieveOutput(), - ) - - def run(self, params={}): # noqa: MC0001 - sig_obj_list = [] - signatures = self.connection.threat_connect.signatures() - - filter1 = signatures.add_filter() - - filter1.add_owner(params.get("owner")) - - if params.get("adversary_id"): - filter1.add_adversary_id(params.get("adversary_id")) - - if params.get("email_id"): - filter1.add_email_id(params.get("email_id")) - - if params.get("document_id"): - filter1.add_document_id(params.get("document_id")) - - if params.get("id"): - filter1.add_id(params.get("id")) - - if params.get("incident_id"): - filter1.add_incident_id(params.get("incident_id")) - - if params.get("indicator"): - filter1.add_indicator(params.get("indicator")) - - if params.get("security_label"): - filter1.add_security_label(params.get("security_label")) - - if params.get("signature_id"): - filter1.add_signature_id(params.get("signature_id")) - - if params.get("threat_id"): - filter1.add_threat_id(params.get("threat_id")) - - if params.get("tag"): - filter1.add_tag(params.get("tag")) - - if params.get("victim_id"): - filter1.add_victim_id(params.get("victim_id")) - - try: - filter1 = signatures.add_filter() - # filter1.add_id(params.get('id')) - except AttributeError as e: - raise e - - try: - signatures.retrieve() - except RuntimeError as e: - raise e - - for signature in signatures: - sig_obj = { - "id": signature.id, - "name": signature.name, - "date_added": ( - datetime.datetime.strptime(signature.date_added, "%Y-%d-%mT%H:%M:%SZ").isoformat() or "" - ), - "weblink": signature.weblink, - } - sig_obj_list.append(sig_obj) - - return {"signatures": sig_obj_list} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/schema.py b/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/schema.py deleted file mode 100755 index 608ca90f53..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/signatures_retrieve/schema.py +++ /dev/null @@ -1,172 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Retrieve ThreatConnect Signatures" - - -class Input: - FILTER = "filter" - OWNER = "owner" - - -class Output: - SIGNATURES = "signatures" - - -class SignaturesRetrieveInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "filter": { - "$ref": "#/definitions/filter", - "title": "Filter", - "description": "ThreatConnect filters", - "order": 1 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 2 - } - }, - "required": [ - "owner" - ], - "definitions": { - "filter": { - "type": "object", - "title": "filter", - "properties": { - "adversary_id": { - "type": "integer", - "title": "Adversary ID", - "description": "Filter Groups on associated Adversary ID", - "order": 1 - }, - "document_id": { - "type": "integer", - "title": "Document ID", - "description": "Filter Groups on associated Document ID", - "order": 4 - }, - "email_id": { - "type": "integer", - "title": "Email ID", - "description": "Filter Groups on associated Email ID", - "order": 2 - }, - "id": { - "type": "integer", - "title": "ID", - "description": "Filter Groups on associated ID", - "order": 3 - }, - "incident_id": { - "type": "integer", - "title": "Incident ID", - "description": "Filter Groups on associated Incident ID", - "order": 5 - }, - "indicator": { - "type": "string", - "title": "Indicator", - "description": "Filter Groups on associated Indicator", - "order": 6 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Filter Groups on associated Security Label", - "order": 7 - }, - "signature_id": { - "type": "integer", - "title": "Signature ID", - "description": "Filter Groups on applied Security Label", - "order": 8 - }, - "tag": { - "type": "string", - "title": "Tag", - "description": "Filter Groups on applied Tag", - "order": 10 - }, - "threat_id": { - "type": "integer", - "title": "Threat ID", - "description": "Filter Groups on associated Threat ID", - "order": 9 - }, - "victim_id": { - "type": "integer", - "title": "Victim ID", - "description": "Filter Groups on associated Victim ID", - "order": 11 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class SignaturesRetrieveOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "signatures": { - "type": "array", - "title": "Signatures", - "description": "Signatures", - "items": { - "$ref": "#/definitions/signatures_output" - }, - "order": 1 - } - }, - "definitions": { - "signatures_output": { - "type": "object", - "title": "signatures_output", - "properties": { - "date_added": { - "type": "string", - "title": "Date Added", - "displayType": "date", - "format": "date-time", - "order": 3 - }, - "id": { - "type": "integer", - "title": "ID", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "order": 2 - }, - "weblink": { - "type": "string", - "title": "Weblink", - "order": 4 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/__init__.py deleted file mode 100755 index 4e28d7c470..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import ThreatsRetrieve diff --git a/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/action.py b/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/action.py deleted file mode 100755 index 864006f8b1..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/action.py +++ /dev/null @@ -1,90 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import ThreatsRetrieveInput, ThreatsRetrieveOutput - -# Custom imports below -import datetime - - -class ThreatsRetrieve(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="threats_retrieve", - description="Retrieve ThreatConnect Threats", - input=ThreatsRetrieveInput(), - output=ThreatsRetrieveOutput(), - ) - - def run(self, params={}): # noqa: MC0001 - threat_obj_list = [] - threats = self.connection.threat_connect.threats() - - filter1 = threats.add_filter() - - filter1.add_owner(params.get("owner")) - - if params.get("adversary_id"): - filter1.add_adversary_id(params.get("adversary_id")) - - if params.get("email_id"): - filter1.add_email_id(params.get("email_id")) - - if params.get("document_id"): - filter1.add_document_id(params.get("document_id")) - - if params.get("id"): - filter1.add_id(params.get("id")) - - if params.get("incident_id"): - filter1.add_incident_id(params.get("incident_id")) - - if params.get("indicator"): - filter1.add_indicator(params.get("indicator")) - - if params.get("security_label"): - filter1.add_security_label(params.get("security_label")) - - if params.get("signature_id"): - filter1.add_signature_id(params.get("signature_id")) - - if params.get("threat_id"): - filter1.add_threat_id(params.get("threat_id")) - - if params.get("tag"): - filter1.add_tag(params.get("tag")) - - if params.get("victim_id"): - filter1.add_victim_id(params.get("victim_id")) - - try: - filter1 = threats.add_filter() - # filter1.add_id(params.get('id')) - except AttributeError as e: - raise e - - try: - threats.retrieve() - except RuntimeError as e: - raise e - - for threat in threats: - threat_obj = { - "id": (threat.id or -1), - "name": (threat.name or ""), - "date_added": (datetime.datetime.strptime(threat.date_added, "%Y-%d-%mT%H:%M:%SZ").isoformat() or ""), - "weblink": (threat.weblink or ""), - } - threat_obj_list.append(threat_obj) - - return {"threats": threat_obj_list} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/schema.py b/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/schema.py deleted file mode 100755 index d13c6c1d54..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/threats_retrieve/schema.py +++ /dev/null @@ -1,172 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Retrieve ThreatConnect Threats" - - -class Input: - FILTER = "filter" - OWNER = "owner" - - -class Output: - THREATS = "threats" - - -class ThreatsRetrieveInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "filter": { - "$ref": "#/definitions/filter", - "title": "Filter", - "description": "ThreatConnect filters", - "order": 1 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 2 - } - }, - "required": [ - "owner" - ], - "definitions": { - "filter": { - "type": "object", - "title": "filter", - "properties": { - "adversary_id": { - "type": "integer", - "title": "Adversary ID", - "description": "Filter Groups on associated Adversary ID", - "order": 1 - }, - "document_id": { - "type": "integer", - "title": "Document ID", - "description": "Filter Groups on associated Document ID", - "order": 4 - }, - "email_id": { - "type": "integer", - "title": "Email ID", - "description": "Filter Groups on associated Email ID", - "order": 2 - }, - "id": { - "type": "integer", - "title": "ID", - "description": "Filter Groups on associated ID", - "order": 3 - }, - "incident_id": { - "type": "integer", - "title": "Incident ID", - "description": "Filter Groups on associated Incident ID", - "order": 5 - }, - "indicator": { - "type": "string", - "title": "Indicator", - "description": "Filter Groups on associated Indicator", - "order": 6 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Filter Groups on associated Security Label", - "order": 7 - }, - "signature_id": { - "type": "integer", - "title": "Signature ID", - "description": "Filter Groups on applied Security Label", - "order": 8 - }, - "tag": { - "type": "string", - "title": "Tag", - "description": "Filter Groups on applied Tag", - "order": 10 - }, - "threat_id": { - "type": "integer", - "title": "Threat ID", - "description": "Filter Groups on associated Threat ID", - "order": 9 - }, - "victim_id": { - "type": "integer", - "title": "Victim ID", - "description": "Filter Groups on associated Victim ID", - "order": 11 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class ThreatsRetrieveOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "threats": { - "type": "array", - "title": "Threats", - "description": "Threats", - "items": { - "$ref": "#/definitions/signatures_output" - }, - "order": 1 - } - }, - "definitions": { - "signatures_output": { - "type": "object", - "title": "signatures_output", - "properties": { - "date_added": { - "type": "string", - "title": "Date Added", - "displayType": "date", - "format": "date-time", - "order": 3 - }, - "id": { - "type": "integer", - "title": "ID", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "order": 2 - }, - "weblink": { - "type": "string", - "title": "Weblink", - "order": 4 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/__init__.py b/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/__init__.py deleted file mode 100755 index f3131c9575..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .action import VictimsRetrieve diff --git a/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/action.py b/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/action.py deleted file mode 100755 index 7c687cf0cb..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/action.py +++ /dev/null @@ -1,86 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import VictimsRetrieveInput, VictimsRetrieveOutput - -# Custom imports below - - -class VictimsRetrieve(insightconnect_plugin_runtime.Action): - def __init__(self): - super(self.__class__, self).__init__( - name="victims_retrieve", - description="Retrieve ThreatConnect Victims", - input=VictimsRetrieveInput(), - output=VictimsRetrieveOutput(), - ) - - def run(self, params={}): - victims = self.connection.threat_connect.victims() - victim_obj_list = [] - - filter1 = victims.add_filter() - - filter1.add_owner(params.get("owner")) - - if params.get("adversary_id"): - filter1.add_adversary_id(params.get("adversary_id")) - - if params.get("email_id"): - filter1.add_email_id(params.get("email_id")) - - if params.get("document_id"): - filter1.add_document_id(params.get("document_id")) - - if params.get("id"): - filter1.add_id(params.get("id")) - - if params.get("incident_id"): - filter1.add_incident_id(params.get("incident_id")) - - if params.get("indicator"): - filter1.add_indicator(params.get("indicator")) - - if params.get("security_label"): - filter1.add_security_label(params.get("security_label")) - - if params.get("signature_id"): - filter1.add_signature_id(params.get("signature_id")) - - if params.get("threat_id"): - filter1.add_threat_id(params.get("threat_id")) - - if params.get("tag"): - filter1.add_tag(params.get("tag")) - - if params.get("victim_id"): - filter1.add_victim_id(params.get("victim_id")) - - try: - victims.retrieve() - except RuntimeError as e: - raise e - - for victim in victims: - victim_obj = { - "id": victim.id, - "name": victim.name, - "nationality": (victim.nationality or ""), - "org": (victim.org or ""), - "suborg": (victim.suborg or ""), - "work_location": (victim.work_location or ""), - "weblink": victim.weblink, - } - victim_obj_list.append(victim_obj) - - return {"victims": victim_obj_list} - - def test(self): - owners = self.connection.threat_connect.owners() - owner = "" - try: - owners.retrieve() - except RuntimeError as e: - raise e - - for owner in owners: - owner = owner.name - return {"Owner Name": owner} diff --git a/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/schema.py b/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/schema.py deleted file mode 100755 index 0d2628e711..0000000000 --- a/plugins/threat_connect/komand_threat_connect/actions/victims_retrieve/schema.py +++ /dev/null @@ -1,185 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Component: - DESCRIPTION = "Retrieve ThreatConnect Victims" - - -class Input: - FILTER = "filter" - OWNER = "owner" - - -class Output: - VICTIMS = "victims" - - -class VictimsRetrieveInput(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "filter": { - "$ref": "#/definitions/filter", - "title": "Filter", - "description": "ThreatConnect filters", - "order": 1 - }, - "owner": { - "type": "string", - "title": "Owner", - "description": "Owner/Organization", - "order": 2 - } - }, - "required": [ - "owner" - ], - "definitions": { - "filter": { - "type": "object", - "title": "filter", - "properties": { - "adversary_id": { - "type": "integer", - "title": "Adversary ID", - "description": "Filter Groups on associated Adversary ID", - "order": 1 - }, - "document_id": { - "type": "integer", - "title": "Document ID", - "description": "Filter Groups on associated Document ID", - "order": 4 - }, - "email_id": { - "type": "integer", - "title": "Email ID", - "description": "Filter Groups on associated Email ID", - "order": 2 - }, - "id": { - "type": "integer", - "title": "ID", - "description": "Filter Groups on associated ID", - "order": 3 - }, - "incident_id": { - "type": "integer", - "title": "Incident ID", - "description": "Filter Groups on associated Incident ID", - "order": 5 - }, - "indicator": { - "type": "string", - "title": "Indicator", - "description": "Filter Groups on associated Indicator", - "order": 6 - }, - "security_label": { - "type": "string", - "title": "Security Label", - "description": "Filter Groups on associated Security Label", - "order": 7 - }, - "signature_id": { - "type": "integer", - "title": "Signature ID", - "description": "Filter Groups on applied Security Label", - "order": 8 - }, - "tag": { - "type": "string", - "title": "Tag", - "description": "Filter Groups on applied Tag", - "order": 10 - }, - "threat_id": { - "type": "integer", - "title": "Threat ID", - "description": "Filter Groups on associated Threat ID", - "order": 9 - }, - "victim_id": { - "type": "integer", - "title": "Victim ID", - "description": "Filter Groups on associated Victim ID", - "order": 11 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) - - -class VictimsRetrieveOutput(insightconnect_plugin_runtime.Output): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "victims": { - "type": "array", - "title": "Victims", - "description": "Victims", - "items": { - "$ref": "#/definitions/victim_output" - }, - "order": 1 - } - }, - "definitions": { - "victim_output": { - "type": "object", - "title": "victim_output", - "properties": { - "id": { - "type": "integer", - "title": "ID", - "order": 1 - }, - "name": { - "type": "string", - "title": "Name", - "order": 2 - }, - "nationality": { - "type": "string", - "title": "Nationality", - "order": 4 - }, - "org": { - "type": "string", - "title": "Org", - "order": 5 - }, - "suborg": { - "type": "string", - "title": "Suborg", - "order": 6 - }, - "weblink": { - "type": "string", - "title": "Weblink", - "order": 3 - }, - "work_location": { - "type": "string", - "title": "Work Location", - "order": 7 - } - } - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/connection/__init__.py b/plugins/threat_connect/komand_threat_connect/connection/__init__.py deleted file mode 100755 index a515dcf6b0..0000000000 --- a/plugins/threat_connect/komand_threat_connect/connection/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from .connection import Connection diff --git a/plugins/threat_connect/komand_threat_connect/connection/connection.py b/plugins/threat_connect/komand_threat_connect/connection/connection.py deleted file mode 100755 index eff6db472b..0000000000 --- a/plugins/threat_connect/komand_threat_connect/connection/connection.py +++ /dev/null @@ -1,27 +0,0 @@ -import insightconnect_plugin_runtime -from .schema import ConnectionSchema - -# Custom imports below -import sys -import threatconnect - - -class Connection(insightconnect_plugin_runtime.Connection): - def __init__(self): - super(self.__class__, self).__init__(input=ConnectionSchema()) - self.threat_connect = None - - def connect(self, params): - self.logger.info("Connect: Connecting..") - - try: - api_access_id = int(params.get("api_access_id")) - api_default_org = params.get("api_default_org") - api_secret_key = params.get("api_secret_key").get("secretKey") - api_base_url = params.get("api_base_url") - except Exception: - self.logger.info("Connect: Connection Failed") - sys.exit(1) - - self.threat_connect = threatconnect.ThreatConnect(api_access_id, api_secret_key, api_default_org, api_base_url) - self.threat_connect.set_tcl_console_level("debug") diff --git a/plugins/threat_connect/komand_threat_connect/connection/schema.py b/plugins/threat_connect/komand_threat_connect/connection/schema.py deleted file mode 100755 index 73cdb14b87..0000000000 --- a/plugins/threat_connect/komand_threat_connect/connection/schema.py +++ /dev/null @@ -1,74 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -import insightconnect_plugin_runtime -import json - - -class Input: - API_ACCESS_ID = "api_access_id" - API_BASE_URL = "api_base_url" - API_DEFAULT_ORG = "api_default_org" - API_SECRET_KEY = "api_secret_key" - - -class ConnectionSchema(insightconnect_plugin_runtime.Input): - schema = json.loads(""" - { - "type": "object", - "title": "Variables", - "properties": { - "api_access_id": { - "type": "string", - "title": "Api Access Id", - "description": "Enter API Access ID", - "order": 1 - }, - "api_base_url": { - "type": "string", - "title": "Api Base Url", - "description": "Enter API Base URL", - "order": 4 - }, - "api_default_org": { - "type": "string", - "title": "Api Default Org", - "description": "Enter API Default Org", - "order": 2 - }, - "api_secret_key": { - "$ref": "#/definitions/credential_secret_key", - "title": "Api Secret Key", - "description": "Enter API Secret Key", - "order": 3 - } - }, - "required": [ - "api_access_id", - "api_base_url", - "api_default_org", - "api_secret_key" - ], - "definitions": { - "credential_secret_key": { - "id": "credential_secret_key", - "type": "object", - "title": "Credential: Secret Key", - "description": "A shared secret key", - "properties": { - "secretKey": { - "type": "string", - "title": "Secret Key", - "displayType": "password", - "description": "The shared secret key", - "format": "password" - } - }, - "required": [ - "secretKey" - ] - } - } -} - """) - - def __init__(self): - super(self.__class__, self).__init__(self.schema) diff --git a/plugins/threat_connect/komand_threat_connect/triggers/__init__.py b/plugins/threat_connect/komand_threat_connect/triggers/__init__.py deleted file mode 100755 index bace8db897..0000000000 --- a/plugins/threat_connect/komand_threat_connect/triggers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/threat_connect/komand_threat_connect/util/__init__.py b/plugins/threat_connect/komand_threat_connect/util/__init__.py deleted file mode 100755 index bace8db897..0000000000 --- a/plugins/threat_connect/komand_threat_connect/util/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT diff --git a/plugins/threat_connect/plugin.spec.yaml b/plugins/threat_connect/plugin.spec.yaml deleted file mode 100644 index dcbbb70bc8..0000000000 --- a/plugins/threat_connect/plugin.spec.yaml +++ /dev/null @@ -1,576 +0,0 @@ -plugin_spec_version: v2 -extension: plugin -products: [insightconnect] -name: threat_connect -title: ThreatConnect -description: "ThreatConnect is a Threat Intelligence Platform (TIP) that empowers large - organizations to aggregate, analyze and act on their threat intelligence. The ThreatConnect plugin for Rapid7 -InsightConnect allows users to view incidents, emails, threats, victims, and more" -version: 1.0.2 -vendor: rapid7 -support: community -status: [] -resources: - source_url: https://github.com/rapid7/insightconnect-plugins/tree/master/plugins/threat_connect - license_url: https://github.com/rapid7/insightconnect-plugins/blob/master/LICENSE - vendor_url: https://threatconnect.com/ -tags: -- threat -- malicious -- analyze -- manage -- identify -- threatconnect -hub_tags: - use_cases: [threat_detection_and_response] - keywords: [threat, malicious, analyze, manage, identify, threatconnect] - features: [] -types: - filter: - adversary_id: - title: Adversary ID - type: integer - description: Filter Groups on associated Adversary ID - required: false - email_id: - title: Email ID - type: integer - description: Filter Groups on associated Email ID - required: false - id: - title: ID - type: integer - description: Filter Groups on associated ID - required: false - document_id: - title: Document ID - type: integer - description: Filter Groups on associated Document ID - required: false - incident_id: - title: Incident ID - type: integer - description: Filter Groups on associated Incident ID - required: false - indicator: - title: Indicator - type: string - description: Filter Groups on associated Indicator - required: false - security_label: - title: Security Label - type: string - description: Filter Groups on associated Security Label - required: false - signature_id: - title: Signature ID - type: integer - description: Filter Groups on applied Security Label - required: false - threat_id: - title: Threat ID - type: integer - description: Filter Groups on associated Threat ID - required: false - tag: - title: Tag - type: string - description: Filter Groups on applied Tag - required: false - victim_id: - title: Victim ID - type: integer - description: Filter Groups on associated Victim ID - required: false - email_output: - id: - title: ID - type: integer - name: - title: Name - type: string - date_added: - title: Date Added - type: date - weblink: - title: Weblink - type: string - header: - title: Header - type: string - subject: - title: Subject - type: string - from_address: - title: From Address - type: string - to: - title: To - type: string - body: - title: Body - type: string - score: - title: Score - type: string - incidents_output: - id: - title: ID - type: integer - name: - title: Name - type: string - date_added: - title: Date Added - type: date - event_date: - title: Event Date - type: date - weblink: - title: Weblink - type: string - bulk_indicator_output: - id: - title: ID - type: integer - required: false - owner_name: - title: Owner Name - type: string - required: false - date_added: - title: Date Added - type: date - required: false - last_modified: - title: Last Modified - type: date - required: false - rating: - title: Rating - type: string - required: false - threat_assess_rating: - title: Threat Assess Rating - type: string - required: false - confidence: - title: Confidence - type: string - required: false - threat_assess_confidence: - title: Threat Assess Confidence - type: string - required: false - type: - title: Type - type: string - required: false - weblink: - title: Weblink - type: string - required: false - signatures_output: - id: - title: ID - type: integer - required: false - name: - title: Name - type: string - required: false - date_added: - title: Date Added - type: date - required: false - weblink: - title: Weblink - type: string - required: false - victim_output: - id: - title: ID - type: integer - required: false - name: - title: Name - type: string - required: false - weblink: - title: Weblink - type: string - required: false - nationality: - title: Nationality - type: string - required: false - org: - title: Org - type: string - required: false - suborg: - title: Suborg - type: string - required: false - work_location: - title: Work Location - type: string - required: false -connection: - api_access_id: - type: string - description: Enter API Access ID - required: true - api_default_org: - type: string - description: Enter API Default Org - required: true - api_secret_key: - type: credential_secret_key - description: Enter API Secret Key - required: true - api_base_url: - type: string - description: Enter API Base URL - required: true -actions: - emails_retrieve: - title: Email Retrieve - description: Retrieve ThreatConnect emails - input: - adversary_id: - title: Adversary ID - type: integer - description: Filter Groups on associated Adversary ID - required: false - email_id: - title: Email ID - type: integer - description: Filter Groups on associated Email ID - required: false - id: - title: ID - type: integer - description: Filter Groups on associated ID - required: false - document_id: - title: Document ID - type: integer - description: Filter Groups on associated Document ID - required: false - incident_id: - title: Incident ID - type: integer - description: Filter Groups on associated Incident ID - required: false - indicator: - title: Indicator - type: string - description: Filter Groups on associated Indicator - required: false - security_label: - title: Security Label - type: string - description: Filter Groups on associated Security Label - required: false - signature_id: - title: Signature ID - type: integer - description: Filter Groups on applied Security Label - required: false - threat_id: - title: Threat ID - type: integer - description: Filter Groups on associated Threat ID - required: false - tag: - title: Tag - type: string - description: Filter Groups on applied Tag - required: false - owner: - title: Owner - type: string - description: Owner/Organization - required: true - output: - emails: - title: Emails - type: '[]email_output' - required: false - description: Emails - incidents_retrieve: - title: Incidents Retrieve - description: Retrieve ThreatConnect Incidents - input: - filter: - title: Filter - type: filter - description: ThreatConnect filters - required: false - owner: - title: Owner - type: string - description: Owner/Organization - required: true - output: - incidents: - title: Incidents - type: '[]incidents_output' - required: false - description: Incidents - bulk_indicator_download: - title: Bulk Indicator Download - description: Retrieve ThreatConnect Bulk Indicator Download - input: - owner: - title: Owner - type: string - description: Owner/Organization - required: true - attribute: - title: Attribute - type: string - description: Attribute type - required: false - confidence: - title: Confidence - type: integer - description: Confidence value - required: false - date_added: - title: Date Added - type: date - description: Date indicator added - required: false - last_modified: - title: Last Modified - type: date - description: Last modified date - required: false - rating: - title: Rating - type: string - description: Indicator rating - required: false - tag: - title: Tag - type: string - description: Single tag filter - required: false - threat_assess_confidence: - title: Threat Assess Confidence - type: integer - description: Threat Assess Confidence filter - required: false - threat_assess_rating: - title: Threat Assess Rating - type: string - description: Threat Assess Rating filter - required: false - type: - title: Type - type: string - description: Indicator type - required: false - output: - bulk_indicators: - title: Bulk Indicators - type: '[]bulk_indicator_output' - required: false - description: Bulk indicators - signatures_retrieve: - title: Signatures Retrieve - description: Retrieve ThreatConnect Signatures - input: - filter: - title: Filter - type: filter - description: ThreatConnect filters - required: false - owner: - title: Owner - type: string - description: Owner/Organization - required: true - output: - signatures: - title: Signatures - type: '[]signatures_output' - required: false - description: Signatures - threats_retrieve: - title: Threats Retrieve - description: Retrieve ThreatConnect Threats - input: - filter: - title: Filter - type: filter - description: ThreatConnect filters - required: false - owner: - title: Owner - type: string - description: Owner/Organization - required: true - output: - threats: - title: Threats - type: '[]signatures_output' - required: false - description: Threats - victims_retrieve: - title: Victims Retrieve - description: Retrieve ThreatConnect Victims - input: - filter: - title: Filter - type: filter - description: ThreatConnect filters - required: false - owner: - title: Owner - type: string - description: Owner/Organization - required: true - output: - victims: - title: Victims - type: '[]victim_output' - required: false - description: Victims - create_adversary: - title: Create Adversary - description: Create ThreatConnect Adversary - input: - tags: - title: Tags - type: string - description: Adversary Tags - required: false - security_label: - title: Security Label - type: string - description: Adversary Security Label - required: false - name: - title: Name - type: string - description: Adversary Name - required: true - owner: - title: Owner - type: string - description: Owner/Organization - required: true - attributes: - title: Attributes - type: '[]object' - description: Adversary Attributes - required: false - output: - id: - title: Adversary ID - type: integer - required: false - description: Adversary ID - delete_adversary: - title: Delete Adversary - description: Delete an Adversary in the ThreatConnect platform - input: - owner: - title: Owner - type: string - description: Owner/Organization - required: true - id: - title: ID - type: integer - description: Adversary To Delete - required: true - output: - status: - title: Status - type: boolean - required: false - description: Status - create_task: - title: Create Task - description: Create a Task Resource in the ThreatConnect platform - input: - name: - title: Name - type: string - description: Task Name - required: true - attributes: - title: Attributes - type: '[]object' - description: Task Attributes - required: false - tags: - title: Tags - type: string - description: Task tags comma delimited - required: false - due_date: - title: Due Date - type: date - description: Task due date - required: false - escalation_date: - title: Escalation Date - type: date - description: Task escalation date - required: false - reminder_date: - title: Reminder Date - type: date - description: Task reminder date - required: false - escalated: - title: Escalated - type: boolean - description: Use task escalation - required: false - overdue: - title: Overdue - type: boolean - description: Is task overdue - required: false - reminded: - title: Reminded - type: boolean - description: Use task Reminder - required: false - status: - title: Status - type: string - description: Task status - enum: - - In Progress - - Completed - - Waiting on Someone - - Deferred - required: false - assignee: - title: Assignee - type: string - description: Task Assignee - required: false - escalatee: - title: Escalatee - type: string - description: Task escalatee - required: false - security_label: - title: Security Label - type: string - description: Task security label - required: false - output: - id: - title: Task ID - type: integer - required: false - description: Task ID diff --git a/plugins/threat_connect/requirements.txt b/plugins/threat_connect/requirements.txt deleted file mode 100755 index 106e93ccab..0000000000 --- a/plugins/threat_connect/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -# List third-party dependencies here, separated by newlines. -# All dependencies must be version-pinned, eg. requests==1.2.0 -# See: https://pip.pypa.io/en/stable/user_guide/#requirements-files -threatconnect==2.4.18 -requests==2.31.0 \ No newline at end of file diff --git a/plugins/threat_connect/setup.py b/plugins/threat_connect/setup.py deleted file mode 100755 index 7e2e0fd86a..0000000000 --- a/plugins/threat_connect/setup.py +++ /dev/null @@ -1,14 +0,0 @@ -# GENERATED BY KOMAND SDK - DO NOT EDIT -from setuptools import setup, find_packages - - -setup(name="threat_connect-rapid7-plugin", - version="1.0.2", - description="ThreatConnect is a Threat Intelligence Platform (TIP) that empowers large organizations to aggregate, analyze and act on their threat intelligence. The ThreatConnect plugin for Rapid7 InsightConnect allows users to view incidents, emails, threats, victims, and more", - author="rapid7", - author_email="", - url="", - packages=find_packages(), - install_requires=['insightconnect-plugin-runtime'], # Add third-party dependencies to requirements.txt, not here! - scripts=['bin/komand_threat_connect'] - )