1
1
import logging
2
- from typing import Optional
2
+ from collections import Counter
3
+ from typing import Optional , Union
3
4
4
5
from app .translator .core .exceptions .core import UnsupportedPlatform
5
6
from app .translator .core .models .query_container import RawQueryContainer , TokenizedQueryContainer
6
- from app .translator .core .parser import QueryParser
7
+ from app .translator .core .parser import PlatformQueryParser , QueryParser
7
8
from app .translator .core .render import QueryRender
8
9
from app .translator .managers import ParserManager , RenderManager , parser_manager , render_manager
9
10
from app .translator .platforms .elasticsearch .const import ELASTIC_QUERY_TYPES
11
+ from app .translator .platforms .microsoft .const import MICROSOFT_QUERY_TYPES
12
+ from app .translator .platforms .roota .parsers .roota import RootAParser
13
+ from app .translator .platforms .sigma .mapping import sigma_rule_mappings
10
14
from app .translator .tools .decorators import handle_translation_exceptions
11
15
12
16
@@ -32,18 +36,36 @@ def __get_render(self, target: str) -> QueryRender:
32
36
33
37
@staticmethod
34
38
def __is_one_vendor_translation (source : str , target : str ) -> bool :
35
- vendors_query_types = [ELASTIC_QUERY_TYPES ]
39
+ vendors_query_types = [ELASTIC_QUERY_TYPES , MICROSOFT_QUERY_TYPES ]
36
40
for vendor_query_types in vendors_query_types :
37
41
if source in vendor_query_types and target in vendor_query_types :
38
42
return True
39
43
40
44
return False
41
45
42
- def parse_raw_query (self , text : str , source : str ) -> tuple [QueryParser , RawQueryContainer ]:
46
+ def parse_raw_query (
47
+ self , text : str , source : str
48
+ ) -> tuple [Union [PlatformQueryParser , RootAParser ], RawQueryContainer ]:
43
49
parser = self .__get_parser (source )
44
50
text = parser .remove_comments (text )
45
51
return parser , parser .parse_raw_query (text , language = source )
46
52
53
+ def parse_meta_info (self , text : str , source : str ) -> Union [dict , RawQueryContainer ]:
54
+ parser , raw_query_container = self .parse_raw_query (text = text , source = source )
55
+ source_mappings = parser .get_source_mapping_ids_by_logsources (raw_query_container .query )
56
+ log_sources = {"product" : Counter (), "service" : Counter (), "category" : Counter ()}
57
+ sigma_source_mappings = sigma_rule_mappings .get_source_mappings_by_ids (
58
+ [source_mapping .source_id for source_mapping in source_mappings ], return_default = False
59
+ )
60
+ for sigma_source_mapping in sigma_source_mappings :
61
+ if product := sigma_source_mapping .log_source_signature .log_sources .get ("product" ):
62
+ log_sources ["product" ][product ] += 1
63
+ if service := sigma_source_mapping .log_source_signature .log_sources .get ("service" ):
64
+ log_sources ["service" ][service ] += 1
65
+ if category := sigma_source_mapping .log_source_signature .log_sources .get ("category" ):
66
+ log_sources ["category" ][category ] += 1
67
+ return log_sources , raw_query_container
68
+
47
69
@handle_translation_exceptions
48
70
def __parse_incoming_data (
49
71
self , text : str , source : str , target : Optional [str ] = None
0 commit comments