Skip to content

Commit 53aa31d

Browse files
author
oleksandr.volha
committed
refactoring
1 parent f56ab22 commit 53aa31d

File tree

34 files changed

+115
-126
lines changed

34 files changed

+115
-126
lines changed

translator/app/models/ioc_translation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66

77

88
class CTIPlatform(BaseModel):
9-
name: str
9+
id: str
1010

1111

1212
class OneTranslationCTIData(BaseModel):
1313
info: Optional[InfoMessage] = None
1414
status: bool
1515
translations: Optional[list] = None
16-
target_siem_type: str
16+
target_platform_id: str

translator/app/models/translation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ class OneTranslationData(BaseModel):
1212
info: Optional[InfoMessage] = None
1313
status: bool
1414
translation: Optional[str] = None
15-
target_siem_type: str
15+
target_platform_id: str
1616

1717

18-
class ConvertorPlatform(BaseModel):
18+
class TranslatorPlatform(BaseModel):
1919
name: str
2020
id: str
2121
code: str
@@ -28,7 +28,7 @@ class ConvertorPlatform(BaseModel):
2828
first_choice: int = 1
2929

3030

31-
class ConvertorPlatforms(BaseModel):
31+
class TranslatorPlatforms(BaseModel):
3232
renders: list
3333
parsers: list
3434

translator/app/routers/ioc_translate.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44

55
from app.models.ioc_translation import CTIPlatform, OneTranslationCTIData
66
from app.models.translation import InfoMessage
7-
from app.translator.cti_translator import CTIConverter
7+
from app.translator.cti_translator import CTITranslator
88
from app.translator.tools.const import HashType, IocParsingRule, IOCType
99

1010
iocs_router = APIRouter()
11-
converter = CTIConverter()
11+
cti_translator = CTITranslator()
1212

1313

