Skip to content

Commit dc9cc40

Browse files
committed
added confirm invitation
1 parent 2c12bb1 commit dc9cc40

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

src/vaultwarden/models/bitwarden.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Generic, Literal, TypeVar, cast
22
from uuid import UUID
3+
from base64 import b64decode
34

45
from pydantic import AliasChoices, Field, TypeAdapter, field_validator
56
from pydantic_core.core_schema import FieldValidationInfo
@@ -8,7 +9,7 @@
89
from vaultwarden.models.enum import CipherType, OrganizationUserType
910
from vaultwarden.models.exception_models import BitwardenError
1011
from vaultwarden.models.permissive_model import PermissiveBaseModel
11-
from vaultwarden.utils.crypto import decrypt, encrypt
12+
from vaultwarden.utils.crypto import decrypt, encrypt, encrypt_asym
1213

1314
# Pydantic models for Bitwarden data structures
1415

@@ -423,6 +424,30 @@ def invite(
423424
self._users = self._get_users()
424425
return resp
425426

427+
def confirm(
428+
self,
429+
new_user: OrganizationUserDetails,
430+
):
431+
rsa_public_key_new_user = b64decode(self.get_public_key_for_user(new_user.UserId))
432+
org_key_decrypted = self.key()
433+
key = encrypt_asym(org_key_decrypted, rsa_public_key_new_user)
434+
435+
payload = {
436+
"key": key,
437+
}
438+
resp = self.api_client.api_request(
439+
"POST", f"api/organizations/{self.Id}/users/{new_user.Id}/confirm", json=payload
440+
)
441+
self._users = self._get_users()
442+
return resp
443+
444+
def get_public_key_for_user(self, user_id: UUID | str):
445+
resp = self.api_client.api_request(
446+
"GET", f"api/users/{user_id}/public-key"
447+
)
448+
resp.raise_for_status()
449+
return resp.json().get("publicKey")
450+
426451
def _get_users(self) -> list[OrganizationUserDetails]:
427452
resp = self.api_client.api_request(
428453
"GET",

tests/e2e/run_tests.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ if [[ -z "${VAULTWARDEN_VERSION}" ]]; then
44
VAULTWARDEN_VERSION="1.34.3"
55
fi
66

7+
export VAULTWARDEN_INVITATIONS_ALLOWED="false"
8+
79
temp_dir=$(mktemp -d)
810

911
# Copy fixtures db to tmp
1012
cp tests/fixtures/server/* $temp_dir
1113

1214
# Start Vaultwarden docker
13-
docker run -d --name vaultwarden -v $temp_dir:/data --env I_REALLY_WANT_VOLATILE_STORAGE=true --env ADMIN_TOKEN=admin --restart unless-stopped -p 80:80 vaultwarden/server:${VAULTWARDEN_VERSION}
15+
docker run -d --name vaultwarden -v $temp_dir:/data --env INVITATIONS_ALLOWED=${VAULTWARDEN_INVITATIONS_ALLOWED} --env I_REALLY_WANT_VOLATILE_STORAGE=true --env ADMIN_TOKEN=admin --restart unless-stopped -p 80:80 vaultwarden/server:${VAULTWARDEN_VERSION}
1416

1517
exit 0
1618

tests/e2e/test_bitwarden.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,21 @@ def test_add_remove_collection_from_user(self):
9797
)
9898

9999
def test_invite_user_than_remove(self):
100-
resp = self.organization.invite("[email protected]")
101-
self.assertTrue(resp.is_success)
102100
user = self.organization.user_search(
103-
"test-user-3@example.com", force_refresh=True
101+
"test-account-2@example.com", force_refresh=True
104102
)
105-
self.assertIsNotNone(user)
106103
user.delete()
107104

105+
resp = self.organization.invite("[email protected]")
106+
self.assertTrue(resp.is_success)
107+
108+
if not os.environ.get("VAULTWARDEN_INVITATIONS_ALLOWED", True).lower() in ["true", "1", "yes"]:
109+
user = self.organization.user_search(
110+
"[email protected]", force_refresh=True
111+
)
112+
resp = self.organization.confirm(user)
113+
self.assertTrue(resp.is_success)
114+
108115
def test_rename_organization(self):
109116
old_name = self.organization.Name
110117
new_name = "new_test_organization"

0 commit comments

Comments
 (0)