From 10d4d47a178f801bd5c514fd4d227267b37cd1a7 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Thu, 17 Nov 2022 16:19:47 -0600 Subject: [PATCH] Handle errors in authorisation for both Twitter and mastodon --- src/sessions/mastodon/session.py | 24 ++++++++++++---- src/sessions/twitter/session.py | 49 ++++++++++++++------------------ 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/sessions/mastodon/session.py b/src/sessions/mastodon/session.py index 9e565c9d..b49a86d2 100644 --- a/src/sessions/mastodon/session.py +++ b/src/sessions/mastodon/session.py @@ -60,10 +60,15 @@ class Session(base.baseSession): authorisation_dialog.Destroy() if answer != wx.ID_OK: return - client_id, client_secret = mastodon.Mastodon.create_app("TWBlue", api_base_url=authorisation_dialog.GetValue(), website="https://twblue.es") - temporary_api = mastodon.Mastodon(client_id=client_id, client_secret=client_secret, api_base_url=instance, mastodon_version=MASTODON_VERSION) - authorisation_dialog.Destroy() - auth_url = temporary_api.auth_request_url() + try: + client_id, client_secret = mastodon.Mastodon.create_app("TWBlue", api_base_url=authorisation_dialog.GetValue(), website="https://twblue.es") + temporary_api = mastodon.Mastodon(client_id=client_id, client_secret=client_secret, api_base_url=instance, mastodon_version=MASTODON_VERSION) + auth_url = temporary_api.auth_request_url() + except MastodonError: + dlg = wx.MessageDialog(None, _("We could not connect to your mastodon instance. Please verify that the domain exists and the instance is accessible via a web browser."), _("Instance error"), wx.ICON_ERROR) + dlg.ShowModal() + dlg.Destroy() + return webbrowser.open_new_tab(auth_url) verification_dialog = wx.TextEntryDialog(None, _("Enter the verification code"), _("PIN code authorization")) answer = verification_dialog.ShowModal() @@ -71,10 +76,19 @@ class Session(base.baseSession): verification_dialog.Destroy() if answer != wx.ID_OK: return - access_token = temporary_api.log_in(code=verification_dialog.GetValue()) + try: + access_token = temporary_api.log_in(code=verification_dialog.GetValue()) + except MastodonError: + dlg = wx.MessageDialog(None, _("We could not authorice your mastodon account to be used in TWBlue. This might be caused due to an incorrect verification code. Please try to add the session again."), _("Authorization error"), wx.ICON_ERROR) + dlg.ShowModal() + dlg.Destroy() + return + self.create_session_folder() + self.get_configuration() self.settings["mastodon"]["access_token"] = access_token self.settings["mastodon"]["instance"] = instance self.settings.write() + return True def get_user_info(self): """ Retrieves some information required by TWBlue for setup.""" diff --git a/src/sessions/twitter/session.py b/src/sessions/twitter/session.py index a957f069..242dfeb5 100644 --- a/src/sessions/twitter/session.py +++ b/src/sessions/twitter/session.py @@ -5,13 +5,13 @@ import time import logging import webbrowser import wx +import tweepy import demoji import config import output import application import appkeys from pubsub import pub -import tweepy from tweepy.errors import TweepyException, Forbidden, NotFound from tweepy.models import User as UserModel from mysc.thread_utils import call_threaded @@ -150,37 +150,32 @@ class Session(base.baseSession): self.logged = False raise Exceptions.RequireCredentialsSessionError -# @_require_configuration def authorise(self): """ Authorises a Twitter account. This function needs to be called for each new session, after self.get_configuration() and before self.login()""" if self.logged == True: raise Exceptions.AlreadyAuthorisedError("The authorisation process is not needed at this time.") - else: - self.auth = tweepy.OAuth1UserHandler(appkeys.twitter_api_key, appkeys.twitter_api_secret) - redirect_url = self.auth.get_authorization_url() - webbrowser.open_new_tab(redirect_url) - self.authorisation_dialog = authorisationDialog() - self.authorisation_dialog.cancel.Bind(wx.EVT_BUTTON, self.authorisation_cancelled) - self.authorisation_dialog.ok.Bind(wx.EVT_BUTTON, self.authorisation_accepted) - self.authorisation_dialog.ShowModal() - - def verify_authorisation(self, pincode): - self.auth.get_access_token(pincode) - self.settings["twitter"]["user_key"] = self.auth.access_token - self.settings["twitter"]["user_secret"] = self.auth.access_token_secret + auth = tweepy.OAuth1UserHandler(appkeys.twitter_api_key, appkeys.twitter_api_secret) + redirect_url = auth.get_authorization_url() + webbrowser.open_new_tab(redirect_url) + verification_dialog = wx.TextEntryDialog(None, _("Enter your PIN code here"), _("Authorising account...")) + answer = verification_dialog.ShowModal() + code = verification_dialog.GetValue() + verification_dialog.Destroy() + if answer != wx.ID_OK: + return + try: + auth.get_access_token(code) + except TweepyException: + dlg = wx.MessageDialog(None, _("We could not authorice your Twitter account to be used in TWBlue. This might be caused due to an incorrect verification code. Please try to add the session again."), _("Authorization error"), wx.ICON_ERROR) + dlg.ShowModal() + dlg.Destroy() + return False + self.create_session_folder() + self.get_configuration() + self.settings["twitter"]["user_key"] = auth.access_token + self.settings["twitter"]["user_secret"] = auth.access_token_secret self.settings.write() - del self.auth - - def authorisation_cancelled(self, *args, **kwargs): - """ Destroy the authorization dialog. """ - self.authorisation_dialog.Destroy() - del self.authorisation_dialog - - def authorisation_accepted(self, *args, **kwargs): - """ Gets the PIN code entered by user and validate it through Twitter.""" - pincode = self.authorisation_dialog.text.GetValue() - self.verify_authorisation(pincode) - self.authorisation_dialog.Destroy() + return True def api_call(self, call_name, action="", _sound=None, report_success=False, report_failure=True, preexec_message="", *args, **kwargs): """ Make a call to the Twitter API. If there is a connectionError or another exception not related to Twitter, It will call the method again at least 25 times, waiting a while between calls. Useful for post methods.