Skip to content

Commit

Permalink
Address @touilleMan's comments
Browse files Browse the repository at this point in the history
  • Loading branch information
vxgmichel committed Jan 27, 2025
1 parent b05c053 commit 43224d8
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use super::authenticated_cmds;
use libparsec_types::prelude::*;

use libparsec_tests_lite::{hex, p_assert_eq};
use libparsec_types::{InvitationStatus, InvitationToken};

// Request

Expand Down
3 changes: 1 addition & 2 deletions libparsec/src/invite.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@ pub use libparsec_client::{
ShamirRecoveryClaimRecoverDeviceError,
};
pub use libparsec_protocol::authenticated_cmds::latest::invite_list::InvitationCreatedBy as InviteListInvitationCreatedBy;
pub use libparsec_protocol::invited_cmds::latest::invite_info::InvitationCreatedBy as InviteInfoInvitationCreatedBy;
pub use libparsec_protocol::invited_cmds::latest::invite_info::{
ShamirRecoveryRecipient, UserOnlineStatus,
InvitationCreatedBy as InviteInfoInvitationCreatedBy, ShamirRecoveryRecipient, UserOnlineStatus,
};
pub use libparsec_types::prelude::*;

Expand Down
8 changes: 4 additions & 4 deletions server/parsec/components/invite.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@


@dataclass(slots=True)
class _InvitationCreatedBy:
class BaseInvitationCreatedBy:
def for_invite_info(self) -> InviteInfoInvitationCreatedBy:
match self:
case InvitationCreatedByUser(user_id, human_handle):
Expand Down Expand Up @@ -86,17 +86,17 @@ def for_invite_list(self) -> InviteListInvitationCreatedBy:


@dataclass(slots=True)
class InvitationCreatedByUser(_InvitationCreatedBy):
class InvitationCreatedByUser(BaseInvitationCreatedBy):
user_id: UserID
human_handle: HumanHandle


@dataclass(slots=True)
class InvitationCreatedByExternalService(_InvitationCreatedBy):
class InvitationCreatedByExternalService(BaseInvitationCreatedBy):
service_label: str


InvitationCreatedBy: TypeAlias = InvitationCreatedByUser | InvitationCreatedByExternalService
type InvitationCreatedBy = InvitationCreatedByUser | InvitationCreatedByExternalService


@dataclass(slots=True)
Expand Down
60 changes: 27 additions & 33 deletions server/parsec/components/postgresql/invite.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class ShamirRecoveryInvitationInfo(BaseInvitationInfo):
shamir_recovery_deleted_on: DateTime | None


InvitationInfo: TypeAlias = UserInvitationInfo | DeviceInvitationInfo | ShamirRecoveryInvitationInfo
type InvitationInfo = UserInvitationInfo | DeviceInvitationInfo | ShamirRecoveryInvitationInfo


def invitation_info_from_record(record: Record) -> InvitationInfo:
Expand All @@ -132,16 +132,10 @@ def invitation_info_from_record(record: Record) -> InvitationInfo:
case unknown:
assert False, repr(unknown)

