Skip to content

Commit 4b54f66

Browse files
authored
Merge pull request #166 from UncoderIO/gis-8036
predefined field processing
2 parents 50a0bbf + a4ab1a3 commit 4b54f66

File tree

17 files changed

+124
-39
lines changed

17 files changed

+124
-39
lines changed

uncoder-core/app/translator/core/custom_types/functions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class FunctionType(CustomEnum):
1515
latest = "latest"
1616

1717
divide = "divide"
18+
multiply = "multiply"
1819

1920
lower = "lower"
2021
split = "split"
@@ -28,6 +29,7 @@ class FunctionType(CustomEnum):
2829
bin = "bin"
2930
eval = "eval"
3031
fields = "fields"
32+
iploc = "iploc"
3133
join = "join"
3234
rename = "rename"
3335
search = "search"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from app.translator.tools.custom_enum import CustomEnum
2+
3+
4+
class IPLocationType(CustomEnum):
5+
asn = "ip_loc_asn"
6+
asn_org = "ip_loc_asn_org"
7+
city = "ip_loc_city"
8+
continent = "ip_loc_continent"
9+
country = "ip_loc_country"
10+
lat_lon = "ip_loc_lat_lon"
11+
region = "ip_loc_region"
12+
timezone = "ip_loc_timezone"

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ def set_generic_names_map(self, source_mappings: list[SourceMapping], default_ma
3737
self.__generic_names_map = generic_names_map
3838

3939

40+
class PredefinedField:
41+
def __init__(self, name: str):
42+
self.name = name
43+
44+
4045
class FieldField:
4146
def __init__(
4247
self,
@@ -46,10 +51,10 @@ def __init__(
4651
is_alias_left: bool = False,
4752
is_alias_right: bool = False,
4853
):
49-
self.field_left = Field(source_name=source_name_left)
54+
self.field_left = Field(source_name=source_name_left) if not is_alias_left else None
5055
self.alias_left = Alias(name=source_name_left) if is_alias_left else None
5156
self.operator = operator
52-
self.field_right = Field(source_name=source_name_right)
57+
self.field_right = Field(source_name=source_name_right) if not is_alias_right else None
5358
self.alias_right = Alias(name=source_name_right) if is_alias_right else None
5459

5560

@@ -60,11 +65,14 @@ def __init__(
6065
operator: Identifier,
6166
value: Union[int, str, StrValue, list, tuple],
6267
is_alias: bool = False,
68+
is_predefined_field: bool = False,
6369
):
64-
self.field = Field(source_name=source_name)
65-
self.alias = None
66-
if is_alias:
67-
self.alias = Alias(name=source_name)
70+
# mapped by platform fields mapping
71+
self.field = Field(source_name=source_name) if not (is_alias or is_predefined_field) else None
72+
# not mapped
73+
self.alias = Alias(name=source_name) if is_alias else None
74+
# mapped by platform predefined fields mapping
75+
self.predefined_field = PredefinedField(name=source_name) if is_predefined_field else None
6876

6977
self.operator = operator
7078
self.values = []
@@ -96,10 +104,13 @@ def __add_value(self, value: Optional[Union[int, str, StrValue, list, tuple]]) -
96104
self.values.append(value)
97105

98106
def __repr__(self):
99-
if self.field:
100-
return f"{self.field.source_name} {self.operator.token_type} {self.values}"
107+
if self.alias:
108+
return f"{self.alias.name} {self.operator.token_type} {self.values}"
109+
110+
if self.predefined_field:
111+
return f"{self.predefined_field.name} {self.operator.token_type} {self.values}"
101112

102-
return f"{self.alias.name} {self.operator.token_type} {self.values}"
113+
return f"{self.field.source_name} {self.operator.token_type} {self.values}"
103114

104115

105116
class Keyword:

uncoder-core/app/translator/core/render.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from app.translator.core.exceptions.parser import UnsupportedOperatorException
3232
from app.translator.core.functions import PlatformFunctions
3333
from app.translator.core.mapping import DEFAULT_MAPPING_NAME, BasePlatformMappings, LogSourceSignature, SourceMapping
34-
from app.translator.core.models.field import Field, FieldField, FieldValue, Keyword
34+
from app.translator.core.models.field import Field, FieldField, FieldValue, Keyword, PredefinedField
3535
from app.translator.core.models.functions.base import Function, RenderedFunctions
3636
from app.translator.core.models.identifier import Identifier
3737
from app.translator.core.models.platform_details import PlatformDetails
@@ -218,7 +218,8 @@ class PlatformQueryRender(QueryRender):
218218
field_field_render = BaseFieldFieldRender()
219219
field_value_render = BaseFieldValueRender(or_token=or_token)
220220

221-
raw_log_field_pattern_map: ClassVar[dict[str, str]] = None
221+
predefined_fields_map: ClassVar[dict[str, str]] = {}
222+
raw_log_field_patterns_map: ClassVar[dict[str, str]] = {}
222223

223224
def __init__(self):
224225
super().__init__()
@@ -248,9 +249,23 @@ def map_field(self, field: Field, source_mapping: SourceMapping) -> list[str]:
248249

249250
return mapped_field if mapped_field else [generic_field_name] if generic_field_name else [field.source_name]
250251

252+
def map_predefined_field(self, predefined_field: PredefinedField) -> str:
253+
if not (mapped_predefined_field_name := self.predefined_fields_map.get(predefined_field.name)):
254+
if self.is_strict_mapping:
255+
raise StrictPlatformException(field_name=predefined_field.name, platform_name=self.details.name)
256+
257+
return predefined_field.name
258+
259+
return mapped_predefined_field_name
260+
251261
def apply_token(self, token: Union[FieldValue, Keyword, Identifier], source_mapping: SourceMapping) -> str:
252262
if isinstance(token, FieldValue):
253-
mapped_fields = [token.alias.name] if token.alias else self.map_field(token.field, source_mapping)
263+
if token.alias:
264+
mapped_fields = [token.alias.name]
265+
elif token.predefined_field:
266+
mapped_fields = [self.map_predefined_field(token.predefined_field)]
267+
else:
268+
mapped_fields = self.map_field(token.field, source_mapping)
254269
joined = self.logical_operators_map[LogicalOperatorType.OR].join(
255270
[
256271
self.field_value_render.apply_field_value(field=field, operator=token.operator, value=token.value)
@@ -365,7 +380,7 @@ def generate_from_raw_query_container(self, query_container: RawQueryContainer)
365380
)
366381

367382
def process_raw_log_field(self, field: str, field_type: str) -> Optional[str]:
368-
if raw_log_field_pattern := self.raw_log_field_pattern_map.get(field_type):
383+
if raw_log_field_pattern := self.raw_log_field_patterns_map.get(field_type):
369384
return raw_log_field_pattern.format(field=field)
370385

371386
def process_raw_log_field_prefix(self, field: str, source_mapping: SourceMapping) -> Optional[list]:
@@ -379,7 +394,7 @@ def process_raw_log_field_prefix(self, field: str, source_mapping: SourceMapping
379394
return [self.process_raw_log_field(field=field, field_type=raw_log_field_type)]
380395

381396
def generate_raw_log_fields(self, fields: list[Field], source_mapping: SourceMapping) -> str:
382-
if self.raw_log_field_pattern_map is None:
397+
if not self.raw_log_field_patterns_map:
383398
return ""
384399
defined_raw_log_fields = []
385400
for field in fields:

uncoder-core/app/translator/core/tokenizer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,12 +332,12 @@ def get_field_tokens_from_func_args( # noqa: PLR0912
332332
if isinstance(arg, Field):
333333
result.append(arg)
334334
elif isinstance(arg, FieldField):
335-
if not arg.alias_left or arg.alias_left.name != arg.field_left.source_name:
335+
if arg.field_left:
336336
result.append(arg.field_left)
337-
if not arg.alias_right or arg.alias_right.name != arg.field_right.source_name:
337+
if arg.field_right:
338338
result.append(arg.field_right)
339339
elif isinstance(arg, FieldValue):
340-
if not arg.alias or arg.alias.name != arg.field.source_name:
340+
if arg.field:
341341
result.append(arg.field)
342342
elif isinstance(arg, GroupByFunction):
343343
result.extend(self.get_field_tokens_from_func_args(args=arg.args))

uncoder-core/app/translator/mappings/platforms/palo_alto_cortex/dns.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ field_mapping:
1111
dns_query_name: xdm.network.dns.dns_question.name
1212
QueryName: xdm.network.dns.dns_question.name
1313
query: xdm.network.dns.dns_question.name
14-
dns-record-type: xdm.network.dns.dns_question.type
14+
dns-record-type: xdm.network.dns.dns_question.type

uncoder-core/app/translator/mappings/platforms/palo_alto_cortex/linux_process_creation.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ field_mapping:
2626
ParentProduct: actor_process_signature_product
2727
ParentCompany: actor_process_signature_vendor
2828
md5: action_process_image_md5
29-
sha256: action_process_image_sha256
29+
sha256: action_process_image_sha256
30+
EventID: action_evtlog_event_id

uncoder-core/app/translator/mappings/platforms/qradar/default.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ field_mapping:
5959
- dst-packets
6060
src-bytes: src-bytes
6161
dst-bytes: dst-bytes
62-
ExternalSeverity: External Severity
62+
ExternalSeverity:
63+
- External Severity
64+
- Observeit Severity
6365
SourceMAC:
6466
- SourceMAC
6567
- MAC
@@ -73,6 +75,6 @@ field_mapping:
7375
SourceUserName: SourceUserName
7476
url_category: XForceCategoryByURL
7577
EventSeverity: EventSeverity
76-
Source:
78+
Source:
7779
- Source
78-
- source
80+
- source

uncoder-core/app/translator/mappings/platforms/qradar/firewall.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ default_log_source:
1111
field_mapping:
1212
src-ip:
1313
- sourceip
14+
- sourceIP
15+
- SourceIP
1416
- SrcHost
1517
- LocalHost
1618
- Source
1719
- NetworkView
20+
- HostName
1821
src-port:
1922
- sourceport
2023
- SrcPort

uncoder-core/app/translator/mappings/platforms/qradar/linux_process_creation.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@ default_log_source:
1111
category: 8110
1212

1313
field_mapping:
14-
CommandLine: Command
14+
CommandLine:
15+
- Command
16+
- ASACommand
1517
Image: Process Path
1618
ParentCommandLine: Parent Command
1719
ParentImage: Parent Process Path
1820
User: username
19-
LogonId: Logon ID
21+
LogonId: Logon ID
22+
EventID: ASASyslogCode

0 commit comments

Comments
 (0)