psengine 2.3.1__tar.gz → 2.4.1__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.3.1 → psengine-2.4.1}/PKG-INFO +2 -1
- {psengine-2.3.1 → psengine-2.4.1}/psengine/_version.py +1 -1
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/note_mgr.py +1 -1
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/lookup.py +2 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/models/lookup.py +39 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_match/entity_match.py +17 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_match/entity_match_mgr.py +2 -2
- {psengine-2.3.1 → psengine-2.4.1}/psengine/malware_intel/malware_intel.py +1 -1
- {psengine-2.3.1 → psengine-2.4.1}/psengine/malware_intel/models.py +6 -1
- {psengine-2.3.1 → psengine-2.4.1}/psengine.egg-info/PKG-INFO +2 -1
- {psengine-2.3.1 → psengine-2.4.1}/psengine.egg-info/requires.txt +1 -0
- {psengine-2.3.1 → psengine-2.4.1}/pyproject.toml +2 -1
- {psengine-2.3.1 → psengine-2.4.1}/LICENSE +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/README.md +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/_sdk_id.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/helpers.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/markdown.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/analyst_notes/note.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/base_http_client.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/classic_alert.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/classic_alert_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/helpers.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/markdown/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/markdown/markdown.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/classic_alerts/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/collective_insights/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/collective_insights/collective_insights.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/collective_insights/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/collective_insights/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/collective_insights/insight.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/collective_insights/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/common_models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/config/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/config/config.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/config/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/detection/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/detection/detection_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/detection/detection_rule.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/detection/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/detection/helpers.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/detection/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/endpoints.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/lookup_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/models/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/models/base_enriched_entity.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/models/soar.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/soar.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/enrich/soar_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_lists/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_lists/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_lists/entity_list.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_lists/entity_list_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_lists/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_lists/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_match/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_match/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/entity_match/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/fusion/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/fusion/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/fusion/fusion_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/fusion/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/helpers/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/helpers/helpers.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/identity.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/identity_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/models/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/models/common_models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/models/detections.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/models/incident_report.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/identity/models/lookup.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/logger/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/logger/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/logger/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/logger/rf_logger.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/malware_intel/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/malware_intel/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/malware_intel/malware_intel_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/markdown/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/markdown/markdown.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/markdown/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/helpers.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/mappings.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_code_repo.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_cyber_vulnerability.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_domain_abuse.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_geopolitics_facility.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_identity_exposure.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_malware_report.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_third_party_risk.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/common_models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/panel_log.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/panel_status.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_code_repo_leak.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_cyber_vulnerability.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_domain_abuse.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_geopolitics_facility.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_identity_exposures.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_malware_report.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_third_party_risk.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/search_endpoint.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/pa_category.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/playbook_alert_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/playbook_alerts.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/py.typed +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/rf_client.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risk_history/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risk_history/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risk_history/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risk_history/risk_history_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risklists/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risklists/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risklists/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risklists/models.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/risklists/risklist_mgr.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/__init__.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/base_stix_entity.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/complex_entity.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/constants.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/enriched_indicator.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/errors.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/helpers.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/rf_bundle.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/simple_entity.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine/stix2/util.py +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine.egg-info/SOURCES.txt +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine.egg-info/dependency_links.txt +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/psengine.egg-info/top_level.txt +0 -0
- {psengine-2.3.1 → psengine-2.4.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: psengine
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
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
|
|
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
20
20
|
Requires-Python: <3.14,>=3.9
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
|
+
Requires-Dist: typing_extensions>=4.8.0
|
|
23
24
|
Requires-Dist: requests>=2.27.1
|
|
24
25
|
Requires-Dist: jsonpath_ng<=1.6.1,>=1.5.3
|
|
25
26
|
Requires-Dist: stix2~=3.0.1
|
|
@@ -111,7 +111,7 @@ class AnalystNoteMgr:
|
|
|
111
111
|
'label': label,
|
|
112
112
|
'source': source,
|
|
113
113
|
'serialization': serialization,
|
|
114
|
-
'
|
|
114
|
+
'tagged_text': tagged_text,
|
|
115
115
|
'limit': min(max_results, notes_per_page),
|
|
116
116
|
}
|
|
117
117
|
data = {key: val for key, val in data.items() if val is not None}
|
|
@@ -33,6 +33,7 @@ from .models.lookup import (
|
|
|
33
33
|
RawRisk,
|
|
34
34
|
RiskMapping,
|
|
35
35
|
RiskyCIDRPIP,
|
|
36
|
+
Scanner,
|
|
36
37
|
)
|
|
37
38
|
|
|
38
39
|
|
|
@@ -47,6 +48,7 @@ class EnrichedIP(BaseEnrichedEntity):
|
|
|
47
48
|
dns_port_cert: Optional[DnsPortCert] = Field(alias='dnsPortCert', default=None)
|
|
48
49
|
location: Optional[IPLocation] = None
|
|
49
50
|
risky_cidr_ips: Optional[list[RiskyCIDRPIP]] = Field(alias='riskyCIDRIPs', default=None)
|
|
51
|
+
scanner: Optional[Scanner] = None
|
|
50
52
|
|
|
51
53
|
|
|
52
54
|
class EnrichedDomain(BaseEnrichedEntity):
|
|
@@ -304,6 +304,45 @@ class DnsPortCert(RFBaseModel):
|
|
|
304
304
|
ports: Optional[list[Port]] = None
|
|
305
305
|
|
|
306
306
|
|
|
307
|
+
###########################################################
|
|
308
|
+
# Scanner
|
|
309
|
+
###########################################################
|
|
310
|
+
class Tag(RFBaseModel):
|
|
311
|
+
verdict_details: Optional[list[str]] = Field(default=None, alias='verdictDetails')
|
|
312
|
+
entity: list[IdNameType]
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class Ports(RFBaseModel):
|
|
316
|
+
tcp: list[int]
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
class Evidence(RFBaseModel):
|
|
320
|
+
name: str = Field(alias='Name')
|
|
321
|
+
mitigation_string: str = Field(default=None, alias='MitigationString')
|
|
322
|
+
evidence_string: str = Field(alias='EvidenceString', default=None)
|
|
323
|
+
rule: str = Field(alias='Rule')
|
|
324
|
+
criticality: float = Field(alias='Criticality')
|
|
325
|
+
timestamp: datetime = Field(alias='Timestamp')
|
|
326
|
+
criticality_label: str = Field(alias='CriticalityLabel')
|
|
327
|
+
sources_count: float = Field(alias='SourcesCount')
|
|
328
|
+
sightings_count: float = Field(alias='SightingsCount')
|
|
329
|
+
sources: list[str] = Field(alias='Sources')
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
class Scanner(RFBaseModel):
|
|
333
|
+
last_seen: str = Field(alias='lastSeen')
|
|
334
|
+
tags: Tag
|
|
335
|
+
verdict: str
|
|
336
|
+
scanned_ip_countries: list[str] = Field(alias='scannedIpCountries')
|
|
337
|
+
rdns: list[str]
|
|
338
|
+
scanner_country: str = Field(alias='scannerCountry')
|
|
339
|
+
ports: Ports
|
|
340
|
+
global_scanner: bool = Field(alias='globalScanner')
|
|
341
|
+
user_agents: list[str] = Field(alias='userAgents', default=None)
|
|
342
|
+
web_requests: list[str] = Field(alias='webRequests', default=None)
|
|
343
|
+
evidence: Optional[list[Evidence]] = []
|
|
344
|
+
|
|
345
|
+
|
|
307
346
|
###########################################################
|
|
308
347
|
# NVD
|
|
309
348
|
###########################################################
|
|
@@ -68,6 +68,13 @@ class ResolvedEntity(RFBaseModel):
|
|
|
68
68
|
|
|
69
69
|
This class supports string representation of `ResolvedEntity` instances.
|
|
70
70
|
|
|
71
|
+
Hashing:
|
|
72
|
+
Returns a hash value based on the entity `id_` if found, else the hash of the name.
|
|
73
|
+
|
|
74
|
+
Equality:
|
|
75
|
+
Checks equality between two `ResolvedEntity` instances based on the `id_` if the entity was
|
|
76
|
+
found else the name.
|
|
77
|
+
|
|
71
78
|
String Representation:
|
|
72
79
|
Returns a string representation of the `ResolvedEntity` instance including the
|
|
73
80
|
entity match name, type, and ID.
|
|
@@ -91,3 +98,13 @@ class ResolvedEntity(RFBaseModel):
|
|
|
91
98
|
if isinstance(self.content, IdNameType):
|
|
92
99
|
return f'Entity: {self.entity}, Type: {self.content.type_}, ID: {self.content.id_}'
|
|
93
100
|
return f'Entity: {self.entity}, {self.content}'
|
|
101
|
+
|
|
102
|
+
def __hash__(self):
|
|
103
|
+
if hasattr(self.content, 'id_'):
|
|
104
|
+
return hash(self.content.id_)
|
|
105
|
+
return hash(self.entity)
|
|
106
|
+
|
|
107
|
+
def __eq__(self, other: 'ResolvedEntity'):
|
|
108
|
+
if hasattr(self.content, 'id_') and hasattr(other.content, 'id_'):
|
|
109
|
+
return self.content.id_ == other.content.id_
|
|
110
|
+
return self.entity == other.entity
|
|
@@ -48,7 +48,7 @@ class EntityMatchMgr:
|
|
|
48
48
|
Optional[Union[list, str]], Doc('Type or list of types of the entity, if known.')
|
|
49
49
|
] = None,
|
|
50
50
|
limit: Annotated[int, Doc('Maximum number of matches to return.')] = DEFAULT_LIMIT,
|
|
51
|
-
) -> Annotated[list[ResolvedEntity], Doc('List of resolved entity matches.')]:
|
|
51
|
+
) -> Annotated[list[ResolvedEntity], Doc('List of deduplicated resolved entity matches.')]:
|
|
52
52
|
"""Match a text string using the entity match API.
|
|
53
53
|
|
|
54
54
|
Endpoint:
|
|
@@ -65,7 +65,7 @@ class EntityMatchMgr:
|
|
|
65
65
|
response = self.rf_client.request('post', EP_ENTITY_MATCH, data=request_body.json())
|
|
66
66
|
response = [IdNameType.model_validate(d) for d in response.json()]
|
|
67
67
|
return (
|
|
68
|
-
|
|
68
|
+
list({ResolvedEntity(entity=d.name, is_found=bool(d.id_), content=d) for d in response})
|
|
69
69
|
if response
|
|
70
70
|
else [ResolvedEntity(entity=entity_name, is_found=False, content='Entity ID not found')]
|
|
71
71
|
)
|
|
@@ -96,7 +96,7 @@ class MalwareReportIn(RFBaseModel):
|
|
|
96
96
|
"""Validate data sent to the `/v1/reports` endpoint."""
|
|
97
97
|
|
|
98
98
|
query: str
|
|
99
|
-
sha256: str
|
|
99
|
+
sha256: Optional[str] = None
|
|
100
100
|
start_date: Annotated[
|
|
101
101
|
str, BeforeValidator(Validators.convert_relative_time), AfterValidator(_split_time)
|
|
102
102
|
]
|
|
@@ -247,7 +247,8 @@ class SampleInfo(RFBaseModel):
|
|
|
247
247
|
|
|
248
248
|
|
|
249
249
|
class StaticInfo(RFBaseModel):
|
|
250
|
-
|
|
250
|
+
extracted: Optional[list[ExtractedItem]] = []
|
|
251
|
+
exts: Optional[list[str]] = None
|
|
251
252
|
sha1: Optional[str] = None
|
|
252
253
|
md5: Optional[str] = None
|
|
253
254
|
sha256: Optional[str] = None
|
|
@@ -256,6 +257,10 @@ class StaticInfo(RFBaseModel):
|
|
|
256
257
|
ssdeep: Optional[str] = None
|
|
257
258
|
tags: Optional[list[str]] = []
|
|
258
259
|
target: Optional[str] = None
|
|
260
|
+
registry: RegistryInfo = Field(default_factory=RegistryInfo)
|
|
261
|
+
registry_count: Optional[int] = None
|
|
262
|
+
signatures: Optional[list[Signature]] = []
|
|
263
|
+
signatures_count: Optional[int] = None
|
|
259
264
|
|
|
260
265
|
|
|
261
266
|
class DynamicInfo(RFBaseModel):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: psengine
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
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
|
|
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
20
20
|
Requires-Python: <3.14,>=3.9
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
|
+
Requires-Dist: typing_extensions>=4.8.0
|
|
23
24
|
Requires-Dist: requests>=2.27.1
|
|
24
25
|
Requires-Dist: jsonpath_ng<=1.6.1,>=1.5.3
|
|
25
26
|
Requires-Dist: stix2~=3.0.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "psengine"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.4.1"
|
|
4
4
|
readme = "README.md"
|
|
5
5
|
license = "MIT"
|
|
6
6
|
requires-python = ">=3.9, <3.14"
|
|
@@ -27,6 +27,7 @@ classifiers=[
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
dependencies = [
|
|
30
|
+
"typing_extensions >= 4.8.0",
|
|
30
31
|
"requests>=2.27.1",
|
|
31
32
|
"jsonpath_ng>=1.5.3, <=1.6.1",
|
|
32
33
|
"stix2~=3.0.1",
|
|
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.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_cyber_vulnerability.py
RENAMED
|
File without changes
|
{psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_domain_abuse.py
RENAMED
|
File without changes
|
{psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_geopolitics_facility.py
RENAMED
|
File without changes
|
{psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_identity_exposure.py
RENAMED
|
File without changes
|
{psengine-2.3.1 → psengine-2.4.1}/psengine/playbook_alerts/markdown/markdown_malware_report.py
RENAMED
|
File without changes
|
{psengine-2.3.1 → psengine-2.4.1}/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.3.1 → psengine-2.4.1}/psengine/playbook_alerts/models/pba_cyber_vulnerability.py
RENAMED
|
File without changes
|
|
File without changes
|
{psengine-2.3.1 → psengine-2.4.1}/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
|
|
File without changes
|