diff --git a/gui/mainFrame.py b/gui/mainFrame.py index d5bc8f0e9..f7039b73e 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -62,13 +62,11 @@ from gui.preferenceDialog import PreferenceDialog from gui.resistsEditor import ResistsEditorDlg from gui.setEditor import ImplantSetEditorDlg from gui.shipBrowser import ShipBrowser -from gui.ssoLogin import SsoLogin from gui.statsPane import StatsPane from gui.updateDialog import UpdateDialog from gui.utils.clipboard import fromClipboard, toClipboard from service.character import Character -from service.esi import Esi, LoginMethod -from service.esiAccess import SsoMode +from service.esi import Esi from service.fit import Fit from service.port import EfsPort, IPortUser, Port from service.settings import HTMLExportSettings, SettingsProvider @@ -230,20 +228,11 @@ class MainFrame(wx.Frame): self.sUpdate.CheckUpdate(self.ShowUpdateBox) self.Bind(GE.EVT_SSO_LOGIN, self.onSSOLogin) - self.Bind(GE.EVT_SSO_LOGGING_IN, self.ShowSsoLogin) @property def command(self) -> wx.CommandProcessor: return Fit.getCommandProcessor(self.getActiveFit()) - def ShowSsoLogin(self, event): - if getattr(event, "login_mode", LoginMethod.SERVER) == LoginMethod.MANUAL and getattr(event, "sso_mode", SsoMode.AUTO) == SsoMode.AUTO: - dlg = SsoLogin(self) - if dlg.ShowModal() == wx.ID_OK: - sEsi = Esi.getInstance() - # todo: verify that this is a correct SSO Info block - sEsi.handleLogin({'SSOInfo': [dlg.ssoInfoCtrl.Value.strip()]}) - def ShowUpdateBox(self, release, version): dlg = UpdateDialog(self, release, version) dlg.ShowModal() diff --git a/gui/ssoLogin.py b/gui/ssoLogin.py index 4a8f1197b..d11d84a53 100644 --- a/gui/ssoLogin.py +++ b/gui/ssoLogin.py @@ -1,9 +1,14 @@ import wx +import gui.mainFrame +import webbrowser +import gui.globalEvents as GE class SsoLogin(wx.Dialog): - def __init__(self, parent): - wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="SSO Login", size=wx.Size(400, 240)) + def __init__(self): + mainFrame = gui.mainFrame.MainFrame.getInstance() + + wx.Dialog.__init__(self, mainFrame, id=wx.ID_ANY, title="SSO Login", size=wx.Size(400, 240)) bSizer1 = wx.BoxSizer(wx.VERTICAL) @@ -24,3 +29,55 @@ class SsoLogin(wx.Dialog): self.SetSizer(bSizer1) self.Center() + + mainFrame.Bind(GE.EVT_SSO_LOGIN, self.OnLogin) + + from service.esi import Esi + + self.sEsi = Esi.getInstance() + uri = self.sEsi.getLoginURI(None) + webbrowser.open(uri) + + def OnLogin(self, event): + self.Close() + event.Skip() + + +class SsoLoginServer(wx.Dialog): + def __init__(self, port): + mainFrame = gui.mainFrame.MainFrame.getInstance() + wx.Dialog.__init__(self, mainFrame, id=wx.ID_ANY, title="SSO Login", size=(-1, -1)) + + from service.esi import Esi + + self.sEsi = Esi.getInstance() + serverAddr = self.sEsi.startServer(port) + + uri = self.sEsi.getLoginURI(serverAddr) + + bSizer1 = wx.BoxSizer(wx.VERTICAL) + mainFrame.Bind(GE.EVT_SSO_LOGIN, self.OnLogin) + self.Bind(wx.EVT_CLOSE, self.OnClose) + + text = wx.StaticText(self, wx.ID_ANY, "Waiting for character login through EVE Single Sign-On.") + bSizer1.Add(text, 0, wx.ALL | wx.EXPAND, 10) + + bSizer3 = wx.BoxSizer(wx.VERTICAL) + bSizer3.Add(wx.StaticLine(self, wx.ID_ANY), 0, wx.BOTTOM | wx.EXPAND, 10) + + bSizer3.Add(self.CreateStdDialogButtonSizer(wx.CANCEL), 0, wx.EXPAND) + bSizer1.Add(bSizer3, 0, wx.BOTTOM | wx.RIGHT | wx.LEFT | wx.EXPAND, 10) + + self.SetSizer(bSizer1) + self.Fit() + self.Center() + + webbrowser.open(uri) + + def OnLogin(self, event): + self.Close() + event.Skip() + + def OnClose(self, event): + self.sEsi.stopServer() + event.Skip() diff --git a/service/esi.py b/service/esi.py index 7b5247bec..e7689e0cd 100644 --- a/service/esi.py +++ b/service/esi.py @@ -13,9 +13,11 @@ from eos.enum import Enum from eos.saveddata.ssocharacter import SsoCharacter from service.esiAccess import APIException, SsoMode import gui.globalEvents as GE +from gui.ssoLogin import SsoLogin, SsoLoginServer from service.server import StoppableHTTPServer, AuthHandler from service.settings import EsiSettings from service.esiAccess import EsiAccess +import gui.mainFrame from requests import Session @@ -104,14 +106,15 @@ class Esi(EsiAccess): self.fittings_deleted.add(fittingID) def login(self): - serverAddr = None # always start the local server if user is using client details. Otherwise, start only if they choose to do so. if self.settings.get('ssoMode') == SsoMode.CUSTOM or self.settings.get('loginMode') == LoginMethod.SERVER: - # random port, or if it's custom application, use a defined port - serverAddr = self.startServer(6461 if self.settings.get('ssoMode') == SsoMode.CUSTOM else 0) - uri = self.getLoginURI(serverAddr) - webbrowser.open(uri) - wx.PostEvent(self.mainFrame, GE.SsoLoggingIn(sso_mode=self.settings.get('ssoMode'), login_mode=self.settings.get('loginMode'))) + dlg = gui.ssoLogin.SsoLoginServer(6461 if self.settings.get('ssoMode') == SsoMode.CUSTOM else 0) + dlg.ShowModal() + else: + dlg = gui.ssoLogin.SsoLogin() + + if dlg.ShowModal() == wx.ID_OK: + self.handleLogin({'SSOInfo': [dlg.ssoInfoCtrl.Value.strip()]}) def stopServer(self): pyfalog.debug("Stopping Server") diff --git a/service/server.py b/service/server.py index 09af2299e..31f235c04 100644 --- a/service/server.py +++ b/service/server.py @@ -117,13 +117,7 @@ class StoppableHTTPServer(socketserver.TCPServer): # self.settings = CRESTSettings.getInstance() - # Allow listening for x seconds - sec = 120 - pyfalog.debug("Running server for {0} seconds", sec) - self.socket.settimeout(1) - self.max_tries = sec / self.socket.gettimeout() - self.tries = 0 self.run = True def get_request(self): @@ -140,13 +134,6 @@ class StoppableHTTPServer(socketserver.TCPServer): pyfalog.warning("Setting pyfa server to stop.") self.run = False - def handle_timeout(self): - pyfalog.debug("Number of tries: {0}", self.tries) - self.tries += 1 - if self.tries == self.max_tries: - pyfalog.debug("Server timed out waiting for connection") - self.stop() - def serve(self, callback=None): self.callback = callback while self.run: