binalyze-air-sdk 1.0.1__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.
Files changed (142) hide show
  1. binalyze_air/__init__.py +77 -77
  2. binalyze_air/apis/__init__.py +67 -27
  3. binalyze_air/apis/acquisitions.py +107 -0
  4. binalyze_air/apis/api_tokens.py +49 -0
  5. binalyze_air/apis/assets.py +161 -0
  6. binalyze_air/apis/audit_logs.py +26 -0
  7. binalyze_air/apis/{authentication.py → auth.py} +29 -27
  8. binalyze_air/apis/auto_asset_tags.py +79 -75
  9. binalyze_air/apis/backup.py +177 -0
  10. binalyze_air/apis/baseline.py +46 -0
  11. binalyze_air/apis/cases.py +225 -0
  12. binalyze_air/apis/cloud_forensics.py +116 -0
  13. binalyze_air/apis/event_subscription.py +96 -96
  14. binalyze_air/apis/evidence.py +249 -53
  15. binalyze_air/apis/interact.py +153 -36
  16. binalyze_air/apis/investigation_hub.py +234 -0
  17. binalyze_air/apis/license.py +104 -0
  18. binalyze_air/apis/logger.py +83 -0
  19. binalyze_air/apis/multipart_upload.py +201 -0
  20. binalyze_air/apis/notifications.py +115 -0
  21. binalyze_air/apis/organizations.py +267 -0
  22. binalyze_air/apis/params.py +44 -39
  23. binalyze_air/apis/policies.py +186 -0
  24. binalyze_air/apis/preset_filters.py +79 -0
  25. binalyze_air/apis/recent_activities.py +71 -0
  26. binalyze_air/apis/relay_server.py +104 -0
  27. binalyze_air/apis/settings.py +395 -27
  28. binalyze_air/apis/tasks.py +80 -0
  29. binalyze_air/apis/triage.py +197 -0
  30. binalyze_air/apis/user_management.py +183 -74
  31. binalyze_air/apis/webhook_executions.py +50 -0
  32. binalyze_air/apis/webhooks.py +322 -230
  33. binalyze_air/base.py +207 -133
  34. binalyze_air/client.py +217 -1337
  35. binalyze_air/commands/__init__.py +175 -145
  36. binalyze_air/commands/acquisitions.py +661 -387
  37. binalyze_air/commands/api_tokens.py +55 -0
  38. binalyze_air/commands/assets.py +324 -362
  39. binalyze_air/commands/{authentication.py → auth.py} +36 -36
  40. binalyze_air/commands/auto_asset_tags.py +230 -230
  41. binalyze_air/commands/backup.py +47 -0
  42. binalyze_air/commands/baseline.py +32 -396
  43. binalyze_air/commands/cases.py +609 -602
  44. binalyze_air/commands/cloud_forensics.py +88 -0
  45. binalyze_air/commands/event_subscription.py +101 -101
  46. binalyze_air/commands/evidences.py +918 -988
  47. binalyze_air/commands/interact.py +172 -58
  48. binalyze_air/commands/investigation_hub.py +315 -0
  49. binalyze_air/commands/license.py +183 -0
  50. binalyze_air/commands/logger.py +126 -0
  51. binalyze_air/commands/multipart_upload.py +363 -0
  52. binalyze_air/commands/notifications.py +45 -0
  53. binalyze_air/commands/organizations.py +200 -221
  54. binalyze_air/commands/policies.py +175 -203
  55. binalyze_air/commands/preset_filters.py +55 -0
  56. binalyze_air/commands/recent_activities.py +32 -0
  57. binalyze_air/commands/relay_server.py +144 -0
  58. binalyze_air/commands/settings.py +431 -29
  59. binalyze_air/commands/tasks.py +95 -56
  60. binalyze_air/commands/triage.py +224 -360
  61. binalyze_air/commands/user_management.py +351 -126
  62. binalyze_air/commands/webhook_executions.py +77 -0
  63. binalyze_air/config.py +244 -244
  64. binalyze_air/exceptions.py +49 -49
  65. binalyze_air/http_client.py +426 -305
  66. binalyze_air/models/__init__.py +287 -285
  67. binalyze_air/models/acquisitions.py +365 -250
  68. binalyze_air/models/api_tokens.py +73 -0
  69. binalyze_air/models/assets.py +438 -438
  70. binalyze_air/models/audit.py +247 -272
  71. binalyze_air/models/audit_logs.py +14 -0
  72. binalyze_air/models/{authentication.py → auth.py} +69 -69
  73. binalyze_air/models/auto_asset_tags.py +227 -116
  74. binalyze_air/models/backup.py +138 -0
  75. binalyze_air/models/baseline.py +231 -231
  76. binalyze_air/models/cases.py +275 -275
  77. binalyze_air/models/cloud_forensics.py +145 -0
  78. binalyze_air/models/event_subscription.py +170 -171
  79. binalyze_air/models/evidence.py +65 -65
  80. binalyze_air/models/evidences.py +367 -348
  81. binalyze_air/models/interact.py +266 -135
  82. binalyze_air/models/investigation_hub.py +265 -0
  83. binalyze_air/models/license.py +150 -0
  84. binalyze_air/models/logger.py +83 -0
  85. binalyze_air/models/multipart_upload.py +352 -0
  86. binalyze_air/models/notifications.py +138 -0
  87. binalyze_air/models/organizations.py +293 -293
  88. binalyze_air/models/params.py +153 -127
  89. binalyze_air/models/policies.py +260 -249
  90. binalyze_air/models/preset_filters.py +79 -0
  91. binalyze_air/models/recent_activities.py +70 -0
  92. binalyze_air/models/relay_server.py +121 -0
  93. binalyze_air/models/settings.py +538 -84
  94. binalyze_air/models/tasks.py +215 -149
  95. binalyze_air/models/triage.py +141 -142
  96. binalyze_air/models/user_management.py +200 -97
  97. binalyze_air/models/webhook_executions.py +33 -0
  98. binalyze_air/queries/__init__.py +121 -133
  99. binalyze_air/queries/acquisitions.py +155 -155
  100. binalyze_air/queries/api_tokens.py +46 -0
  101. binalyze_air/queries/assets.py +186 -105
  102. binalyze_air/queries/audit.py +400 -416
  103. binalyze_air/queries/{authentication.py → auth.py} +55 -55
  104. binalyze_air/queries/auto_asset_tags.py +59 -59
  105. binalyze_air/queries/backup.py +66 -0
  106. binalyze_air/queries/baseline.py +21 -185
  107. binalyze_air/queries/cases.py +292 -292
  108. binalyze_air/queries/cloud_forensics.py +137 -0
  109. binalyze_air/queries/event_subscription.py +54 -54
  110. binalyze_air/queries/evidence.py +139 -139
  111. binalyze_air/queries/evidences.py +279 -279
  112. binalyze_air/queries/interact.py +140 -28
  113. binalyze_air/queries/investigation_hub.py +329 -0
  114. binalyze_air/queries/license.py +85 -0
  115. binalyze_air/queries/logger.py +58 -0
  116. binalyze_air/queries/multipart_upload.py +180 -0
  117. binalyze_air/queries/notifications.py +71 -0
  118. binalyze_air/queries/organizations.py +222 -222
  119. binalyze_air/queries/params.py +154 -115
  120. binalyze_air/queries/policies.py +149 -149
  121. binalyze_air/queries/preset_filters.py +60 -0
  122. binalyze_air/queries/recent_activities.py +44 -0
  123. binalyze_air/queries/relay_server.py +42 -0
  124. binalyze_air/queries/settings.py +533 -20
  125. binalyze_air/queries/tasks.py +125 -81
  126. binalyze_air/queries/triage.py +230 -230
  127. binalyze_air/queries/user_management.py +193 -83
  128. binalyze_air/queries/webhook_executions.py +39 -0
  129. binalyze_air_sdk-1.0.3.dist-info/METADATA +752 -0
  130. binalyze_air_sdk-1.0.3.dist-info/RECORD +132 -0
  131. {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.3.dist-info}/WHEEL +1 -1
  132. binalyze_air/apis/endpoints.py +0 -22
  133. binalyze_air/apis/evidences.py +0 -216
  134. binalyze_air/apis/users.py +0 -68
  135. binalyze_air/commands/users.py +0 -101
  136. binalyze_air/models/endpoints.py +0 -76
  137. binalyze_air/models/users.py +0 -82
  138. binalyze_air/queries/endpoints.py +0 -25
  139. binalyze_air/queries/users.py +0 -69
  140. binalyze_air_sdk-1.0.1.dist-info/METADATA +0 -635
  141. binalyze_air_sdk-1.0.1.dist-info/RECORD +0 -82
  142. {binalyze_air_sdk-1.0.1.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