diff --git a/config.py b/config.py index 08d641195..1855b96fc 100644 --- a/config.py +++ b/config.py @@ -44,8 +44,12 @@ version = None language = None API_CLIENT_ID = '095d8cd841ac40b581330919b49fe746' +API_CLIENT_ID_SERENITY = 'bc90aa496a404724a93f41b4f4e97761' + ESI_CACHE = 'esi_cache' SSO_CALLBACK = 'https://pyfa-org.github.io/Pyfa/callback' +SSO_CALLBACK_SERENITY='https://esi.evepc.163.com/ui/oauth2-redirect.html' +SSO_LOGOFF_SERENITY='https://login.evepc.163.com/account/logoff' LOGLEVEL_MAP = { "critical": CRITICAL, diff --git a/gui/builtinPreferenceViews/pyfaEsiPreferences.py b/gui/builtinPreferenceViews/pyfaEsiPreferences.py index 1356fec16..f769cbe6e 100644 --- a/gui/builtinPreferenceViews/pyfaEsiPreferences.py +++ b/gui/builtinPreferenceViews/pyfaEsiPreferences.py @@ -48,9 +48,30 @@ class PFEsiPref(PreferenceView): self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange) - mainSizer.Add(rbSizer, 1, wx.ALL | wx.EXPAND, 0) + mainSizer.Add(rbSizer, 0, wx.ALL | wx.EXPAND, 0) + + esiSizer = wx.BoxSizer(wx.HORIZONTAL) + + self.esiServer = wx.StaticText(panel, wx.ID_ANY, _t("Default SSO Server:"), wx.DefaultPosition,wx.DefaultSize, 0) + + self.esiServer.Wrap(-1) + + esiSizer.Add(self.esiServer, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) + + self.esiServer.SetToolTip(wx.ToolTip(_t('The source you choose will be used on connection.'))) + + self.chESIserver = wx.Choice(panel, choices=list(self.settings.keys())) + + self.chESIserver.SetStringSelection(self.settings.get("server")) + + esiSizer.Add(self.chESIserver, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 10) + + mainSizer.Add(esiSizer, 0, wx.TOP | wx.RIGHT , 10) + + self.chESIserver.Bind(wx.EVT_CHOICE, self.OnServerChange) panel.SetSizer(mainSizer) + panel.Layout() def OnTimeoutChange(self, event): @@ -59,8 +80,12 @@ class PFEsiPref(PreferenceView): def OnModeChange(self, event): self.settings.set('loginMode', event.GetInt()) + def OnServerChange(self, event): + source = self.chESIserver.GetString(self.chESIserver.GetSelection()) + self.settings.set("server",source) + def getImage(self): return BitmapLoader.getBitmap("eve", "gui") -PFEsiPref.register() +PFEsiPref.register() \ No newline at end of file diff --git a/gui/ssoLogin.py b/gui/ssoLogin.py index 28f283cd8..9a3eac1b5 100644 --- a/gui/ssoLogin.py +++ b/gui/ssoLogin.py @@ -26,6 +26,18 @@ class SsoLogin(wx.Dialog): bSizer1.Add(self.ssoInfoCtrl, 1, wx.LEFT | wx.RIGHT | wx.EXPAND, 10) + from service.settings import EsiSettings + import config + import time + self.Esisettings = EsiSettings.getInstance() + if (self.Esisettings.get("server") == "Serenity"): + bSizer4 = wx.BoxSizer(wx.VERTICAL) + text = wx.StaticText(self, wx.ID_ANY, _t("Please copy the url when your authorization is completed")) + bSizer4.Add(text, 0, wx.ALL | wx.EXPAND, 10) + bSizer1.Add(bSizer4, 0, wx.ALL | wx.EXPAND, 10) + webbrowser.open(config.SSO_LOGOFF_SERENITY) + time.sleep(1) + bSizer3 = wx.BoxSizer(wx.VERTICAL) bSizer3.Add(wx.StaticLine(self, wx.ID_ANY), 0, wx.BOTTOM | wx.EXPAND, 10) @@ -39,6 +51,7 @@ class SsoLogin(wx.Dialog): self.sEsi = Esi.getInstance() uri = self.sEsi.get_login_uri(None) + webbrowser.open(uri) diff --git a/service/esi.py b/service/esi.py index 3fb38ac03..bc0ef14a8 100644 --- a/service/esi.py +++ b/service/esi.py @@ -108,7 +108,16 @@ class Esi(EsiAccess): else: with gui.ssoLogin.SsoLogin() as dlg: if dlg.ShowModal() == wx.ID_OK: - message = json.loads(base64.b64decode(dlg.ssoInfoCtrl.Value.strip())) + message = {} + if (self.server_name == "Serenity"): + import re + s=re.search(r'(?<=code=)[a-zA-Z0-9\-_]*',dlg.ssoInfoCtrl.Value.strip()) + if s: + message['code']=s.group() + else: + message['code']=None + else: + message = json.loads(base64.b64decode(dlg.ssoInfoCtrl.Value.strip())) self.handleLogin(message) def stopServer(self): diff --git a/service/esiAccess.py b/service/esiAccess.py index 12bcddc94..984059315 100644 --- a/service/esiAccess.py +++ b/service/esiAccess.py @@ -65,7 +65,8 @@ class APIException(Exception): class EsiAccess: def __init__(self): self.settings = EsiSettings.getInstance() - self.server_base: ApiBase = supported_servers[self.settings.get("server")] + self.server_name=self.settings.get('server') + self.server_base: ApiBase = supported_servers[self.server_name] # session request stuff self._session = Session() @@ -116,7 +117,10 @@ class EsiAccess: @property def client_id(self): - return self.settings.get('clientID') or config.API_CLIENT_ID + if (self.server_name == "Serenity"): + return self.settings.get('clientID') or config.API_CLIENT_ID + else: + return self.settings.get('clientID') or config.API_CLIENT_ID_SERENITY @staticmethod def update_token(char, tokenResponse): @@ -141,17 +145,25 @@ class EsiAccess: 'redirect': redirect, 'state': self.state } - - args = { - 'response_type': 'code', - 'redirect_uri': config.SSO_CALLBACK, - 'client_id': self.client_id, - 'scope': ' '.join(scopes), - 'code_challenge': code_challenge, - 'code_challenge_method': 'S256', - 'state': base64.b64encode(bytes(json.dumps(state_arg), 'utf-8')) - } - + if(self.server_name=="Serenity"): + args = { + 'response_type': 'code', + 'redirect_uri': config.SSO_CALLBACK_SERENITY, + 'client_id': self.client_id, + 'scope': ' '.join(scopes), + 'state': 'hilltech', + 'device_id': 'eims' + } + else: + args = { + 'response_type': 'code', + 'redirect_uri': config.SSO_CALLBACK, + 'client_id': self.client_id, + 'scope': ' '.join(scopes), + 'code_challenge': code_challenge, + 'code_challenge_method': 'S256', + 'state': base64.b64encode(bytes(json.dumps(state_arg), 'utf-8')) + } return '%s?%s' % ( self.oauth_authorize, urlencode(args) diff --git a/service/settings.py b/service/settings.py index 64435cd4d..36be2b6c5 100644 --- a/service/settings.py +++ b/service/settings.py @@ -388,6 +388,9 @@ class EsiSettings: def set(self, type, value): self.settings[type] = value + def keys(self): + return list({"Tranquility":"Tranquility","Singularity":"Singularity","Serenity":"Serenity"}) + class StatViewSettings: _instance = None