kalir-python 0.1.0__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.
- kalir/__init__.py +11 -0
- kalir/api/__init__.py +1 -0
- kalir/api/assets/__init__.py +1 -0
- kalir/api/assets/create_asset.py +193 -0
- kalir/api/assets/delete_asset.py +182 -0
- kalir/api/assets/get_asset.py +186 -0
- kalir/api/assets/list_assets.py +165 -0
- kalir/api/assets/update_asset.py +206 -0
- kalir/api/events/__init__.py +1 -0
- kalir/api/events/get_event.py +194 -0
- kalir/api/events/ingest_event.py +215 -0
- kalir/api/events/list_events.py +259 -0
- kalir/api/exposures/__init__.py +1 -0
- kalir/api/exposures/count_exposures.py +165 -0
- kalir/api/exposures/get_infostealer_summary.py +181 -0
- kalir/api/exposures/list_exposures.py +225 -0
- kalir/api/incidents/__init__.py +1 -0
- kalir/api/incidents/get_incident.py +194 -0
- kalir/api/incidents/list_incidents.py +265 -0
- kalir/api/incidents/update_incident_status.py +207 -0
- kalir/api/intel/__init__.py +1 -0
- kalir/api/intel/get_ransomware_stats.py +165 -0
- kalir/api/intel/list_ransomware_victims.py +165 -0
- kalir/api/mentions/__init__.py +1 -0
- kalir/api/mentions/list_mentions.py +283 -0
- kalir/api/overview/__init__.py +1 -0
- kalir/api/overview/get_overview.py +184 -0
- kalir/api/phishing/__init__.py +1 -0
- kalir/api/phishing/list_phishing.py +245 -0
- kalir/api/reports/__init__.py +1 -0
- kalir/api/reports/create_report.py +193 -0
- kalir/api/reports/download_report.py +186 -0
- kalir/api/reports/list_reports.py +165 -0
- kalir/api/rules/__init__.py +1 -0
- kalir/api/rules/create_rule.py +193 -0
- kalir/api/rules/delete_rule.py +183 -0
- kalir/api/rules/get_rule.py +187 -0
- kalir/api/rules/list_rules.py +165 -0
- kalir/api/rules/replace_rule.py +207 -0
- kalir/api/takedowns/__init__.py +1 -0
- kalir/api/takedowns/count_takedowns.py +165 -0
- kalir/api/takedowns/create_takedown.py +193 -0
- kalir/api/takedowns/delete_takedown.py +183 -0
- kalir/api/takedowns/get_takedown.py +187 -0
- kalir/api/takedowns/list_takedowns.py +165 -0
- kalir/api/takedowns/replace_takedown.py +210 -0
- kalir/api/takedowns/update_takedown.py +210 -0
- kalir/api/webhooks/__init__.py +1 -0
- kalir/api/webhooks/create_webhook.py +222 -0
- kalir/api/webhooks/delete_webhook.py +190 -0
- kalir/api/webhooks/get_webhook.py +194 -0
- kalir/api/webhooks/get_webhook_delivery.py +194 -0
- kalir/api/webhooks/list_webhook_deliveries.py +239 -0
- kalir/api/webhooks/list_webhook_event_types.py +165 -0
- kalir/api/webhooks/list_webhooks.py +172 -0
- kalir/api/webhooks/retry_webhook_delivery.py +190 -0
- kalir/api/webhooks/rotate_webhook_secret.py +202 -0
- kalir/api/webhooks/send_webhook_test.py +202 -0
- kalir/api/webhooks/update_webhook.py +229 -0
- kalir/client.py +271 -0
- kalir/errors.py +14 -0
- kalir/models/__init__.py +195 -0
- kalir/models/asset.py +162 -0
- kalir/models/asset_create.py +122 -0
- kalir/models/asset_create_asset_type.py +14 -0
- kalir/models/asset_create_metadata.py +64 -0
- kalir/models/count_exposures_response_200.py +78 -0
- kalir/models/count_takedowns_response_200.py +96 -0
- kalir/models/create_report_body.py +96 -0
- kalir/models/create_report_body_type.py +10 -0
- kalir/models/create_webhook_response_201.py +111 -0
- kalir/models/error.py +84 -0
- kalir/models/error_error.py +106 -0
- kalir/models/error_error_type.py +15 -0
- kalir/models/event.py +151 -0
- kalir/models/event_asset.py +87 -0
- kalir/models/event_ingest.py +146 -0
- kalir/models/event_ingest_asset.py +87 -0
- kalir/models/event_ingest_evidence.py +64 -0
- kalir/models/event_ingest_source.py +87 -0
- kalir/models/exposure.py +137 -0
- kalir/models/exposure_webhook_event.py +152 -0
- kalir/models/exposure_webhook_event_data.py +115 -0
- kalir/models/exposure_webhook_event_data_exposure.py +149 -0
- kalir/models/exposure_webhook_event_data_infection.py +136 -0
- kalir/models/exposure_webhook_event_type.py +8 -0
- kalir/models/get_incident_response_200.py +174 -0
- kalir/models/get_infostealer_summary_response_200.py +100 -0
- kalir/models/get_ransomware_stats_response_200.py +156 -0
- kalir/models/get_ransomware_stats_response_200_top_countries_7d_item.py +64 -0
- kalir/models/get_ransomware_stats_response_200_top_groups_7d_item.py +64 -0
- kalir/models/incident.py +170 -0
- kalir/models/incident_severity.py +10 -0
- kalir/models/incident_status.py +10 -0
- kalir/models/incident_webhook_event.py +152 -0
- kalir/models/incident_webhook_event_data.py +115 -0
- kalir/models/incident_webhook_event_data_previous.py +88 -0
- kalir/models/incident_webhook_event_type.py +9 -0
- kalir/models/infostealer_domain_summary.py +122 -0
- kalir/models/infostealer_domain_summary_snapshot.py +201 -0
- kalir/models/infostealer_domain_summary_snapshot_top_employee_urls_item.py +87 -0
- kalir/models/infostealer_domain_summary_snapshot_top_families_item.py +87 -0
- kalir/models/list_assets_response_200.py +100 -0
- kalir/models/list_events_response_200.py +109 -0
- kalir/models/list_exposures_response_200.py +127 -0
- kalir/models/list_incidents_bucket.py +10 -0
- kalir/models/list_incidents_response_200.py +149 -0
- kalir/models/list_incidents_response_200_counts.py +106 -0
- kalir/models/list_incidents_status.py +12 -0
- kalir/models/list_mentions_response_200.py +122 -0
- kalir/models/list_mentions_source.py +8 -0
- kalir/models/list_phishing_response_200.py +122 -0
- kalir/models/list_phishing_verdict.py +11 -0
- kalir/models/list_ransomware_victims_response_200.py +109 -0
- kalir/models/list_ransomware_victims_response_200_victims_item.py +64 -0
- kalir/models/list_reports_response_200.py +109 -0
- kalir/models/list_rules_response_200.py +100 -0
- kalir/models/list_takedowns_response_200.py +109 -0
- kalir/models/list_webhook_deliveries_response_200.py +122 -0
- kalir/models/list_webhook_event_types_response_200.py +100 -0
- kalir/models/list_webhook_event_types_response_200_data_item.py +87 -0
- kalir/models/list_webhooks_response_200.py +100 -0
- kalir/models/mention.py +194 -0
- kalir/models/mention_source.py +8 -0
- kalir/models/overview.py +231 -0
- kalir/models/overview_assets.py +96 -0
- kalir/models/overview_exposures.py +105 -0
- kalir/models/overview_incidents.py +114 -0
- kalir/models/overview_phishing.py +87 -0
- kalir/models/overview_risk_level.py +10 -0
- kalir/models/overview_takedowns.py +87 -0
- kalir/models/pagination.py +105 -0
- kalir/models/phishing_domain.py +186 -0
- kalir/models/phishing_domain_verdict.py +11 -0
- kalir/models/report.py +182 -0
- kalir/models/report_parameters.py +181 -0
- kalir/models/report_parameters_date_range.py +11 -0
- kalir/models/report_parameters_language.py +8 -0
- kalir/models/report_parameters_sections_item.py +15 -0
- kalir/models/report_status.py +10 -0
- kalir/models/rotate_webhook_secret_response_200.py +87 -0
- kalir/models/rule.py +174 -0
- kalir/models/rule_input.py +134 -0
- kalir/models/rule_input_actions_item.py +64 -0
- kalir/models/takedown.py +163 -0
- kalir/models/takedown_create.py +113 -0
- kalir/models/takedown_update.py +96 -0
- kalir/models/update_incident_status_body.py +90 -0
- kalir/models/update_incident_status_body_status.py +10 -0
- kalir/models/webhook_delivery.py +274 -0
- kalir/models/webhook_delivery_payload.py +64 -0
- kalir/models/webhook_delivery_status.py +9 -0
- kalir/models/webhook_endpoint.py +216 -0
- kalir/models/webhook_endpoint_input.py +124 -0
- kalir/models/webhook_endpoint_input_event_types_item.py +11 -0
- kalir/models/webhook_incident.py +232 -0
- kalir/models/webhook_incident_severity.py +10 -0
- kalir/py.typed +1 -0
- kalir/types.py +53 -0
- kalir/webhooks.py +63 -0
- kalir_python-0.1.0.dist-info/METADATA +76 -0
- kalir_python-0.1.0.dist-info/RECORD +163 -0
- kalir_python-0.1.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping
|
|
4
|
+
from typing import Any, TypeVar, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
5
|
+
|
|
6
|
+
from attrs import define as _attrs_define
|
|
7
|
+
from attrs import field as _attrs_field
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
|
|
11
|
+
from ..models.webhook_incident_severity import WebhookIncidentSeverity
|
|
12
|
+
from ..types import UNSET, Unset
|
|
13
|
+
from typing import cast
|
|
14
|
+
from uuid import UUID
|
|
15
|
+
import datetime
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
T = TypeVar("T", bound="WebhookIncident")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@_attrs_define
|
|
27
|
+
class WebhookIncident:
|
|
28
|
+
"""
|
|
29
|
+
Attributes:
|
|
30
|
+
id (UUID | Unset):
|
|
31
|
+
title (str | Unset):
|
|
32
|
+
severity (WebhookIncidentSeverity | Unset):
|
|
33
|
+
status (str | Unset):
|
|
34
|
+
signal_family (str | Unset):
|
|
35
|
+
asset (str | Unset):
|
|
36
|
+
risk_score (int | Unset):
|
|
37
|
+
event_count (int | Unset):
|
|
38
|
+
first_event_at (datetime.datetime | Unset):
|
|
39
|
+
last_event_at (datetime.datetime | Unset):
|
|
40
|
+
created_at (datetime.datetime | Unset):
|
|
41
|
+
url (str | Unset): Deep link to the incident in Kalir.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
id: UUID | Unset = UNSET
|
|
45
|
+
title: str | Unset = UNSET
|
|
46
|
+
severity: WebhookIncidentSeverity | Unset = UNSET
|
|
47
|
+
status: str | Unset = UNSET
|
|
48
|
+
signal_family: str | Unset = UNSET
|
|
49
|
+
asset: str | Unset = UNSET
|
|
50
|
+
risk_score: int | Unset = UNSET
|
|
51
|
+
event_count: int | Unset = UNSET
|
|
52
|
+
first_event_at: datetime.datetime | Unset = UNSET
|
|
53
|
+
last_event_at: datetime.datetime | Unset = UNSET
|
|
54
|
+
created_at: datetime.datetime | Unset = UNSET
|
|
55
|
+
url: str | Unset = UNSET
|
|
56
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def to_dict(self) -> dict[str, Any]:
|
|
63
|
+
id: str | Unset = UNSET
|
|
64
|
+
if not isinstance(self.id, Unset):
|
|
65
|
+
id = str(self.id)
|
|
66
|
+
|
|
67
|
+
title = self.title
|
|
68
|
+
|
|
69
|
+
severity: str | Unset = UNSET
|
|
70
|
+
if not isinstance(self.severity, Unset):
|
|
71
|
+
severity = self.severity.value
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
status = self.status
|
|
75
|
+
|
|
76
|
+
signal_family = self.signal_family
|
|
77
|
+
|
|
78
|
+
asset = self.asset
|
|
79
|
+
|
|
80
|
+
risk_score = self.risk_score
|
|
81
|
+
|
|
82
|
+
event_count = self.event_count
|
|
83
|
+
|
|
84
|
+
first_event_at: str | Unset = UNSET
|
|
85
|
+
if not isinstance(self.first_event_at, Unset):
|
|
86
|
+
first_event_at = self.first_event_at.isoformat()
|
|
87
|
+
|
|
88
|
+
last_event_at: str | Unset = UNSET
|
|
89
|
+
if not isinstance(self.last_event_at, Unset):
|
|
90
|
+
last_event_at = self.last_event_at.isoformat()
|
|
91
|
+
|
|
92
|
+
created_at: str | Unset = UNSET
|
|
93
|
+
if not isinstance(self.created_at, Unset):
|
|
94
|
+
created_at = self.created_at.isoformat()
|
|
95
|
+
|
|
96
|
+
url = self.url
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
field_dict: dict[str, Any] = {}
|
|
100
|
+
field_dict.update(self.additional_properties)
|
|
101
|
+
field_dict.update({
|
|
102
|
+
})
|
|
103
|
+
if id is not UNSET:
|
|
104
|
+
field_dict["id"] = id
|
|
105
|
+
if title is not UNSET:
|
|
106
|
+
field_dict["title"] = title
|
|
107
|
+
if severity is not UNSET:
|
|
108
|
+
field_dict["severity"] = severity
|
|
109
|
+
if status is not UNSET:
|
|
110
|
+
field_dict["status"] = status
|
|
111
|
+
if signal_family is not UNSET:
|
|
112
|
+
field_dict["signal_family"] = signal_family
|
|
113
|
+
if asset is not UNSET:
|
|
114
|
+
field_dict["asset"] = asset
|
|
115
|
+
if risk_score is not UNSET:
|
|
116
|
+
field_dict["risk_score"] = risk_score
|
|
117
|
+
if event_count is not UNSET:
|
|
118
|
+
field_dict["event_count"] = event_count
|
|
119
|
+
if first_event_at is not UNSET:
|
|
120
|
+
field_dict["first_event_at"] = first_event_at
|
|
121
|
+
if last_event_at is not UNSET:
|
|
122
|
+
field_dict["last_event_at"] = last_event_at
|
|
123
|
+
if created_at is not UNSET:
|
|
124
|
+
field_dict["created_at"] = created_at
|
|
125
|
+
if url is not UNSET:
|
|
126
|
+
field_dict["url"] = url
|
|
127
|
+
|
|
128
|
+
return field_dict
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@classmethod
|
|
133
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
134
|
+
d = dict(src_dict)
|
|
135
|
+
_id = d.pop("id", UNSET)
|
|
136
|
+
id: UUID | Unset
|
|
137
|
+
if isinstance(_id, Unset):
|
|
138
|
+
id = UNSET
|
|
139
|
+
else:
|
|
140
|
+
id = UUID(_id)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
title = d.pop("title", UNSET)
|
|
146
|
+
|
|
147
|
+
_severity = d.pop("severity", UNSET)
|
|
148
|
+
severity: WebhookIncidentSeverity | Unset
|
|
149
|
+
if isinstance(_severity, Unset):
|
|
150
|
+
severity = UNSET
|
|
151
|
+
else:
|
|
152
|
+
severity = WebhookIncidentSeverity(_severity)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
status = d.pop("status", UNSET)
|
|
158
|
+
|
|
159
|
+
signal_family = d.pop("signal_family", UNSET)
|
|
160
|
+
|
|
161
|
+
asset = d.pop("asset", UNSET)
|
|
162
|
+
|
|
163
|
+
risk_score = d.pop("risk_score", UNSET)
|
|
164
|
+
|
|
165
|
+
event_count = d.pop("event_count", UNSET)
|
|
166
|
+
|
|
167
|
+
_first_event_at = d.pop("first_event_at", UNSET)
|
|
168
|
+
first_event_at: datetime.datetime | Unset
|
|
169
|
+
if isinstance(_first_event_at, Unset):
|
|
170
|
+
first_event_at = UNSET
|
|
171
|
+
else:
|
|
172
|
+
first_event_at = datetime.datetime.fromisoformat(_first_event_at)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
_last_event_at = d.pop("last_event_at", UNSET)
|
|
178
|
+
last_event_at: datetime.datetime | Unset
|
|
179
|
+
if isinstance(_last_event_at, Unset):
|
|
180
|
+
last_event_at = UNSET
|
|
181
|
+
else:
|
|
182
|
+
last_event_at = datetime.datetime.fromisoformat(_last_event_at)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
_created_at = d.pop("created_at", UNSET)
|
|
188
|
+
created_at: datetime.datetime | Unset
|
|
189
|
+
if isinstance(_created_at, Unset):
|
|
190
|
+
created_at = UNSET
|
|
191
|
+
else:
|
|
192
|
+
created_at = datetime.datetime.fromisoformat(_created_at)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
url = d.pop("url", UNSET)
|
|
198
|
+
|
|
199
|
+
webhook_incident = cls(
|
|
200
|
+
id=id,
|
|
201
|
+
title=title,
|
|
202
|
+
severity=severity,
|
|
203
|
+
status=status,
|
|
204
|
+
signal_family=signal_family,
|
|
205
|
+
asset=asset,
|
|
206
|
+
risk_score=risk_score,
|
|
207
|
+
event_count=event_count,
|
|
208
|
+
first_event_at=first_event_at,
|
|
209
|
+
last_event_at=last_event_at,
|
|
210
|
+
created_at=created_at,
|
|
211
|
+
url=url,
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
webhook_incident.additional_properties = d
|
|
216
|
+
return webhook_incident
|
|
217
|
+
|
|
218
|
+
@property
|
|
219
|
+
def additional_keys(self) -> list[str]:
|
|
220
|
+
return list(self.additional_properties.keys())
|
|
221
|
+
|
|
222
|
+
def __getitem__(self, key: str) -> Any:
|
|
223
|
+
return self.additional_properties[key]
|
|
224
|
+
|
|
225
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
226
|
+
self.additional_properties[key] = value
|
|
227
|
+
|
|
228
|
+
def __delitem__(self, key: str) -> None:
|
|
229
|
+
del self.additional_properties[key]
|
|
230
|
+
|
|
231
|
+
def __contains__(self, key: str) -> bool:
|
|
232
|
+
return key in self.additional_properties
|
kalir/py.typed
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Marker file for PEP 561
|
kalir/types.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
""" Contains some shared types for properties """
|
|
2
|
+
|
|
3
|
+
from collections.abc import Mapping, MutableMapping
|
|
4
|
+
from http import HTTPStatus
|
|
5
|
+
from typing import BinaryIO, Generic, TypeVar, Literal, IO
|
|
6
|
+
|
|
7
|
+
from attrs import define
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Unset:
|
|
11
|
+
def __bool__(self) -> Literal[False]:
|
|
12
|
+
return False
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
UNSET: Unset = Unset()
|
|
16
|
+
|
|
17
|
+
# The types that `httpx.Client(files=)` can accept, copied from that library.
|
|
18
|
+
FileContent = IO[bytes] | bytes | str
|
|
19
|
+
FileTypes = (
|
|
20
|
+
# (filename, file (or bytes), content_type)
|
|
21
|
+
tuple[str | None, FileContent, str | None]
|
|
22
|
+
# (filename, file (or bytes), content_type, headers)
|
|
23
|
+
| tuple[str | None, FileContent, str | None, Mapping[str, str]]
|
|
24
|
+
)
|
|
25
|
+
RequestFiles = list[tuple[str, FileTypes]]
|
|
26
|
+
|
|
27
|
+
@define
|
|
28
|
+
class File:
|
|
29
|
+
""" Contains information for file uploads """
|
|
30
|
+
|
|
31
|
+
payload: BinaryIO
|
|
32
|
+
file_name: str | None = None
|
|
33
|
+
mime_type: str | None = None
|
|
34
|
+
|
|
35
|
+
def to_tuple(self) -> FileTypes:
|
|
36
|
+
""" Return a tuple representation that httpx will accept for multipart/form-data """
|
|
37
|
+
return self.file_name, self.payload, self.mime_type
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
T = TypeVar("T")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@define
|
|
44
|
+
class Response(Generic[T]):
|
|
45
|
+
""" A response from an endpoint """
|
|
46
|
+
|
|
47
|
+
status_code: HTTPStatus
|
|
48
|
+
content: bytes
|
|
49
|
+
headers: MutableMapping[str, str]
|
|
50
|
+
parsed: T | None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
__all__ = ["UNSET", "File", "FileTypes", "RequestFiles", "Response", "Unset"]
|
kalir/webhooks.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""Verify and parse Kalir webhook deliveries.
|
|
2
|
+
|
|
3
|
+
Hand-written (not generated); ``regenerate.sh`` copies it into the package.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import hashlib
|
|
9
|
+
import hmac
|
|
10
|
+
import json
|
|
11
|
+
import time
|
|
12
|
+
from typing import Any, Union
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class WebhookSignatureError(Exception):
|
|
16
|
+
"""Raised when a delivery's signature is missing, invalid or too old."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def construct_event(
|
|
20
|
+
raw_body: Union[bytes, str],
|
|
21
|
+
signature_header: Union[str, None],
|
|
22
|
+
secret: str,
|
|
23
|
+
tolerance_seconds: int = 300,
|
|
24
|
+
) -> dict[str, Any]:
|
|
25
|
+
"""Verify an ``X-Kalir-Signature`` header and return the parsed event.
|
|
26
|
+
|
|
27
|
+
The header is ``t=<unix>,v1=<hex>`` where
|
|
28
|
+
``v1 = HMAC-SHA256(secret, "<t>." + raw_body)``. Deliveries older than
|
|
29
|
+
``tolerance_seconds`` are rejected to stop replays.
|
|
30
|
+
|
|
31
|
+
Pass the **raw** request body exactly as received, not re-serialized JSON.
|
|
32
|
+
|
|
33
|
+
Example (Flask)::
|
|
34
|
+
|
|
35
|
+
from kalir.webhooks import construct_event, WebhookSignatureError
|
|
36
|
+
|
|
37
|
+
@app.post("/kalir-webhooks")
|
|
38
|
+
def kalir_webhooks():
|
|
39
|
+
try:
|
|
40
|
+
event = construct_event(request.get_data(), request.headers.get("X-Kalir-Signature"), SECRET)
|
|
41
|
+
except WebhookSignatureError:
|
|
42
|
+
return "", 400
|
|
43
|
+
if event["type"] == "incident.created":
|
|
44
|
+
...
|
|
45
|
+
return "", 200
|
|
46
|
+
"""
|
|
47
|
+
if not signature_header:
|
|
48
|
+
raise WebhookSignatureError("missing X-Kalir-Signature header")
|
|
49
|
+
try:
|
|
50
|
+
parts = dict(p.strip().split("=", 1) for p in signature_header.split(","))
|
|
51
|
+
timestamp = int(parts["t"])
|
|
52
|
+
received = parts["v1"]
|
|
53
|
+
except (KeyError, ValueError) as exc:
|
|
54
|
+
raise WebhookSignatureError("malformed X-Kalir-Signature header") from exc
|
|
55
|
+
|
|
56
|
+
if abs(time.time() - timestamp) > tolerance_seconds:
|
|
57
|
+
raise WebhookSignatureError("signature timestamp outside tolerance (possible replay)")
|
|
58
|
+
|
|
59
|
+
body = raw_body.encode() if isinstance(raw_body, str) else raw_body
|
|
60
|
+
expected = hmac.new(secret.encode(), f"{timestamp}.".encode() + body, hashlib.sha256).hexdigest()
|
|
61
|
+
if not hmac.compare_digest(expected, received):
|
|
62
|
+
raise WebhookSignatureError("signature mismatch")
|
|
63
|
+
return json.loads(body)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: kalir-python
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Official Python SDK for the Kalir Public API — digital risk intelligence and signed webhooks.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Requires-Dist: httpx>=0.23.1,<0.29.0
|
|
7
|
+
Requires-Dist: attrs>=22.2.0
|
|
8
|
+
Requires-Python: >=3.11
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
|
|
11
|
+
# kalir-python
|
|
12
|
+
|
|
13
|
+
Official Python SDK for the [Kalir](https://kalir.io) Public API: your organization's digital-risk intelligence (incidents, credential and infostealer exposure, phishing impersonation, dark-web and Telegram mentions) plus signed webhooks. Typed with `attrs`, built on `httpx`, sync and async.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install kalir-python
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quickstart
|
|
20
|
+
|
|
21
|
+
Create an API key at **app.kalir.io → Developers → API Keys**.
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from kalir import AuthenticatedClient
|
|
25
|
+
from kalir.api.overview import get_overview
|
|
26
|
+
from kalir.api.phishing import list_phishing
|
|
27
|
+
from kalir.api.incidents import list_incidents
|
|
28
|
+
from kalir.models import ListIncidentsBucket, ListPhishingVerdict
|
|
29
|
+
|
|
30
|
+
client = AuthenticatedClient(base_url="https://api.kalir.io", token="klr_…")
|
|
31
|
+
|
|
32
|
+
with client as c:
|
|
33
|
+
overview = get_overview.sync(client=c)
|
|
34
|
+
print(overview.risk_score, overview.incidents.open_critical)
|
|
35
|
+
|
|
36
|
+
phishing = list_phishing.sync(client=c, verdict=ListPhishingVerdict.CONFIRMED)
|
|
37
|
+
for d in phishing.data:
|
|
38
|
+
print(d.domain, "impersonates", d.impersonates)
|
|
39
|
+
|
|
40
|
+
incidents = list_incidents.sync(client=c, bucket=ListIncidentsBucket.OPEN, limit=20)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Every endpoint has four functions: `sync`, `sync_detailed` (status + headers), `asyncio` and `asyncio_detailed`.
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
async with AuthenticatedClient(base_url="https://api.kalir.io", token="klr_…") as c:
|
|
47
|
+
overview = await get_overview.asyncio(client=c)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Errors
|
|
51
|
+
|
|
52
|
+
Error responses share one envelope: `{"error": {"type", "message", "status", "retry_after"}}`. Use the `*_detailed` functions to inspect `status_code`, or pass `raise_on_unexpected_status=True` to the client.
|
|
53
|
+
|
|
54
|
+
## Webhooks
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from kalir.webhooks import construct_event, WebhookSignatureError
|
|
58
|
+
|
|
59
|
+
@app.post("/kalir-webhooks") # Flask
|
|
60
|
+
def kalir_webhooks():
|
|
61
|
+
try:
|
|
62
|
+
event = construct_event(
|
|
63
|
+
request.get_data(), # raw body
|
|
64
|
+
request.headers.get("X-Kalir-Signature"),
|
|
65
|
+
KALIR_WEBHOOK_SECRET, # whsec_…
|
|
66
|
+
)
|
|
67
|
+
except WebhookSignatureError:
|
|
68
|
+
return "", 400
|
|
69
|
+
if event["type"] == "incident.created":
|
|
70
|
+
...
|
|
71
|
+
return "", 200
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Respond `2xx` within 15 seconds. Failed deliveries are retried with exponential backoff for ~20 hours; deduplicate on the `X-Kalir-Event-Id` header.
|
|
75
|
+
|
|
76
|
+
Full reference: <https://app.kalir.io/developers/docs>
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
kalir/__init__.py,sha256=H4kfOIsp1W1wsL4Vd8KHAl9qXmOkcLSW9oxrIB1H7_Q,274
|
|
2
|
+
kalir/api/__init__.py,sha256=87ApBzKyGb5zsgTMOkQXDqsLZCmaSFoJMwbGzCDQZMw,47
|
|
3
|
+
kalir/api/assets/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
4
|
+
kalir/api/assets/create_asset.py,sha256=64kcETxi6NkcjVHlo3lJ3FOe37qO4a7QiAPyiOUe9gY,4030
|
|
5
|
+
kalir/api/assets/delete_asset.py,sha256=vnLFWv3HekfqVhrzNk4IO0wpVEYwLM5MYLB6tJC2iNI,3690
|
|
6
|
+
kalir/api/assets/get_asset.py,sha256=dC6ZKAsLn80yZlizcmy_Tt1n94132sTKBZeiMfuN3BU,3749
|
|
7
|
+
kalir/api/assets/list_assets.py,sha256=4Cnp66bBy4k1wsHFh7S-7AS0Lzr9fqQlzVRQaYk2Oi4,3710
|
|
8
|
+
kalir/api/assets/update_asset.py,sha256=x_B1w7JDuK_GVCEJgPcaRjX8zsQozJq-Eo0I64UaOwI,4235
|
|
9
|
+
kalir/api/events/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
10
|
+
kalir/api/events/get_event.py,sha256=_QLKTRHfXEob9L_GTQg61CS8F0vIb_fYTu2cc2m40pM,3928
|
|
11
|
+
kalir/api/events/ingest_event.py,sha256=zw9cWeaIrS-bQlYmeeqKhuR3HQD3gw5nByvevFMdUgw,4686
|
|
12
|
+
kalir/api/events/list_events.py,sha256=CLiqFMlyW9bSun_upmc3J_9ODn94bFH-TkZWZ4uTNDk,6225
|
|
13
|
+
kalir/api/exposures/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
14
|
+
kalir/api/exposures/count_exposures.py,sha256=GjTZro7xkmU_bS3x8am4pxXAwCXbGCwmxLCMd9qDMcg,3855
|
|
15
|
+
kalir/api/exposures/get_infostealer_summary.py,sha256=Fe-UcVi52CXmNZL10cYVXtI0PwzL1VY6PUFfRIgJEg0,4817
|
|
16
|
+
kalir/api/exposures/list_exposures.py,sha256=ldpeCI0BFQMSEk2PL6hIa6k-5WXh7ADDOauAAOQfiQE,5166
|
|
17
|
+
kalir/api/incidents/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
18
|
+
kalir/api/incidents/get_incident.py,sha256=5Eb2n3v0SOL0uU_5x-jbc7BYpuo0rLFjQOXD9k2LYAg,4167
|
|
19
|
+
kalir/api/incidents/list_incidents.py,sha256=y_TjTLCISC_ukD9vLKMyOjmKhjjrQDziLraXkPzbQLE,6779
|
|
20
|
+
kalir/api/incidents/update_incident_status.py,sha256=5efksDsIN0dF7HzwLDOfN4Vqcs60vlwkTSErGSefVzs,4483
|
|
21
|
+
kalir/api/intel/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
22
|
+
kalir/api/intel/get_ransomware_stats.py,sha256=v2bUHwI6WogYfV7mHD9zSeHzzntUNt7gyHoOX-fA2KU,3899
|
|
23
|
+
kalir/api/intel/list_ransomware_victims.py,sha256=fTs30ChxCWvwrVNqW6w80WhKsdK3KUNwU4TLdPNT-_A,3916
|
|
24
|
+
kalir/api/mentions/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
25
|
+
kalir/api/mentions/list_mentions.py,sha256=a3jxtnuLwNQ7ZepRVUCwWfZJyM-CCVki2H9hsCJaYmA,7707
|
|
26
|
+
kalir/api/overview/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
27
|
+
kalir/api/overview/get_overview.py,sha256=h3becj_UpxVznN6B_Ynmd-1b7kE1CA97VrFQkTib6UQ,4340
|
|
28
|
+
kalir/api/phishing/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
29
|
+
kalir/api/phishing/list_phishing.py,sha256=JoqhF_x53RCfG3Ho711TmQmkXEWwoOdQcO7ReOF_ytc,6111
|
|
30
|
+
kalir/api/reports/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
31
|
+
kalir/api/reports/create_report.py,sha256=9IuEC76YKOY6OvARmIIxrvhtnST_lSvlT44egolIeEY,4108
|
|
32
|
+
kalir/api/reports/download_report.py,sha256=7el9b5s-cWfWXYU2pmIVMwGL6yMQYbG7i9HlJd5nnVk,3732
|
|
33
|
+
kalir/api/reports/list_reports.py,sha256=kbunY8aNNiNyAS6Jk_dSRIMTvWzIGIr57WkwFKR-7OQ,3728
|
|
34
|
+
kalir/api/rules/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
35
|
+
kalir/api/rules/create_rule.py,sha256=iSoHn7h_LqC98KK-H2hFyjnC97KywkHu702pmSnGSvU,3986
|
|
36
|
+
kalir/api/rules/delete_rule.py,sha256=6UAR7pzO_kI0uCvyfn01_Mvdve7V7c9WQlO8M_AHS_Q,3712
|
|
37
|
+
kalir/api/rules/get_rule.py,sha256=8KiuZKv5Rw_VQT8eHG9O0_5lIdspHq0x8M0_8RE4sjY,3758
|
|
38
|
+
kalir/api/rules/list_rules.py,sha256=y6ODTh0VMZR1j7ye0yIO6m8QgGKjOB8O6P1JOpcZVLo,3692
|
|
39
|
+
kalir/api/rules/replace_rule.py,sha256=wYvIO9Rc2GnIM7BP1cZQYV1BTOS9-d8H1FEsJH3dPfg,4226
|
|
40
|
+
kalir/api/takedowns/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
41
|
+
kalir/api/takedowns/count_takedowns.py,sha256=W616mLbcI8CwFWu1NVYoclYHTKjAL9timqOpYlcWUhI,3788
|
|
42
|
+
kalir/api/takedowns/create_takedown.py,sha256=yQIlaW1ySgz4bGqN_vH6o1_jUibuc68mq0B-4ojAUbY,4145
|
|
43
|
+
kalir/api/takedowns/delete_takedown.py,sha256=CxbzZtXMTIZpboYbKWW2VO-ZC1Y-0J23qPCfQySOAO8,3732
|
|
44
|
+
kalir/api/takedowns/get_takedown.py,sha256=lVorzKpM1at5sbwXd0keCcOxeVHxCWjA94N1syjInI4,3830
|
|
45
|
+
kalir/api/takedowns/list_takedowns.py,sha256=nCy7E-XpwuPETeb2hYCdRN9UgbEZ8tMn91C62QrjA_I,3796
|
|
46
|
+
kalir/api/takedowns/replace_takedown.py,sha256=Gfeyzcobr_IyP-XpeXr4pxMtpYA4dGNC7cszVHH96f4,4608
|
|
47
|
+
kalir/api/takedowns/update_takedown.py,sha256=gLwPHY4txRCX-ScRQ0tnInT1fO_HNJ2Eaqyo-qI6ozs,4542
|
|
48
|
+
kalir/api/webhooks/__init__.py,sha256=wYN6A3_bvYW13B1J9YvYCmcv5Els-q-E07kZJwJ7Vto,58
|
|
49
|
+
kalir/api/webhooks/create_webhook.py,sha256=Bh-MzCd8joA77KrVf8Qa1DRcl1btRRvoBoioutmA7Fs,5166
|
|
50
|
+
kalir/api/webhooks/delete_webhook.py,sha256=Zj1POhzP2VOoV2C8seqpQk03I0jn5Y2AYO0TdZezpFs,3887
|
|
51
|
+
kalir/api/webhooks/get_webhook.py,sha256=uhcduHbZPMoEmoG9egb6QDruUGJRzxITZCu9DfLG36w,4077
|
|
52
|
+
kalir/api/webhooks/get_webhook_delivery.py,sha256=BFdIfmCXDPv7lm-SLJdC5qV51WLlgDHbHMXyNGPizLM,4115
|
|
53
|
+
kalir/api/webhooks/list_webhook_deliveries.py,sha256=_wS5PqJf5FxfDdZ-dXaGCQw8bXSsxAMPbvcv-TY6Jy4,5682
|
|
54
|
+
kalir/api/webhooks/list_webhook_event_types.py,sha256=sDvXWco-9CgU-ErbVfrseHEjbf73fOzf1UsL_NshOGk,3941
|
|
55
|
+
kalir/api/webhooks/list_webhooks.py,sha256=HN0AHdYy1bW7Bk9BYnRkpRIFr7YOB0FWLqFL8wKb9HU,3906
|
|
56
|
+
kalir/api/webhooks/retry_webhook_delivery.py,sha256=DNf3GRffTtXh1bQonQnB1Ofuewl_ACdoUs6XIi-5AFg,3853
|
|
57
|
+
kalir/api/webhooks/rotate_webhook_secret.py,sha256=AHhlpKz2luoGAuwo7DluMFsgsN6jGHBanKF4FR8-iyk,4634
|
|
58
|
+
kalir/api/webhooks/send_webhook_test.py,sha256=hdzniXS6dhqOtKVr-crTEdcVJLUE7ci5RlBG-RtHPho,4423
|
|
59
|
+
kalir/api/webhooks/update_webhook.py,sha256=iM5flDNy94fIiJneZC2PlYrm94WydWu_kTwWpGpGb3M,5181
|
|
60
|
+
kalir/client.py,sha256=DHrMMBAjNo246WrkD6e8CTsC-xgljCIMj9VtSR2azYU,12309
|
|
61
|
+
kalir/errors.py,sha256=trp-p5qn1_JLRxGZhdHtICaNPaCrcDCe4TgIihBravk,546
|
|
62
|
+
kalir/models/__init__.py,sha256=DT8C2Z0PJApSz-jrK8qMqYAXV7kk-9SWK7pwM0nUzHo,8453
|
|
63
|
+
kalir/models/asset.py,sha256=PzV3z1gcgRfCX1P_hR6-G4sLkM_38yUKnP1lH0QkbJo,4281
|
|
64
|
+
kalir/models/asset_create.py,sha256=Dg77hZ49OOVzGl5lDdusZPuFi7NMmvSM8L6wVt-McJ4,3133
|
|
65
|
+
kalir/models/asset_create_asset_type.py,sha256=qusQooLTvrO7Nj1EHA3PLuJrpw--4YcpP383Lq6J1vs,301
|
|
66
|
+
kalir/models/asset_create_metadata.py,sha256=sXYSAeUNDibWcddABDz5SPDGDZAfNxMM4rOC01daWos,1382
|
|
67
|
+
kalir/models/count_exposures_response_200.py,sha256=609vdrI_ChUcs9n64yPhwtNx8eVI9pPfEggWOfrgZH8,1739
|
|
68
|
+
kalir/models/count_takedowns_response_200.py,sha256=gslKa4ren0nJH56UcrlbokXjIPjn1tbAXrxZ1bdQ_Gs,2237
|
|
69
|
+
kalir/models/create_report_body.py,sha256=am-ZdZvZ03G_gNXL3VTr-ZGjeAMUfcBjdzTHOXl5d54,2243
|
|
70
|
+
kalir/models/create_report_body_type.py,sha256=HJKAzbr6va97atWwneS1tlmdnuYvy7h2kQKzsqV8zmc,287
|
|
71
|
+
kalir/models/create_webhook_response_201.py,sha256=moC_1l0JcOHbxVi2-Bvg_EYtg9yLYWSdNyNmesBBZNI,2860
|
|
72
|
+
kalir/models/error.py,sha256=ibyKuZbutHQMDO_AjQHpPzDg-uzCVzEkOvaHz-lUyBQ,1796
|
|
73
|
+
kalir/models/error_error.py,sha256=9POZiGtmTioFZbTepztv7KRJd6I-DRer_AeB1GF9NGc,2398
|
|
74
|
+
kalir/models/error_error_type.py,sha256=JyUy0JMJT37mx4RdRvwpFtmVeK6lkSQeNapNe6fUcX0,511
|
|
75
|
+
kalir/models/event.py,sha256=BYAVhNax3SdmdpuxeaVWFsjNcpCuLJgAN8xKpFkr_oA,3918
|
|
76
|
+
kalir/models/event_asset.py,sha256=CG2JA6NH0jmTHSO92uEpNmn50iwaKI60Pn46ttWIXAI,1938
|
|
77
|
+
kalir/models/event_ingest.py,sha256=MUT2XCTspK-iGYxKVuekKk_dg15maJIXikFtOiaGqbU,4073
|
|
78
|
+
kalir/models/event_ingest_asset.py,sha256=Z7W_qW8oqWxOMx3m_KrmWvBeFidN6aAovotBQ0DuFaY,2012
|
|
79
|
+
kalir/models/event_ingest_evidence.py,sha256=mITHRe3zJmiYuQ-VkQ1jhmRRQoZhB9pvucHui1fwmhE,1382
|
|
80
|
+
kalir/models/event_ingest_source.py,sha256=pocyiuedkvNF8CRMgm4tmXRL0QT51RPHq__WJ_D8f_A,1899
|
|
81
|
+
kalir/models/exposure.py,sha256=fd8Du_CGZmWa0rydX3Gk1ioRFsIJcZiLjjGiUh4O1K4,3431
|
|
82
|
+
kalir/models/exposure_webhook_event.py,sha256=qBRgRKuBh3WA9VPWvn5wDrYykd7LSWovVxa8nY7WzlE,4095
|
|
83
|
+
kalir/models/exposure_webhook_event_data.py,sha256=Hbaw5qLH9XCIQgNvBXk2dxSizsWjCaSsB5Chr5YZ5SQ,3563
|
|
84
|
+
kalir/models/exposure_webhook_event_data_exposure.py,sha256=6WhYwyxIT-iWTUkCy9dCz7FkrtfoI-J5LV86-vVIR5w,3900
|
|
85
|
+
kalir/models/exposure_webhook_event_data_infection.py,sha256=g2UsnEyFzRYNqUG3Gjg7SLzGqUUe6CAeJ-t1efkyqoU,4055
|
|
86
|
+
kalir/models/exposure_webhook_event_type.py,sha256=vvzqVpNbQp3LI9zA7S2Y5vpDWUnHuHbugy23B-p5loM,223
|
|
87
|
+
kalir/models/get_incident_response_200.py,sha256=2HnP4b-imUlCccHfAY_jmtkrWJkkCQT2G6f9LsOCFe0,5141
|
|
88
|
+
kalir/models/get_infostealer_summary_response_200.py,sha256=wf5njESqXRempTLodDigo6HMxSrBp-OBPRWmDWcObZs,2722
|
|
89
|
+
kalir/models/get_ransomware_stats_response_200.py,sha256=SwsphYgvBln05rWfzKn_v074YqMegZ_Bvwu4Pzgo-zE,5444
|
|
90
|
+
kalir/models/get_ransomware_stats_response_200_top_countries_7d_item.py,sha256=R3dhJLAnMBVhVsB34iSzAGG8901BuaFdxdoApgk87As,1540
|
|
91
|
+
kalir/models/get_ransomware_stats_response_200_top_groups_7d_item.py,sha256=UTO97meJLerIxlLCZyPvKNpe2wJ4EeF8c9QPmH49cto,1525
|
|
92
|
+
kalir/models/incident.py,sha256=P46A5wMpGNO6pbBSKA2dAsJdazWfuMP42px9cyE_a0k,4417
|
|
93
|
+
kalir/models/incident_severity.py,sha256=TD2hz9vG59AtYC0Uv9syuSY80FUEPOufOWNJEYFXwAc,203
|
|
94
|
+
kalir/models/incident_status.py,sha256=j5MCAuJb7pPkDvsg4LsQ1kPQNK-MqjzNveCoE2Z14wU,221
|
|
95
|
+
kalir/models/incident_webhook_event.py,sha256=i3z9r3kgtAFQ2KExJtK3zPBZ6yjI5SPLiHj9qJaEWfA,4095
|
|
96
|
+
kalir/models/incident_webhook_event_data.py,sha256=MKeU4s33q-uq-QFyA1AwxfcpvGZuFIRQifp0pGRLCDc,3352
|
|
97
|
+
kalir/models/incident_webhook_event_data_previous.py,sha256=UTI7tGLu-S909micTdKdYfbBznNpcZALcSW7RXzDGoI,2074
|
|
98
|
+
kalir/models/incident_webhook_event_type.py,sha256=Jc9M25Zj66y5-9hSqYcVq8y-thLIKUI_psPURuOTiSs,257
|
|
99
|
+
kalir/models/infostealer_domain_summary.py,sha256=SLtq6ohc0PXJyTp0Np1CKqujJW_HHvTtbH1dx9wTyPU,3437
|
|
100
|
+
kalir/models/infostealer_domain_summary_snapshot.py,sha256=pJq41gHxaQru-axYLvP43b064lJ8Nz0uQZ2eIGX1e98,7395
|
|
101
|
+
kalir/models/infostealer_domain_summary_snapshot_top_employee_urls_item.py,sha256=HPUsqsurr2GSw8qzOwcyVmN2IYkm4Ro_PKe1sF-vWM0,2141
|
|
102
|
+
kalir/models/infostealer_domain_summary_snapshot_top_families_item.py,sha256=7GXSM_o2FJp3vHCRTOEnxdm0PXsM6lzlWa-vsXCKjc4,2096
|
|
103
|
+
kalir/models/list_assets_response_200.py,sha256=tNgsqdb_87YEtX3ANsDvMNguGwBJu_mTMGVR8Par8LA,2441
|
|
104
|
+
kalir/models/list_events_response_200.py,sha256=lzPxyjqa7QK_YEXnRgznLb8jD_o-mcrtwm9Yf27BKS8,2668
|
|
105
|
+
kalir/models/list_exposures_response_200.py,sha256=VJb-CXq0H-0mH0CXtHiHYEgxe0j-dWgmx_yI5OGJpXY,3259
|
|
106
|
+
kalir/models/list_incidents_bucket.py,sha256=l_aPADcDCXTZiEqm26r_6zCttjb9lls76TXOLL8-cgU,238
|
|
107
|
+
kalir/models/list_incidents_response_200.py,sha256=DCh-OAdMJR_TmuiA660dNF_dc5I9VGFZ87XBOTkjhfo,4219
|
|
108
|
+
kalir/models/list_incidents_response_200_counts.py,sha256=Eba5oKO78m35afZQZPcZqg_A80zmO9bfHAGEYlBG76M,2682
|
|
109
|
+
kalir/models/list_incidents_status.py,sha256=zs-PgUbAEQ_x3CK40tphWl_Qd7oYxnozEsWDPcenaRI,290
|
|
110
|
+
kalir/models/list_mentions_response_200.py,sha256=PneujQkQPobf95luCy-xo2IDU1r8ofp2FlIjvQOSuNA,3199
|
|
111
|
+
kalir/models/list_mentions_source.py,sha256=C7RK3r-HAw-9dyx9hdpIi6FSXmd6n1Q3I_1a6JtZCls,173
|
|
112
|
+
kalir/models/list_phishing_response_200.py,sha256=nXRdhM-h75obBxKnmSqkM2QqBGSBGNEFCtQdwfCi5_4,3272
|
|
113
|
+
kalir/models/list_phishing_verdict.py,sha256=CP5yMOY1MAydu_6YNJrYIDvb-D3_e3QiZlZ9iuSul5Y,266
|
|
114
|
+
kalir/models/list_ransomware_victims_response_200.py,sha256=YwgJzEBqwN4dgu4dNLVp92Jegqx_FM-iJ5FhMsVFijg,3151
|
|
115
|
+
kalir/models/list_ransomware_victims_response_200_victims_item.py,sha256=w1M6T4cWpbcqjTcXj_j7fqsNvgpANxHeIto2wTZW4XQ,1514
|
|
116
|
+
kalir/models/list_reports_response_200.py,sha256=RJ9yRKax0LGkZ6DuSFkSF2Y1AVqQn7bFGqeGRU_wPdE,2710
|
|
117
|
+
kalir/models/list_rules_response_200.py,sha256=RpAWLf2vPZTC7X55gZ3PRlxzPB1mDO-WPHSDn_nZibk,2399
|
|
118
|
+
kalir/models/list_takedowns_response_200.py,sha256=Tb2NgrNUm8JUiBQ9b8oDiLJLi2__Czy5D2LJICqg8eI,2794
|
|
119
|
+
kalir/models/list_webhook_deliveries_response_200.py,sha256=21QrRINwPQlwSmqNe80irl-eeo1_DzlDneK1gsT-ziQ,3330
|
|
120
|
+
kalir/models/list_webhook_event_types_response_200.py,sha256=dA1GhL4cT-RKbcPJWdTFnlDdGJrADCf7eMwWgqaDC1k,2819
|
|
121
|
+
kalir/models/list_webhook_event_types_response_200_data_item.py,sha256=-g2kxxIuFZVPE_L4Z7qBP8W8Ob_q0_tDItNuF4IteLk,2117
|
|
122
|
+
kalir/models/list_webhooks_response_200.py,sha256=_EJ0L4Ev_D-ukPCNeqGdKlzwQy_2jtcUNWILK6r9cjk,2500
|
|
123
|
+
kalir/models/mention.py,sha256=YaRpQpXqw8B06MEaz1RU8algKuUvA-ignEVe_5qOIjg,5020
|
|
124
|
+
kalir/models/mention_source.py,sha256=7_QWZClqdA9RvJt5QexztURtj1g3K-a-Bb1ICDgrc6k,168
|
|
125
|
+
kalir/models/overview.py,sha256=VeInXwIpjJltuCaI8aXsHy6IWNQRa6rpofbTK_ijdew,7159
|
|
126
|
+
kalir/models/overview_assets.py,sha256=6Ne04vmW84oWWnWACZIneugws87YCQaiUkaIBBf6-Jc,2286
|
|
127
|
+
kalir/models/overview_exposures.py,sha256=SR10aPQbAV69zLEjBaOByobl-qxHTDAWId6dvreGhOU,2887
|
|
128
|
+
kalir/models/overview_incidents.py,sha256=0LcvAgzbNUOxvM8Yj53DQ0zAJMFZpLKBbx-qXopUXaA,2887
|
|
129
|
+
kalir/models/overview_phishing.py,sha256=tiosmgdJ7AkzuW6-q2pGFlERpMhD0IesOCPH6Yi0Cx8,1970
|
|
130
|
+
kalir/models/overview_risk_level.py,sha256=NJP57yOckIY0IYJURct6uPl_Lp5czw-uTvxtp0TZ39g,204
|
|
131
|
+
kalir/models/overview_takedowns.py,sha256=dz7JfvhpUsScV8iGg83SaAqfrEmCjzNYUCEwQ-zNbMc,1951
|
|
132
|
+
kalir/models/pagination.py,sha256=BpQOoLt7uXyPLWm_plitVe0PpBe9JlcTG3rpEnjLeys,2382
|
|
133
|
+
kalir/models/phishing_domain.py,sha256=hIy-Y-3t-5rrVDuNGiZpGws2r2BSfOyr1uazHQpZy5c,5176
|
|
134
|
+
kalir/models/phishing_domain_verdict.py,sha256=_XCyacjppuO0EuBC_ym4QvvPwijsZ2Ucnbw3Zsj_66U,268
|
|
135
|
+
kalir/models/report.py,sha256=yKtymi81cWd7adkZoaV1e3RB8YV8wW1rH83EPQmH3xI,4818
|
|
136
|
+
kalir/models/report_parameters.py,sha256=erFq6JjMp-Wngv-maPO_EOfVYHOTZo7sZ03Q-zLumKY,4938
|
|
137
|
+
kalir/models/report_parameters_date_range.py,sha256=MXJeOal_VssDUyIirAGbMnLakjunNB2bsjrYwvt_5Oo,231
|
|
138
|
+
kalir/models/report_parameters_language.py,sha256=IDcpGrj54TN3GQpLfxStKRjakEt6qMzFG-GAoRIAMVw,157
|
|
139
|
+
kalir/models/report_parameters_sections_item.py,sha256=1C5H3povzwkhAjbBsHBVX6mxeHs3ZVqemidFlE8FyBQ,403
|
|
140
|
+
kalir/models/report_status.py,sha256=EtoBfN7q88GHqx3ym4NxTitHkwqTcILCoLzrbMoihJ4,221
|
|
141
|
+
kalir/models/rotate_webhook_secret_response_200.py,sha256=FMPr9ltJ87U-vCNZgtPM2v5dKONn3mysgmJAP0cU6IA,2027
|
|
142
|
+
kalir/models/rule.py,sha256=ucA-W7oqEDvvsH53-Sj5Id2MFCEi_qZ203pHl3nenxY,4607
|
|
143
|
+
kalir/models/rule_input.py,sha256=aMv9pUSkj_h0TL46gtpv15owQHSa5ALTaLqiNmmHVro,3472
|
|
144
|
+
kalir/models/rule_input_actions_item.py,sha256=92vOmDABMk4PWcxZfbp-NrdPqZ0hLACa2ClTMDWhST8,1390
|
|
145
|
+
kalir/models/takedown.py,sha256=mExaHTmLY0L22d_90WE2vfTV7kKGfhe74PbF93jU11s,4232
|
|
146
|
+
kalir/models/takedown_create.py,sha256=APKHHXb_uzwKzvwS1ljisEhjmRgy77GTJeNENbVaRt8,2768
|
|
147
|
+
kalir/models/takedown_update.py,sha256=xHETKuf636tnSo574YKh3v-UDeeSv0-ut8z86stH0Xo,2176
|
|
148
|
+
kalir/models/update_incident_status_body.py,sha256=-2EKPWp15Go6gaGBkCj9CaedzjNAlU-fMtxUo0Vc1f8,2128
|
|
149
|
+
kalir/models/update_incident_status_body_status.py,sha256=yPXaOaGBXEOy64Amcq8McsdUun_YjoDgSmZNUBTuidM,237
|
|
150
|
+
kalir/models/webhook_delivery.py,sha256=BvDaDIX3NjoOHVrffnpA4zsApfA2hFiOZzKtiAr6WQU,7966
|
|
151
|
+
kalir/models/webhook_delivery_payload.py,sha256=nt1meN41asUDaV8wZ9Jl9jER6BrWcwmHmvVG0yE_bg4,1397
|
|
152
|
+
kalir/models/webhook_delivery_status.py,sha256=pbM260wmFSDwfL9jDe28lhe8U_V73NMwY3Avyv41YT4,200
|
|
153
|
+
kalir/models/webhook_endpoint.py,sha256=JYuYhIVF0cL8hNSppQoNEq0hNcPDk2F_CscnEshOaGI,6112
|
|
154
|
+
kalir/models/webhook_endpoint_input.py,sha256=Ida6-pkaqlZspEaWdfD_NjvhBdzCFlmrPXBdbZ7K9XA,3417
|
|
155
|
+
kalir/models/webhook_endpoint_input_event_types_item.py,sha256=hHHaown4razbfrgK7Q9G0QsWiF1f9suTXN5UWBpHrMA,361
|
|
156
|
+
kalir/models/webhook_incident.py,sha256=CF6YrpUFK-8WnwoEwk5rIkoZWRkAD_dxZAUTPDo0KKc,6420
|
|
157
|
+
kalir/models/webhook_incident_severity.py,sha256=DsO5gg17WPlP-JI6Q6DfzSRwbvVyQbBv2_y981oU7Mw,210
|
|
158
|
+
kalir/py.typed,sha256=8ZJUsxZiuOy1oJeVhsTWQhTG_6pTVHVXk5hJL79ebTk,25
|
|
159
|
+
kalir/types.py,sha256=k9-ddYg6Tq-sd90hvGkH8-9hLj94QeCGVmGNz2xM5JQ,1350
|
|
160
|
+
kalir/webhooks.py,sha256=L79TZ09MW-KEW-XAs6dLtLcT5Dh5IGibhyZIjhfJg-s,2189
|
|
161
|
+
kalir_python-0.1.0.dist-info/WHEEL,sha256=7hzKWg-J8I3Buqyw5tBii5z_MmAVsDYXXijd_QAtNZ8,81
|
|
162
|
+
kalir_python-0.1.0.dist-info/METADATA,sha256=PKeWkY2eKI6XCyqr2sBNeFLkMHBBA81V2KJo-g45RfE,2681
|
|
163
|
+
kalir_python-0.1.0.dist-info/RECORD,,
|