psengine 2.4.1__tar.gz → 2.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {psengine-2.4.1 → psengine-2.4.2}/PKG-INFO +1 -1
- {psengine-2.4.1 → psengine-2.4.2}/psengine/constants.py +1 -1
- {psengine-2.4.1 → psengine-2.4.2}/psengine/detection/detection_mgr.py +1 -1
- {psengine-2.4.1 → psengine-2.4.2}/psengine/malware_intel/malware_intel.py +5 -1
- {psengine-2.4.1 → psengine-2.4.2}/psengine/malware_intel/malware_intel_mgr.py +4 -2
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/playbook_alert_mgr.py +5 -5
- {psengine-2.4.1 → psengine-2.4.2}/psengine/rf_client.py +15 -1
- {psengine-2.4.1 → psengine-2.4.2}/psengine.egg-info/PKG-INFO +1 -1
- {psengine-2.4.1 → psengine-2.4.2}/pyproject.toml +1 -1
- {psengine-2.4.1 → psengine-2.4.2}/LICENSE +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/README.md +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/_sdk_id.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/_version.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/helpers.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/markdown.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/note.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/analyst_notes/note_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/base_http_client.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/classic_alert.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/classic_alert_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/helpers.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/markdown/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/markdown/markdown.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/classic_alerts/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/collective_insights/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/collective_insights/collective_insights.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/collective_insights/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/collective_insights/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/collective_insights/insight.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/collective_insights/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/common_models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/config/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/config/config.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/config/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/detection/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/detection/detection_rule.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/detection/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/detection/helpers.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/detection/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/endpoints.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/lookup.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/lookup_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/models/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/models/base_enriched_entity.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/models/lookup.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/models/soar.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/soar.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/enrich/soar_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_lists/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_lists/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_lists/entity_list.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_lists/entity_list_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_lists/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_lists/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_match/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_match/entity_match.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_match/entity_match_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_match/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/entity_match/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/fusion/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/fusion/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/fusion/fusion_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/fusion/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/helpers/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/helpers/helpers.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/identity.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/identity_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/models/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/models/common_models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/models/detections.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/models/incident_report.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/identity/models/lookup.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/logger/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/logger/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/logger/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/logger/rf_logger.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/malware_intel/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/malware_intel/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/malware_intel/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/markdown/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/markdown/markdown.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/markdown/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/helpers.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/mappings.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_code_repo.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_cyber_vulnerability.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_domain_abuse.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_geopolitics_facility.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_identity_exposure.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_malware_report.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_third_party_risk.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/common_models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/panel_log.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/panel_status.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_code_repo_leak.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_cyber_vulnerability.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_domain_abuse.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_geopolitics_facility.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_identity_exposures.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_malware_report.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_third_party_risk.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/search_endpoint.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/pa_category.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/playbook_alerts.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/py.typed +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risk_history/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risk_history/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risk_history/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risk_history/risk_history_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risklists/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risklists/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risklists/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risklists/models.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/risklists/risklist_mgr.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/__init__.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/base_stix_entity.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/complex_entity.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/constants.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/enriched_indicator.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/errors.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/helpers.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/rf_bundle.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/simple_entity.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine/stix2/util.py +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine.egg-info/SOURCES.txt +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine.egg-info/dependency_links.txt +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine.egg-info/requires.txt +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/psengine.egg-info/top_level.txt +0 -0
- {psengine-2.4.1 → psengine-2.4.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: psengine
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.2
|
|
4
4
|
Summary: psengine is a simple, yet elegant, library for rapid development of integrations with Recorded Future.
|
|
5
5
|
Author-email: Moise Medici <moise.medici@recordedfuture.com>, Patrick Kinsella <patrick.kinsella@recordedfuture.com>, Ernest Bartosevic <ernest.bartosevic@recordedfuture.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -23,7 +23,7 @@ DEFAULT_MAX_WORKERS = 10
|
|
|
23
23
|
# Recorded Future API
|
|
24
24
|
#####################
|
|
25
25
|
RF_TOKEN_ENV_VAR = 'RF_TOKEN' # noqa: S105
|
|
26
|
-
RF_TOKEN_VALIDATION_REGEX = r'^[a-
|
|
26
|
+
RF_TOKEN_VALIDATION_REGEX = r'^[a-z0-9]{32}$' # noqa: S105
|
|
27
27
|
|
|
28
28
|
#####################
|
|
29
29
|
# Recorded Future Portal
|
|
@@ -89,6 +89,8 @@ class SandboxReport(RFBaseModel):
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
def _split_time(value: str):
|
|
92
|
+
if not value:
|
|
93
|
+
return value
|
|
92
94
|
return value.split('T')[0]
|
|
93
95
|
|
|
94
96
|
|
|
@@ -101,7 +103,9 @@ class MalwareReportIn(RFBaseModel):
|
|
|
101
103
|
str, BeforeValidator(Validators.convert_relative_time), AfterValidator(_split_time)
|
|
102
104
|
]
|
|
103
105
|
end_date: Annotated[
|
|
104
|
-
str,
|
|
106
|
+
Optional[str],
|
|
107
|
+
BeforeValidator(Validators.convert_relative_time),
|
|
108
|
+
AfterValidator(_split_time),
|
|
105
109
|
]
|
|
106
110
|
my_enterprise: bool
|
|
107
111
|
limit: int = Field(ge=1, le=10)
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
##############################################################################################
|
|
13
13
|
|
|
14
14
|
import logging
|
|
15
|
-
from typing import Annotated
|
|
15
|
+
from typing import Annotated, Optional
|
|
16
16
|
|
|
17
17
|
from pydantic import validate_call
|
|
18
18
|
from typing_extensions import Doc
|
|
@@ -48,7 +48,9 @@ class MalwareIntelMgr:
|
|
|
48
48
|
start_date: Annotated[
|
|
49
49
|
str, Doc('The starting date, format YYYY-MM-DD or relative like -1d.')
|
|
50
50
|
],
|
|
51
|
-
end_date: Annotated[
|
|
51
|
+
end_date: Annotated[
|
|
52
|
+
Optional[str], Doc('The ending date, format YYYY-MM-DD or relative like -1d.')
|
|
53
|
+
] = None,
|
|
52
54
|
my_enterprise: Annotated[
|
|
53
55
|
bool, Doc('If the report has been submitted by your enterprise.')
|
|
54
56
|
] = False,
|
|
@@ -141,9 +141,9 @@ class PlaybookAlertMgr:
|
|
|
141
141
|
alerts_per_page: Annotated[
|
|
142
142
|
Optional[int], Doc('Number of alerts per page (pagination).')
|
|
143
143
|
] = Field(ge=1, le=10000, default=ALERTS_PER_PAGE),
|
|
144
|
-
max_results: Annotated[
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
max_results: Annotated[Optional[int], Doc('Maximum number of alerts to fetch.')] = Field(
|
|
145
|
+
ge=1, le=10_000, default=DEFAULT_LIMIT
|
|
146
|
+
),
|
|
147
147
|
order_by: Annotated[
|
|
148
148
|
Optional[str], Doc('Field to order alerts by, e.g. `created` or `updated`.')
|
|
149
149
|
] = None,
|
|
@@ -229,7 +229,7 @@ class PlaybookAlertMgr:
|
|
|
229
229
|
),
|
|
230
230
|
max_results: Annotated[
|
|
231
231
|
Optional[int], Doc('Maximum total number of alerts to fetch.')
|
|
232
|
-
] = DEFAULT_LIMIT,
|
|
232
|
+
] = Field(ge=1, le=10_000, default=DEFAULT_LIMIT),
|
|
233
233
|
order_by: Annotated[
|
|
234
234
|
Optional[str], Doc('Field to order alerts by, e.g. `created` or `updated`.')
|
|
235
235
|
] = None,
|
|
@@ -286,7 +286,7 @@ class PlaybookAlertMgr:
|
|
|
286
286
|
data=request_body,
|
|
287
287
|
max_results=max_results,
|
|
288
288
|
results_path='data',
|
|
289
|
-
offset_key='
|
|
289
|
+
offset_key='offset',
|
|
290
290
|
)
|
|
291
291
|
|
|
292
292
|
# To avoid a breaking change have to reconstruct the SearchResponse model manually
|
|
@@ -184,8 +184,13 @@ class RFClient(BaseHTTPClient):
|
|
|
184
184
|
**kwargs,
|
|
185
185
|
):
|
|
186
186
|
if 'next_offset' in json_response:
|
|
187
|
+
current_len = 0
|
|
187
188
|
while 'next_offset' in json_response:
|
|
188
189
|
data[offset_key] = json_response['next_offset']
|
|
190
|
+
data['limit'] = min(data['limit'], max_results - current_len)
|
|
191
|
+
if data['limit'] <= 0:
|
|
192
|
+
break
|
|
193
|
+
|
|
189
194
|
json_response = self.request(
|
|
190
195
|
method=method,
|
|
191
196
|
url=url,
|
|
@@ -202,11 +207,15 @@ class RFClient(BaseHTTPClient):
|
|
|
202
207
|
if any(len(v) >= max_results for v in dict_results.values()):
|
|
203
208
|
dict_results = {k: v[:max_results] for k, v in dict_results.items()}
|
|
204
209
|
break
|
|
210
|
+
current_len = max(len(v) for v in dict_results.values())
|
|
211
|
+
|
|
205
212
|
else:
|
|
206
213
|
all_results += self._get_matches(results_expr, json_response)
|
|
207
|
-
|
|
214
|
+
current_len = len(all_results)
|
|
215
|
+
if current_len >= max_results:
|
|
208
216
|
all_results = all_results[:max_results]
|
|
209
217
|
break
|
|
218
|
+
|
|
210
219
|
else:
|
|
211
220
|
seen = json_response['counts']['returned']
|
|
212
221
|
if json_response['counts']['total'] > max_results:
|
|
@@ -324,6 +333,9 @@ class RFClient(BaseHTTPClient):
|
|
|
324
333
|
with suppress(KeyError):
|
|
325
334
|
dict_results[str(expr)].extend(self._get_matches(expr, json_response))
|
|
326
335
|
|
|
336
|
+
if len(all_results) >= max_results:
|
|
337
|
+
return all_results[:max_results]
|
|
338
|
+
|
|
327
339
|
if method.lower() == 'get':
|
|
328
340
|
return self._request_paged_get(
|
|
329
341
|
url=url,
|
|
@@ -340,6 +352,8 @@ class RFClient(BaseHTTPClient):
|
|
|
340
352
|
)
|
|
341
353
|
|
|
342
354
|
if method.lower() == 'post':
|
|
355
|
+
data['limit'] = min(data['limit'], max_results - len(all_results))
|
|
356
|
+
|
|
343
357
|
return self._request_paged_post(
|
|
344
358
|
url=url,
|
|
345
359
|
method=method,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: psengine
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.2
|
|
4
4
|
Summary: psengine is a simple, yet elegant, library for rapid development of integrations with Recorded Future.
|
|
5
5
|
Author-email: Moise Medici <moise.medici@recordedfuture.com>, Patrick Kinsella <patrick.kinsella@recordedfuture.com>, Ernest Bartosevic <ernest.bartosevic@recordedfuture.com>
|
|
6
6
|
License-Expression: MIT
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_cyber_vulnerability.py
RENAMED
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_domain_abuse.py
RENAMED
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_geopolitics_facility.py
RENAMED
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_identity_exposure.py
RENAMED
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_malware_report.py
RENAMED
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/markdown/markdown_third_party_risk.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_cyber_vulnerability.py
RENAMED
|
File without changes
|
|
File without changes
|
{psengine-2.4.1 → psengine-2.4.2}/psengine/playbook_alerts/models/pba_geopolitics_facility.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|