Skip to content

Commit 82a49e2

Browse files
authored
Merge pull request #32 from UncoderIO/merge-queries-results
Merge queries results; Add case insensitive to LogScale render
2 parents cc34120 + 0245587 commit 82a49e2

File tree

5 files changed

+32
-37
lines changed

5 files changed

+32
-37
lines changed

translator/app/translator/core/mitre.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def __get_mitre_json(self) -> dict:
3030
return json.loads(cti_json.read().decode())
3131
except HTTPError:
3232
return {}
33+
3334
def update_mitre_config(self) -> None:
3435
if not (mitre_json := self.__get_mitre_json()):
3536
self.__load_mitre_configs_from_files()

translator/app/translator/core/render.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,21 @@ def render_not_supported_functions(self, not_supported_functions: list) -> str:
194194
def wrap_with_comment(self, value: str) -> str:
195195
return f"{self.comment_symbol} {value}"
196196

197+
@staticmethod
198+
def unique_queries(queries_map: Dict[str, str]) -> Dict[str, List[str]]:
199+
unique_queries = {}
200+
for source_id, query in queries_map.items():
201+
unique_queries.setdefault(query, []).append(source_id)
202+
203+
return unique_queries
204+
197205
def finalize(self, queries_map: Dict[str, str]) -> str:
198-
unique_queries = set(queries_map.values())
199206
if len(set(queries_map.values())) == 1:
200-
return next(iter(unique_queries))
201-
207+
return next(iter(queries_map.values()))
208+
unique_queries = self.unique_queries(queries_map=queries_map)
202209
result = ""
203-
for source_id, query in queries_map.items():
204-
result = result + self.wrap_with_comment(source_id) + f"\n{query}\n\n"
210+
for query, source_ids in unique_queries.items():
211+
result = result + self.wrap_with_comment(", ".join(source_ids)) + f"\n{query}\n\n"
205212

206213
return result
207214

translator/app/translator/platforms/logscale/renders/logscale.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,55 +33,62 @@ class LogScaleFieldValue(BaseQueryFieldValue):
3333

3434
def apply_value(self, value: Union[str, int]) -> str:
3535
if isinstance(value, str) and '"' in value:
36-
value = value.translate(str.maketrans({'"': r'\"'}))
36+
value = re.sub(r'(?<!\\)"', r'\"', value)
37+
if isinstance(value, str) and '/' in value:
38+
value = re.sub(r'(?<!\\)/', r'\/', value)
3739
return value
3840

41+
def apply_field_name(self, field_name: str) -> str:
42+
if not field_name.isalpha():
43+
return f'"{field_name}"'
44+
return field_name
45+
3946
def equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
4047
if isinstance(value, list):
4148
return f"({self.or_token.join(self.equal_modifier(field=field, value=v) for v in value)})"
42-
return f'{field}="{self.apply_value(value)}"'
49+
return f'{self.apply_field_name(field_name=field)}=/{self.apply_value(value)}/i'
4350

4451
def less_modifier(self, field: str, value: Union[int, str]) -> str:
45-
return f'{field}<"{self.apply_value(value)}"'
52+
return f'{self.apply_field_name(field_name=field)}<"{self.apply_value(value)}"'
4653

4754
def less_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
48-
return f'{field}<="{self.apply_value(value)}"'
55+
return f'{self.apply_field_name(field_name=field)}<="{self.apply_value(value)}"'
4956

5057
def greater_modifier(self, field: str, value: Union[int, str]) -> str:
51-
return f'{field}>"{self.apply_value(value)}"'
58+
return f'{self.apply_field_name(field_name=field)}>"{self.apply_value(value)}"'
5259

5360
def greater_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
54-
return f'{field}>="{self.apply_value(value)}"'
61+
return f'{self.apply_field_name(field_name=field)}>="{self.apply_value(value)}"'
5562

5663
def not_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
5764
if isinstance(value, list):
5865
return f"({self.or_token.join([self.not_equal_modifier(field=field, value=v) for v in value])})"
59-
return f'{field}!="{self.apply_value(value)}"'
66+
return f'{self.apply_field_name(field_name=field)}!=/{self.apply_value(value)}/i'
6067

6168
def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6269
if isinstance(value, list):
6370
return f"({self.or_token.join(self.contains_modifier(field=field, value=v) for v in value)})"
64-
return f'{field}="*{self.apply_value(value)}*"'
71+
return f'{self.apply_field_name(field_name=field)}=/{self.apply_value(value)}/i'
6572

6673
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6774
if isinstance(value, list):
6875
return f"({self.or_token.join(self.endswith_modifier(field=field, value=v) for v in value)})"
69-
return f'{field}="*{self.apply_value(value)}"'
76+
return f'{self.apply_field_name(field_name=field)}=/{self.apply_value(value)}$/i'
7077

7178
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
7279
if isinstance(value, list):
7380
return f"({self.or_token.join(self.startswith_modifier(field=field, value=v) for v in value)})"
74-
return f'{field}="{self.apply_value(value)}*"'
81+
return f'{self.apply_field_name(field_name=field)}=/^{self.apply_value(value)}/i'
7582

7683
def regex_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
7784
if isinstance(value, list):
7885
return f"({self.or_token.join(self.regex_modifier(field=field, value=v) for v in value)})"
79-
return f'{field}="/{self.apply_value(value)}/"'
86+
return f'{self.apply_field_name(field_name=field)}=/{self.apply_value(value)}/'
8087

8188
def keywords(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
8289
if isinstance(value, list):
8390
return f"({self.or_token.join(self.keywords(field=field, value=v) for v in value)})"
84-
return f'"{self.apply_value(value)}"'
91+
return f'/{self.apply_value(value)}/i'
8592

8693

8794
class LogScaleQueryRender(BaseQueryRender):

translator/app/translator/platforms/microsoft/siem_functions/__init__.py

Whitespace-only changes.

translator/app/translator/platforms/microsoft/siem_functions/base.py

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)