Просмотр исходного кода

Catch unusable_password errors while logging in

Tulir Asokan 3 лет назад
Родитель
Сommit
0b55708e41

+ 1 - 0
mauigpapi/errors/__init__.py

@@ -20,6 +20,7 @@ from .response import (
     IGLoginInvalidUserError,
     IGLoginRequiredError,
     IGLoginTwoFactorRequiredError,
+    IGLoginUnusablePasswordError,
     IGNotFoundError,
     IGNotLoggedInError,
     IGPrivateUserError,

+ 4 - 0
mauigpapi/errors/response.py

@@ -141,6 +141,10 @@ class IGLoginBadPasswordError(IGLoginError):
     pass
 
 
+class IGLoginUnusablePasswordError(IGLoginError):
+    pass
+
+
 class IGLoginInvalidUserError(IGLoginError):
     pass
 

+ 3 - 0
mauigpapi/http/base.py

@@ -39,6 +39,7 @@ from ..errors import (
     IGLoginInvalidUserError,
     IGLoginRequiredError,
     IGLoginTwoFactorRequiredError,
+    IGLoginUnusablePasswordError,
     IGNotFoundError,
     IGPrivateUserError,
     IGRateLimitError,
@@ -226,6 +227,8 @@ class BaseAndroidAPI:
             raise IGInactiveUserError(resp, data)
         elif error_type == "bad_password":
             raise IGLoginBadPasswordError(resp, data)
+        elif error_type == "unusable_password":
+            raise IGLoginUnusablePasswordError(resp, data)
         elif error_type == "invalid_user":
             raise IGLoginInvalidUserError(resp, data)
         elif error_type == "sms_code_validation_code_invalid":

+ 17 - 0
mautrix_instagram/web/provisioning_api.py

@@ -38,6 +38,7 @@ from mauigpapi.errors import (
     IGLoginInvalidUserError,
     IGLoginRequiredError,
     IGLoginTwoFactorRequiredError,
+    IGLoginUnusablePasswordError,
     IGNotLoggedInError,
     IGResponseError,
 )
@@ -290,6 +291,22 @@ class ProvisioningAPI:
                 status=403,
                 headers=self._acao_headers,
             )
+        except IGLoginUnusablePasswordError as e:
+            self.log.debug(
+                "%s tried to log in as %s with an unusable password: %s",
+                user.mxid,
+                username,
+                e.body.serialize(),
+            )
+            track(user, "$login_failed", {"error": "unusable-password"})
+            return web.json_response(
+                data={
+                    "error": "Unusable password - please check the Instagram website or app first",
+                    "status": "unusable-password",
+                },
+                status=403,
+                headers=self._acao_headers,
+            )
         except Exception as e:
             return self._unknown_error(user, username, e, after="password")
         return await self._finish_login(user, state, api, login_resp=resp, after="password")