Skip to content

Commit cb7c35e

Browse files
committed
vault events
1 parent 2c5bed9 commit cb7c35e

File tree

6 files changed

+272
-0
lines changed

6 files changed

+272
-0
lines changed

src/workos/types/events/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@
1313
from .organization_domain_verification_failed_payload import *
1414
from .previous_attributes import *
1515
from .session_payload import *
16+
from .vault_payload import *

src/workos/types/events/event.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@
5353
SessionCreatedPayload,
5454
SessionRevokedPayload,
5555
)
56+
from workos.types.events.vault_payload import (
57+
VaultDataCreatedPayload,
58+
VaultDataDeletedPayload,
59+
VaultDataReadPayload,
60+
VaultDekDecryptedPayload,
61+
VaultDekReadPayload,
62+
VaultKekCreatedPayload,
63+
VaultNamesListedPayload,
64+
)
5665
from workos.types.organizations.organization_common import OrganizationCommon
5766
from workos.types.organization_domains import OrganizationDomain
5867
from workos.types.roles.role import EventRole
@@ -372,6 +381,42 @@ class UserUpdatedEvent(EventModel[User]):
372381
event: Literal["user.updated"]
373382

374383

384+
class VaultDataCreatedEvent(EventModel[VaultDataCreatedPayload]):
385+
event: Literal["vault.data.created"]
386+
387+
388+
class VaultDataDeletedEvent(EventModel[VaultDataDeletedPayload]):
389+
event: Literal["vault.data.deleted"]
390+
391+
392+
class VaultDataReadEvent(EventModel[VaultDataReadPayload]):
393+
event: Literal["vault.data.read"]
394+
395+
396+
class VaultDataUpdatedEvent(EventModel[VaultDataCreatedPayload]):
397+
event: Literal["vault.data.updated"]
398+
399+
400+
class VaultDekDecryptedEvent(EventModel[VaultDekDecryptedPayload]):
401+
event: Literal["vault.dek.decrypted"]
402+
403+
404+
class VaultDekReadEvent(EventModel[VaultDekReadPayload]):
405+
event: Literal["vault.dek.read"]
406+
407+
408+
class VaultKekCreatedEvent(EventModel[VaultKekCreatedPayload]):
409+
event: Literal["vault.kek.created"]
410+
411+
412+
class VaultMetadataReadEvent(EventModel[VaultDataDeletedPayload]):
413+
event: Literal["vault.metadata.read"]
414+
415+
416+
class VaultNamesListedEvent(EventModel[VaultNamesListedPayload]):
417+
event: Literal["vault.names.listed"]
418+
419+
375420
Event = Annotated[
376421
Union[
377422
ApiKeyCreatedEvent,
@@ -443,6 +488,15 @@ class UserUpdatedEvent(EventModel[User]):
443488
UserCreatedEvent,
444489
UserDeletedEvent,
445490
UserUpdatedEvent,
491+
VaultDataCreatedEvent,
492+
VaultDataDeletedEvent,
493+
VaultDataReadEvent,
494+
VaultDataUpdatedEvent,
495+
VaultDekDecryptedEvent,
496+
VaultDekReadEvent,
497+
VaultKekCreatedEvent,
498+
VaultMetadataReadEvent,
499+
VaultNamesListedEvent,
446500
],
447501
Field(..., discriminator="event"),
448502
]

src/workos/types/events/event_model.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@
5050
SessionCreatedPayload,
5151
SessionRevokedPayload,
5252
)
53+
from workos.types.events.vault_payload import (
54+
VaultDataCreatedPayload,
55+
VaultDataDeletedPayload,
56+
VaultDataReadPayload,
57+
VaultDekDecryptedPayload,
58+
VaultDekReadPayload,
59+
VaultKekCreatedPayload,
60+
VaultNamesListedPayload,
61+
)
5362
from workos.types.organizations.organization_common import OrganizationCommon
5463
from workos.types.organization_domains import OrganizationDomain
5564
from workos.types.authorization.organization_role import OrganizationRoleEvent
@@ -110,6 +119,13 @@
110119
SessionCreatedPayload,
111120
SessionRevokedPayload,
112121
User,
122+
VaultDataCreatedPayload,
123+
VaultDataDeletedPayload,
124+
VaultDataReadPayload,
125+
VaultDekDecryptedPayload,
126+
VaultDekReadPayload,
127+
VaultKekCreatedPayload,
128+
VaultNamesListedPayload,
113129
)
114130

115131

src/workos/types/events/event_type.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@
7474
"user.created",
7575
"user.deleted",
7676
"user.updated",
77+
"vault.data.created",
78+
"vault.data.deleted",
79+
"vault.data.read",
80+
"vault.data.updated",
81+
"vault.dek.decrypted",
82+
"vault.dek.read",
83+
"vault.kek.created",
84+
"vault.metadata.read",
85+
"vault.names.listed",
7786
]
7887

7988
EventTypeDiscriminator = TypeVar("EventTypeDiscriminator", bound=EventType)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from typing import List, Optional
2+
3+
from workos.types.vault.key import KeyContext
4+
from workos.types.workos_model import WorkOSModel
5+
6+
7+
class VaultNamesListedPayload(WorkOSModel):
8+
actor_id: str
9+
actor_source: str
10+
actor_name: Optional[str] = None
11+
12+
13+
class VaultDataDeletedPayload(WorkOSModel):
14+
actor_id: str
15+
actor_source: str
16+
actor_name: Optional[str] = None
17+
kv_name: str
18+
19+
20+
class VaultDekDecryptedPayload(WorkOSModel):
21+
actor_id: str
22+
actor_source: str
23+
actor_name: Optional[str] = None
24+
key_id: str
25+
26+
27+
class VaultDataReadPayload(WorkOSModel):
28+
actor_id: str
29+
actor_source: str
30+
actor_name: Optional[str] = None
31+
kv_name: str
32+
key_id: str
33+
34+
35+
class VaultDataCreatedPayload(WorkOSModel):
36+
actor_id: str
37+
actor_source: str
38+
actor_name: Optional[str] = None
39+
kv_name: str
40+
key_id: str
41+
key_context: KeyContext
42+
43+
44+
class VaultDekReadPayload(WorkOSModel):
45+
actor_id: str
46+
actor_source: str
47+
actor_name: Optional[str] = None
48+
key_ids: List[str]
49+
key_context: KeyContext
50+
51+
52+
class VaultKekCreatedPayload(WorkOSModel):
53+
actor_id: str
54+
actor_source: str
55+
actor_name: Optional[str] = None
56+
key_name: str
57+
key_id: str

tests/test_events.py

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
from tests.utils.syncify import syncify
66
from workos.events import AsyncEvents, Events, EventsListResource
77
from workos.types.events import OrganizationMembershipCreatedEvent
8+
from workos.types.events.event import (
9+
VaultDataCreatedEvent,
10+
VaultDekReadEvent,
11+
VaultNamesListedEvent,
12+
)
813

914

1015
@pytest.mark.sync_and_async(Events, AsyncEvents)
@@ -86,3 +91,133 @@ def test_list_events_organization_membership_missing_custom_attributes(
8691
event = events.data[0]
8792
assert isinstance(event, OrganizationMembershipCreatedEvent)
8893
assert event.data.custom_attributes == {}
94+
95+
def test_list_events_vault_data_created(
96+
self,
97+
module_instance: Union[Events, AsyncEvents],
98+
capture_and_mock_http_client_request,
99+
):
100+
mock_response = {
101+
"object": "list",
102+
"data": [
103+
{
104+
"object": "event",
105+
"id": "event_vault_01",
106+
"event": "vault.data.created",
107+
"data": {
108+
"actor_id": "user_01234",
109+
"actor_source": "dashboard",
110+
"actor_name": "Test User",
111+
"kv_name": "my-secret",
112+
"key_id": "key_01234",
113+
"key_context": {"env": "production"},
114+
},
115+
"created_at": "2024-01-01T00:00:00.000Z",
116+
}
117+
],
118+
"list_metadata": {
119+
"after": None,
120+
},
121+
}
122+
123+
capture_and_mock_http_client_request(
124+
http_client=module_instance._http_client,
125+
status_code=200,
126+
response_dict=mock_response,
127+
)
128+
129+
events: EventsListResource = syncify(
130+
module_instance.list_events(events=["vault.data.created"])
131+
)
132+
133+
event = events.data[0]
134+
assert isinstance(event, VaultDataCreatedEvent)
135+
assert event.data.actor_id == "user_01234"
136+
assert event.data.actor_source == "dashboard"
137+
assert event.data.actor_name == "Test User"
138+
assert event.data.kv_name == "my-secret"
139+
assert event.data.key_id == "key_01234"
140+
assert event.data.key_context.root == {"env": "production"}
141+
142+
def test_list_events_vault_dek_read(
143+
self,
144+
module_instance: Union[Events, AsyncEvents],
145+
capture_and_mock_http_client_request,
146+
):
147+
mock_response = {
148+
"object": "list",
149+
"data": [
150+
{
151+
"object": "event",
152+
"id": "event_vault_02",
153+
"event": "vault.dek.read",
154+
"data": {
155+
"actor_id": "user_01234",
156+
"actor_source": "api",
157+
"key_ids": ["key_01", "key_02"],
158+
"key_context": {"tenant": "acme"},
159+
},
160+
"created_at": "2024-01-01T00:00:00.000Z",
161+
}
162+
],
163+
"list_metadata": {
164+
"after": None,
165+
},
166+
}
167+
168+
capture_and_mock_http_client_request(
169+
http_client=module_instance._http_client,
170+
status_code=200,
171+
response_dict=mock_response,
172+
)
173+
174+
events: EventsListResource = syncify(
175+
module_instance.list_events(events=["vault.dek.read"])
176+
)
177+
178+
event = events.data[0]
179+
assert isinstance(event, VaultDekReadEvent)
180+
assert event.data.key_ids == ["key_01", "key_02"]
181+
assert event.data.key_context.root == {"tenant": "acme"}
182+
assert event.data.actor_name is None
183+
184+
def test_list_events_vault_names_listed(
185+
self,
186+
module_instance: Union[Events, AsyncEvents],
187+
capture_and_mock_http_client_request,
188+
):
189+
mock_response = {
190+
"object": "list",
191+
"data": [
192+
{
193+
"object": "event",
194+
"id": "event_vault_03",
195+
"event": "vault.names.listed",
196+
"data": {
197+
"actor_id": "user_01234",
198+
"actor_source": "api",
199+
"actor_name": "Service Account",
200+
},
201+
"created_at": "2024-01-01T00:00:00.000Z",
202+
}
203+
],
204+
"list_metadata": {
205+
"after": None,
206+
},
207+
}
208+
209+
capture_and_mock_http_client_request(
210+
http_client=module_instance._http_client,
211+
status_code=200,
212+
response_dict=mock_response,
213+
)
214+
215+
events: EventsListResource = syncify(
216+
module_instance.list_events(events=["vault.names.listed"])
217+
)
218+
219+
event = events.data[0]
220+
assert isinstance(event, VaultNamesListedEvent)
221+
assert event.data.actor_id == "user_01234"
222+
assert event.data.actor_source == "api"
223+
assert event.data.actor_name == "Service Account"

0 commit comments

Comments
 (0)