Skip to content

Commit 2b3836c

Browse files
authored
Merge pull request #111 from UncoderIO/gis-7789
Palo Alto Cortex XSIAM: add support array of default logsources
2 parents 4f01f62 + 17ea72d commit 2b3836c

File tree

4 files changed

+31
-19
lines changed

4 files changed

+31
-19
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
platform: Palo Alto XSIAM
2+
source: webserver
3+
4+
default_log_source:
5+
dataset: [apache_tomcat_raw, nginx_nginx_raw, apache_tomcat_raw]
6+
7+
field_mapping:
8+
c-uri: xdm.network.http.url
9+
c-useragent: xdm.source.user_agent
10+
cs-method: xdm.network.http.method
11+
cs-bytes: xdm.target.sent_bytes
12+
c-uri-query: xdm.network.http.url
13+
cs-referrer: xdm.network.http.referrer
14+
sc-status: xdm.network.http.response_code

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77

88
class XQLEscapeManager(EscapeManager):
99
escape_map: ClassVar[dict[str, list[EscapeDetails]]] = {
10-
ValueType.regex_value: [EscapeDetails(pattern=r'([_!@#$%^&*=+()\[\]{}|;:\'",.<>?/`~\-\s\\])', escape_symbols=r"\\\1")],
11-
ValueType.value: [EscapeDetails(pattern=r'([\\])', escape_symbols=r"\\\1")],
12-
10+
ValueType.regex_value: [
11+
EscapeDetails(pattern=r'([_!@#$%^&*=+()\[\]{}|;:\'",.<>?/`~\-\s\\])', escape_symbols=r"\\\1")
12+
],
13+
ValueType.value: [EscapeDetails(pattern=r"([\\])", escape_symbols=r"\\\1")],
1314
}
1415

1516

uncoder-core/app/translator/platforms/palo_alto/mapping.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional
1+
from typing import Optional, Union
22

33
from app.translator.core.mapping import (
44
DEFAULT_MAPPING_NAME,
@@ -18,8 +18,17 @@ def __init__(self, preset: Optional[list[str]], dataset: Optional[list[str]], de
1818
def is_suitable(self, preset: str, dataset: str) -> bool:
1919
return preset == self.preset or dataset == self.dataset
2020

21+
def __prepare_log_source_for_render(self, logsource: Union[str, list[str]], model: str = "datamodel") -> str:
22+
if isinstance(logsource, list):
23+
return f"{model} in ({', '.join(source for source in logsource)})"
24+
return f"{model} = {logsource}"
25+
2126
def __str__(self) -> str:
22-
return self._default_source.get("preset") or self._default_source.get("dataset")
27+
if preset_data := self._default_source.get("preset"):
28+
return self.__prepare_log_source_for_render(logsource=preset_data, model="preset")
29+
if dataset_data := self._default_source.get("dataset"):
30+
return self.__prepare_log_source_for_render(logsource=dataset_data, model="dataset")
31+
return "datamodel"
2332

2433

2534
class CortexXSIAMMappings(BasePlatformMappings):

uncoder-core/app/translator/platforms/palo_alto/renders/cortex_xsiam.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,7 @@ def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6969

7070
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
7171
if isinstance(value, list):
72-
return (
73-
f"({self.or_token.join(self.endswith_modifier(field=field, value=v) for v in value)})"
74-
)
72+
return f"({self.or_token.join(self.endswith_modifier(field=field, value=v) for v in value)})"
7573
return f'{field} ~= ".*{self.apply_value(value, value_type=ValueType.regex_value)}"'
7674

7775
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
@@ -118,14 +116,4 @@ class CortexXQLQueryRender(PlatformQueryRender):
118116
is_single_line_comment = False
119117

120118
def generate_prefix(self, log_source_signature: CortexXSIAMLogSourceSignature) -> str:
121-
preset = (
122-
f"preset = {log_source_signature._default_source.get('preset')}"
123-
if log_source_signature._default_source.get("preset")
124-
else None
125-
)
126-
dataset = (
127-
f"dataset = {log_source_signature._default_source.get('dataset')}"
128-
if log_source_signature._default_source.get("dataset")
129-
else None
130-
)
131-
return preset or dataset or "datamodel"
119+
return str(log_source_signature)

0 commit comments

Comments
 (0)