Browse Source

catch captcha required error and request user to enter captcha

Malte E 3 years ago
parent
commit
b4aa8b77a8
2 changed files with 35 additions and 3 deletions
  1. 2 2
      mausignald/errors.py
  2. 33 1
      mautrix_signal/commands/auth.py

+ 2 - 2
mausignald/errors.py

@@ -49,7 +49,7 @@ class UnknownIdentityKey(ResponseError):
     pass
 
 
-class CaptchaRequired(ResponseError):
+class CaptchaRequiredError(ResponseError):
     pass
 
 
@@ -116,7 +116,7 @@ response_error_types = {
     "UserAlreadyExists": UserAlreadyExistsError,
     "RequestValidationFailure": RequestValidationFailure,
     "UnknownIdentityKey": UnknownIdentityKey,
-    "CaptchaRequired": CaptchaRequired,
+    "CaptchaRequiredError": CaptchaRequiredError,
     "InternalError": InternalError,
     "AttachmentTooLargeError": AttachmentTooLargeError,
     "AuthorizationFailedError": AuthorizationFailedError,

+ 33 - 1
mautrix_signal/commands/auth.py

@@ -16,7 +16,12 @@
 from typing import Union
 import io
 
-from mausignald.errors import AuthorizationFailedError, TimeoutException, UnexpectedResponse
+from mausignald.errors import (
+    AuthorizationFailedError,
+    CaptchaRequiredError,
+    TimeoutException,
+    UnexpectedResponse,
+)
 from mautrix.appservice import IntentAPI
 from mautrix.bridge.commands import HelpSection, command_handler
 from mautrix.types import EventID, ImageInfo, MediaMessageEventContent, MessageType, UserID
@@ -169,6 +174,33 @@ async def register(evt: CommandEvent) -> None:
     except Exception:
         await evt.reply("Please enter the phone number in international format (E.164)")
         return
+    try:
+        username = await evt.bridge.signal.register(phone, voice=voice, captcha=captcha)
+        evt.sender.command_status = {
+            "action": "Register",
+            "room_id": evt.room_id,
+            "next": enter_register_code,
+            "username": username,
+        }
+        await evt.reply("Register SMS requested, please enter the code here.")
+    except CaptchaRequiredError:
+        await evt.reply(
+            "Captcha required. Please follow the instructions at https://signald.org/articles/captcha/ "
+            "to obtain a captcha token and paste it here."
+        )
+        evt.sender.command_status = {
+            "action": "Register",
+            "room_id": evt.room_id,
+            "next": enter_captcha_token,
+            "voice": voice,
+            "phone": phone,
+        }
+
+
+async def enter_captcha_token(evt: CommandEvent) -> None:
+    captcha = evt.args[0]
+    phone = evt.command_status["phone"]
+    voice = evt.command_status["voice"]
     username = await evt.bridge.signal.register(phone, voice=voice, captcha=captcha)
     evt.sender.command_status = {
         "action": "Register",