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
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() == ""
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()
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
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()
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 !")
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()
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