binalyze-air-sdk 1.0.2__py3-none-any.whl → 1.0.3__py3-none-any.whl
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.
- binalyze_air/__init__.py +77 -77
- binalyze_air/apis/__init__.py +67 -27
- binalyze_air/apis/acquisitions.py +107 -0
- binalyze_air/apis/api_tokens.py +49 -0
- binalyze_air/apis/assets.py +161 -0
- binalyze_air/apis/audit_logs.py +26 -0
- binalyze_air/apis/{authentication.py → auth.py} +29 -27
- binalyze_air/apis/auto_asset_tags.py +79 -75
- binalyze_air/apis/backup.py +177 -0
- binalyze_air/apis/baseline.py +46 -0
- binalyze_air/apis/cases.py +225 -0
- binalyze_air/apis/cloud_forensics.py +116 -0
- binalyze_air/apis/event_subscription.py +96 -96
- binalyze_air/apis/evidence.py +249 -53
- binalyze_air/apis/interact.py +153 -36
- binalyze_air/apis/investigation_hub.py +234 -0
- binalyze_air/apis/license.py +104 -0
- binalyze_air/apis/logger.py +83 -0
- binalyze_air/apis/multipart_upload.py +201 -0
- binalyze_air/apis/notifications.py +115 -0
- binalyze_air/apis/organizations.py +267 -0
- binalyze_air/apis/params.py +44 -39
- binalyze_air/apis/policies.py +186 -0
- binalyze_air/apis/preset_filters.py +79 -0
- binalyze_air/apis/recent_activities.py +71 -0
- binalyze_air/apis/relay_server.py +104 -0
- binalyze_air/apis/settings.py +395 -27
- binalyze_air/apis/tasks.py +80 -0
- binalyze_air/apis/triage.py +197 -0
- binalyze_air/apis/user_management.py +183 -74
- binalyze_air/apis/webhook_executions.py +50 -0
- binalyze_air/apis/webhooks.py +322 -230
- binalyze_air/base.py +207 -133
- binalyze_air/client.py +217 -1337
- binalyze_air/commands/__init__.py +175 -145
- binalyze_air/commands/acquisitions.py +661 -387
- binalyze_air/commands/api_tokens.py +55 -0
- binalyze_air/commands/assets.py +324 -362
- binalyze_air/commands/{authentication.py → auth.py} +36 -36
- binalyze_air/commands/auto_asset_tags.py +230 -230
- binalyze_air/commands/backup.py +47 -0
- binalyze_air/commands/baseline.py +32 -396
- binalyze_air/commands/cases.py +609 -602
- binalyze_air/commands/cloud_forensics.py +88 -0
- binalyze_air/commands/event_subscription.py +101 -101
- binalyze_air/commands/evidences.py +918 -988
- binalyze_air/commands/interact.py +172 -58
- binalyze_air/commands/investigation_hub.py +315 -0
- binalyze_air/commands/license.py +183 -0
- binalyze_air/commands/logger.py +126 -0
- binalyze_air/commands/multipart_upload.py +363 -0
- binalyze_air/commands/notifications.py +45 -0
- binalyze_air/commands/organizations.py +200 -221
- binalyze_air/commands/policies.py +175 -203
- binalyze_air/commands/preset_filters.py +55 -0
- binalyze_air/commands/recent_activities.py +32 -0
- binalyze_air/commands/relay_server.py +144 -0
- binalyze_air/commands/settings.py +431 -29
- binalyze_air/commands/tasks.py +95 -56
- binalyze_air/commands/triage.py +224 -360
- binalyze_air/commands/user_management.py +351 -126
- binalyze_air/commands/webhook_executions.py +77 -0
- binalyze_air/config.py +244 -244
- binalyze_air/exceptions.py +49 -49
- binalyze_air/http_client.py +426 -305
- binalyze_air/models/__init__.py +287 -285
- binalyze_air/models/acquisitions.py +365 -250
- binalyze_air/models/api_tokens.py +73 -0
- binalyze_air/models/assets.py +438 -438
- binalyze_air/models/audit.py +247 -272
- binalyze_air/models/audit_logs.py +14 -0
- binalyze_air/models/{authentication.py → auth.py} +69 -69
- binalyze_air/models/auto_asset_tags.py +227 -116
- binalyze_air/models/backup.py +138 -0
- binalyze_air/models/baseline.py +231 -231
- binalyze_air/models/cases.py +275 -275
- binalyze_air/models/cloud_forensics.py +145 -0
- binalyze_air/models/event_subscription.py +170 -171
- binalyze_air/models/evidence.py +65 -65
- binalyze_air/models/evidences.py +367 -348
- binalyze_air/models/interact.py +266 -135
- binalyze_air/models/investigation_hub.py +265 -0
- binalyze_air/models/license.py +150 -0
- binalyze_air/models/logger.py +83 -0
- binalyze_air/models/multipart_upload.py +352 -0
- binalyze_air/models/notifications.py +138 -0
- binalyze_air/models/organizations.py +293 -293
- binalyze_air/models/params.py +153 -127
- binalyze_air/models/policies.py +260 -249
- binalyze_air/models/preset_filters.py +79 -0
- binalyze_air/models/recent_activities.py +70 -0
- binalyze_air/models/relay_server.py +121 -0
- binalyze_air/models/settings.py +538 -84
- binalyze_air/models/tasks.py +215 -149
- binalyze_air/models/triage.py +141 -142
- binalyze_air/models/user_management.py +200 -97
- binalyze_air/models/webhook_executions.py +33 -0
- binalyze_air/queries/__init__.py +121 -133
- binalyze_air/queries/acquisitions.py +155 -155
- binalyze_air/queries/api_tokens.py +46 -0
- binalyze_air/queries/assets.py +186 -105
- binalyze_air/queries/audit.py +400 -416
- binalyze_air/queries/{authentication.py → auth.py} +55 -55
- binalyze_air/queries/auto_asset_tags.py +59 -59
- binalyze_air/queries/backup.py +66 -0
- binalyze_air/queries/baseline.py +21 -185
- binalyze_air/queries/cases.py +292 -292
- binalyze_air/queries/cloud_forensics.py +137 -0
- binalyze_air/queries/event_subscription.py +54 -54
- binalyze_air/queries/evidence.py +139 -139
- binalyze_air/queries/evidences.py +279 -279
- binalyze_air/queries/interact.py +140 -28
- binalyze_air/queries/investigation_hub.py +329 -0
- binalyze_air/queries/license.py +85 -0
- binalyze_air/queries/logger.py +58 -0
- binalyze_air/queries/multipart_upload.py +180 -0
- binalyze_air/queries/notifications.py +71 -0
- binalyze_air/queries/organizations.py +222 -222
- binalyze_air/queries/params.py +154 -115
- binalyze_air/queries/policies.py +149 -149
- binalyze_air/queries/preset_filters.py +60 -0
- binalyze_air/queries/recent_activities.py +44 -0
- binalyze_air/queries/relay_server.py +42 -0
- binalyze_air/queries/settings.py +533 -20
- binalyze_air/queries/tasks.py +125 -81
- binalyze_air/queries/triage.py +230 -230
- binalyze_air/queries/user_management.py +193 -83
- binalyze_air/queries/webhook_executions.py +39 -0
- binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
- binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
- {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
- binalyze_air/apis/endpoints.py +0 -22
- binalyze_air/apis/evidences.py +0 -216
- binalyze_air/apis/users.py +0 -68
- binalyze_air/commands/users.py +0 -101
- binalyze_air/models/endpoints.py +0 -76
- binalyze_air/models/users.py +0 -82
- binalyze_air/queries/endpoints.py +0 -25
- binalyze_air/queries/users.py +0 -69
- binalyze_air_sdk-1.0.2.dist-info/METADATA +0 -706
- binalyze_air_sdk-1.0.2.dist-info/RECORD +0 -82
- {binalyze_air_sdk-1.0.2.dist-info → binalyze_air_sdk-1.0.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,180 @@
|
|
1
|
+
"""Multipart Upload query classes for Binalyze AIR SDK."""
|
2
|
+
|
3
|
+
from typing import Dict, Any, Optional
|
4
|
+
from ..models.multipart_upload import (
|
5
|
+
UploadInitializeRequest, UploadPartRequest, UploadStatusRequest, UploadFinalizeRequest
|
6
|
+
)
|
7
|
+
|
8
|
+
|
9
|
+
class MultipartUploadQuery:
|
10
|
+
"""Base query class for multipart upload operations."""
|
11
|
+
|
12
|
+
def __init__(self):
|
13
|
+
"""Initialize base multipart upload query."""
|
14
|
+
self._params = {}
|
15
|
+
|
16
|
+
def build_params(self) -> Dict[str, Any]:
|
17
|
+
"""Build query parameters.
|
18
|
+
|
19
|
+
Returns:
|
20
|
+
Dictionary of query parameters
|
21
|
+
"""
|
22
|
+
return self._params.copy()
|
23
|
+
|
24
|
+
|
25
|
+
class InitializeUploadQuery(MultipartUploadQuery):
|
26
|
+
"""Query for initializing a multipart upload session.
|
27
|
+
|
28
|
+
This query starts a new upload session and returns a unique file ID
|
29
|
+
that will be used for all subsequent operations in this upload.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(self):
|
33
|
+
"""Initialize upload initialization query."""
|
34
|
+
super().__init__()
|
35
|
+
self._request = UploadInitializeRequest()
|
36
|
+
|
37
|
+
def build_body(self) -> Dict[str, Any]:
|
38
|
+
"""Build request body for upload initialization.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
Dictionary containing request body (typically empty)
|
42
|
+
"""
|
43
|
+
return self._request.to_dict()
|
44
|
+
|
45
|
+
|
46
|
+
class UploadPartQuery(MultipartUploadQuery):
|
47
|
+
"""Query for uploading a file part in a multipart upload.
|
48
|
+
|
49
|
+
This query uploads a specific part of a file using the file ID
|
50
|
+
obtained from the initialization step.
|
51
|
+
"""
|
52
|
+
|
53
|
+
def __init__(self, file_id: str, part_number: int, file_data: bytes, filename: Optional[str] = None):
|
54
|
+
"""Initialize upload part query.
|
55
|
+
|
56
|
+
Args:
|
57
|
+
file_id: Upload session identifier
|
58
|
+
part_number: Sequential part number (starting from 1)
|
59
|
+
file_data: Binary file data for this part
|
60
|
+
filename: Optional filename for the part
|
61
|
+
"""
|
62
|
+
super().__init__()
|
63
|
+
self._request = UploadPartRequest(
|
64
|
+
file_id=file_id,
|
65
|
+
part_number=part_number,
|
66
|
+
file_data=file_data,
|
67
|
+
filename=filename
|
68
|
+
)
|
69
|
+
|
70
|
+
def build_form_data(self) -> Dict[str, Any]:
|
71
|
+
"""Build form data for multipart file upload.
|
72
|
+
|
73
|
+
Returns:
|
74
|
+
Dictionary with form data fields
|
75
|
+
"""
|
76
|
+
return self._request.to_form_data()
|
77
|
+
|
78
|
+
@property
|
79
|
+
def file_id(self) -> str:
|
80
|
+
"""Get the file ID for this upload.
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
Upload session identifier
|
84
|
+
"""
|
85
|
+
return self._request.file_id
|
86
|
+
|
87
|
+
@property
|
88
|
+
def part_number(self) -> int:
|
89
|
+
"""Get the part number for this upload.
|
90
|
+
|
91
|
+
Returns:
|
92
|
+
Part number being uploaded
|
93
|
+
"""
|
94
|
+
return self._request.part_number
|
95
|
+
|
96
|
+
@property
|
97
|
+
def part_size(self) -> int:
|
98
|
+
"""Get the size of this part.
|
99
|
+
|
100
|
+
Returns:
|
101
|
+
Size of the part in bytes
|
102
|
+
"""
|
103
|
+
return self._request.get_part_size()
|
104
|
+
|
105
|
+
@property
|
106
|
+
def part_hash(self) -> str:
|
107
|
+
"""Get MD5 hash of this part.
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
MD5 hash of the part data
|
111
|
+
"""
|
112
|
+
return self._request.get_part_hash()
|
113
|
+
|
114
|
+
|
115
|
+
class CheckUploadStatusQuery(MultipartUploadQuery):
|
116
|
+
"""Query for checking the status of a multipart upload.
|
117
|
+
|
118
|
+
This query checks if all parts have been uploaded and the upload
|
119
|
+
is ready to be finalized.
|
120
|
+
"""
|
121
|
+
|
122
|
+
def __init__(self, file_id: str):
|
123
|
+
"""Initialize upload status check query.
|
124
|
+
|
125
|
+
Args:
|
126
|
+
file_id: Upload session identifier to check
|
127
|
+
"""
|
128
|
+
super().__init__()
|
129
|
+
self._request = UploadStatusRequest(file_id=file_id)
|
130
|
+
|
131
|
+
def build_params(self) -> Dict[str, Any]:
|
132
|
+
"""Build query parameters for status check.
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
Dictionary containing query parameters
|
136
|
+
"""
|
137
|
+
return self._request.to_dict()
|
138
|
+
|
139
|
+
@property
|
140
|
+
def file_id(self) -> str:
|
141
|
+
"""Get the file ID being checked.
|
142
|
+
|
143
|
+
Returns:
|
144
|
+
Upload session identifier
|
145
|
+
"""
|
146
|
+
return self._request.file_id
|
147
|
+
|
148
|
+
|
149
|
+
class FinalizeUploadQuery(MultipartUploadQuery):
|
150
|
+
"""Query for finalizing a multipart upload.
|
151
|
+
|
152
|
+
This query completes the upload process by combining all uploaded
|
153
|
+
parts into the final file.
|
154
|
+
"""
|
155
|
+
|
156
|
+
def __init__(self, file_id: str):
|
157
|
+
"""Initialize upload finalization query.
|
158
|
+
|
159
|
+
Args:
|
160
|
+
file_id: Upload session identifier to finalize
|
161
|
+
"""
|
162
|
+
super().__init__()
|
163
|
+
self._request = UploadFinalizeRequest(file_id=file_id)
|
164
|
+
|
165
|
+
def build_body(self) -> Dict[str, Any]:
|
166
|
+
"""Build request body for upload finalization.
|
167
|
+
|
168
|
+
Returns:
|
169
|
+
Dictionary containing request body
|
170
|
+
"""
|
171
|
+
return self._request.to_dict()
|
172
|
+
|
173
|
+
@property
|
174
|
+
def file_id(self) -> str:
|
175
|
+
"""Get the file ID being finalized.
|
176
|
+
|
177
|
+
Returns:
|
178
|
+
Upload session identifier
|
179
|
+
"""
|
180
|
+
return self._request.file_id
|
@@ -0,0 +1,71 @@
|
|
1
|
+
"""
|
2
|
+
Notifications queries for the Binalyze AIR SDK.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import Optional, List
|
6
|
+
|
7
|
+
from ..base import Query
|
8
|
+
from ..models.notifications import Notification, NotificationsList, NotificationsFilter
|
9
|
+
from ..http_client import HTTPClient
|
10
|
+
|
11
|
+
|
12
|
+
class GetNotificationsQuery(Query[NotificationsList]):
|
13
|
+
"""Query to get notifications with optional filtering."""
|
14
|
+
|
15
|
+
def __init__(self, http_client: HTTPClient, filter_params: Optional[NotificationsFilter] = None):
|
16
|
+
self.http_client = http_client
|
17
|
+
self.filter_params = filter_params
|
18
|
+
|
19
|
+
def execute(self) -> NotificationsList:
|
20
|
+
"""Execute the query to get notifications."""
|
21
|
+
params = {}
|
22
|
+
|
23
|
+
if self.filter_params:
|
24
|
+
params = self.filter_params.to_params()
|
25
|
+
|
26
|
+
# Ensure organization filter is set (required by API)
|
27
|
+
if "filter[organizationIds]" not in params:
|
28
|
+
params["filter[organizationIds]"] = "0"
|
29
|
+
|
30
|
+
response = self.http_client.get("notifications", params=params)
|
31
|
+
|
32
|
+
result_data = response.get("result", {})
|
33
|
+
|
34
|
+
# Parse entities
|
35
|
+
entities_data = result_data.get("entities", [])
|
36
|
+
entities = [Notification.model_validate(entity) for entity in entities_data]
|
37
|
+
|
38
|
+
# Create notifications list
|
39
|
+
notifications_list = NotificationsList(
|
40
|
+
entities=entities,
|
41
|
+
currentPage=result_data.get("currentPage", 1),
|
42
|
+
pageSize=result_data.get("pageSize", 10),
|
43
|
+
totalEntityCount=result_data.get("totalEntityCount", 0),
|
44
|
+
totalPageCount=result_data.get("totalPageCount", 0)
|
45
|
+
)
|
46
|
+
|
47
|
+
return notifications_list
|
48
|
+
|
49
|
+
|
50
|
+
class GetNotificationByIdQuery(Query[Optional[Notification]]):
|
51
|
+
"""Query to get a specific notification by ID."""
|
52
|
+
|
53
|
+
def __init__(self, http_client: HTTPClient, notification_id: str):
|
54
|
+
self.http_client = http_client
|
55
|
+
self.notification_id = notification_id
|
56
|
+
|
57
|
+
def execute(self) -> Optional[Notification]:
|
58
|
+
"""Execute the query to get notification by ID."""
|
59
|
+
# Get all notifications and find the specific one
|
60
|
+
# (API doesn't have individual notification endpoint)
|
61
|
+
params = {"filter[organizationIds]": "0", "pageSize": "100"}
|
62
|
+
response = self.http_client.get("notifications", params=params)
|
63
|
+
|
64
|
+
result_data = response.get("result", {})
|
65
|
+
entities_data = result_data.get("entities", [])
|
66
|
+
|
67
|
+
for entity_data in entities_data:
|
68
|
+
if str(entity_data.get("_id")) == str(self.notification_id):
|
69
|
+
return Notification.model_validate(entity_data)
|
70
|
+
|
71
|
+
return None
|