CheckIndicatorValue

Check if indicators exist in the Threat Intel database.

python · Common Scripts

Details

IDCheckIndicatorValue
Languagepython
From Version6.5.0
Docker Imagedemisto/python3:3.12.13.10404775
Tagsevaluation polling

README

Check if indicators exist in the Threat Intel DB.

Script Data


Name Description
Script Type python3
Cortex XSOAR Version 6.5.0

Inputs


Argument Name Description
indicator The indicator value to check
encoding Decode indicators by the algorithm given

Outputs


Path Description Type
CheckIndicatorValue.Indicator The indicator value string
CheckIndicatorValue.EncodedIndicator The encoded indicator value given string
CheckIndicatorValue.Exists Whether the indicator exist boolean
from typing import Any

import demistomock as demisto
import pytest
from CommonServerPython import *  # noqa: F401


def equals_object(obj1, obj2) -> bool:
    if type(obj1) is not type(obj2):
        return False
    elif isinstance(obj1, dict):
        for k1, v1 in obj1.items():
            if k1 not in obj2:
                return False
            if not equals_object(v1, obj2[k1]):
                return False
        return not (set(obj1.keys()) ^ set(obj2.keys()))
    elif isinstance(obj1, list):
        # Compare lists (ignore order)
        list2 = list(obj2)
        for _i1, v1 in enumerate(obj1):
            for i2, v2 in enumerate(list2):
                if equals_object(v1, v2):
                    list2.pop(i2)
                    break
            else:
                return False
        return not list2
    else:
        return obj1 == obj2


class GetIndicator:
    def __init__(self, indicators: list[str]):
        self.__indicators = indicators

    def get_indicator(self, cmd: str, params: dict[str, Any]) -> list:
        indicator = params.get("value")
        if indicator in self.__indicators:
            return [{"value": indicator}]
        return []


@pytest.mark.parametrize(
    argnames="encoded_indicators, existing_indicators, encoding, expected_results",
    argvalues=[
        (
            ["1.2.3.4"],
            ["1.2.3.4"],
            "none",
            [
                {
                    "Indicator": "1.2.3.4",
                    "EncodedIndicator": "1.2.3.4",
                    "Exists": True,
                }
            ],
        ),
        (
            ["MS4yLjMuNA=="],
            ["1.2.3.4"],
            "base64",
            [
                {
                    "Indicator": "1.2.3.4",
                    "EncodedIndicator": "MS4yLjMuNA==",
                    "Exists": True,
                }
            ],
        ),
        (
            ["%2C"],
            [","],
            "url-encoding",
            [
                {
                    "Indicator": ",",
                    "EncodedIndicator": "%2C",
                    "Exists": True,
                }
            ],
        ),
        (
            "1.2.3.4, %2C, www.paloaltonetworks.com",
            ["1.2.3.4"],
            "url-encoding",
            [
                {
                    "Indicator": "1.2.3.4",
                    "EncodedIndicator": "1.2.3.4",
                    "Exists": True,
                },
                {
                    "Indicator": ",",
                    "EncodedIndicator": "%2C",
                    "Exists": False,
                },
                {
                    "Indicator": "www.paloaltonetworks.com",
                    "EncodedIndicator": "www.paloaltonetworks.com",
                    "Exists": False,
                },
            ],
        ),
        (
            "%61%61%61, aaa",
            ["aaa"],
            "url-encoding",
            [
                {
                    "Indicator": "aaa",
                    "EncodedIndicator": "aaa",
                    "Exists": True,
                }
            ],
        ),
        (
            "aaa, %61%61%61",
            ["aaa"],
            "url-encoding",
            [
                {
                    "Indicator": "aaa",
                    "EncodedIndicator": "%61%61%61",
                    "Exists": True,
                }
            ],
        ),
        (
            ["1.2.3.4"],
            [],
            "none",
            [
                {
                    "Indicator": "1.2.3.4",
                    "EncodedIndicator": "1.2.3.4",
                    "Exists": False,
                }
            ],
        ),
    ],
)
def test_check_indicators(mocker, encoded_indicators, existing_indicators, encoding, expected_results):
    """
    Given:
        Indicators to check and expected results

    When:
        Running script to check indictors.

    Then:
        Validate the right output returns.
    """
    from CheckIndicatorValue import check_indicators

    mocker.patch("CheckIndicatorValue.execute_command", side_effect=GetIndicator(existing_indicators).get_indicator)

    results = check_indicators(argToList(encoded_indicators), encoding)
    assert results == expected_results


def test_main(mocker):
    """
    Given:
        an indicator that exist in the DB.

    When:
        Running script to check an indictor.

    Then:
        Validate the right output returns.
    """
    from CheckIndicatorValue import main

    encoded_indicator = "1.2.3.4"
    decoded_indicator = "1.2.3.4"

    mocker.patch.object(
        demisto,
        "args",
        return_value={
            "indicator": encoded_indicator,
            "encoding": "none",
        },
    )
    mocker.patch("CheckIndicatorValue.execute_command", return_value=[{"value": f"{decoded_indicator}"}])
    return_results = mocker.patch("CheckIndicatorValue.return_results")

    main()

    assert return_results.call_count == 1
    results = return_results.call_args[0][0].to_context()

    assert equals_object(
        results["EntryContext"],
        {
            "CheckIndicatorValue(val.Indicator && val.Indicator == obj.Indicator)": [
                {"Indicator": decoded_indicator, "EncodedIndicator": encoded_indicator, "Exists": True}
            ]
        },
    )