Ver Fonte

Add command to mark safety numbers as trusted

Tulir Asokan há 4 anos atrás
pai
commit
5fa2c227ea
3 ficheiros alterados com 23 adições e 2 exclusões
  1. 2 2
      mausignald/rpc.py
  2. 7 0
      mausignald/signald.py
  3. 14 0
      mautrix_signal/commands/signal.py

+ 2 - 2
mausignald/rpc.py

@@ -114,9 +114,9 @@ class SignaldRPCClient:
                 waiter.set_exception(UnexpectedError(data["message"]))
             except KeyError:
                 waiter.set_exception(UnexpectedError("Unexpected error with no message"))
-        elif data and "error" in data:
+        elif data and "error" in data and isinstance(data["error"], (str, dict)):
             waiter.set_exception(make_response_error(data["error"]))
-        elif "error" in req:
+        elif "error" in req and isinstance(req["error"], (str, dict)):
             waiter.set_exception(make_response_error(req["error"]))
         else:
             waiter.set_result((command, data))

+ 7 - 0
mausignald/signald.py

@@ -233,3 +233,10 @@ class SignaldClient(SignaldRPCClient):
         if avatar_path is not None:
             args["avatarFile"] = avatar_path
         await self.request("set_profile", "set_profile", account=username, version="v1", **args)
+
+    async def trust(self, username: str, recipient: Address, fingerprint: str, trust_level: str
+                    ) -> str:
+        resp = await self.request("trust", "trusted_safety_number", username=username,
+                                  version="v0", fingerprint=fingerprint,
+                                  recipientAddress=recipient.serialize(), trust_level=trust_level)
+        return resp["message"]

+ 14 - 0
mautrix_signal/commands/signal.py

@@ -122,6 +122,20 @@ async def set_profile_name(evt: CommandEvent) -> None:
     await evt.reply("Successfully updated profile name")
 
 
+@command_handler(needs_auth=True, management_only=False, help_section=SECTION_SIGNAL,
+                 help_text="Mark another user's safety number as trusted",
+                 help_args="<_recipient phone_> <_safety number_>")
+async def mark_trusted(evt: CommandEvent) -> None:
+    number = evt.args[0]
+    safety_num = "".join(evt.args[1:]).replace("\n", "")
+    if len(safety_num) != 60 or not safety_num.isdecimal():
+        await evt.reply("That doesn't look like a valid safety number")
+        return
+    msg = await evt.bridge.signal.trust(evt.sender.username, Address(number=number),
+                                        fingerprint=safety_num, trust_level="TRUSTED_VERIFIED")
+    await evt.reply(msg)
+
+
 @command_handler(needs_admin=False, needs_auth=True, help_section=SECTION_SIGNAL,
                  help_text="Sync data from Signal")
 async def sync(evt: CommandEvent) -> None: