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,44 @@
1
+ """
2
+ Recent Activities queries for the Binalyze AIR SDK.
3
+ """
4
+
5
+ from typing import Optional
6
+
7
+ from ..base import Query
8
+ from ..models.recent_activities import RecentActivitiesList, RecentActivitiesFilter
9
+ from ..http_client import HTTPClient
10
+
11
+
12
+ class GetRecentActivitiesQuery(Query[RecentActivitiesList]):
13
+ """Query to get recent activities."""
14
+
15
+ def __init__(self, http_client: HTTPClient, filter_params: Optional[RecentActivitiesFilter] = None):
16
+ self.http_client = http_client
17
+ self.filter_params = filter_params or RecentActivitiesFilter()
18
+
19
+ def execute(self) -> RecentActivitiesList:
20
+ """Execute the query to get recent activities."""
21
+ params = {}
22
+
23
+ # Add filter parameters
24
+ if self.filter_params.organization_id is not None:
25
+ params['filter[organizationId]'] = str(self.filter_params.organization_id)
26
+ if self.filter_params.type:
27
+ params['filter[type]'] = self.filter_params.type
28
+ if self.filter_params.username:
29
+ params['filter[username]'] = self.filter_params.username
30
+ if self.filter_params.search_term:
31
+ params['filter[searchTerm]'] = self.filter_params.search_term
32
+
33
+ # Add pagination parameters
34
+ if self.filter_params.page_size:
35
+ params['pageSize'] = str(self.filter_params.page_size)
36
+ if self.filter_params.page_number:
37
+ params['pageNumber'] = str(self.filter_params.page_number)
38
+ if self.filter_params.sort_by:
39
+ params['sortBy'] = self.filter_params.sort_by
40
+ if self.filter_params.sort_type:
41
+ params['sortType'] = self.filter_params.sort_type
42
+
43
+ response = self.http_client.get('/recent-activities', params=params)
44
+ return RecentActivitiesList(**response['result'])
@@ -0,0 +1,42 @@
1
+ """
2
+ Relay Server queries for the Binalyze AIR SDK.
3
+ """
4
+
5
+ from typing import Optional
6
+
7
+ from ..base import Query
8
+ from ..models.relay_server import RelayServer, RelayServersList, RelayServersFilter
9
+ from ..http_client import HTTPClient
10
+
11
+
12
+ class GetRelayServersQuery(Query[RelayServersList]):
13
+ """Query to get relay servers."""
14
+
15
+ def __init__(self, http_client: HTTPClient, filter_params: Optional[RelayServersFilter] = None):
16
+ self.http_client = http_client
17
+ self.filter_params = filter_params or RelayServersFilter()
18
+
19
+ def execute(self) -> RelayServersList:
20
+ """Execute the query to get relay servers."""
21
+ # Use the filter's to_params() method to ensure proper parameter formatting
22
+ # including required organizationId parameter
23
+ params = self.filter_params.to_params()
24
+
25
+ response = self.http_client.get('/relay-servers', params=params)
26
+ return RelayServersList(**response['result'])
27
+
28
+
29
+ class GetRelayServerByIdQuery(Query[Optional[RelayServer]]):
30
+ """Query to get a specific relay server by ID."""
31
+
32
+ def __init__(self, http_client: HTTPClient, server_id: str):
33
+ self.http_client = http_client
34
+ self.server_id = server_id
35
+
36
+ def execute(self) -> Optional[RelayServer]:
37
+ """Execute the query to get a relay server by ID."""
38
+ try:
39
+ response = self.http_client.get(f'/relay-servers/{self.server_id}')
40
+ return RelayServer(**response['result'])
41
+ except Exception:
42
+ return None
@@ -1,20 +1,533 @@
1
- """
2
- Settings queries for the Binalyze AIR SDK.
3
- """
4
-
5
- from ..base import Query
6
- from ..models.settings import BannerSettings
7
- from ..http_client import HTTPClient
8
-
9
-
10
- class GetBannerSettingsQuery(Query[BannerSettings]):
11
- """Query to get banner settings."""
12
-
13
- def __init__(self, http_client: HTTPClient):
14
- self.http_client = http_client
15
-
16
- def execute(self) -> BannerSettings:
17
- """Execute the query to get banner settings."""
18
- response = self.http_client.get("settings/banner")
19
-
20
- return BannerSettings(**response.get("result", {}))
1
+ """
2
+ Settings queries for the Binalyze AIR SDK.
3
+ """
4
+
5
+ from typing import Dict, Any, Union, Optional
6
+ from ..base import Query
7
+ from ..models.settings import (
8
+ BannerSettings, AllSettings, UpdateProxySettingsRequest,
9
+ ValidateProxySettingsRequest, UpdateActiveDirectorySettingsRequest,
10
+ ValidateActiveDirectorySettingsRequest, UpdateSMTPSettingsRequest,
11
+ ValidateSMTPSettingsRequest, UpdateConsoleAddressSettingsRequest,
12
+ ValidateConsoleAddressSettingsRequest, UpdatePolicySettingsRequest,
13
+ UpdateEnforceTFASettingsRequest, UpdateAutoAssetTaggingSettingsRequest,
14
+ UpdateInteractSettingsRequest, UpdateRFC3161SettingsRequest,
15
+ UpdateResponderSettingsRequest, UpdateLocardSettingsRequest,
16
+ UpdateUninstallationPasswordProtectionSettingsRequest,
17
+ UpdateSyslogSettingsRequest, ValidateSyslogSettingsRequest,
18
+ UpdateBackupRestoreSettingsRequest, ValidateBackupSftpSettingsRequest,
19
+ UpdateSslSettingsRequest, ValidateSslSettingsRequest,
20
+ UpdateSingleSignOnSettingsRequest
21
+ )
22
+ from ..http_client import HTTPClient
23
+
24
+
25
+ class GetSettingsQuery(Query[AllSettings]):
26
+ """Query to get all system settings."""
27
+
28
+ def __init__(self, http_client: HTTPClient):
29
+ self.http_client = http_client
30
+
31
+ def execute(self) -> AllSettings:
32
+ """Execute the query to get all settings."""
33
+ response = self.http_client.get("settings")
34
+
35
+ return AllSettings(**response.get("result", {}))
36
+
37
+
38
+ class GetBannerSettingsQuery(Query[BannerSettings]):
39
+ """Query to get banner settings."""
40
+
41
+ def __init__(self, http_client: HTTPClient):
42
+ self.http_client = http_client
43
+
44
+ def execute(self) -> BannerSettings:
45
+ """Execute the query to get banner settings."""
46
+ response = self.http_client.get("settings/banner")
47
+
48
+ return BannerSettings(**response.get("result", {}))
49
+
50
+
51
+ class UpdateProxySettingsQuery:
52
+ """Query for updating proxy settings."""
53
+
54
+ def __init__(self, request: Union[UpdateProxySettingsRequest, Dict[str, Any]]):
55
+ """Initialize proxy settings update query.
56
+
57
+ Args:
58
+ request: Proxy settings request data
59
+ """
60
+ if isinstance(request, dict):
61
+ self._request = UpdateProxySettingsRequest(**request)
62
+ else:
63
+ self._request = request
64
+
65
+ def build_form_data(self) -> Dict[str, Any]:
66
+ """Build form data for proxy settings update.
67
+
68
+ Returns:
69
+ Dictionary of form data
70
+ """
71
+ form_data = {
72
+ 'enabled': str(self._request.enabled).lower(),
73
+ }
74
+
75
+ if self._request.address:
76
+ form_data['address'] = self._request.address
77
+ if self._request.port:
78
+ form_data['port'] = str(self._request.port)
79
+ if self._request.username:
80
+ form_data['username'] = self._request.username
81
+ if self._request.password:
82
+ form_data['password'] = self._request.password
83
+ if self._request.cert_type:
84
+ # Handle both enum and string values - FIXED
85
+ if hasattr(self._request.cert_type, 'value'):
86
+ form_data['certType'] = self._request.cert_type.value
87
+ else:
88
+ form_data['certType'] = self._request.cert_type
89
+ if self._request.cert_password:
90
+ form_data['certPassword'] = self._request.cert_password
91
+
92
+ return form_data
93
+
94
+ def build_files(self) -> Optional[Dict[str, Any]]:
95
+ """Build files data for proxy settings update.
96
+
97
+ Returns:
98
+ Dictionary of files data or None
99
+ """
100
+ if self._request.cert:
101
+ return {'cert': ('cert.pem', self._request.cert, 'application/x-pem-file')}
102
+ return None
103
+
104
+
105
+ class ValidateProxySettingsQuery:
106
+ """Query for validating proxy settings."""
107
+
108
+ def __init__(self, request: Union[ValidateProxySettingsRequest, Dict[str, Any]]):
109
+ """Initialize proxy settings validation query.
110
+
111
+ Args:
112
+ request: Proxy settings validation request data
113
+ """
114
+ if isinstance(request, dict):
115
+ self._request = ValidateProxySettingsRequest(**request)
116
+ else:
117
+ self._request = request
118
+
119
+ def build_form_data(self) -> Dict[str, Any]:
120
+ """Build form data for proxy settings validation.
121
+
122
+ Returns:
123
+ Dictionary of form data
124
+ """
125
+ form_data = {
126
+ 'enabled': str(self._request.enabled).lower(),
127
+ }
128
+
129
+ if self._request.address:
130
+ form_data['address'] = self._request.address
131
+ if self._request.port:
132
+ form_data['port'] = str(self._request.port)
133
+ if self._request.username:
134
+ form_data['username'] = self._request.username
135
+ if self._request.password:
136
+ form_data['password'] = self._request.password
137
+ if self._request.cert_type:
138
+ # Handle both enum and string values - FIXED
139
+ if hasattr(self._request.cert_type, 'value'):
140
+ form_data['certType'] = self._request.cert_type.value
141
+ else:
142
+ form_data['certType'] = self._request.cert_type
143
+ if self._request.cert_password:
144
+ form_data['certPassword'] = self._request.cert_password
145
+
146
+ return form_data
147
+
148
+ def build_files(self) -> Optional[Dict[str, Any]]:
149
+ """Build files data for proxy settings validation.
150
+
151
+ Returns:
152
+ Dictionary of files data or None
153
+ """
154
+ if self._request.cert:
155
+ return {'cert': ('cert.pem', self._request.cert, 'application/x-pem-file')}
156
+ return None
157
+
158
+
159
+ class UpdateActiveDirectorySettingsQuery:
160
+ """Query for updating Active Directory settings."""
161
+
162
+ def __init__(self, request: Union[UpdateActiveDirectorySettingsRequest, Dict[str, Any]]):
163
+ """Initialize Active Directory settings update query.
164
+
165
+ Args:
166
+ request: Active Directory settings request data
167
+ """
168
+ if isinstance(request, dict):
169
+ self._request = UpdateActiveDirectorySettingsRequest(**request)
170
+ else:
171
+ self._request = request
172
+
173
+ def build_body(self) -> Dict[str, Any]:
174
+ """Build request body for Active Directory settings update.
175
+
176
+ Returns:
177
+ Dictionary of request body data
178
+ """
179
+ return self._request.model_dump(exclude_none=True, by_alias=True)
180
+
181
+
182
+ class ValidateActiveDirectorySettingsQuery:
183
+ """Query for validating Active Directory settings."""
184
+
185
+ def __init__(self, request: Union[ValidateActiveDirectorySettingsRequest, Dict[str, Any]]):
186
+ """Initialize Active Directory settings validation query.
187
+
188
+ Args:
189
+ request: Active Directory settings validation request data
190
+ """
191
+ if isinstance(request, dict):
192
+ self._request = ValidateActiveDirectorySettingsRequest(**request)
193
+ else:
194
+ self._request = request
195
+
196
+ def build_body(self) -> Dict[str, Any]:
197
+ """Build request body for Active Directory settings validation.
198
+
199
+ Returns:
200
+ Dictionary of request body data
201
+ """
202
+ return self._request.model_dump(exclude_none=True, by_alias=True)
203
+
204
+
205
+ class UpdateSMTPSettingsQuery:
206
+ """Query for updating SMTP settings."""
207
+
208
+ def __init__(self, request: Union[UpdateSMTPSettingsRequest, Dict[str, Any]]):
209
+ """Initialize SMTP settings update query.
210
+
211
+ Args:
212
+ request: SMTP settings request data
213
+ """
214
+ if isinstance(request, dict):
215
+ self._request = UpdateSMTPSettingsRequest(**request)
216
+ else:
217
+ self._request = request
218
+
219
+ def build_body(self) -> Dict[str, Any]:
220
+ """Build request body for SMTP settings update.
221
+
222
+ Returns:
223
+ Dictionary of request body data
224
+ """
225
+ return self._request.model_dump(exclude_none=True, by_alias=True)
226
+
227
+
228
+ class ValidateSMTPSettingsQuery:
229
+ """Query for validating SMTP settings."""
230
+
231
+ def __init__(self, request: Union[ValidateSMTPSettingsRequest, Dict[str, Any]]):
232
+ """Initialize SMTP settings validation query.
233
+
234
+ Args:
235
+ request: SMTP settings validation request data
236
+ """
237
+ if isinstance(request, dict):
238
+ self._request = ValidateSMTPSettingsRequest(**request)
239
+ else:
240
+ self._request = request
241
+
242
+ def build_body(self) -> Dict[str, Any]:
243
+ """Build request body for SMTP settings validation.
244
+
245
+ Returns:
246
+ Dictionary of request body data
247
+ """
248
+ return self._request.model_dump(exclude_none=True, by_alias=True)
249
+
250
+
251
+ class UpdateConsoleAddressSettingsQuery:
252
+ """Query for updating console address settings."""
253
+
254
+ def __init__(self, request: Union[UpdateConsoleAddressSettingsRequest, Dict[str, Any]]):
255
+ """Initialize console address settings update query.
256
+
257
+ Args:
258
+ request: Console address settings request data
259
+ """
260
+ if isinstance(request, dict):
261
+ self._request = UpdateConsoleAddressSettingsRequest(**request)
262
+ else:
263
+ self._request = request
264
+
265
+ def build_form_data(self) -> Dict[str, Any]:
266
+ """Build form data for console address settings update.
267
+
268
+ Returns:
269
+ Dictionary of form data
270
+ """
271
+ form_data = {
272
+ 'consoleAddress': self._request.console_address,
273
+ }
274
+
275
+ if self._request.cert_type:
276
+ form_data['certType'] = self._request.cert_type
277
+ if self._request.cert_password:
278
+ form_data['certPassword'] = self._request.cert_password
279
+
280
+ return form_data
281
+
282
+ def build_files(self) -> Optional[Dict[str, Any]]:
283
+ """Build files data for console address settings update.
284
+
285
+ Returns:
286
+ Dictionary of files data or None
287
+ """
288
+ files = {}
289
+ if self._request.cert:
290
+ files['cert'] = ('cert.pem', self._request.cert, 'application/x-pem-file')
291
+ if self._request.key:
292
+ files['key'] = ('key.pem', self._request.key, 'application/x-pem-file')
293
+ return files if files else None
294
+
295
+
296
+ class ValidateConsoleAddressSettingsQuery:
297
+ """Query for validating console address settings."""
298
+
299
+ def __init__(self, request: Union[ValidateConsoleAddressSettingsRequest, Dict[str, Any]]):
300
+ """Initialize console address settings validation query.
301
+
302
+ Args:
303
+ request: Console address settings validation request data
304
+ """
305
+ if isinstance(request, dict):
306
+ self._request = ValidateConsoleAddressSettingsRequest(**request)
307
+ else:
308
+ self._request = request
309
+
310
+ def build_body(self) -> Dict[str, Any]:
311
+ """Build request body for console address settings validation.
312
+
313
+ Returns:
314
+ Dictionary of request body data
315
+ """
316
+ return self._request.model_dump(exclude_none=True, by_alias=True)
317
+
318
+
319
+ # Simple JSON-based settings queries (most have the same pattern)
320
+ class UpdatePolicySettingsQuery:
321
+ """Query for updating policy settings."""
322
+
323
+ def __init__(self, request: Union[UpdatePolicySettingsRequest, Dict[str, Any]]):
324
+ if isinstance(request, dict):
325
+ self._request = UpdatePolicySettingsRequest(**request)
326
+ else:
327
+ self._request = request
328
+
329
+ def build_body(self) -> Dict[str, Any]:
330
+ return self._request.model_dump(exclude_none=True, by_alias=True)
331
+
332
+
333
+ class UpdateEnforceTFASettingsQuery:
334
+ """Query for updating enforce TFA settings."""
335
+
336
+ def __init__(self, request: Union[UpdateEnforceTFASettingsRequest, Dict[str, Any]]):
337
+ if isinstance(request, dict):
338
+ self._request = UpdateEnforceTFASettingsRequest(**request)
339
+ else:
340
+ self._request = request
341
+
342
+ def build_body(self) -> Dict[str, Any]:
343
+ return self._request.model_dump(exclude_none=True, by_alias=True)
344
+
345
+
346
+ class UpdateAutoAssetTaggingSettingsQuery:
347
+ """Query for updating auto asset tagging settings."""
348
+
349
+ def __init__(self, request: Union[UpdateAutoAssetTaggingSettingsRequest, Dict[str, Any]]):
350
+ if isinstance(request, dict):
351
+ self._request = UpdateAutoAssetTaggingSettingsRequest(**request)
352
+ else:
353
+ self._request = request
354
+
355
+ def build_body(self) -> Dict[str, Any]:
356
+ return self._request.model_dump(exclude_none=True, by_alias=True)
357
+
358
+
359
+ class UpdateInteractSettingsQuery:
360
+ """Query for updating InterACT settings."""
361
+
362
+ def __init__(self, request: Union[UpdateInteractSettingsRequest, Dict[str, Any]]):
363
+ if isinstance(request, dict):
364
+ self._request = UpdateInteractSettingsRequest(**request)
365
+ else:
366
+ self._request = request
367
+
368
+ def build_body(self) -> Dict[str, Any]:
369
+ return self._request.model_dump(exclude_none=True, by_alias=True)
370
+
371
+
372
+ class UpdateRFC3161SettingsQuery:
373
+ """Query for updating RFC3161 settings."""
374
+
375
+ def __init__(self, request: Union[UpdateRFC3161SettingsRequest, Dict[str, Any]]):
376
+ if isinstance(request, dict):
377
+ self._request = UpdateRFC3161SettingsRequest(**request)
378
+ else:
379
+ self._request = request
380
+
381
+ def build_body(self) -> Dict[str, Any]:
382
+ return self._request.model_dump(exclude_none=True, by_alias=True)
383
+
384
+
385
+ class UpdateResponderSettingsQuery:
386
+ """Query for updating responder/agent settings."""
387
+
388
+ def __init__(self, request: Union[UpdateResponderSettingsRequest, Dict[str, Any]]):
389
+ if isinstance(request, dict):
390
+ self._request = UpdateResponderSettingsRequest(**request)
391
+ else:
392
+ self._request = request
393
+
394
+ def build_body(self) -> Dict[str, Any]:
395
+ return self._request.model_dump(exclude_none=True, by_alias=True)
396
+
397
+
398
+ class UpdateLocardSettingsQuery:
399
+ """Query for updating Locard settings."""
400
+
401
+ def __init__(self, request: Union[UpdateLocardSettingsRequest, Dict[str, Any]]):
402
+ if isinstance(request, dict):
403
+ self._request = UpdateLocardSettingsRequest(**request)
404
+ else:
405
+ self._request = request
406
+
407
+ def build_body(self) -> Dict[str, Any]:
408
+ return self._request.model_dump(exclude_none=True, by_alias=True)
409
+
410
+
411
+ class UpdateUninstallationPasswordProtectionSettingsQuery:
412
+ """Query for updating uninstallation password protection settings."""
413
+
414
+ def __init__(self, request: Union[UpdateUninstallationPasswordProtectionSettingsRequest, Dict[str, Any]]):
415
+ if isinstance(request, dict):
416
+ self._request = UpdateUninstallationPasswordProtectionSettingsRequest(**request)
417
+ else:
418
+ self._request = request
419
+
420
+ def build_body(self) -> Dict[str, Any]:
421
+ return self._request.model_dump(exclude_none=True, by_alias=True)
422
+
423
+ # ADD THE REMAINING 9 QUERIES FOR SETTINGS API
424
+
425
+ class UpdateSyslogSettingsQuery:
426
+ """Query for updating syslog settings."""
427
+
428
+ def __init__(self, request: Union[UpdateSyslogSettingsRequest, Dict[str, Any]]):
429
+ if isinstance(request, dict):
430
+ self._request = UpdateSyslogSettingsRequest(**request)
431
+ else:
432
+ self._request = request
433
+
434
+ def build_body(self) -> Dict[str, Any]:
435
+ return self._request.model_dump(exclude_none=True, by_alias=True)
436
+
437
+ class ValidateSyslogSettingsQuery:
438
+ """Query for validating syslog settings."""
439
+
440
+ def __init__(self, request: Union[ValidateSyslogSettingsRequest, Dict[str, Any]]):
441
+ if isinstance(request, dict):
442
+ self._request = ValidateSyslogSettingsRequest(**request)
443
+ else:
444
+ self._request = request
445
+
446
+ def build_body(self) -> Dict[str, Any]:
447
+ return self._request.model_dump(exclude_none=True, by_alias=True)
448
+
449
+ class UpdateBackupRestoreSettingsQuery:
450
+ """Query for updating backup restore settings."""
451
+
452
+ def __init__(self, request: Union[UpdateBackupRestoreSettingsRequest, Dict[str, Any]]):
453
+ if isinstance(request, dict):
454
+ self._request = UpdateBackupRestoreSettingsRequest(**request)
455
+ else:
456
+ self._request = request
457
+
458
+ def build_body(self) -> Dict[str, Any]:
459
+ return self._request.model_dump(exclude_none=True, by_alias=True)
460
+
461
+ class ValidateBackupSftpSettingsQuery:
462
+ """Query for validating backup SFTP settings."""
463
+
464
+ def __init__(self, request: Union[ValidateBackupSftpSettingsRequest, Dict[str, Any]]):
465
+ if isinstance(request, dict):
466
+ self._request = ValidateBackupSftpSettingsRequest(**request)
467
+ else:
468
+ self._request = request
469
+
470
+ def build_body(self) -> Dict[str, Any]:
471
+ return self._request.model_dump(exclude_none=True, by_alias=True)
472
+
473
+ class UpdateSslSettingsQuery:
474
+ """Query for updating SSL settings."""
475
+
476
+ def __init__(self, request: Union[UpdateSslSettingsRequest, Dict[str, Any]], cert_file: Optional[bytes] = None, key_file: Optional[bytes] = None):
477
+ if isinstance(request, dict):
478
+ self._request = UpdateSslSettingsRequest(**request)
479
+ else:
480
+ self._request = request
481
+ self._cert_file = cert_file
482
+ self._key_file = key_file
483
+
484
+ def build_body(self) -> Dict[str, Any]:
485
+ """Build form data for SSL settings"""
486
+ form_data = self._request.model_dump(exclude_none=True, by_alias=True)
487
+ if self._cert_file:
488
+ form_data['cert'] = self._cert_file
489
+ if self._key_file:
490
+ form_data['key'] = self._key_file
491
+ return form_data
492
+
493
+ class ValidateSslSettingsQuery:
494
+ """Query for validating SSL settings."""
495
+
496
+ def __init__(self, request: Union[ValidateSslSettingsRequest, Dict[str, Any]], cert_file: Optional[bytes] = None, key_file: Optional[bytes] = None):
497
+ if isinstance(request, dict):
498
+ self._request = ValidateSslSettingsRequest(**request)
499
+ else:
500
+ self._request = request
501
+ self._cert_file = cert_file
502
+ self._key_file = key_file
503
+
504
+ def build_body(self) -> Dict[str, Any]:
505
+ """Build form data for SSL validation"""
506
+ form_data = self._request.model_dump(exclude_none=True, by_alias=True)
507
+ if self._cert_file:
508
+ form_data['cert'] = self._cert_file
509
+ if self._key_file:
510
+ form_data['key'] = self._key_file
511
+ return form_data
512
+
513
+ class UpdateSingleSignOnSettingsQuery:
514
+ """Query for updating single sign-on settings."""
515
+
516
+ def __init__(self, request: Union[UpdateSingleSignOnSettingsRequest, Dict[str, Any]]):
517
+ if isinstance(request, dict):
518
+ self._request = UpdateSingleSignOnSettingsRequest(**request)
519
+ else:
520
+ self._request = request
521
+
522
+ def build_body(self) -> Dict[str, Any]:
523
+ return self._request.model_dump(exclude_none=True, by_alias=True)
524
+
525
+ class GetSsoCallbackUrlQuery:
526
+ """Query for getting SSO callback URL by type."""
527
+
528
+ def __init__(self, sso_type: str):
529
+ self._sso_type = sso_type
530
+
531
+ def get_sso_type(self) -> str:
532
+ """Get the SSO type (azure or okta)"""
533
+ return self._sso_type