Esempio n. 1
0
    async def _get_device_invitation(self, conn,
                                     organization_id: OrganizationID,
                                     device_id: DeviceID):
        if await self._device_exists(conn, organization_id, device_id):
            raise UserAlreadyExistsError(
                f"Device `{device_id}` already exists")

        result = await conn.fetchrow(
            """
SELECT device_invitations.device_id, devices.device_id, device_invitations.created_on
FROM device_invitations
LEFT JOIN devices ON device_invitations.creator = devices._id
WHERE
    device_invitations.organization = (
        SELECT _id from organizations WHERE organization_id = $1
    )
    AND device_invitations.device_id = $2
""",
            organization_id,
            device_id,
        )
        if not result:
            raise UserNotFoundError(device_id)

        return DeviceInvitation(device_id=DeviceID(result[0]),
                                creator=DeviceID(result[1]),
                                created_on=result[2])
async def test_device_invite(monkeypatch, backend, alice_backend_sock, alice, alice_nd_id):
    dummy_device_id = DeviceID(f"{alice.user_id}@pc1")
    await backend.user.create_device_invitation(
        alice.organization_id, DeviceInvitation(dummy_device_id, alice.device_id)
    )

    device_invitation_created = trio.Event()

    vanilla_create_device_invitation = backend.user.create_device_invitation

    async def _mocked_create_device_invitation(*args, **kwargs):
        ret = await vanilla_create_device_invitation(*args, **kwargs)
        device_invitation_created.set()
        return ret

    monkeypatch.setattr(backend.user, "create_device_invitation", _mocked_create_device_invitation)

    with trio.fail_after(1):
        async with device_invite(
            alice_backend_sock, invited_device_name=alice_nd_id.device_name
        ) as prep:

            # Wait for invitation to be created before fetching it !
            await device_invitation_created.wait()

            # No the user we are waiting for
            await backend.user.claim_device_invitation(
                alice.organization_id, dummy_device_id, b"<alice@dummy encrypted_claim>"
            )

            await backend.user.claim_device_invitation(
                alice.organization_id, alice_nd_id, b"<alice@new_device encrypted_claim>"
            )

        assert prep[0] == {"status": "ok", "encrypted_claim": b"<alice@new_device encrypted_claim>"}
Esempio n. 3
0
async def _get_device_invitation(conn, organization_id: OrganizationID,
                                 device_id: DeviceID) -> DeviceInvitation:
    if await _device_exists(conn, organization_id, device_id):
        raise UserAlreadyExistsError(f"Device `{device_id}` already exists")

    result = await conn.fetchrow(_q_get_invitation, organization_id, device_id)
    if not result:
        raise UserNotFoundError(device_id)

    return DeviceInvitation(device_id=DeviceID(result[0]),
                            creator=DeviceID(result[1]),
                            created_on=result[2])
Esempio n. 4
0
async def test_device_get_invitation_creator_with_trustchain_ok(
    backend_data_binder_factory, local_device_factory, backend, alice, anonymous_backend_sock
):
    binder = backend_data_binder_factory(backend)
    certificates_store = binder.certificates_store

    roger1 = local_device_factory("roger@dev1")
    mike1 = local_device_factory("mike@dev1")

    await binder.bind_device(roger1, certifier=alice)
    await binder.bind_device(mike1, certifier=roger1)
    await binder.bind_revocation(roger1.user_id, certifier=mike1)

    invitation = DeviceInvitation(
        device_id=DeviceID(f"{alice.user_id}@new"), creator=mike1.device_id
    )
    await backend.user.create_device_invitation(alice.organization_id, invitation)

    rep = await device_get_invitation_creator(
        anonymous_backend_sock, invited_device_id=invitation.device_id
    )
    cooked_rep = {
        **rep,
        "device_certificate": certificates_store.translate_certif(rep["device_certificate"]),
        "user_certificate": certificates_store.translate_certif(rep["user_certificate"]),
        "trustchain": {
            "devices": sorted(certificates_store.translate_certifs(rep["trustchain"]["devices"])),
            "users": sorted(certificates_store.translate_certifs(rep["trustchain"]["users"])),
            "revoked_users": sorted(
                certificates_store.translate_certifs(rep["trustchain"]["revoked_users"])
            ),
        },
    }

    assert cooked_rep == {
        "status": "ok",
        "device_certificate": "<mike@dev1 device certif>",
        "user_certificate": "<mike user certif>",
        "trustchain": {
            "devices": sorted(
                [
                    "<alice@dev1 device certif>",
                    "<roger@dev1 device certif>",
                    "<mike@dev1 device certif>",
                ]
            ),
            "users": sorted(["<alice user certif>", "<roger user certif>", "<mike user certif>"]),
            "revoked_users": ["<roger revoked user certif>"],
        },
    }
async def alice_nd_invitation(backend, alice):
    invitation = DeviceInvitation(DeviceID(f"{alice.user_id}@new_device"),
                                  alice.device_id, Pendulum(2000, 1, 2))
    await backend.user.create_device_invitation(alice.organization_id,
                                                invitation)
    return invitation
async def alice_nd_invitation(backend, alice):
    invitation = DeviceInvitation(alice.user_id.to_device_id("new_device"),
                                  alice.device_id, datetime(2000, 1, 2))
    await backend.user.create_device_invitation(alice.organization_id,
                                                invitation)
    return invitation