Преглед изворни кода

Request new proxy when encountering `ip_block` during provisioning

Nick Mills-Barrett пре 2 година
родитељ
комит
fc2bac68fc
1 измењених фајлова са 12 додато и 7 уклоњено
  1. 12 7
      mautrix_instagram/web/provisioning_api.py

+ 12 - 7
mautrix_instagram/web/provisioning_api.py

@@ -223,7 +223,7 @@ class ProvisioningAPI:
             headers=self._acao_headers,
         )
 
-    def _unknown_error(
+    async def _unknown_error(
         self, user: u.User, username: str, e: Exception, after: str, track_error: bool = True
     ) -> web.Response:
         self.log.exception(
@@ -242,6 +242,9 @@ class ProvisioningAPI:
                 error_code = e.body["error_type"]
         if track_error:
             track(user, "$login_failed", {"error": error_code})
+        if error_code == "ip_block" and user.proxy_handler:
+            user.proxy_handler.update_proxy_url(reason=error_code)
+            await user.on_proxy_update()
         return web.json_response(
             data={
                 "error": "Unknown error while logging in, please try logging in again.",
@@ -329,7 +332,7 @@ class ProvisioningAPI:
                 headers=self._acao_headers,
             )
         except Exception as e:
-            return self._unknown_error(user, username, e, after="password")
+            return await self._unknown_error(user, username, e, after="password")
         return await self._finish_login(user, state, api, login_resp=resp, after="password")
 
     def _2fa_required(
@@ -413,7 +416,7 @@ class ProvisioningAPI:
             )
         except Exception as e:
             track(user, "$login_resend_2fa_sms_fail", {"error": "unknown"})
-            return self._unknown_error(
+            return await self._unknown_error(
                 user, username, e, after="2fa sms request", track_error=False
             )
         return web.json_response(
@@ -485,7 +488,7 @@ class ProvisioningAPI:
         except IGCheckpointError as e:
             return self._checkpoint_error(user, username, e, after="2fa")
         except Exception as e:
-            return self._unknown_error(user, username, e, after="2fa")
+            return await self._unknown_error(user, username, e, after="2fa")
         return await self._finish_login(user, state, api, login_resp=resp, after="2-factor auth")
 
     async def start_checkpoint(
@@ -575,7 +578,7 @@ class ProvisioningAPI:
         except IGCheckpointError as e:
             return self._checkpoint_error(user, "<username not known>", e, after="challenge")
         except Exception as e:
-            return self._unknown_error(user, "<username not known>", e, after="challenge")
+            return await self._unknown_error(user, "<username not known>", e, after="challenge")
         liu = resp.logged_in_user
         challenge_data = resp.serialize()
         challenge_data.pop("logged_in_user", None)
@@ -633,7 +636,7 @@ class ProvisioningAPI:
         except IGLoginRequiredError as e:
             return self._login_required_error(user, username, e, after=f"{after}/success")
         except Exception as e:
-            return self._unknown_error(user, username, e, after=f"{after}/success")
+            return await self._unknown_error(user, username, e, after=f"{after}/success")
         track(user, "$login_success")
         await user.connect(user=resp.user)
         return web.json_response(
@@ -786,7 +789,9 @@ class ProvisioningAPI:
         except IGConsentRequiredError as e:
             return self._consent_error(user, "<facebook credentials>", e, after="facebook auth")
         except Exception as e:
-            return self._unknown_error(user, "<facebook credentials>", e, after="facebook auth")
+            return await self._unknown_error(
+                user, "<facebook credentials>", e, after="facebook auth"
+            )
         return await self._finish_login(user, state, api, login_resp=resp, after="facebook auth")
 
     def _no_fb_account(