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.
- 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.1.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.1.dist-info/METADATA +0 -635
- binalyze_air_sdk-1.0.1.dist-info/RECORD +0 -82
- {binalyze_air_sdk-1.0.1.dist-info → binalyze_air_sdk-1.0.3.dist-info}/top_level.txt +0 -0
binalyze_air/models/audit.py
CHANGED
@@ -1,273 +1,248 @@
|
|
1
|
-
"""
|
2
|
-
Audit-related data models for the Binalyze AIR SDK.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from typing import List, Optional, Dict, Any
|
6
|
-
from datetime import datetime
|
7
|
-
from enum import Enum
|
8
|
-
|
9
|
-
from
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
if self.
|
154
|
-
body["
|
155
|
-
if self.
|
156
|
-
body["
|
157
|
-
if self.
|
158
|
-
body["
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
if self.
|
166
|
-
filter_obj["
|
167
|
-
if self.
|
168
|
-
filter_obj["
|
169
|
-
if self.
|
170
|
-
filter_obj["
|
171
|
-
if self.
|
172
|
-
filter_obj["
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
if self.
|
178
|
-
filter_obj["
|
179
|
-
if self.
|
180
|
-
filter_obj["
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
end_date: Optional[datetime] = None
|
249
|
-
tags: Optional[List[str]] = None
|
250
|
-
correlation_id: Optional[str] = None
|
251
|
-
|
252
|
-
|
253
|
-
class AuditExportRequest(AIRBaseModel):
|
254
|
-
"""Request model for exporting audit logs."""
|
255
|
-
|
256
|
-
filter_params: AuditFilter
|
257
|
-
format: str = "json" # json, csv, excel
|
258
|
-
include_details: bool = True
|
259
|
-
organization_ids: List[int] = []
|
260
|
-
|
261
|
-
|
262
|
-
class AuditRetentionPolicy(AIRBaseModel):
|
263
|
-
"""Audit retention policy model."""
|
264
|
-
|
265
|
-
organization_id: int
|
266
|
-
retention_days: int = 365
|
267
|
-
auto_archive: bool = True
|
268
|
-
archive_location: Optional[str] = None
|
269
|
-
compress_archives: bool = True
|
270
|
-
delete_after_archive: bool = False
|
271
|
-
created_at: Optional[datetime] = None
|
272
|
-
updated_at: Optional[datetime] = None
|
1
|
+
"""
|
2
|
+
Audit-related data models for the Binalyze AIR SDK.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import List, Optional, Dict, Any
|
6
|
+
from datetime import datetime
|
7
|
+
from enum import Enum
|
8
|
+
from typing import Optional
|
9
|
+
from pydantic import Field
|
10
|
+
|
11
|
+
from ..base import AIRBaseModel, Filter
|
12
|
+
|
13
|
+
|
14
|
+
class AuditLevel(str, Enum):
|
15
|
+
"""Audit log level."""
|
16
|
+
INFO = "info"
|
17
|
+
WARNING = "warning"
|
18
|
+
ERROR = "error"
|
19
|
+
CRITICAL = "critical"
|
20
|
+
|
21
|
+
|
22
|
+
class AuditCategory(str, Enum):
|
23
|
+
"""Audit event category."""
|
24
|
+
AUTHENTICATION = "authentication"
|
25
|
+
AUTHORIZATION = "authorization"
|
26
|
+
DATA_ACCESS = "data_access"
|
27
|
+
SYSTEM_CHANGE = "system_change"
|
28
|
+
USER_ACTION = "user_action"
|
29
|
+
API_CALL = "api_call"
|
30
|
+
POLICY_EXECUTION = "policy_execution"
|
31
|
+
TASK_EXECUTION = "task_execution"
|
32
|
+
|
33
|
+
|
34
|
+
class AuditAction(str, Enum):
|
35
|
+
"""Audit action type."""
|
36
|
+
CREATE = "create"
|
37
|
+
READ = "read"
|
38
|
+
UPDATE = "update"
|
39
|
+
DELETE = "delete"
|
40
|
+
EXECUTE = "execute"
|
41
|
+
LOGIN = "login"
|
42
|
+
LOGOUT = "logout"
|
43
|
+
DOWNLOAD = "download"
|
44
|
+
UPLOAD = "upload"
|
45
|
+
|
46
|
+
|
47
|
+
class AuditLog(AIRBaseModel):
|
48
|
+
"""Audit log model."""
|
49
|
+
|
50
|
+
id: str
|
51
|
+
timestamp: datetime
|
52
|
+
user_id: Optional[str] = None
|
53
|
+
username: Optional[str] = None
|
54
|
+
organization_id: int = 0
|
55
|
+
category: AuditCategory
|
56
|
+
action: AuditAction
|
57
|
+
resource_type: str
|
58
|
+
resource_id: Optional[str] = None
|
59
|
+
resource_name: Optional[str] = None
|
60
|
+
level: AuditLevel = AuditLevel.INFO
|
61
|
+
message: str
|
62
|
+
details: Dict[str, Any] = {}
|
63
|
+
ip_address: Optional[str] = None
|
64
|
+
user_agent: Optional[str] = None
|
65
|
+
session_id: Optional[str] = None
|
66
|
+
correlation_id: Optional[str] = None
|
67
|
+
success: bool = True
|
68
|
+
error_code: Optional[str] = None
|
69
|
+
duration: Optional[int] = None # milliseconds
|
70
|
+
tags: List[str] = []
|
71
|
+
|
72
|
+
|
73
|
+
class AuditSummary(AIRBaseModel):
|
74
|
+
"""Audit summary model."""
|
75
|
+
|
76
|
+
organization_id: int
|
77
|
+
date: datetime
|
78
|
+
total_events: int = 0
|
79
|
+
successful_events: int = 0
|
80
|
+
failed_events: int = 0
|
81
|
+
authentication_events: int = 0
|
82
|
+
authorization_events: int = 0
|
83
|
+
data_access_events: int = 0
|
84
|
+
system_change_events: int = 0
|
85
|
+
user_action_events: int = 0
|
86
|
+
api_call_events: int = 0
|
87
|
+
unique_users: int = 0
|
88
|
+
unique_ips: int = 0
|
89
|
+
top_users: List[Dict[str, Any]] = []
|
90
|
+
top_actions: List[Dict[str, Any]] = []
|
91
|
+
error_summary: List[Dict[str, Any]] = []
|
92
|
+
|
93
|
+
|
94
|
+
class AuditUserActivity(AIRBaseModel):
|
95
|
+
"""User activity audit model."""
|
96
|
+
|
97
|
+
user_id: str
|
98
|
+
username: str
|
99
|
+
organization_id: int
|
100
|
+
date: datetime
|
101
|
+
login_count: int = 0
|
102
|
+
action_count: int = 0
|
103
|
+
failed_login_count: int = 0
|
104
|
+
last_login: Optional[datetime] = None
|
105
|
+
last_action: Optional[datetime] = None
|
106
|
+
unique_ips: List[str] = []
|
107
|
+
actions_by_category: Dict[str, int] = {}
|
108
|
+
risk_score: float = 0.0
|
109
|
+
|
110
|
+
|
111
|
+
class AuditSystemEvent(AIRBaseModel):
|
112
|
+
"""System event audit model."""
|
113
|
+
|
114
|
+
id: str
|
115
|
+
timestamp: datetime
|
116
|
+
event_type: str
|
117
|
+
severity: AuditLevel
|
118
|
+
component: str
|
119
|
+
message: str
|
120
|
+
details: Dict[str, Any] = {}
|
121
|
+
organization_id: int = 0
|
122
|
+
resolved: bool = False
|
123
|
+
resolved_by: Optional[str] = None
|
124
|
+
resolved_at: Optional[datetime] = None
|
125
|
+
|
126
|
+
|
127
|
+
class AuditLogsFilter(Filter):
|
128
|
+
"""Filter for audit logs queries - matches NEW API specification exactly (POST with JSON body)."""
|
129
|
+
|
130
|
+
# Search and identification
|
131
|
+
search_term: Optional[str] = None
|
132
|
+
name: Optional[str] = None
|
133
|
+
|
134
|
+
# Audit log specific filters
|
135
|
+
type: Optional[str] = None # audit log type filter (changed from List[str] to str)
|
136
|
+
performed_by: Optional[str] = None # user who performed the action
|
137
|
+
endpoint_name: Optional[str] = None # endpoint name filter
|
138
|
+
|
139
|
+
# NEW PARAMETERS from updated API spec
|
140
|
+
event_source: Optional[str] = None # NEW: event source filter
|
141
|
+
occurred_at: Optional[str] = None # NEW: timestamp filter
|
142
|
+
data_filter: Optional[str] = None # NEW: data filtering capability
|
143
|
+
|
144
|
+
# Organization parameters - changed to single int instead of list
|
145
|
+
organization_ids: Optional[int] = Field(default=None, alias="organizationIds") # API expects camelCase
|
146
|
+
all_organizations: Optional[bool] = None # true/false
|
147
|
+
|
148
|
+
def to_json_body(self) -> Dict[str, Any]:
|
149
|
+
"""Convert filter to JSON body for POST request - NEW API FORMAT."""
|
150
|
+
body = {}
|
151
|
+
|
152
|
+
# Pagination parameters (top level in body)
|
153
|
+
if self.page_number is not None:
|
154
|
+
body["pageNumber"] = self.page_number
|
155
|
+
if self.page_size is not None:
|
156
|
+
body["pageSize"] = self.page_size
|
157
|
+
if self.sort_by is not None:
|
158
|
+
body["sortBy"] = self.sort_by
|
159
|
+
if self.sort_type is not None:
|
160
|
+
body["sortType"] = self.sort_type
|
161
|
+
|
162
|
+
# Filter object (nested in body)
|
163
|
+
filter_obj = {}
|
164
|
+
|
165
|
+
if self.search_term is not None:
|
166
|
+
filter_obj["searchTerm"] = self.search_term
|
167
|
+
if self.name is not None:
|
168
|
+
filter_obj["name"] = self.name
|
169
|
+
if self.type is not None:
|
170
|
+
filter_obj["type"] = self.type
|
171
|
+
if self.performed_by is not None:
|
172
|
+
filter_obj["performedBy"] = self.performed_by
|
173
|
+
if self.endpoint_name is not None:
|
174
|
+
filter_obj["endpointName"] = self.endpoint_name
|
175
|
+
|
176
|
+
# NEW PARAMETERS
|
177
|
+
if self.event_source is not None:
|
178
|
+
filter_obj["eventSource"] = self.event_source
|
179
|
+
if self.occurred_at is not None:
|
180
|
+
filter_obj["occurredAt"] = self.occurred_at
|
181
|
+
if self.data_filter is not None:
|
182
|
+
filter_obj["dataFilter"] = self.data_filter
|
183
|
+
|
184
|
+
# Organization parameters - API requires organizationIds to be empty
|
185
|
+
# Don't include organizationIds in filter as API requires it to be empty
|
186
|
+
# if self.organization_ids is not None:
|
187
|
+
# filter_obj["organizationIds"] = self.organization_ids
|
188
|
+
if self.all_organizations is not None:
|
189
|
+
filter_obj["allOrganizations"] = self.all_organizations
|
190
|
+
|
191
|
+
# Only add filter object if it has content
|
192
|
+
if filter_obj:
|
193
|
+
body["filter"] = filter_obj
|
194
|
+
|
195
|
+
return body
|
196
|
+
|
197
|
+
def to_params(self) -> Dict[str, Any]:
|
198
|
+
"""Convert filter to API parameters with correct camelCase naming."""
|
199
|
+
# Get base parameters
|
200
|
+
params = super().to_params()
|
201
|
+
|
202
|
+
# Fix organization_ids parameter name to match API specification
|
203
|
+
if 'filter[organization_ids]' in params:
|
204
|
+
# Move from snake_case to camelCase as required by API
|
205
|
+
params['filter[organizationIds]'] = params.pop('filter[organization_ids]')
|
206
|
+
|
207
|
+
return params
|
208
|
+
|
209
|
+
|
210
|
+
class AuditFilter(Filter):
|
211
|
+
"""Filter for audit queries."""
|
212
|
+
|
213
|
+
user_id: Optional[str] = None
|
214
|
+
username: Optional[str] = None
|
215
|
+
category: Optional[List[AuditCategory]] = None
|
216
|
+
action: Optional[List[AuditAction]] = None
|
217
|
+
level: Optional[List[AuditLevel]] = None
|
218
|
+
resource_type: Optional[str] = None
|
219
|
+
resource_id: Optional[str] = None
|
220
|
+
ip_address: Optional[str] = None
|
221
|
+
success: Optional[bool] = None
|
222
|
+
start_date: Optional[datetime] = None
|
223
|
+
end_date: Optional[datetime] = None
|
224
|
+
tags: Optional[List[str]] = None
|
225
|
+
correlation_id: Optional[str] = None
|
226
|
+
|
227
|
+
|
228
|
+
class AuditExportRequest(AIRBaseModel):
|
229
|
+
"""Request model for exporting audit logs."""
|
230
|
+
|
231
|
+
filter_params: AuditFilter
|
232
|
+
format: str = "json" # json, csv, excel
|
233
|
+
include_details: bool = True
|
234
|
+
organization_ids: List[int] = []
|
235
|
+
|
236
|
+
|
237
|
+
class AuditRetentionPolicy(AIRBaseModel):
|
238
|
+
"""Audit retention policy model."""
|
239
|
+
|
240
|
+
organization_id: int
|
241
|
+
retention_days: int = 365
|
242
|
+
auto_archive: bool = True
|
243
|
+
archive_location: Optional[str] = None
|
244
|
+
compress_archives: bool = True
|
245
|
+
delete_after_archive: bool = False
|
246
|
+
created_at: Optional[datetime] = None
|
247
|
+
updated_at: Optional[datetime] = None
|
273
248
|
created_by: str
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from typing import Optional, List
|
2
|
+
from pydantic import Field
|
3
|
+
from ..base import Filter
|
4
|
+
|
5
|
+
class AuditLogsFilter(Filter):
|
6
|
+
"""Filter for audit logs queries."""
|
7
|
+
|
8
|
+
search_term: Optional[str] = None
|
9
|
+
organization_ids: Optional[List[int]] = None
|
10
|
+
start_date: Optional[str] = Field(default=None, alias="startDate") # ISO 8601 format
|
11
|
+
end_date: Optional[str] = Field(default=None, alias="endDate") # ISO 8601 format
|
12
|
+
user_id: Optional[str] = None
|
13
|
+
action: Optional[str] = None
|
14
|
+
resource: Optional[str] = None
|