Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,23 @@ pip install python-vaultwarden
```python
from vaultwarden.clients.vaultwarden import VaultwardenAdminClient

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

client.invite("[email protected]")

all_users = client.get_all_users()
# Get all users
all_users = client.users()

client.delete(all_users[0].id)
# Get a specific user by email
user = client.user(email="[email protected]")

# Delete/Disable/Enable a user by ID
client.delete(user.Id)
client.disable(user.Id)
client.enable(user.Id)

# Set enabled status of a user
client.set_user_enabled(user.Id, enabled=True)
```

### Bitwarden client
Expand Down
46 changes: 44 additions & 2 deletions src/vaultwarden/clients/vaultwarden.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,54 @@ def delete(self, identifier: str | UUID) -> bool:
self._load_users()
return res

def disable(self, identifier: str | UUID) -> bool:
logger.info(f"Disabling {identifier} account")
res = True
try:
self._admin_request(
"POST",
f"users/{identifier}/disable",
headers={"Content-Type": "application/json"},
)
except HTTPStatusError:
res = False
if not res:
logger.warning(f"Failed to disable {identifier}")
else:
self._load_users()
return res

def enable(self, identifier: str | UUID) -> bool:
logger.info(f"Enabling {identifier} account")
res = True
try:
self._admin_request(
"POST",
f"users/{identifier}/enable",
headers={"Content-Type": "application/json"},
)
except HTTPStatusError:
res = False
if not res:
logger.warning(f"Failed to enable {identifier}")
else:
self._load_users()
return res

def set_user_enabled(self, identifier: str | UUID, enabled: bool) -> None:
"""Disabling a user also deauthorizes all its sessions"""
if enabled:
resp = self._admin_request("POST", f"users/{identifier}/enable")
resp = self._admin_request(
"POST",
f"users/{identifier}/enable",
headers={"Content-Type": "application/json"},
)
else:
resp = self._admin_request("POST", f"users/{identifier}/disable")
resp = self._admin_request(
"POST",
f"users/{identifier}/disable",
headers={"Content-Type": "application/json"},
)
resp.raise_for_status()

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