Browse Source

Allow specifying trust level in mark-trusted

Tulir Asokan 3 years ago
parent
commit
76cfacffe4
3 changed files with 28 additions and 10 deletions
  1. 3 2
      mausignald/signald.py
  2. 10 1
      mausignald/types.py
  3. 15 7
      mautrix_signal/commands/signal.py

+ 3 - 2
mausignald/signald.py

@@ -33,6 +33,7 @@ from .types import (
     Quote,
     Reaction,
     SendMessageResponse,
+    TrustLevel,
     WebsocketConnectionState,
     WebsocketConnectionStateChangeEvent,
 )
@@ -420,7 +421,7 @@ class SignaldClient(SignaldRPCClient):
         self,
         username: str,
         recipient: Address,
-        trust_level: str,
+        trust_level: TrustLevel | str,
         safety_number: str | None = None,
         qr_code_data: str | None = None,
     ) -> None:
@@ -437,7 +438,7 @@ class SignaldClient(SignaldRPCClient):
             "trust",
             account=username,
             **args,
-            trust_level=trust_level,
+            trust_level=trust_level.value if isinstance(trust_level, TrustLevel) else trust_level,
             address=recipient.serialize(),
         )
 

+ 10 - 1
mausignald/types.py

@@ -100,12 +100,21 @@ class LinkSession(SerializableAttrs):
     session_id: str
 
 
-@dataclass
 class TrustLevel(SerializableEnum):
     TRUSTED_UNVERIFIED = "TRUSTED_UNVERIFIED"
     TRUSTED_VERIFIED = "TRUSTED_VERIFIED"
     UNTRUSTED = "UNTRUSTED"
 
+    @property
+    def human_str(self) -> str:
+        if self == TrustLevel.TRUSTED_VERIFIED:
+            return "trusted"
+        elif self == TrustLevel.TRUSTED_UNVERIFIED:
+            return "trusted (unverified)"
+        elif self == TrustLevel.UNTRUSTED:
+            return "untrusted"
+        return "unknown"
+
 
 @dataclass
 class Identity(SerializableAttrs):

+ 15 - 7
mautrix_signal/commands/signal.py

@@ -19,7 +19,7 @@ import base64
 import json
 
 from mausignald.errors import UnknownIdentityKey
-from mausignald.types import Address
+from mausignald.types import Address, TrustLevel
 from mautrix.bridge.commands import SECTION_ADMIN, HelpSection, command_handler
 from mautrix.types import EventID
 
@@ -199,20 +199,28 @@ async def set_profile_name(evt: CommandEvent) -> None:
     await evt.reply("Successfully updated profile name")
 
 
+_trust_levels = [x.value for x in TrustLevel]
+
+
 @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_>",
+    help_args="<_recipient phone_> [_level_] <_safety number_>",
 )
 async def mark_trusted(evt: CommandEvent) -> EventID:
     if len(evt.args) < 2:
         return await evt.reply(
-            "**Usage:** `$cmdprefix+sp mark-trusted <recipient phone> <safety number>`"
+            "**Usage:** `$cmdprefix+sp mark-trusted <recipient phone> [level] <safety number>`"
         )
     number = evt.args[0].translate(remove_extra_chars)
-    safety_num = "".join(evt.args[1:]).replace("\n", "")
+    remaining_args = evt.args[1:]
+    trust_level = TrustLevel.TRUSTED_VERIFIED
+    if len(evt.args) > 2 and evt.args[1].upper() in _trust_levels:
+        trust_level = TrustLevel(evt.args[1])
+        remaining_args = evt.args[2:]
+    safety_num = "".join(remaining_args).replace("\n", "")
     if len(safety_num) != 60 or not safety_num.isdecimal():
         return await evt.reply("That doesn't look like a valid safety number")
     try:
@@ -220,11 +228,11 @@ async def mark_trusted(evt: CommandEvent) -> EventID:
             evt.sender.username,
             Address(number=number),
             safety_number=safety_num,
-            trust_level="TRUSTED_VERIFIED",
+            trust_level=trust_level,
         )
     except UnknownIdentityKey as e:
-        return await evt.reply(f"Failed to mark {number} as trusted: {e}")
-    return await evt.reply(f"Successfully marked {number} as trusted")
+        return await evt.reply(f"Failed to mark {number} as {trust_level.human_str}: {e}")
+    return await evt.reply(f"Successfully marked {number} as {trust_level.human_str}")
 
 
 @command_handler(