From 5e6a58ebabce01ef0abb9267ca2b2856f309ad11 Mon Sep 17 00:00:00 2001 From: Justin Ibarra Date: Sun, 14 Nov 2021 17:05:42 -0900 Subject: [PATCH] Add index as a required field to rule_prompt (#1595) --- detection_rules/cli_utils.py | 14 ++++++++------ detection_rules/main.py | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/detection_rules/cli_utils.py b/detection_rules/cli_utils.py index 500b8f15c..bc26007d7 100644 --- a/detection_rules/cli_utils.py +++ b/detection_rules/cli_utils.py @@ -8,7 +8,7 @@ import datetime import os import typing from pathlib import Path -from typing import List +from typing import List, Optional import click @@ -96,10 +96,12 @@ def multi_collection(f): return get_collection -def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbose=False, **kwargs) -> TOMLRule: +def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbose=False, + additional_required: Optional[list] = None, **kwargs) -> TOMLRule: """Prompt loop to build a rule.""" from .misc import schema_prompt + additional_required = additional_required or [] creation_date = datetime.date.today().strftime("%Y/%m/%d") if verbose and path: click.echo(f'[+] Building rule for {path}') @@ -116,7 +118,7 @@ def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbos target_data_subclass = TOMLRuleContents.get_data_subclass(rule_type) schema = target_data_subclass.jsonschema() props = schema['properties'] - opt_reqs = schema.get('required', []) + required_fields = schema.get('required', []) + additional_required contents = {} skipped = [] @@ -130,7 +132,7 @@ def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbos if name == 'version': continue - if required_only and name not in opt_reqs: + if required_only and name not in required_fields: continue # build this from technique ID @@ -164,10 +166,10 @@ def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbos contents[name] = schema_prompt(name, value=kwargs.pop(name)) continue - result = schema_prompt(name, required=name in opt_reqs, **options.copy()) + result = schema_prompt(name, required=name in required_fields, **options.copy()) if result: - if name not in opt_reqs and result == options.get('default', ''): + if name not in required_fields and result == options.get('default', ''): skipped.append(name) continue diff --git a/detection_rules/main.py b/detection_rules/main.py index c3ec8ce09..4c6f3e337 100644 --- a/detection_rules/main.py +++ b/detection_rules/main.py @@ -107,7 +107,7 @@ def import_rules(input_file, directory): base_path = contents.get('name') or contents.get('rule', {}).get('name') base_path = name_to_filename(base_path) if base_path else base_path rule_path = os.path.join(RULES_DIR, base_path) if base_path else None - rule_prompt(rule_path, required_only=True, save=True, verbose=True, **contents) + rule_prompt(rule_path, required_only=True, save=True, verbose=True, additional_required=['index'], **contents) @root.command('toml-lint')