Skip to content

Commit 337a0a2

Browse files
authored
fix(admin-client): fix readme example and fix disable/enable method for users managment (#25)
* fix(admin-client): add Content-Type header to user enable/disable requests * fix(admin-client): add enable and disable methods for user accounts * fix(admin-client): update README with user management methods and examples * fix(admin-client): improve error handling and logging for user management methods
1 parent 9c100b6 commit 337a0a2

File tree

2 files changed

+63
-20
lines changed

2 files changed

+63
-20
lines changed

README.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,23 @@ pip install python-vaultwarden
3636
```python
3737
from vaultwarden.clients.vaultwarden import VaultwardenAdminClient
3838

39-
client = VaultwardenAdminClient(url="https://vaultwarden.example.com", admin_secret_token="admin_token")
39+
client = VaultwardenAdminClient(url="https://vaultwarden.example.com", admin_secret_token="admin_token", preload_users=True)
4040

4141
client.invite("john.doe@example.com")
4242

43-
all_users = client.get_all_users()
43+
# Get all users
44+
all_users = client.users()
4445

45-
client.delete(all_users[0].id)
46+
# Get a specific user by email
47+
user = client.user(email="example@example.com")
4648

49+
# Delete/Disable/Enable a user by ID
50+
client.delete(user.Id)
51+
client.disable(user.Id)
52+
client.enable(user.Id)
53+
54+
# Set enabled status of a user
55+
client.set_user_enabled(user.Id, enabled=True)
4756
```
4857

4958
### Bitwarden client

src/vaultwarden/clients/vaultwarden.py

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -133,36 +133,70 @@ def users(
133133

134134
# User Management Part
135135
def invite(self, email: str) -> bool:
136-
res = True
137136
try:
138137
self._admin_request("POST", "invite", json={"email": email})
139138
except HTTPStatusError as e:
140-
res = e.response.status_code == http.HTTPStatus.CONFLICT
141-
if not res:
142-
logger.warning(f"Failed to invite {email}")
143-
else:
144-
self._load_users()
145-
return res
139+
if e.response.status_code != http.HTTPStatus.CONFLICT:
140+
logger.warning(f"Failed to invite {email} {e}")
141+
return False
142+
self._load_users()
143+
return True
146144

147145
def delete(self, identifier: str | UUID) -> bool:
148146
logger.info(f"Deleting {identifier} account")
149-
res = True
150147
try:
151148
self._admin_request("POST", f"users/{identifier}/delete")
152-
except HTTPStatusError:
153-
res = False
154-
if not res:
155-
logger.warning(f"Failed to delete {identifier}")
156-
else:
157-
self._load_users()
158-
return res
149+
except HTTPStatusError as e:
150+
logger.warning(f"Failed to delete {identifier} {e}")
151+
return False
152+
self._load_users()
153+
logger.info(f"Successfully deleted account: {identifier}")
154+
return True
155+
156+
def disable(self, identifier: str | UUID) -> bool:
157+
logger.info(f"Disabling {identifier} account")
158+
try:
159+
self._admin_request(
160+
"POST",
161+
f"users/{identifier}/disable",
162+
headers={"Content-Type": "application/json"},
163+
)
164+
except HTTPStatusError as e:
165+
logger.warning(f"Failed to disable {identifier} {e}")
166+
return False
167+
self._load_users()
168+
logger.info(f"Successfully disabled account: {identifier}")
169+
return True
170+
171+
def enable(self, identifier: str | UUID) -> bool:
172+
logger.info(f"Enabling {identifier} account")
173+
try:
174+
self._admin_request(
175+
"POST",
176+
f"users/{identifier}/enable",
177+
headers={"Content-Type": "application/json"},
178+
)
179+
except HTTPStatusError as e:
180+
logger.warning(f"Failed to enable {identifier} {e}")
181+
return False
182+
self._load_users()
183+
logger.info(f"Successfully enabled account: {identifier}")
184+
return True
159185

160186
def set_user_enabled(self, identifier: str | UUID, enabled: bool) -> None:
161187
"""Disabling a user also deauthorizes all its sessions"""
162188
if enabled:
163-
resp = self._admin_request("POST", f"users/{identifier}/enable")
189+
resp = self._admin_request(
190+
"POST",
191+
f"users/{identifier}/enable",
192+
headers={"Content-Type": "application/json"},
193+
)
164194
else:
165-
resp = self._admin_request("POST", f"users/{identifier}/disable")
195+
resp = self._admin_request(
196+
"POST",
197+
f"users/{identifier}/disable",
198+
headers={"Content-Type": "application/json"},
199+
)
166200
resp.raise_for_status()
167201

168202
def remove_2fa(self, uuid=None, email=None) -> bool:

0 commit comments

Comments
 (0)