Browse Source

link_wait: use wait_for_scan to have intermediate step on login

Sumner Evans 3 years ago
parent
commit
715c8668f7
3 changed files with 18 additions and 1 deletions
  1. 3 0
      mausignald/signald.py
  2. 2 0
      mautrix_signal/user.py
  3. 13 1
      mautrix_signal/web/provisioning_api.py

+ 3 - 0
mausignald/signald.py

@@ -150,6 +150,9 @@ class SignaldClient(SignaldRPCClient):
     async def start_link(self) -> LinkSession:
     async def start_link(self) -> LinkSession:
         return LinkSession.deserialize(await self.request_v1("generate_linking_uri"))
         return LinkSession.deserialize(await self.request_v1("generate_linking_uri"))
 
 
+    async def wait_for_scan(self, session_id: str) -> None:
+        await self.request_v1("wait_for_scan", session_id=session_id)
+
     async def finish_link(
     async def finish_link(
         self, session_id: str, device_name: str = "mausignald", overwrite: bool = False
         self, session_id: str, device_name: str = "mausignald", overwrite: bool = False
     ) -> Account:
     ) -> Account:

+ 2 - 0
mautrix_signal/user.py

@@ -155,6 +155,8 @@ class User(DBUser, BaseUser):
         self.username = account.account_id
         self.username = account.account_id
         self.uuid = account.address.uuid
         self.uuid = account.address.uuid
         self._add_to_cache()
         self._add_to_cache()
+        # Push a remote state immediately so that the client knows that it's doing something.
+        asyncio.create_task(self.push_bridge_state(BridgeStateEvent.CONNECTING))
         await self.update()
         await self.update()
         await self.bridge.signal.subscribe(self.username)
         await self.bridge.signal.subscribe(self.username)
         asyncio.create_task(self.sync())
         asyncio.create_task(self.sync())

+ 13 - 1
mautrix_signal/web/provisioning_api.py

@@ -25,7 +25,7 @@ from aiohttp import web
 from mausignald.errors import InternalError, TimeoutException
 from mausignald.errors import InternalError, TimeoutException
 from mausignald.types import Account, Address
 from mausignald.types import Account, Address
 from mautrix.types import UserID
 from mautrix.types import UserID
-from mautrix.util.bridge_state import BridgeStateEvent
+from mautrix.util.bridge_state import BridgeState, BridgeStateEvent
 from mautrix.util.logging import TraceLogger
 from mautrix.util.logging import TraceLogger
 
 
 from .. import user as u
 from .. import user as u
@@ -186,6 +186,18 @@ class ProvisioningAPI:
             )
             )
         session_id = user.command_status["session_id"]
         session_id = user.command_status["session_id"]
         device_name = user.command_status["device_name"]
         device_name = user.command_status["device_name"]
+        try:
+            await self.bridge.signal.wait_for_scan(session_id)
+            status_endpoint = self.bridge.config["homeserver.status_endpoint"]
+            if status_endpoint:
+                state = BridgeState(state_event=BridgeStateEvent.CONNECTING).fill()
+                asyncio.create_task(state.send(status_endpoint, self.bridge.az.as_token, self.log))
+        except Exception as e:
+            self.log.exception(f"Failed waiting for scan. Error: {e}")
+            raise web.HTTPBadRequest(
+                text='{"error": "Failed to wait for scan"}', headers=self._headers
+            )
+
         try:
         try:
             account = await asyncio.shield(self._shielded_link(user, session_id, device_name))
             account = await asyncio.shield(self._shielded_link(user, session_id, device_name))
         except asyncio.CancelledError:
         except asyncio.CancelledError: