Skip to content

Commit 0245587

Browse files
committed
Merge queries results; Add case insensitive to LogScale render
1 parent c51dfe7 commit 0245587

File tree

8 files changed

+32
-41
lines changed

8 files changed

+32
-41
lines changed

translator/.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,3 @@ test_data
197197

198198
# backup_logs
199199
.backup_logs
200-
201-
# sigmac tests stuff
202-
tactics.json
203-
techniques.json

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy