ZTAPBuildTimeline Deprecated

Deprecated. Comment ingestion simplified and audit log ingestion removed. No available replacement. Adds unmarked log/comment notes as evidence in the timeline.

python · Zero Trust Analytics Platform

Source

from CommonServerPython import *

from typing import Dict, Any
import traceback

""" STANDALONE FUNCTION """


def get_description(contents):
    """
    Gets the description of an ZTAP note.
    Type will be prefixed to the first line of the comment/log.
    """
    note = contents.get("contents")
    if not note:
        return ""

    first_line = note.split("\n")[0]

    typ = contents.get("type")
    if typ == "comment":
        description = "ZTAP Comment: " + first_line
    elif typ == "log":
        description = "ZTAP Log: " + first_line
    else:
        description = ""

    return description


def parse_note(note, filename_to_occurred):
    description = ""
    occurred = ""

    # Json contents log or comment
    if note.get("ContentsFormat") == "json":
        contents = note.get("Contents")
        description = get_description(contents)
        occurred = contents.get("occurred") or ""
    elif note.get("File"):
        filename = note.get("File")
        description = "ZTAP Uploaded File: " + filename
        occurred = filename_to_occurred.get(filename)

    return description, occurred


def get_occurred(note):
    if note.get("ContentsFormat") == "json":
        contents = note.get("Contents")
        return contents.get("occurred") or ""

    return ""


def get_filenames(note):
    if note.get("ContentsFormat") == "json":
        contents = note.get("Contents")
        return contents.get("files") or []

    return []


def build_timeline(entries):
    """
    Marks notes as evidence in the timeline
    :param entries: notes from the incident
    :return: Results
    """

    results = {}

    # Parse each comment for file names
    filename_to_occurred = {}
    for note in entries:
        occurred = get_occurred(note)
        for filename in get_filenames(note):
            filename_to_occurred[filename] = occurred

    for note in entries:
        if not note.get("Evidence", False):

            description, occurred = parse_note(note, filename_to_occurred)
            if all((description, occurred)):
                note_id = note["ID"]
                result = demisto.executeCommand(
                    "markAsEvidence",
                    {
                        "id": note_id,
                        "tags": note["Tags"],
                        "description": description,
                        "when": occurred,
                    },
                )
                if result[0].get("Contents") == "done":
                    results[note_id] = "Marked as evidence"
                else:
                    return_error("Unable to mark note {note_id} as evidence")

    if not results:
        results["Message"] = "No new notes to add to evidence timeline"

    return results


""" COMMAND FUNCTION """


def build_timeline_command(args: Dict[str, Any]) -> CommandResults:
    incident = demisto.incident()
    input_tag = incident.get("CustomFields").get("ztapinputtag")
    entries = demisto.executeCommand(
        "getEntries", {"filter": {"tags": [input_tag], "categories": ["notes"]}}
    )

    # Call the standalone function and get the raw response
    results = build_timeline(entries)

    return CommandResults(
        outputs_prefix="ZTAPBuildTimeline",
        outputs_key_field="",
        outputs=results,
    )


""" MAIN FUNCTION """


def main():
    try:
        return_results(build_timeline_command(demisto.args()))
    except Exception as ex:
        demisto.error(traceback.format_exc())  # print the traceback
        return_error(f"Failed to execute BaseScript. Error: {str(ex)}")


""" ENTRY POINT """


if __name__ in ("__main__", "__builtin__", "builtins"):
    main()

README

Adds unmarked log/comment notes as evidence in the timeline.

Script Data


Name Description
Script Type python3
Tags ztap
Cortex XSOAR Version 6.0.0

Inputs


There are no inputs for this script.

Outputs


There are no outputs for this script.