Forráskód Böngészése

Handle 2FA required error in FB login flow

Tulir Asokan 2 éve
szülő
commit
f1e9cd4800
1 módosított fájl, 27 hozzáadás és 20 törlés
  1. 27 20
      mautrix_instagram/web/provisioning_api.py

+ 27 - 20
mautrix_instagram/web/provisioning_api.py

@@ -264,26 +264,7 @@ class ProvisioningAPI:
         try:
             resp = await api.login(username, password)
         except IGLoginTwoFactorRequiredError as e:
-            track(user, "$login_2fa")
-            found_username = e.body.two_factor_info.username if e.body.two_factor_info else None
-            if found_username and found_username != username:
-                state.login_2fa_username = found_username
-            else:
-                state.login_2fa_username = None
-            self.log.debug(
-                "%s logged in as %s -> %s, but needs 2-factor auth",
-                user.mxid,
-                username,
-                found_username or "<no username?>",
-            )
-            return web.json_response(
-                data={
-                    "status": "two-factor",
-                    "response": e.body.serialize(),
-                },
-                status=202,
-                headers=self._acao_headers,
-            )
+            return self._2fa_required(user, username, state, e)
         except IGChallengeError as e:
             self.log.debug("%s logged in as %s, but got a challenge", user.mxid, username)
             return await self.start_checkpoint(user, state, api, e, after="password")
@@ -327,6 +308,30 @@ class ProvisioningAPI:
             return self._unknown_error(user, username, e, after="password")
         return await self._finish_login(user, state, api, login_resp=resp, after="password")
 
+    def _2fa_required(
+        self, user: u.User, username: str, state: AndroidState, err: IGLoginTwoFactorRequiredError
+    ) -> web.Response:
+        track(user, "$login_2fa")
+        found_username = err.body.two_factor_info.username if err.body.two_factor_info else None
+        if found_username and found_username != username:
+            state.login_2fa_username = found_username
+        else:
+            state.login_2fa_username = None
+        self.log.debug(
+            "%s logged in as %s -> %s, but needs 2-factor auth",
+            user.mxid,
+            username,
+            found_username or "<no username?>",
+        )
+        return web.json_response(
+            data={
+                "status": "two-factor",
+                "response": err.body.serialize(),
+            },
+            status=202,
+            headers=self._acao_headers,
+        )
+
     async def _get_user(
         self, request: web.Request, check_state: bool = False, read_body: bool = True
     ) -> tuple[u.User, JSON]:
@@ -717,6 +722,8 @@ class ProvisioningAPI:
                 status=403,
                 headers=self._acao_headers,
             )
+        except IGLoginTwoFactorRequiredError as e:
+            return self._2fa_required(user, "<facebook credentials>", state, e)
         except IGCheckpointError as e:
             return self._checkpoint_error(user, "<facebook credentials>", e, after="facebook auth")
         except IGConsentRequiredError as e: