Skip to content

Commit 40dacae

Browse files
committed
Merge branch 'dev/1.30' of https://github.com/weaviate/weaviate-python-client into poc-separate-sync-and-async
2 parents 6c46ad4 + 81d6b13 commit 40dacae

4 files changed

Lines changed: 59 additions & 21 deletions

File tree

integration/test_users.py

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ def test_get_user_roles_db(client_factory: ClientFactory) -> None:
3434
with client_factory(ports=RBAC_PORTS, auth_credentials=RBAC_AUTH_CREDS) as client:
3535
if client._connection._weaviate_version.is_lower_than(1, 30, 0):
3636
pytest.skip("This test requires Weaviate 1.30.0 or higher")
37-
roles_base = client.users.db.get_assigned_roles("admin-user")
37+
roles_base = client.users.db.get_assigned_roles(user_id="admin-user")
3838
names = list(roles_base.keys())
3939
assert len(roles_base) > 0
4040
assert isinstance(roles_base[names[0]], RoleBase)
4141

42-
roles = client.users.db.get_assigned_roles("admin-user", include_permissions=True)
42+
roles = client.users.db.get_assigned_roles(user_id="admin-user", include_permissions=True)
4343
assert len(roles) > 0
4444
assert isinstance(roles[names[0]], Role)
4545

@@ -48,12 +48,12 @@ def test_get_user_roles_oidc(client_factory: ClientFactory) -> None:
4848
with client_factory(ports=RBAC_PORTS, auth_credentials=RBAC_AUTH_CREDS) as client:
4949
if client._connection._weaviate_version.is_lower_than(1, 30, 0):
5050
pytest.skip("This test requires Weaviate 1.30.0 or higher")
51-
roles_base = client.users.oidc.get_assigned_roles("admin-user")
51+
roles_base = client.users.oidc.get_assigned_roles(user_id="admin-user")
5252
names = list(roles_base.keys())
5353
assert len(roles_base) > 0
5454
assert isinstance(roles_base[names[0]], RoleBase)
5555

56-
roles = client.users.oidc.get_assigned_roles("admin-user", include_permissions=True)
56+
roles = client.users.oidc.get_assigned_roles(user_id="admin-user", include_permissions=True)
5757
assert len(roles) > 0
5858
assert isinstance(roles[names[0]], Role)
5959

@@ -154,6 +154,42 @@ def test_de_activate(client_factory: ClientFactory) -> None:
154154
client.users.db.delete(user_id=randomUserName)
155155

156156

157+
def test_deactivate_and_revoke(client_factory: ClientFactory) -> None:
158+
with client_factory(ports=RBAC_PORTS, auth_credentials=Auth.api_key("admin-key")) as client:
159+
if client._connection._weaviate_version.is_lower_than(1, 30, 0):
160+
pytest.skip("This test requires Weaviate 1.30.0 or higher")
161+
162+
randomUserName = "new-user" + str(random.randint(1, 1000))
163+
apiKeyOld = client.users.db.create(user_id=randomUserName)
164+
assert client.users.db.deactivate(user_id=randomUserName, revoke_key=True)
165+
166+
with pytest.raises(weaviate.exceptions.UnexpectedStatusCodeError):
167+
weaviate.connect_to_local(
168+
port=RBAC_PORTS[0],
169+
grpc_port=RBAC_PORTS[1],
170+
auth_credentials=Auth.api_key(apiKeyOld),
171+
)
172+
173+
# re-activating is not enough
174+
assert client.users.db.activate(user_id=randomUserName)
175+
with pytest.raises(weaviate.exceptions.UnexpectedStatusCodeError):
176+
weaviate.connect_to_local(
177+
port=RBAC_PORTS[0],
178+
grpc_port=RBAC_PORTS[1],
179+
auth_credentials=Auth.api_key(apiKeyOld),
180+
)
181+
182+
apiKeyNew = client.users.db.rotate_key(user_id=randomUserName)
183+
184+
with weaviate.connect_to_local(
185+
port=RBAC_PORTS[0], grpc_port=RBAC_PORTS[1], auth_credentials=Auth.api_key(apiKeyNew)
186+
) as client2:
187+
user = client2.users.get_my_user()
188+
assert user.user_id == randomUserName
189+
190+
client.users.db.delete(user_id=randomUserName)
191+
192+
157193
def test_deprecated_syntax(client_factory: ClientFactory) -> None:
158194
with client_factory(ports=RBAC_PORTS, auth_credentials=Auth.api_key("admin-key")) as client:
159195
if client._connection._weaviate_version.is_lower_than(1, 30, 0):

weaviate/users/async_.pyi

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,38 @@ from typing_extensions import deprecated
99
class _UsersOIDCAsync(_OIDCExecutor[ConnectionAsync]):
1010
@overload
1111
async def get_assigned_roles(
12-
self, user_id: str, include_permissions: Literal[False] = False
12+
self, *, user_id: str, include_permissions: Literal[False] = False
1313
) -> Dict[str, RoleBase]: ...
1414
@overload
1515
async def get_assigned_roles(
16-
self, user_id: str, include_permissions: Literal[True]
16+
self, *, user_id: str, include_permissions: Literal[True]
1717
) -> Dict[str, Role]: ...
1818
@overload
1919
async def get_assigned_roles(
20-
self, user_id: str, include_permissions: bool = False
20+
self, *, user_id: str, include_permissions: bool = False
2121
) -> Union[Dict[str, Role], Dict[str, RoleBase]]: ...
2222
async def assign_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
2323
async def revoke_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
2424

2525
class _UsersDBAsync(_DBExecutor[ConnectionAsync]):
2626
@overload
2727
async def get_assigned_roles(
28-
self, user_id: str, include_permissions: Literal[False] = False
28+
self, *, user_id: str, include_permissions: Literal[False] = False
2929
) -> Dict[str, RoleBase]: ...
3030
@overload
3131
async def get_assigned_roles(
32-
self, user_id: str, include_permissions: Literal[True]
32+
self, *, user_id: str, include_permissions: Literal[True]
3333
) -> Dict[str, Role]: ...
3434
@overload
3535
async def get_assigned_roles(
36-
self, user_id: str, include_permissions: bool = False
36+
self, *, user_id: str, include_permissions: bool = False
3737
) -> Union[Dict[str, Role], Dict[str, RoleBase]]: ...
3838
async def assign_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
3939
async def revoke_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
4040
async def create(self, *, user_id: str) -> str: ...
4141
async def delete(self, *, user_id: str) -> bool: ...
4242
async def rotate_key(self, *, user_id: str) -> str: ...
43-
async def deactivate(self, *, user_id: str) -> bool: ...
43+
async def deactivate(self, *, user_id: str, revoke_key: bool) -> bool: ...
4444
async def activate(self, *, user_id: str) -> bool: ...
4545
async def get(self, *, user_id: str) -> UserDB: ...
4646
async def list_all(self) -> List[UserDB]: ...

weaviate/users/executor.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ def revoke_roles(
219219
class _OIDCExecutor(Generic[ConnectionType], _BaseExecutor[ConnectionType]):
220220
def get_assigned_roles(
221221
self,
222+
*,
222223
user_id: str,
223224
include_permissions: bool = False,
224225
) -> executor.Result[Union[Dict[str, Role], Dict[str, RoleBase]]]:
@@ -275,7 +276,7 @@ def revoke_roles(
275276

276277
class _DBExecutor(Generic[ConnectionType], _BaseExecutor[ConnectionType]):
277278
def get_assigned_roles(
278-
self, user_id: str, include_permissions: bool = False
279+
self, *, user_id: str, include_permissions: bool = False
279280
) -> executor.Result[Union[Dict[str, Role], Dict[str, RoleBase]]]:
280281
"""Get the roles assigned to a user.
281282
@@ -403,11 +404,12 @@ def resp(res: Response) -> bool:
403404
status_codes=_ExpectedStatusCodes(ok_in=[200, 409], error="Activate user"),
404405
)
405406

406-
def deactivate(self, *, user_id: str) -> executor.Result[bool]:
407+
def deactivate(self, *, user_id: str, revoke_key: bool) -> executor.Result[bool]:
407408
"""Deactivate an active user.
408409
409410
Args:
410411
user_id: The id of the user.
412+
revoke_key: If True, the old key will be revoked and needs to be rotated.
411413
"""
412414

413415
def resp(res: Response) -> bool:
@@ -417,7 +419,7 @@ def resp(res: Response) -> bool:
417419
response_callback=resp,
418420
method=self._connection.post,
419421
path=f"/users/db/{user_id}/deactivate",
420-
weaviate_object={},
422+
weaviate_object={"revoke_key": revoke_key},
421423
error_msg=f"Could not deactivate user '{user_id}'",
422424
status_codes=_ExpectedStatusCodes(ok_in=[200, 409], error="Deactivate user"),
423425
)

weaviate/users/sync.pyi

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,38 @@ from typing_extensions import deprecated
99
class _UsersOIDC(_OIDCExecutor[ConnectionSync]):
1010
@overload
1111
def get_assigned_roles(
12-
self, user_id: str, include_permissions: Literal[False] = False
12+
self, *, user_id: str, include_permissions: Literal[False] = False
1313
) -> Dict[str, RoleBase]: ...
1414
@overload
1515
def get_assigned_roles(
16-
self, user_id: str, include_permissions: Literal[True]
16+
self, *, user_id: str, include_permissions: Literal[True]
1717
) -> Dict[str, Role]: ...
1818
@overload
1919
def get_assigned_roles(
20-
self, user_id: str, include_permissions: bool = False
20+
self, *, user_id: str, include_permissions: bool = False
2121
) -> Union[Dict[str, Role], Dict[str, RoleBase]]: ...
2222
def assign_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
2323
def revoke_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
2424

2525
class _UsersDB(_DBExecutor[ConnectionSync]):
2626
@overload
2727
def get_assigned_roles(
28-
self, user_id: str, include_permissions: Literal[False] = False
28+
self, *, user_id: str, include_permissions: Literal[False] = False
2929
) -> Dict[str, RoleBase]: ...
3030
@overload
3131
def get_assigned_roles(
32-
self, user_id: str, include_permissions: Literal[True]
32+
self, *, user_id: str, include_permissions: Literal[True]
3333
) -> Dict[str, Role]: ...
3434
@overload
3535
def get_assigned_roles(
36-
self, user_id: str, include_permissions: bool = False
36+
self, *, user_id: str, include_permissions: bool = False
3737
) -> Union[Dict[str, Role], Dict[str, RoleBase]]: ...
3838
def assign_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
3939
def revoke_roles(self, *, user_id: str, role_names: Union[str, List[str]]) -> None: ...
4040
def create(self, *, user_id: str) -> str: ...
4141
def delete(self, *, user_id: str) -> bool: ...
4242
def rotate_key(self, *, user_id: str) -> str: ...
43-
def deactivate(self, *, user_id: str) -> bool: ...
43+
def deactivate(self, *, user_id: str, revoke_key: bool = False) -> bool: ...
4444
def activate(self, *, user_id: str) -> bool: ...
4545
def get(self, *, user_id: str) -> UserDB: ...
4646
def list_all(self) -> List[UserDB]: ...

0 commit comments

Comments
 (0)