1414
@iocs_router.post("/iocs/translate", description="Parse IOCs from text.")
1515
@iocs_router.post("/iocs/translate", include_in_schema=False)
1616
def parse_and_translate_iocs(
1717
text: str = Body(..., description="Text to parse IOCs from", embed=True),
18-
iocs_per_query: int = Body(25, description="Platforms to parse IOCs to", embed=True),
19-
platform: CTIPlatform = Body(..., description="Platforms to parse IOCs to", embed=True),
18+
iocs_per_query: int = Body(25, description="IOCs per query limit", embed=True),
19+
platform: CTIPlatform = Body(..., description="Platform to parse IOCs to", embed=True),
2020
include_ioc_types: Optional[list[IOCType]] = Body(
2121
None, description="List of IOC types to include. By default all types are enabled.", embed=True
2222
),
@@ -31,7 +31,7 @@ def parse_and_translate_iocs(
3131
),
3232
include_source_ip: Optional[bool] = Body(False, description="Include source IP in query. By default it is false."),
3333
) -> OneTranslationCTIData:
34-
status, translations = converter.convert(
34+
status, translations = cti_translator.translate(
3535
text=text,
3636
platform_data=platform,
3737
iocs_per_query=iocs_per_query,
@@ -42,7 +42,7 @@ def parse_and_translate_iocs(
4242
include_source_ip=include_source_ip,
4343
)
4444
if status:
45-
return OneTranslationCTIData(status=status, translations=translations, target_siem_type=platform.name)
45+
return OneTranslationCTIData(status=status, translations=translations, target_platform_id=platform.id)
4646

4747
info_message = InfoMessage(message=translations, severity="error")
48-
return OneTranslationCTIData(info=info_message, status=status, target_siem_type=platform.name)
48+
return OneTranslationCTIData(info=info_message, status=status, target_platform_id=platform.id)

translator/app/routers/translate.py

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,86 @@
11
from fastapi import APIRouter, Body
22

3-
from app.models.translation import ConvertorPlatforms, InfoMessage, OneTranslationData, Platform
4-
from app.translator.cti_translator import CTIConverter
5-
from app.translator.translator import SiemConverter
3+
from app.models.translation import InfoMessage, OneTranslationData, Platform, TranslatorPlatforms
4+
from app.translator.cti_translator import CTITranslator
5+
from app.translator.translator import Translator
66

77
st_router = APIRouter()
88

9-
converter = SiemConverter()
9+
translator = Translator()
1010

1111

12-
@st_router.post("/translate", tags=["siem_translate"], description="Generate target translation")
12+
@st_router.post("/translate", tags=["translator"], description="Generate target translation")
1313
@st_router.post("/translate/", include_in_schema=False)
14-
def generate_one_translation(
15-
source_siem: str = Body(..., embed=True),
16-
source_scheme: str = Body(None, embed=True), # noqa: ARG001
17-
target_siem: str = Body(..., embed=True),
18-
target_scheme: str = Body(None, embed=True), # noqa: ARG001
14+
def translate_one(
15+
source_platform_id: str = Body(..., embed=True),
16+
target_platform_id: str = Body(..., embed=True),
1917
text: str = Body(..., embed=True),
2018
) -> OneTranslationData:
21-
status, data = converter.generate_translation(text=text, source=source_siem, target=target_siem)
19+
status, data = translator.translate_one(text=text, source=source_platform_id, target=target_platform_id)
2220
if status:
23-
return OneTranslationData(status=status, translation=data, target_siem_type=target_siem)
21+
return OneTranslationData(status=status, translation=data, target_platform_id=target_platform_id)
2422

2523
info_message = InfoMessage(message=data, severity="error")
26-
return OneTranslationData(info=info_message, status=status, target_siem_type=target_siem)
24+
return OneTranslationData(info=info_message, status=status, target_platform_id=target_platform_id)
2725

2826

29-
@st_router.post("/translate/all", tags=["siem_translate"], description="Generate all translations")
27+
@st_router.post("/translate/all", tags=["translator"], description="Generate all translations")
3028
@st_router.post("/translate/all/", include_in_schema=False)
31-
def generate_all_translations(
32-
source_siem: str = Body(..., embed=True),
33-
source_scheme: str = Body(None, embed=True), # noqa: ARG001
34-
text: str = Body(..., embed=True),
29+
def translate_all(
30+
source_platform_id: str = Body(..., embed=True), text: str = Body(..., embed=True)
3531
) -> list[OneTranslationData]:
36-
result = converter.generate_all_translation(text=text, source=source_siem)
32+
result = translator.translate_all(text=text, source=source_platform_id)
3733
translations = []
38-
for siem_result in result:
39-
if siem_result.get("status"):
34+
for platform_result in result:
35+
if platform_result.get("status"):
4036
translations.append(
4137
OneTranslationData(
42-
status=siem_result.get("status", True),
43-
translation=siem_result.get("result"),
44-
target_siem_type=siem_result.get("siem_type"),
38+
status=platform_result.get("status", True),
39+
translation=platform_result.get("result"),
40+
target_platform_id=platform_result.get("platform_id"),
4541
)
4642
)
4743
else:
4844
translations.append(
4945
OneTranslationData(
50-
status=siem_result.get("status", False),
51-
info=InfoMessage(message=siem_result.get("result"), severity="error"),
52-
target_siem_type=siem_result.get("siem_type"),
46+
status=platform_result.get("status", False),
47+
info=InfoMessage(message=platform_result.get("result"), severity="error"),
48+
target_platform_id=platform_result.get("platform_id"),
5349
)
5450
)
5551
return translations
5652

5753

58-
@st_router.get("/platforms", tags=["siem_translate"], description="Get translator platforms")
54+
@st_router.get("/platforms", tags=["translator"], description="Get translator platforms")
5955
@st_router.get("/platforms/", include_in_schema=False)
60-
def get_convertor_platforms() -> ConvertorPlatforms:
61-
renders, parsers = converter.get_all_platforms()
62-
return ConvertorPlatforms(renders=renders, parsers=parsers)
56+
def get_translator_platforms() -> TranslatorPlatforms:
57+
renders, parsers = translator.get_all_platforms()
58+
return TranslatorPlatforms(renders=renders, parsers=parsers)
6359

6460

6561
@st_router.get("/all_platforms", description="Get Sigma, RootA and iocs platforms")
6662
@st_router.get("/all_platforms/", include_in_schema=False)
6763
def get_all_platforms() -> list:
68-
converter_renders, converter_platforms = converter.get_all_platforms()
64+
translator_renders, translator_parsers = translator.get_all_platforms()
6965
return [
7066
Platform(
7167
id="roota",
7268
name="RootA",
7369
code="roota",
7470
group_name="RootA",
7571
group_id="roota",
76-
renders=converter_renders,
77-
parsers=converter_platforms,
72+
renders=translator_renders,
73+
parsers=translator_parsers,
7874
),
7975
Platform(
8076
id="sigma",
8177
name="Sigma",
8278
code="sigma",
8379
group_name="Sigma",
8480
group_id="sigma",
85-
renders=[render for render in converter_renders if render.code != "sigma"],
81+
renders=[render for render in translator_renders if render.code != "sigma"],
8682
),
8783
Platform(
88-
id="ioc", name="IOCs", code="ioc", group_name="IOCs", group_id="ioc", renders=CTIConverter().get_renders()
84+
id="ioc", name="IOCs", code="ioc", group_name="IOCs", group_id="ioc", renders=CTITranslator().get_renders()
8985
),
9086
]

translator/app/translator/core/exceptions/core.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ def __init__(self, platform_name: str, field_name: str):
2020

2121
class UnsupportedPlatform(BasePlatformException):
2222
def __init__(self, platform: str, is_parser: bool = False):
23-
converter_direction = "input" if is_parser else "output"
23+
direction = "input" if is_parser else "output"
2424
if platform:
2525
message = (
26-
f"The selected {converter_direction} language `{platform}` is not supported. "
26+
f"The selected {direction} language `{platform}` is not supported. "
2727
f"Please, select an option in the dropdown."
2828
)
2929
else:
30-
message = f"Please, select an {converter_direction} language."
30+
message = f"Please, select an {direction} language."
3131
super().__init__(message)
3232

3333

translator/app/translator/core/mapping.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def __init__(self, platform_dir: str):
8787
def prepare_mapping(self) -> dict[str, SourceMapping]:
8888
source_mappings = {}
8989
default_mapping = SourceMapping(source_id=DEFAULT_MAPPING_NAME)
90-
for mapping_dict in self._loader.load_siem_mappings(self._platform_dir):
90+
for mapping_dict in self._loader.load_platform_mappings(self._platform_dir):
9191
log_source_signature = self.prepare_log_source_signature(mapping=mapping_dict)
9292
if (source_id := mapping_dict["source"]) == DEFAULT_MAPPING_NAME:
9393
default_mapping.log_source_signature = log_source_signature
@@ -131,7 +131,7 @@ def prepare_mapping(self) -> dict[str, SourceMapping]:
131131
source_mappings = {}
132132
common_field_mapping = self._loader.load_common_mapping(self._platform_dir).get("field_mapping", {})
133133

134-
for mapping_dict in self._loader.load_siem_mappings(self._platform_dir):
134+
for mapping_dict in self._loader.load_platform_mappings(self._platform_dir):
135135
source_id = mapping_dict["source"]
136136
log_source_signature = self.prepare_log_source_signature(mapping=mapping_dict)
137137
fields_mapping = self.prepare_fields_mapping(field_mapping=common_field_mapping)

translator/app/translator/core/models/platform_details.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
@dataclass
66
class PlatformDetails:
7-
siem_type: str = ""
7+
platform_id: str = ""
88
name: str = ""
99
platform_name: str = ""
1010
group_id: Optional[str] = None

translator/app/translator/cti_translator.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55
from app.translator.const import CTI_IOCS_PER_QUERY_LIMIT, CTI_MIN_LIMIT_QUERY
66
from app.translator.core.models.iocs import IocsChunkValue
77
from app.translator.core.parser_cti import CTIParser
8-
from app.translator.core.render_cti import RenderCTI
98
from app.translator.managers import RenderCTIManager, render_cti_manager
109
from app.translator.tools.decorators import handle_translation_exceptions
1110

1211

13-
class CTIConverter:
12+
class CTITranslator:
1413
renders: RenderCTIManager = render_cti_manager
1514

1615
def __init__(self):
17-
self.logger = logging.getLogger("cti_converter")
16+
self.logger = logging.getLogger("cti_translator")
1817
self.parser = CTIParser()
1918

2019
@handle_translation_exceptions
@@ -39,12 +38,14 @@ def __parse_iocs_from_string(
3938

4039
@handle_translation_exceptions
4140
def __render_translation(self, parsed_data: dict, platform_data: CTIPlatform, iocs_per_query: int) -> list[str]:
42-
platform = self.renders.get(platform_data.name)
43-
return self.generate(
44-
data=parsed_data, platform=platform, iocs_per_query=iocs_per_query, mapping=platform.default_mapping
41+
render_cti = self.renders.get(platform_data.id)
42+
43+
chunked_iocs = self.__get_iocs_chunk(
44+
chunks_size=iocs_per_query, data=parsed_data, mapping=render_cti.default_mapping
4545
)
46+
return render_cti.render(chunked_iocs)
4647

47-
def convert(
48+
def translate(
4849
self,
4950
text: str,
5051
platform_data: CTIPlatform,
@@ -70,7 +71,7 @@ def convert(
7071
return status, parsed_data
7172

7273
@staticmethod
73-
def _get_iocs_chunk(
74+
def __get_iocs_chunk(
7475
chunks_size: int, data: dict[str, list[str]], mapping: dict[str, str]
7576
) -> list[list[IocsChunkValue]]:
7677
result = []
@@ -82,12 +83,6 @@ def _get_iocs_chunk(
8283
)
8384
return [result[i : i + chunks_size] for i in range(0, len(result), chunks_size)]
8485

85-
def generate(
86-
self, platform: RenderCTI, iocs_per_query: int, data: dict[str, list[str]], mapping: dict[str, str]
87-
) -> list[str]:
88-
chunked_iocs = self._get_iocs_chunk(chunks_size=iocs_per_query, data=data, mapping=mapping)
89-
return platform.render(chunked_iocs)
90-
9186
@classmethod
9287
def get_renders(cls) -> list:
9388
return cls.renders.get_platforms_details

translator/app/translator/managers.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from abc import ABC
22

3-
from app.models.translation import ConvertorPlatform
3+
from app.models.translation import TranslatorPlatform
44
from app.translator.core.exceptions.core import UnsupportedRootAParser
55
from app.translator.platforms import __ALL_PARSERS as PARSERS
66
from app.translator.platforms import __ALL_RENDERS as RENDERS
@@ -12,27 +12,27 @@ class Manager(ABC):
1212

1313
@property
1414
def platforms(self) -> dict:
15-
return {platform.details.siem_type: platform for platform in self.platforms_class}
15+
return {platform.details.platform_id: platform for platform in self.platforms_class}
1616

17-
def get(self, siem: str): # noqa: ANN201
18-
if platform := self.platforms.get(siem):
17+
def get(self, platform_id: str): # noqa: ANN201
18+
if platform := self.platforms.get(platform_id):
1919
return platform
20-
raise UnsupportedRootAParser(parser=siem)
20+
raise UnsupportedRootAParser(parser=platform_id)
2121

2222
def all_platforms(self) -> list:
2323
return list(self.platforms)
2424

2525
@property
26-
def get_platforms_details(self) -> list[ConvertorPlatform]:
26+
def get_platforms_details(self) -> list[TranslatorPlatform]:
2727
platforms = [
28-
ConvertorPlatform(
29-
id=platform.details.siem_type,
28+
TranslatorPlatform(
29+
id=platform.details.platform_id,
3030
name=platform.details.name,
31-
code=platform.details.siem_type,
31+
code=platform.details.platform_id,
3232
group_name=platform.details.group_name,
3333
group_id=platform.details.group_id,
3434
platform_name=platform.details.platform_name,
35-
platform_id=platform.details.siem_type,
35+
platform_id=platform.details.platform_id,
3636
alt_platform_name=platform.details.alt_platform_name,
3737
alt_platform=platform.details.alt_platform,
3838
first_choice=platform.details.first_choice,

translator/app/translator/mappings/utils/load_from_files.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def load_mapping(mapping_file_path: str) -> dict:
2020
print(err)
2121
return {}
2222

23-
def load_siem_mappings(self, platform_dir: str) -> Generator[dict, None, None]:
23+
def load_platform_mappings(self, platform_dir: str) -> Generator[dict, None, None]:
2424
platform_path = os.path.join(self.base_mapping_filepath, platform_dir)
2525
for mapping_file in os.listdir(platform_path):
2626
if mapping_file != COMMON_FIELD_MAPPING_FILE_NAME:

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