Skip to content

Commit 26e468c

Browse files
committed
gis-9195 fixes
1 parent 26402af commit 26e468c

File tree

3 files changed

+115
-4
lines changed

3 files changed

+115
-4
lines changed

uncoder-core/app/translator/platforms/microsoft/renders/microsoft_sentinel_rule.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from app.translator.core.custom_types.meta_info import SeverityType
2727
from app.translator.core.mapping import SourceMapping
2828
from app.translator.core.models.platform_details import PlatformDetails
29-
from app.translator.core.models.query_container import MetaInfoContainer, MitreInfoContainer
29+
from app.translator.core.models.query_container import MetaInfoContainer, MitreInfoContainer, RawQueryContainer
3030
from app.translator.managers import render_manager
3131
from app.translator.platforms.microsoft.const import DEFAULT_MICROSOFT_SENTINEL_RULE, microsoft_sentinel_rule_details
3232
from app.translator.platforms.microsoft.mapping import MicrosoftSentinelMappings, microsoft_sentinel_rule_mappings
@@ -105,9 +105,10 @@ def finalize_query(
105105
not_supported_functions: Optional[list] = None,
106106
unmapped_fields: Optional[list[str]] = None,
107107
*args, # noqa: ARG002
108-
**kwargs, # noqa: ARG002
108+
**kwargs,
109109
) -> str:
110-
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
110+
if not kwargs.get("raw_query", False):
111+
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
111112
rule = copy.deepcopy(DEFAULT_MICROSOFT_SENTINEL_RULE)
112113
rule["query"] = query
113114
rule["displayName"] = meta_info.title or _AUTOGENERATED_TEMPLATE
@@ -130,3 +131,8 @@ def finalize_query(
130131
json_rule = json.dumps(rule, indent=4, sort_keys=False)
131132
json_rule = self.wrap_with_unmapped_fields(json_rule, unmapped_fields)
132133
return self.wrap_with_not_supported_functions(json_rule, not_supported_functions)
134+
135+
def generate_from_raw_query_container(self, query_container: RawQueryContainer) -> str:
136+
return self.finalize_query(
137+
prefix="", query=query_container.query, functions="", meta_info=query_container.meta_info, raw_query=True
138+
)

uncoder-core/app/translator/platforms/sentinel_one/escape_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
class SentinelOnePowerQueryEscapeManager(EscapeManager):
1010
escape_map: ClassVar[dict[str, list[EscapeDetails]]] = {
1111
ValueType.value: [EscapeDetails(pattern=r"\\", escape_symbols=r"\\\\")],
12-
ValueType.regex_value: [EscapeDetails(pattern=r"([$^*+()\[\]{}|.?\-\\])", escape_symbols=r"\\\\\\\\")],
12+
ValueType.regex_value: [EscapeDetails(pattern=r"([$^*+()\[\]{}|.?\-\\])", escape_symbols=r"\\\1")],
1313
SentinelOneValueType.double_escape_regex_value: [EscapeDetails(pattern=r"\\", escape_symbols=r"\\\\")],
1414
}
1515

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
from typing import Union
2+
3+
from app.translator.const import DEFAULT_VALUE_TYPE
4+
from app.translator.core.custom_types.values import ValueType
5+
from app.translator.core.models.platform_details import PlatformDetails
6+
from app.translator.core.render import BaseFieldValueRender, PlatformQueryRender
7+
from app.translator.core.str_value_manager import StrValueManager
8+
from app.translator.managers import render_manager
9+
from app.translator.platforms.sentinel_one.const import sentinel_one_power_query_details
10+
from app.translator.platforms.sentinel_one.mapping import (
11+
SentinelOnePowerQueryMappings,
12+
sentinel_one_power_query_query_mappings,
13+
)
14+
from app.translator.platforms.sentinel_one.str_value_manager import sentinel_one_power_query_str_value_manager
15+
16+
17+
class SentinelOnePowerQueryFieldValue(BaseFieldValueRender):
18+
details: PlatformDetails = sentinel_one_power_query_details
19+
str_value_manager: StrValueManager = sentinel_one_power_query_str_value_manager
20+
list_token = ", "
21+
22+
@staticmethod
23+
def _wrap_str_value(value: str) -> str:
24+
return f'"{value}"'
25+
26+
def equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
27+
if isinstance(value, list):
28+
values = self.list_token.join(
29+
self._pre_process_value(field, v, value_type=ValueType.value, wrap_str=True) for v in value
30+
)
31+
return f"{field} in ({values})"
32+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True)
33+
return f"{field} = {value}"
34+
35+
def less_modifier(self, field: str, value: Union[int, str]) -> str:
36+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True)
37+
return f"{field} < {value}"
38+
39+
def less_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
40+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True)
41+
return f"{field} <= {value}"
42+
43+
def greater_modifier(self, field: str, value: Union[int, str]) -> str:
44+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True)
45+
return f"{field} > {value}"
46+
47+
def greater_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
48+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True)
49+
return f"{field} >= {value}"
50+
51+
def not_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
52+
if isinstance(value, list):
53+
values = self.list_token.join(
54+
self._pre_process_value(field, v, value_type=ValueType.value, wrap_str=True, wrap_int=True)
55+
for v in value
56+
)
57+
return f"{field} != ({values})"
58+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
59+
return f"{field} != {value}"
60+
61+
def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
62+
if isinstance(value, list):
63+
values = self.list_token.join(
64+
self._pre_process_value(field, v, value_type=ValueType.value, wrap_str=True, wrap_int=True)
65+
for v in value
66+
)
67+
return f"{field} contains ({values})"
68+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
69+
return f"{field} contains {value}"
70+
71+
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
72+
return self.contains_modifier(field, value)
73+
74+
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
75+
return self.contains_modifier(field, value)
76+
77+
def regex_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
78+
if isinstance(value, list):
79+
values = self.list_token.join(
80+
self.str_value_manager.escape_manager.escape(
81+
self._pre_process_value(field, v, value_type=ValueType.regex_value, wrap_str=True, wrap_int=True)
82+
)
83+
for v in value
84+
)
85+
return f"{field} matches ({values})"
86+
value = self._pre_process_value(field, value, value_type=ValueType.regex_value, wrap_str=True, wrap_int=True)
87+
value = self.str_value_manager.escape_manager.escape(value)
88+
return f"{field} matches {value}"
89+
90+
def is_none(self, field: str, value: DEFAULT_VALUE_TYPE) -> str: # noqa: ARG002
91+
return f'not ({field} matches "\\.*")'
92+
93+
def is_not_none(self, field: str, value: DEFAULT_VALUE_TYPE) -> str: # noqa: ARG002
94+
return f'{field} matches "\\.*"'
95+
96+
97+
@render_manager.register
98+
class SentinelOnePowerQueryRender(PlatformQueryRender):
99+
details: PlatformDetails = sentinel_one_power_query_details
100+
mappings: SentinelOnePowerQueryMappings = sentinel_one_power_query_query_mappings
101+
or_token = "or"
102+
and_token = "and"
103+
not_token = "not"
104+
comment_symbol = "//"
105+
field_value_render = SentinelOnePowerQueryFieldValue(or_token=or_token)

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