예제 #1
0
 def validate(self, string, pos):
     try:
         if len(string) == 0:
             return QValidator.Intermediate, string, pos
         BackendOrganizationClaimDeviceAddr.from_url(string)
         return QValidator.Acceptable, string, pos
     except ValueError:
         return QValidator.Intermediate, string, pos
예제 #2
0
    def run_dialog():
        modal = InviteDeviceWidget(parent=d_w,
                                   jobs_ctx=d_w.jobs_ctx,
                                   core=d_w.core)
        modal.show()
        assert not modal.line_edit_token.text()
        assert not modal.line_edit_url.text()
        aqtbot.qtbot.keyClicks(modal.line_edit_device_name, "new_device")
        aqtbot.qtbot.mouseClick(modal.button_register, QtCore.Qt.LeftButton)
        assert modal.line_edit_url.text()
        assert modal.line_edit_device_name.text() == "new_device"
        assert modal.line_edit_token.text()
        url = BackendOrganizationClaimDeviceAddr.from_url(
            modal.line_edit_url.text())

        with aqtbot.qtbot.waitSignal(modal.device_registered):
            trio_run(
                _claim_device,
                modal.line_edit_token.text(),
                url.to_organization_addr(),
                url.device_id,
                "P@ssw0rd!",
                logged_gui.config,
            )
        assert len(autoclose_dialog.dialogs) == 1

        assert autoclose_dialog.dialogs[0][0] == ""
        assert autoclose_dialog.dialogs[0][1].label_message.text() == ""
예제 #3
0
    def _on_claim_device_clicked(self, action_addr=None):
        if not action_addr:
            url = get_text_input(
                parent=self,
                title=_("TEXT_CLAIM_DEVICE_URL_TITLE"),
                message=_("TEXT_CLAIM_DEVICE_URL_INSTRUCTIONS"),
                placeholder=_("TEXT_CLAIM_DEVICE_URL_PLACEHOLDER"),
            )
            if url is None:
                return
            elif url == "":
                show_error(self, _("TEXT_CLAIM_DEVICE_INVALID_URL"))
                return

            action_addr = None
            try:
                action_addr = BackendOrganizationClaimDeviceAddr.from_url(url)
            except ValueError as exc:
                show_error(self, _("TEXT_CLAIM_DEVICE_INVALID_URL"), exception=exc)
                return
        ret = ClaimDeviceWidget.exec_modal(
            jobs_ctx=self.jobs_ctx, config=self.config, addr=action_addr, parent=self
        )
        if ret:
            self.reload_login_devices()
예제 #4
0
def test_backend_organization_claim_device_addr_good(organization_addr,
                                                     device_id, token):
    addr = BackendOrganizationClaimDeviceAddr.build(organization_addr,
                                                    device_id, token)

    assert addr.hostname == organization_addr.hostname
    assert addr.port == organization_addr.port
    assert addr.use_ssl == organization_addr.use_ssl
    assert addr.organization_id == organization_addr.organization_id
    assert addr.root_verify_key == organization_addr.root_verify_key

    assert isinstance(addr.device_id, DeviceID)
    assert addr.device_id == device_id
    assert addr.token == token

    addr2 = BackendOrganizationClaimDeviceAddr.from_url(addr.to_url())
    assert isinstance(addr2.device_id, DeviceID)
    assert addr == addr2
예제 #5
0
    def register_device(self):
        if not self.line_edit_device_name.text():
            show_error(self, _("TEXT_INVITE_DEVICE_EMPTY_DEVICE_NAME"))
            return

        try:
            new_device_id = DeviceID(
                f"{self.core.device.user_id}@{self.line_edit_device_name.text()}"
            )
        except ValueError as exc:
            show_error(self,
                       _("TEXT_INVITE_DEVICE_BAD_DEVICE_NAME"),
                       exception=exc)
            return
        token = core_generate_invitation_token()
        try:
            addr = BackendOrganizationClaimDeviceAddr.build(
                self.core.device.organization_addr, device_id=new_device_id)
        except ValueError as exc:
            show_error(self,
                       _("TEXT_INVITE_DEVICE_WRONG_PARAMETERS"),
                       exception=exc)
            return

        self.line_edit_device.setText(new_device_id.device_name)
        self.line_edit_device.setCursorPosition(0)
        self.line_edit_token.setText(token)
        self.line_edit_token.setCursorPosition(0)
        self.line_edit_url.setText(addr.to_url())
        self.line_edit_url.setCursorPosition(0)
        self.widget_registration.show()
        self.registration_job = self.jobs_ctx.submit_job(
            ThreadSafeQtSignal(self, "registration_success"),
            ThreadSafeQtSignal(self, "registration_error"),
            _do_registration,
            core=self.core,
            device=self.core.device,
            new_device_name=new_device_id.device_name,
            token=token,
        )
        self.line_edit_device_name.hide()
        self.button_register.hide()
예제 #6
0
async def _invite_device(config, device, new_device_name):
    action_addr = BackendOrganizationClaimDeviceAddr.build(
        organization_addr=device.organization_addr,
        device_id=DeviceID(f"{device.user_id}@{new_device_name}"),
    )
    token = generate_invitation_token()

    action_addr_display = click.style(action_addr.to_url(), fg="yellow")
    token_display = click.style(token, fg="yellow")
    click.echo(f"url: {action_addr_display}")
    click.echo(f"token: {token_display}")

    async with spinner("Waiting for invitation reply"):
        await invite_and_create_device(
            device=device,
            new_device_name=new_device_name,
            token=token,
            keepalive=config.backend_connection_keepalive,
        )

    display_device = click.style(f"{device.device_name}@{new_device_name}",
                                 fg="yellow")
    click.echo(f"Device {display_device} is ready !")
예제 #7
0
async def alice_invite(running_backend, backend, alice):
    device_id = DeviceID(f"{alice.user_id}@pc1")
    # Modify address subdomain to be able to switch it offline whithout
    # disconnecting the inviter
    organization_addr = addr_with_device_subdomain(alice.organization_addr, device_id)
    invitation = {
        "addr": BackendOrganizationClaimDeviceAddr.build(organization_addr, device_id, "123456"),
        "token": "123456",
        "user_id": device_id.user_id,
        "device_name": device_id.device_name,
        "password": "******",
    }

    async def _invite():
        await invite_and_create_device(alice, invitation["device_name"], invitation["token"])

    async with trio.open_service_nursery() as nursery:
        with backend.event_bus.listen() as spy:
            nursery.start_soon(_invite)
            await spy.wait_with_timeout("event.connected", {"event_name": "device.claimed"})

            yield invitation

            nursery.cancel_scope.cancel()
예제 #8
0
def test_backend_organization_claim_device_addr_bad_value(
        url, exc_msg, exported_verify_key):
    url = url.replace("<rvk>", exported_verify_key)
    with pytest.raises(ValueError) as exc:
        BackendOrganizationClaimDeviceAddr.from_url(url)
    assert str(exc.value) == exc_msg