Update the SSO Login for Serenity and Singularity server's player

This commit is contained in:
hz2016
2022-04-28 15:58:33 +08:00
parent ebd7a1a4ad
commit 216dd2a787
6 changed files with 82 additions and 16 deletions

View File

@@ -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,

View File

@@ -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()

View File

@@ -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)

View File

@@ -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):

View File

@@ -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)

View File

@@ -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