match record["created_by_user_id"]:
case None:
match record["created_by_service_label"]:
case str() as created_by_service_label:
created_by = InvitationCreatedByExternalService(
service_label=created_by_service_label
)
case unknown:
assert False, repr(unknown)
case str() as created_by_user_id_str:
match (record["created_by_user_id"], record["created_by_service_label"]):
case (None, str() as created_by_service_label):
created_by = InvitationCreatedByExternalService(service_label=created_by_service_label)
case (str() as created_by_user_id_str, None):
match (record["created_by_email"], record["created_by_label"]):
case (str() as created_by_email, str() as created_by_label):
created_by = InvitationCreatedByUser(
Expand Down Expand Up @@ -431,7 +425,7 @@ def from_record(cls, record: Record) -> GreetingAttemptInfo:
WHERE
organization.organization_id = $organization_id
AND type = 'USER'
AND user_.user_id = $user_id
AND user_.user_id = $invitation_creator_user_id
AND user_invitation_claimer_email = $user_invitation_claimer_email
AND deleted_on IS NULL
LIMIT 1
Expand Down Expand Up @@ -529,9 +523,9 @@ def from_record(cls, record: Record) -> GreetingAttemptInfo:
DISTINCT invitation._id AS invitation_internal_id,
invitation.token,
invitation.type,
user_.user_id AS created_by_user_id,
human.email AS created_by_email,
human.label AS created_by_label,
created_by_user.user_id AS created_by_user_id,
created_by_human.email AS created_by_email,
created_by_human.label AS created_by_label,
invitation.created_by_service_label,
invitation.user_invitation_claimer_email,
device_invitation_claimer.user_id AS device_invitation_claimer_user_id,
Expand All @@ -548,9 +542,9 @@ def from_record(cls, record: Record) -> GreetingAttemptInfo:
invitation.deleted_on,
invitation.deleted_reason
FROM invitation
LEFT JOIN device ON invitation.created_by_device = device._id
LEFT JOIN user_ ON device.user_ = user_._id
LEFT JOIN human ON human._id = user_.human
LEFT JOIN device AS created_by_device ON invitation.created_by_device = created_by_device._id
LEFT JOIN user_ AS created_by_user ON created_by_device.user_ = created_by_user._id
LEFT JOIN human AS created_by_human ON created_by_human._id = created_by_user.human
LEFT JOIN user_ AS device_invitation_claimer ON invitation.device_invitation_claimer = device_invitation_claimer._id
LEFT JOIN human AS device_invitation_claimer_human ON device_invitation_claimer.human = device_invitation_claimer_human._id
LEFT JOIN shamir_recovery_setup ON invitation.shamir_recovery = shamir_recovery_setup._id
Expand All @@ -562,8 +556,8 @@ def from_record(cls, record: Record) -> GreetingAttemptInfo:
invitation.organization = { q_organization_internal_id("$organization_id") }
-- Different invitation types have different filtering rules
AND (
(invitation.type = 'USER' AND user_.user_id = $user_id)
OR (invitation.type = 'DEVICE' AND user_.user_id = $user_id)
(invitation.type = 'USER' AND created_by_user.user_id = $user_id)
OR (invitation.type = 'DEVICE' AND device_invitation_claimer.user_id = $user_id)
OR (invitation.type = 'SHAMIR_RECOVERY' AND recipient_user_.user_id = $user_id)
)
ORDER BY created_on
Expand All @@ -576,9 +570,9 @@ def from_record(cls, record: Record) -> GreetingAttemptInfo:
invitation._id AS invitation_internal_id,
invitation.token,
invitation.type,
user_.user_id AS created_by_user_id,
human.email AS created_by_email,
human.label AS created_by_label,
created_by_user.user_id AS created_by_user_id,
created_by_human.email AS created_by_email,
created_by_human.label AS created_by_label,
invitation.created_by_service_label,
invitation.user_invitation_claimer_email,
device_invitation_claimer.user_id AS device_invitation_claimer_user_id,
Expand All @@ -595,9 +589,9 @@ def from_record(cls, record: Record) -> GreetingAttemptInfo:
invitation.deleted_on,
invitation.deleted_reason
FROM invitation
LEFT JOIN device ON invitation.created_by_device = device._id
LEFT JOIN user_ ON device.user_ = user_._id
LEFT JOIN human ON human._id = user_.human
LEFT JOIN device AS created_by_device ON invitation.created_by_device = created_by_device._id
LEFT JOIN user_ AS created_by_user ON created_by_device.user_ = created_by_user._id
LEFT JOIN human AS created_by_human ON created_by_human._id = created_by_user.human
LEFT JOIN user_ AS device_invitation_claimer ON invitation.device_invitation_claimer = device_invitation_claimer._id
LEFT JOIN human AS device_invitation_claimer_human ON device_invitation_claimer.human = device_invitation_claimer_human._id
LEFT JOIN shamir_recovery_setup ON invitation.shamir_recovery = shamir_recovery_setup._id
Expand Down Expand Up @@ -642,9 +636,9 @@ def make_q_info_invitation(
invitation._id AS invitation_internal_id,
invitation.token,
invitation.type,
user_.user_id AS created_by_user_id,
human.email AS created_by_email,
human.label AS created_by_label,
created_by_user.user_id AS created_by_user_id,
created_by_human.email AS created_by_email,
created_by_human.label AS created_by_label,
invitation.created_by_service_label,
invitation.user_invitation_claimer_email,
device_invitation_claimer.user_id AS device_invitation_claimer_user_id,
Expand All @@ -662,9 +656,9 @@ def make_q_info_invitation(
invitation.deleted_reason
FROM invitation
INNER JOIN selected_invitation ON invitation._id = selected_invitation.invitation_internal_id
LEFT JOIN device ON invitation.created_by_device = device._id
LEFT JOIN user_ ON device.user_ = user_._id
LEFT JOIN human ON human._id = user_.human
LEFT JOIN device AS created_by_device ON invitation.created_by_device = created_by_device._id
LEFT JOIN user_ AS created_by_user ON created_by_device.user_ = created_by_user._id
LEFT JOIN human AS created_by_human ON created_by_human._id = created_by_user.human
LEFT JOIN user_ AS device_invitation_claimer ON invitation.device_invitation_claimer = device_invitation_claimer._id
LEFT JOIN human AS device_invitation_claimer_human ON device_invitation_claimer.human = device_invitation_claimer_human._id
LEFT JOIN shamir_recovery_setup ON invitation.shamir_recovery = shamir_recovery_setup._id
Expand Down Expand Up @@ -997,7 +991,7 @@ async def _do_new_invitation(
# TODO: Update this when implementing https://github.com/Scille/parsec-cloud/issues/9413
q = _q_retrieve_compatible_user_invitation(
organization_id=organization_id.str,
user_id=author_user_id,
invitation_creator_user_id=author_user_id,
user_invitation_claimer_email=user_invitation_claimer_email,
)
case InvitationType.DEVICE:
Expand Down
11 changes: 8 additions & 3 deletions server/tests/api_v5/invited/test_invite_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,13 @@
UserGreetingAdministrator,
UserOnlineStatus,
)
from tests.common import Backend, CoolorgRpcClients, HttpCommonErrorsTester, ShamirOrgRpcClients
from tests.common.data import bob_becomes_admin
from tests.common import (
Backend,
CoolorgRpcClients,
HttpCommonErrorsTester,
ShamirOrgRpcClients,
bob_becomes_admin,
)


@pytest.mark.parametrize("user_or_device", ("user", "device"))
Expand Down Expand Up @@ -177,7 +182,7 @@ async def test_invited_invite_info_for_user_with_multiple_admins(
)
)

# Alice starts greeting attempt for zack
# Alice re-starts greeting attempt for zack
t3 = DateTime.now()
rep = await backend.invite.greeter_start_greeting_attempt(
t3,
Expand Down
19 changes: 17 additions & 2 deletions server/tests/migrations/0009_after.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
DO $$
DECLARE
organization_internal_id integer;
user_current_profile text;
device_invitation_claimer_human_email text;
user_invitation_claimer_email text;
BEGIN
SELECT _id
INTO organization_internal_id
Expand All @@ -21,7 +21,22 @@ BEGIN
ON user_.human = human._id
WHERE
invitation.organization = organization_internal_id
AND invitation.token = 'e0000000000000000000000000000002';
AND invitation.token = 'e0000000000000000000000000000002'
AND invitation.user_invitation_claimer_email IS NULL;

ASSERT device_invitation_claimer_human_email = '[email protected]', FORMAT('Bad invitation migration: `%s`', device_invitation_claimer_human_email);

-- Ensure that the `device_invitation_claimer` column is NULL for the user invitations
SELECT invitation.user_invitation_claimer_email
INTO user_invitation_claimer_email
FROM invitation
WHERE
invitation.organization = organization_internal_id
AND invitation.token = 'e0000000000000000000000000000001'
AND invitation.device_invitation_claimer IS NULL;

ASSERT user_invitation_claimer_email = '[email protected]', FORMAT('Bad invitation migration: `%s`', user_invitation_claimer_email);



END$$;
2 changes: 2 additions & 0 deletions server/tests/test_sse.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,12 +208,14 @@ def get_local_port(host: str) -> int:
"app": app,
"host": HOST,
"port": PORT,
"proxy_trusted_addresses": None,
},
)

proc.start()
yield (HOST, PORT)
proc.terminate()
proc.join()


@pytest.mark.timeout(2)
Expand Down

0 comments on commit 43224d8

Please sign in to comment.