DSPMExtractRiskDetails

This script extracts risk details from an incident object, processes asset tags, and sets the user's Slack email for future notifications. It retrieves the incident details, including risk information, asset tags, and configuration details from the DSPM integration. If the asset owner's email is found, it is stored; otherwise, a default email is used. The extracted data is stored in the XSOAR context and displayed in a readable markdown format.

python · DSPM

Details

IDDSPMExtractRiskDetails
Languagepython
From Version6.10.0
Docker Imagedemisto/python3:3.12.13.10116658

README

This script extracts risk details from an incident object, processes asset tags, and sets the user’s Slack email for future notifications.
It retrieves the incident details, including risk information, asset tags, and configuration details from the DSPM integration. If the asset owner’s email is found, it is stored; otherwise, a default email is used.The extracted data is stored in the XSOAR context and displayed in a readable markdown format.

Script Data


Name Description
Script Type python3
Cortex XSOAR Version 6.10.0

Inputs


Argument Name Description
incident_object Incident data of a specific asset.
defaultSlackUser Default slack user provided by user.

Outputs


Path Description Type
incident_object   Unknown
from unittest.mock import patch
import json
import pytest
from DSPMExtractRiskDetails import set_user_slack_email, get_incident_details_command, main


def test_set_user_slack_email_with_valid_owner_email():
    incident_details = {"asset Dig Tags": json.dumps({"Owner": ["owner@example.com"]})}
    defaultSlackUser = "default@example.com"

    with patch("demistomock.setContext") as mock_setContext:
        set_user_slack_email(incident_details, defaultSlackUser)
        mock_setContext.assert_called_once_with("userSlackEmail", "owner@example.com")


def test_set_user_slack_email_with_empty_owner_list():
    incident_details = {"asset Dig Tags": json.dumps({"Owner": []})}
    defaultSlackUser = "default@example.com"

    with patch("demistomock.setContext") as mock_setContext:
        set_user_slack_email(incident_details, defaultSlackUser)
        mock_setContext.assert_called_once_with("userSlackEmail", defaultSlackUser)


def test_set_user_slack_email_with_non_list_owner():
    incident_details = {
        "asset Dig Tags": json.dumps({"Owner": "owner@example.com"})  # Not a list, incorrect format
    }
    defaultSlackUser = "default@example.com"

    with patch("demistomock.setContext") as mock_setContext:
        set_user_slack_email(incident_details, defaultSlackUser)
        mock_setContext.assert_called_once_with("userSlackEmail", defaultSlackUser)


def test_set_user_slack_email_with_missing_asset_dig_tags():
    incident_details = {}
    defaultSlackUser = "default@example.com"

    with patch("demistomock.setContext") as mock_setContext:
        set_user_slack_email(incident_details, defaultSlackUser)
        mock_setContext.assert_called_once_with("userSlackEmail", defaultSlackUser)


def test_set_user_slack_email_with_null_asset_dig_tags():
    incident_details = {"asset Dig Tags": None}
    defaultSlackUser = "default@example.com"

    with patch("demistomock.setContext") as mock_setContext:
        set_user_slack_email(incident_details, defaultSlackUser)
        mock_setContext.assert_called_once_with("userSlackEmail", defaultSlackUser)


def test_get_incident_details_command_with_valid_data():
    incident_data = {
        "id": "12345",
        "riskfindingid": "r123",
        "riskname": "High Risk",
        "severity": "Critical",
        "assetname": "Asset1",
        "assetid": "a123",
        "status": "Active",
        "projectid": "p123",
        "cloud": "AWS",
        "servicetype": "S3",
        "firstdetectedon": "2024-10-30T10:30:00Z",
        "assetdigtags": json.dumps({"Owner": ["owner@example.com"]}),
        "remediateinstruction": "Follow the steps to remediate.",
    }

    args = {"incident_object": incident_data}
    incident_object = get_incident_details_command(args)

    assert incident_object["incidentId"] == "12345"
    assert incident_object["riskFindingId"] == "r123"
    assert incident_object["ruleName"] == "High Risk"


def test_get_incident_details_command_with_missing_fields():
    incident_data = {"id": "12345", "riskfindingid": "r123", "riskname": "High Risk"}

    args = {"incident_object": incident_data}
    incident_object = get_incident_details_command(args)

    assert incident_object["incidentId"] == "12345"
    assert incident_object["riskFindingId"] == "r123"
    assert incident_object["ruleName"] == "High Risk"
    assert incident_object.get("severity") == "N/A"


def test_main_success_case():
    args = {
        "defaultSlackUser": "default@example.com",
        "incident_object": {
            "id": "12345",
            "riskfindingid": "r123",
            "riskname": "High Risk",
            "severity": "Critical",
            "assetname": "Asset1",
            "assetid": "a123",
            "status": "Active",
            "projectid": "p123",
            "cloud": "AWS",
            "servicetype": "S3",
            "firstdetectedon": "2024-10-30T10:30:00Z",
            "assetdigtags": json.dumps({"Owner": ["owner@example.com"]}),
            "remediateinstruction": "Follow the steps to remediate.",
        },
    }

    with (
        patch("demistomock.args", return_value=args),
        patch("demistomock.setContext") as mock_setContext,
        patch("DSPMExtractRiskDetails.return_results") as mock_return_results,
    ):
        main()

        mock_setContext.assert_called_once_with("userSlackEmail", "owner@example.com")
        assert mock_return_results.called


# Run pytest with coverage
if __name__ == "__main__":
    pytest.main(["-v", "--cov=DSPMExtractRiskDetails", "--cov-report=term-missing"])