Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions detection_rules/cli_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,9 @@ def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbos
threat_map = []

while click.confirm('add mitre tactic?'):
tactic = schema_prompt('mitre tactic name', type='string', enum=tactics, required=True)
tactic = schema_prompt('mitre tactic name', type='string', enum=tactics, is_required=True)
technique_ids = schema_prompt(f'technique or sub-technique IDs for {tactic}', type='array',
required=False, enum=list(matrix[tactic])) or []
is_required=False, enum=list(matrix[tactic])) or []

try:
threat_map.append(build_threat_map_entry(tactic, *technique_ids))
Expand All @@ -158,15 +158,15 @@ def rule_prompt(path=None, rule_type=None, required_only=True, save=True, verbos
continue

if name == 'threshold':
contents[name] = {n: schema_prompt(f'threshold {n}', required=n in options['required'], **opts.copy())
contents[name] = {n: schema_prompt(f'threshold {n}', is_required=n in options['required'], **opts.copy())
for n, opts in options['properties'].items()}
continue

if kwargs.get(name):
contents[name] = schema_prompt(name, value=kwargs.pop(name))
continue

result = schema_prompt(name, required=name in required_fields, **options.copy())
result = schema_prompt(name, is_required=name in required_fields, **options.copy())

if result:
if name not in required_fields and result == options.get('default', ''):
Expand Down
16 changes: 8 additions & 8 deletions detection_rules/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ def nest_from_dot(dots, value):
return nested


def schema_prompt(name, value=None, required=False, **options):
def schema_prompt(name, value=None, is_required=False, **options):
"""Interactively prompt based on schema requirements."""
name = str(name)
field_type = options.get('type')
Expand All @@ -136,7 +136,7 @@ def schema_prompt(name, value=None, required=False, **options):
if name == 'rule_id':
default = str(uuid.uuid4())

if len(enum) == 1 and required and field_type != "array":
if len(enum) == 1 and is_required and field_type != "array":
return enum[0]

def _check_type(_val):
Expand Down Expand Up @@ -168,7 +168,7 @@ def _convert_type(_val):
prompt = '{name}{default}{required}{multi}'.format(
name=name,
default=' [{}] ("n/a" to leave blank) '.format(default) if default else '',
required=' (required) ' if required else '',
required=' (required) ' if is_required else '',
multi=' (multi, comma separated) ' if field_type == 'array' else '').strip() + ': '

while True:
Expand All @@ -177,7 +177,7 @@ def _convert_type(_val):
result = None

if not result:
if required:
if is_required:
value = None
continue
else:
Expand All @@ -187,27 +187,27 @@ def _convert_type(_val):
result_list = result.split(',')

if not (min_item < len(result_list) < max_items):
if required:
if is_required:
value = None
break
else:
return []

for value in result_list:
if not _check_type(value):
if required:
if is_required:
value = None
break
else:
return []
if required and value is None:
if is_required and value is None:
continue
else:
return [_convert_type(r) for r in result_list]
else:
if _check_type(result):
return _convert_type(result)
elif required:
elif is_required:
value = None
continue
return
Expand Down