Skip to content

Commit 670c8d5

Browse files
authored
Bugfix/search arg validation (#93)
* check against specific search_term enum instead of specified allowlist * disallow begin/end/incremental * remove unecessary changes * remove unecessary changes * remove unecessary changes * get incompatible arg list from actual argument dict keys * test and an h * remove unused arg
1 parent 5b351b6 commit 670c8d5

File tree

5 files changed

+66
-24
lines changed

5 files changed

+66
-24
lines changed

src/code42cli/cmds/alerts/extraction.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def extract(sdk, profile, output_logger, args):
4040
handlers = create_handlers(sdk, AlertExtractor, output_logger, store)
4141
extractor = AlertExtractor(sdk, handlers)
4242
if args.advanced_query:
43-
exit_if_advanced_query_used_with_other_search_args(args)
43+
exit_if_advanced_query_used_with_other_search_args(args, enums.AlertFilterArguments())
4444
extractor.extract_advanced(args.advanced_query)
4545
else:
4646
verify_begin_date_requirements(args, store)

src/code42cli/cmds/search_shared/args.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33

44

55
def create_search_args(search_for, filter_args):
6-
search_args = {
6+
advanced_query_incompatible_args = create_advanced_query_incompatible_search_args(search_for)
7+
filter_args.update(advanced_query_incompatible_args)
8+
9+
format_enum = AlertOutputFormat() if search_for == "alerts" else OutputFormat()
10+
11+
advanced_query_compatible_args = {
712
SearchArguments.ADVANCED_QUERY: ArgConfig(
813
u"--{}".format(SearchArguments.ADVANCED_QUERY.replace(u"_", u"-")),
914
metavar=u"QUERY_JSON",
@@ -13,6 +18,23 @@ def create_search_args(search_for, filter_args):
1318
search_for
1419
),
1520
),
21+
u"format": ArgConfig(
22+
u"-f",
23+
u"--format",
24+
choices=format_enum,
25+
default=format_enum.JSON,
26+
help=u"The format used for outputting {0}.".format(search_for),
27+
),
28+
}
29+
filter_args.update(advanced_query_compatible_args)
30+
31+
return filter_args
32+
33+
34+
def create_advanced_query_incompatible_search_args(search_for=None):
35+
"""Returns a dict of args that are incompatible with the --advanced-query flag. Any new
36+
incompatible args should go here as this is function is also used for arg validation."""
37+
args = {
1638
SearchArguments.BEGIN_DATE: ArgConfig(
1739
u"-b",
1840
u"--{}".format(SearchArguments.BEGIN_DATE),
@@ -30,23 +52,11 @@ def create_search_args(search_for, filter_args):
3052
help=u"The end of the date range in which to look for {0}, "
3153
u"argument format options are the same as --begin.".format(search_for),
3254
),
33-
}
34-
format_enum = AlertOutputFormat() if search_for == "alerts" else OutputFormat()
35-
format_and_incremental_args = {
36-
u"format": ArgConfig(
37-
u"-f",
38-
u"--format",
39-
choices=format_enum,
40-
default=format_enum.JSON,
41-
help=u"The format used for outputting {0}.".format(search_for),
42-
),
4355
u"incremental": ArgConfig(
4456
u"-i",
4557
u"--incremental",
4658
action=u"store_true",
4759
help=u"Only get {0} that were not previously retrieved.".format(search_for),
4860
),
4961
}
50-
search_args.update(filter_args)
51-
search_args.update(format_and_incremental_args)
52-
return search_args
62+
return args

src/code42cli/cmds/search_shared/extraction.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from code42cli.logger import get_main_cli_logger
99
from code42cli.cmds.alerts.util import get_alert_details
1010
from code42cli.util import warn_interrupt
11+
from code42cli.cmds.search_shared.args import create_advanced_query_incompatible_search_args
1112

1213
logger = get_main_cli_logger()
1314

@@ -73,13 +74,16 @@ def handle_response(response):
7374
return handlers
7475

7576

76-
def exit_if_advanced_query_used_with_other_search_args(args):
77-
args_dict_copy = args.__dict__.copy()
78-
for arg in (u"advanced_query", u"format", u"sdk", u"profile"):
79-
args_dict_copy.pop(arg)
80-
if any(args_dict_copy.values()):
81-
logger.print_and_log_error(u"You cannot use --advanced-query with additional search args.")
82-
exit(1)
77+
def exit_if_advanced_query_used_with_other_search_args(args, search_arg_enum):
78+
incompatible_search_args_dict = create_advanced_query_incompatible_search_args()
79+
incompatible_search_args_list = list(incompatible_search_args_dict.keys())
80+
invalid_args = incompatible_search_args_list + list(search_arg_enum)
81+
for arg in invalid_args:
82+
if args.__dict__[arg]:
83+
logger.print_and_log_error(
84+
u"You cannot use --advanced-query with additional search args."
85+
)
86+
exit(1)
8387

8488

8589
def create_time_range_filter(filter_cls, begin_date=None, end_date=None):

src/code42cli/cmds/securitydata/extraction.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from c42eventextractor.extractors import FileEventExtractor
22
from py42.sdk.queries.fileevents.filters import *
33

4-
from code42cli.cmds.search_shared.enums import ExposureType as ExposureTypeOptions
4+
from code42cli.cmds.search_shared.enums import (
5+
ExposureType as ExposureTypeOptions,
6+
FileEventFilterArguments,
7+
)
58
from code42cli.cmds.search_shared.cursor_store import FileEventCursorStore
69
from code42cli.cmds.search_shared.extraction import (
710
verify_begin_date_requirements,
@@ -31,7 +34,7 @@ def extract(sdk, profile, output_logger, args):
3134
handlers = create_handlers(sdk, FileEventExtractor, output_logger, store)
3235
extractor = FileEventExtractor(sdk, handlers)
3336
if args.advanced_query:
34-
exit_if_advanced_query_used_with_other_search_args(args)
37+
exit_if_advanced_query_used_with_other_search_args(args, FileEventFilterArguments())
3538
extractor.extract_advanced(args.advanced_query)
3639
else:
3740
verify_begin_date_requirements(args, store)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import pytest
2+
from code42cli.cmds.search_shared.extraction import (
3+
exit_if_advanced_query_used_with_other_search_args,
4+
)
5+
from code42cli.cmds.search_shared.enums import FileEventFilterArguments, AlertFilterArguments
6+
7+
8+
def test_exit_if_advanced_query_provided_incompatible_args(
9+
mocker, file_event_namespace, alert_namespace
10+
):
11+
mock = mocker.patch(
12+
"code42cli.cmds.search_shared.extraction.create_advanced_query_incompatible_search_args"
13+
)
14+
mock.return_value = {
15+
"invalid_arg": None,
16+
}
17+
file_event_namespace.invalid_arg = "value"
18+
with pytest.raises(SystemExit):
19+
exit_if_advanced_query_used_with_other_search_args(
20+
file_event_namespace, FileEventFilterArguments()
21+
)
22+
23+
alert_namespace.invalid_arg = "value"
24+
with pytest.raises(SystemExit):
25+
exit_if_advanced_query_used_with_other_search_args(alert_namespace, AlertFilterArguments())

0 commit comments

Comments
 (0)