Skip to content

Commit d91ca8a

Browse files
committed
added-parameters
1 parent ba712d7 commit d91ca8a

File tree

15 files changed

+113
-156
lines changed

15 files changed

+113
-156
lines changed

uncoder-core/app/routers/translate.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from fastapi import APIRouter, Body
22

33
from app.models.translation import InfoMessage, OneTranslationData, Platform, TranslatorPlatforms
4+
from app.translator.core.context_vars import with_meta_info_annotation_ctx_var
45
from app.translator.cti_translator import CTITranslator
56
from app.translator.translator import Translator
67

@@ -15,7 +16,9 @@ def translate_one(
1516
source_platform_id: str = Body(..., embed=True),
1617
target_platform_id: str = Body(..., embed=True),
1718
text: str = Body(..., embed=True),
19+
with_meta_info_annotation: bool = True,
1820
) -> OneTranslationData:
21+
with_meta_info_annotation_ctx_var.set(with_meta_info_annotation)
1922
status, data = translator.translate_one(text=text, source=source_platform_id, target=target_platform_id)
2023
if status:
2124
return OneTranslationData(status=status, translation=data, target_platform_id=target_platform_id)
@@ -27,8 +30,11 @@ def translate_one(
2730
@st_router.post("/translate/all", tags=["translator"], description="Generate all translations")
2831
@st_router.post("/translate/all/", include_in_schema=False)
2932
def translate_all(
30-
source_platform_id: str = Body(..., embed=True), text: str = Body(..., embed=True)
33+
source_platform_id: str = Body(..., embed=True),
34+
text: str = Body(..., embed=True),
35+
with_meta_info_annotation: bool = True,
3136
) -> list[OneTranslationData]:
37+
with_meta_info_annotation_ctx_var.set(with_meta_info_annotation)
3238
result = translator.translate_all(text=text, source=source_platform_id)
3339
translations = []
3440
for platform_result in result:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from contextvars import ContextVar
2+
3+
with_meta_info_annotation_ctx_var: ContextVar[bool] = ContextVar("with_meta_info_annotation_ctx_var", default=False)
4+
"""Set to True to return only the query, excluding meta information and comments."""

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from typing import Optional, Union
2222

2323
from app.translator.const import DEFAULT_VALUE_TYPE
24+
from app.translator.core.context_vars import with_meta_info_annotation_ctx_var
2425
from app.translator.core.custom_types.tokens import LogicalOperatorType, OperatorType
2526
from app.translator.core.custom_types.values import ValueType
2627
from app.translator.core.escape_manager import EscapeManager
@@ -195,18 +196,34 @@ def wrap_query_with_meta_info(self, meta_info: MetaInfoContainer, query: str) ->
195196
query = f"{query}\n\n{query_meta_info}"
196197
return query
197198

199+
def render_query(
200+
self,
201+
prefix: str,
202+
query: str,
203+
functions: str,
204+
meta_info: Optional[MetaInfoContainer] = None, # noqa: ARG002
205+
source_mapping: Optional[SourceMapping] = None, # noqa: ARG002
206+
*args, # noqa: ARG002
207+
**kwargs, # noqa: ARG002
208+
) -> str:
209+
return self.query_pattern.format(prefix=prefix, query=query, functions=functions).strip()
210+
198211
def finalize_query(
199212
self,
200213
prefix: str,
201214
query: str,
202215
functions: str,
203216
meta_info: Optional[MetaInfoContainer] = None,
204-
source_mapping: Optional[SourceMapping] = None, # noqa: ARG002
217+
source_mapping: Optional[SourceMapping] = None,
205218
not_supported_functions: Optional[list] = None,
206219
*args, # noqa: ARG002
207220
**kwargs, # noqa: ARG002
208221
) -> str:
209-
query = self.query_pattern.format(prefix=prefix, query=query, functions=functions).strip()
222+
query = self.render_query(
223+
prefix=prefix, query=query, functions=functions, meta_info=meta_info, source_mapping=source_mapping
224+
)
225+
if with_meta_info_annotation_ctx_var.get() is False:
226+
return query
210227
query = self.wrap_query_with_meta_info(meta_info=meta_info, query=query)
211228
if not_supported_functions:
212229
rendered_not_supported = self.render_not_supported_functions(not_supported_functions)

uncoder-core/app/translator/platforms/chronicle/renders/chronicle_rule.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@
2727
from app.translator.platforms.chronicle.const import DEFAULT_CHRONICLE_SECURITY_RULE, chronicle_rule_details
2828
from app.translator.platforms.chronicle.renders.chronicle import ChronicleFieldValue, ChronicleQueryRender
2929

30-
_AUTOGENERATED_TITLE = "Autogenerated Chronicle Security rule"
31-
_AUTOGENERATED_DESCRIPTION = "Autogenerated Chronicle Security rule."
30+
_AUTOGENERATED_TEMPLATE = "Autogenerated Chronicle Security rule."
3231

3332

3433
class ChronicleRuleFieldValue(ChronicleFieldValue):
@@ -100,21 +99,20 @@ def prepare_title(title: str) -> str:
10099
new_title = new_title[index:]
101100
return new_title.strip("_")
102101

103-
def finalize_query(
102+
def render_query(
104103
self,
105104
prefix: str,
106105
query: str,
107106
functions: str,
108107
meta_info: Optional[MetaInfoContainer] = None,
109108
source_mapping: Optional[SourceMapping] = None, # noqa: ARG002
110-
not_supported_functions: Optional[list] = None, # noqa: ARG002,
111109
*args, # noqa: ARG002
112110
**kwargs, # noqa: ARG002
113111
) -> str:
114-
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
112+
query = super().render_query(prefix=prefix, query=query, functions=functions)
115113
rule = DEFAULT_CHRONICLE_SECURITY_RULE.replace("<query_placeholder>", query)
116-
rule = rule.replace("<title_place_holder>", self.prepare_title(meta_info.title) or _AUTOGENERATED_TITLE)
117-
description = meta_info.description or _AUTOGENERATED_DESCRIPTION
114+
rule = rule.replace("<title_place_holder>", self.prepare_title(meta_info.title) or _AUTOGENERATED_TEMPLATE)
115+
description = meta_info.description or _AUTOGENERATED_TEMPLATE
118116
rule = rule.replace("<author_place_holder>", meta_info.author)
119117
rule = rule.replace("<description_place_holder>", description)
120118
rule = rule.replace("<licence_place_holder>", meta_info.license)

uncoder-core/app/translator/platforms/elasticsearch/renders/detection_rule.py

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818
"""
1919

2020
import copy
21+
import json
2122
from typing import Optional, Union
2223

23-
import ujson
24-
2524
from app.translator.core.mapping import SourceMapping
2625
from app.translator.core.mitre import MitreConfig
2726
from app.translator.core.models.platform_details import PlatformDetails
@@ -33,6 +32,8 @@
3332
ElasticSearchQueryRender,
3433
)
3534

35+
_AUTOGENERATED_TEMPLATE = "Autogenerated Elastic Rule"
36+
3637

3738
class ElasticSearchRuleFieldValue(ElasticSearchFieldValue):
3839
details: PlatformDetails = elasticsearch_rule_details
@@ -55,14 +56,6 @@ def __create_mitre_threat(self, mitre_attack: dict) -> Union[list, list[dict]]:
5556
return []
5657
threat = []
5758

58-
if not mitre_attack.get("tactics"):
59-
for technique in mitre_attack.get("techniques"):
60-
technique_name = technique["technique"]
61-
if "." in technique_name:
62-
technique_name = technique_name[: technique_name.index(".")]
63-
threat.append(technique_name)
64-
return sorted(threat)
65-
6659
for tactic in mitre_attack["tactics"]:
6760
tactic_render = {"id": tactic["external_id"], "name": tactic["tactic"], "reference": tactic["url"]}
6861
sub_threat = {"tactic": tactic_render, "framework": "MITRE ATT&CK", "technique": []}
@@ -84,26 +77,23 @@ def __create_mitre_threat(self, mitre_attack: dict) -> Union[list, list[dict]]:
8477

8578
return sorted(threat, key=lambda x: x["tactic"]["id"])
8679

87-
def finalize_query(
80+
def render_query(
8881
self,
8982
prefix: str,
9083
query: str,
9184
functions: str,
9285
meta_info: Optional[MetaInfoContainer] = None,
9386
source_mapping: Optional[SourceMapping] = None, # noqa: ARG002
94-
not_supported_functions: Optional[list] = None,
9587
*args, # noqa: ARG002
9688
**kwargs, # noqa: ARG002
9789
) -> str:
98-
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
90+
query = super().render_query(prefix=prefix, query=query, functions=functions)
9991
rule = copy.deepcopy(ELASTICSEARCH_DETECTION_RULE)
100-
description = meta_info.description or rule["description"]
101-
10292
rule.update(
10393
{
10494
"query": query,
105-
"description": description,
106-
"name": meta_info.title,
95+
"description": meta_info.description or rule["description"] or _AUTOGENERATED_TEMPLATE,
96+
"name": meta_info.title or _AUTOGENERATED_TEMPLATE,
10797
"rule_id": meta_info.id,
10898
"author": [meta_info.author],
10999
"severity": meta_info.severity,
@@ -114,8 +104,4 @@ def finalize_query(
114104
"false_positives": meta_info.false_positives,
115105
}
116106
)
117-
rule_str = ujson.dumps(rule, indent=4, sort_keys=False, ensure_ascii=False)
118-
if not_supported_functions:
119-
rendered_not_supported = self.render_not_supported_functions(not_supported_functions)
120-
return rule_str + rendered_not_supported
121-
return rule_str
107+
return json.dumps(rule, indent=4, sort_keys=False, ensure_ascii=False)

uncoder-core/app/translator/platforms/elasticsearch/renders/elast_alert.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
limitations under the License.
1717
-----------------------------------------------------------------
1818
"""
19-
2019
from typing import Optional
2120

2221
from app.translator.core.custom_types.meta_info import SeverityType
@@ -31,6 +30,7 @@
3130
)
3231
from app.translator.tools.utils import get_rule_description_str
3332

33+
_AUTOGENERATED_TEMPLATE = "Autogenerated ElastAlert"
3434
_SEVERITIES_MAP = {SeverityType.low: "4", SeverityType.medium: "3", SeverityType.high: "2", SeverityType.critical: "1"}
3535

3636

@@ -49,14 +49,13 @@ class ElastAlertRuleRender(ElasticSearchQueryRender):
4949
field_value_map = ElasticAlertRuleFieldValue(or_token=or_token)
5050
query_pattern = "{prefix} {query} {functions}"
5151

52-
def finalize_query(
52+
def render_query(
5353
self,
5454
prefix: str,
5555
query: str,
5656
functions: str,
5757
meta_info: Optional[MetaInfoContainer] = None,
5858
source_mapping: Optional[SourceMapping] = None, # noqa: ARG002
59-
not_supported_functions: Optional[list] = None,
6059
*args, # noqa: ARG002
6160
**kwargs, # noqa: ARG002
6261
) -> str:
@@ -66,14 +65,10 @@ def finalize_query(
6665
"<description_place_holder>",
6766
get_rule_description_str(
6867
author=meta_info.author,
69-
description=meta_info.description,
68+
description=meta_info.description or _AUTOGENERATED_TEMPLATE,
7069
license_=meta_info.license,
7170
rule_id=meta_info.id,
7271
),
7372
)
74-
rule = rule.replace("<title_place_holder>", meta_info.title)
75-
rule = rule.replace("<priority_place_holder>", _SEVERITIES_MAP[meta_info.severity])
76-
if not_supported_functions:
77-
rendered_not_supported = self.render_not_supported_functions(not_supported_functions)
78-
return rule + rendered_not_supported
79-
return rule
73+
rule = rule.replace("<title_place_holder>", meta_info.title or _AUTOGENERATED_TEMPLATE)
74+
return rule.replace("<priority_place_holder>", _SEVERITIES_MAP[meta_info.severity])

uncoder-core/app/translator/platforms/elasticsearch/renders/kibana.py

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616
limitations under the License.
1717
-----------------------------------------------------------------
1818
"""
19-
2019
import copy
20+
import json
2121
from typing import Optional
2222

23-
import ujson
24-
2523
from app.translator.core.mapping import SourceMapping
2624
from app.translator.core.models.platform_details import PlatformDetails
2725
from app.translator.core.models.query_container import MetaInfoContainer
@@ -33,6 +31,8 @@
3331
)
3432
from app.translator.tools.utils import get_rule_description_str
3533

34+
_AUTOGENERATED_TEMPLATE = "Autogenerated Elastic Kibana Saved Search"
35+
3636

3737
class KibanaFieldValue(ElasticSearchFieldValue):
3838
details: PlatformDetails = kibana_rule_details
@@ -44,33 +44,29 @@ class KibanaRuleRender(ElasticSearchQueryRender):
4444
or_token = "OR"
4545
field_value_map = KibanaFieldValue(or_token=or_token)
4646

47-
def finalize_query(
47+
def render_query(
4848
self,
4949
prefix: str,
5050
query: str,
5151
functions: str,
5252
meta_info: Optional[MetaInfoContainer] = None,
5353
source_mapping: Optional[SourceMapping] = None, # noqa: ARG002
54-
not_supported_functions: Optional[list] = None,
5554
*args, # noqa: ARG002
5655
**kwargs, # noqa: ARG002
5756
) -> str:
58-
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
57+
query = super().render_query(prefix=prefix, query=query, functions=functions)
5958
search_source = copy.deepcopy(KIBANA_SEARCH_SOURCE_JSON)
6059
search_source["query"]["query_string"]["query"] = query
61-
dumped_rule = ujson.dumps(search_source, sort_keys=False, escape_forward_slashes=False)
60+
dumped_rule = json.dumps(search_source, sort_keys=False)
6261
rule = copy.deepcopy(KIBANA_RULE)
6362
rule["_source"]["kibanaSavedObjectMeta"]["searchSourceJSON"] = dumped_rule
64-
rule["_source"]["title"] = meta_info.title
63+
rule["_source"]["title"] = meta_info.title or _AUTOGENERATED_TEMPLATE
64+
descr = meta_info.description or rule["_source"]["description"] or _AUTOGENERATED_TEMPLATE
6565
rule["_source"]["description"] = get_rule_description_str(
66-
description=meta_info.description or rule["_source"]["description"],
66+
description=descr,
6767
author=meta_info.author,
6868
rule_id=meta_info.id,
6969
license_=meta_info.license,
7070
references=meta_info.references,
7171
)
72-
rule_str = ujson.dumps(rule, indent=4, sort_keys=False)
73-
if not_supported_functions:
74-
rendered_not_supported = self.render_not_supported_functions(not_supported_functions)
75-
return rule_str + rendered_not_supported
76-
return rule_str
72+
return json.dumps(rule, indent=4, sort_keys=False)

uncoder-core/app/translator/platforms/elasticsearch/renders/xpack_watcher.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616
limitations under the License.
1717
-----------------------------------------------------------------
1818
"""
19-
2019
import copy
20+
import json
2121
from typing import Optional
2222

23-
import ujson
24-
2523
from app.translator.core.mapping import SourceMapping
2624
from app.translator.core.models.platform_details import PlatformDetails
2725
from app.translator.core.models.query_container import MetaInfoContainer
@@ -33,6 +31,8 @@
3331
)
3432
from app.translator.tools.utils import get_rule_description_str
3533

34+
_AUTOGENERATED_TEMPLATE = "Autogenerated Elastic Watcher"
35+
3636

3737
class XpackWatcherRuleFieldValue(ElasticSearchFieldValue):
3838
details: PlatformDetails = xpack_watcher_details
@@ -44,25 +44,24 @@ class XPackWatcherRuleRender(ElasticSearchQueryRender):
4444
or_token = "OR"
4545
field_value_map = XpackWatcherRuleFieldValue(or_token=or_token)
4646

47-
def finalize_query(
47+
def render_query(
4848
self,
4949
prefix: str,
5050
query: str,
5151
functions: str,
5252
meta_info: Optional[MetaInfoContainer] = None,
5353
source_mapping: Optional[SourceMapping] = None,
54-
not_supported_functions: Optional[list] = None,
5554
*args, # noqa: ARG002
5655
**kwargs, # noqa: ARG002
5756
) -> str:
58-
query = super().finalize_query(prefix=prefix, query=query, functions=functions)
57+
query = super().render_query(prefix=prefix, query=query, functions=functions)
5958
rule = copy.deepcopy(XPACK_WATCHER_RULE)
6059
rule["metadata"].update(
6160
{
6261
"query": query,
63-
"title": meta_info.title,
62+
"title": meta_info.title or _AUTOGENERATED_TEMPLATE,
6463
"description": get_rule_description_str(
65-
description=meta_info.description,
64+
description=meta_info.description or _AUTOGENERATED_TEMPLATE,
6665
author=meta_info.author,
6766
license_=meta_info.license,
6867
mitre_attack=meta_info.mitre_attack,
@@ -73,9 +72,5 @@ def finalize_query(
7372
rule["input"]["search"]["request"]["body"]["query"]["bool"]["must"][0]["query_string"]["query"] = query
7473
indices = source_mapping and [str(source_mapping.log_source_signature)] or []
7574
rule["input"]["search"]["request"]["indices"] = indices
76-
rule["actions"]["send_email"]["email"]["subject"] = meta_info.title
77-
rule_str = ujson.dumps(rule, indent=4, sort_keys=False)
78-
if not_supported_functions:
79-
rendered_not_supported = self.render_not_supported_functions(not_supported_functions)
80-
return rule_str + rendered_not_supported
81-
return rule_str
75+
rule["actions"]["send_email"]["email"]["subject"] = meta_info.title or _AUTOGENERATED_TEMPLATE
76+
return json.dumps(rule, indent=4, sort_keys=False)

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