Skip to content

Commit e25af9b

Browse files
committed
gis-9099 add microsoft sentinel to one vendor flow
1 parent 5f93815 commit e25af9b

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

uncoder-core/app/translator/core/models/query_container.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ def __init__(
6565
date: Optional[str] = None,
6666
output_table_fields: Optional[list[Field]] = None,
6767
query_fields: Optional[list[Field]] = None,
68+
function_fields: Optional[list[Field]] = None,
69+
function_fields_map: Optional[dict[str, list[Field]]] = None,
6870
license_: Optional[str] = None,
6971
severity: Optional[str] = None,
7072
references: Optional[list[str]] = None,
@@ -76,7 +78,7 @@ def __init__(
7678
parsed_logsources: Optional[dict] = None,
7779
timeframe: Optional[timedelta] = None,
7880
query_period: Optional[timedelta] = None,
79-
mitre_attack: MitreInfoContainer = MitreInfoContainer(),
81+
mitre_attack: Optional[MitreInfoContainer] = None,
8082
raw_metainfo_container: Optional[RawMetaInfoContainer] = None,
8183
) -> None:
8284
self.id = id_ or str(uuid.uuid4())
@@ -86,23 +88,25 @@ def __init__(
8688
self.risk_score = risk_score
8789
self.type_ = type_ or ""
8890
self.description = description or ""
89-
self.author = [v.strip() for v in author] if author else []
91+
self.author = [v.strip() for v in author] if author and author != [None] else []
9092
self.date = date or datetime.now().date().strftime("%Y-%m-%d")
9193
self.output_table_fields = output_table_fields or []
9294
self.query_fields = query_fields or []
95+
self.function_fields = function_fields or []
96+
self.function_fields_map = function_fields_map or {}
9397
self.license = license_ or "DRL 1.1"
9498
self.severity = severity or SeverityType.low
9599
self.references = references or []
96100
self.tags = tags or []
97-
self.mitre_attack = mitre_attack or None
101+
self.mitre_attack = mitre_attack or MitreInfoContainer()
98102
self.raw_mitre_attack = raw_mitre_attack or []
99103
self.status = status or "stable"
100104
self.false_positives = false_positives or []
101105
self._source_mapping_ids = source_mapping_ids or [DEFAULT_MAPPING_NAME]
102106
self.parsed_logsources = parsed_logsources or {}
103107
self.timeframe = timeframe
104108
self.query_period = query_period
105-
self.raw_metainfo_container = raw_metainfo_container
109+
self.raw_metainfo_container = raw_metainfo_container or RawMetaInfoContainer()
106110

107111
@property
108112
def author_str(self) -> str:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from app.translator.const import DEFAULT_VALUE_TYPE
2323
from app.translator.core.mapping import LogSourceSignature
2424
from app.translator.core.models.platform_details import PlatformDetails
25+
from app.translator.core.models.query_container import RawQueryContainer
2526
from app.translator.core.render import BaseFieldValueRender, PlatformQueryRender
2627
from app.translator.managers import render_manager
2728
from app.translator.platforms.microsoft.const import microsoft_sentinel_query_details
@@ -144,3 +145,6 @@ def generate_prefix(self, log_source_signature: LogSourceSignature, functions_pr
144145
@staticmethod
145146
def _finalize_search_query(query: str) -> str:
146147
return f"| where {query}" if query else ""
148+
149+
def generate_from_raw_query_container(self, query_container: RawQueryContainer) -> str:
150+
return query_container.query

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

Lines changed: 8 additions & 2 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
@@ -107,7 +107,8 @@ def finalize_query(
107107
*args, # noqa: ARG002
108108
**kwargs, # noqa: ARG002
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+
)

0 commit comments

Comments
 (0)