def setSsoCharacter(charID, ssoCharID): char = eos.db.getCharacter(charID) if ssoCharID is not None: sso = eos.db.getSsoCharacter(ssoCharID, config.getClientSecret()) char.setSsoCharacter(sso, config.getClientSecret()) else: char.setSsoCharacter(None, config.getClientSecret()) eos.db.commit()
def getLoginURI(self, redirect=None): self.state = str(uuid.uuid4()) if self.settings.get("ssoMode") == EsiSsoMode.AUTO: args = { 'state': self.state, 'pyfa_version': config.version, 'login_method': self.settings.get('loginMode'), 'client_hash': config.getClientSecret() } if redirect is not None: args['redirect'] = redirect return '%s?%s' % ( self.oauth_authorize, urlencode(args) ) else: return '%s?response_type=%s&redirect_uri=%s&client_id=%s%s%s' % ( self.oauth_authorize, 'code', quote('http://localhost:6461', safe=''), self.settings.get('clientID'), '&scope=%s' % '+'.join(scopes) if scopes else '', '&state=%s' % self.state )
def getLoginURI(self, redirect=None): self.state = str(uuid.uuid4()) if self.settings.get("ssoMode") == SsoMode.AUTO: args = { 'state': self.state, 'pyfa_version': config.version, 'login_method': self.settings.get('loginMode'), 'client_hash': config.getClientSecret() } if redirect is not None: args['redirect'] = redirect return '%s?%s' % ( self.oauth_authorize, urlencode(args) ) else: return '%s?response_type=%s&redirect_uri=%s&client_id=%s%s%s' % ( self.oauth_authorize, 'code', quote('http://localhost:6461', safe=''), self.settings.get('clientID'), '&scope=%s' % '+'.join(scopes) if scopes else '', '&state=%s' % self.state )
def handleLogin(self, message): # we already have authenticated stuff for the auto mode if (self.settings.get('ssoMode') == SsoMode.AUTO): ssoInfo = message['SSOInfo'][0] auth_response = json.loads(base64.b64decode(ssoInfo)) else: # otherwise, we need to fetch the information auth_response = self.auth(message['code'][0]) res = self._session.get(self.oauth_verify, headers=self.get_oauth_header( auth_response['access_token'])) if res.status_code != 200: raise APIException(self.oauth_verify, res.status_code, res.json()) cdata = res.json() print(cdata) currentCharacter = self.getSsoCharacter(cdata['CharacterName']) if currentCharacter is None: currentCharacter = SsoCharacter(cdata['CharacterID'], cdata['CharacterName'], config.getClientSecret()) Esi.update_token(currentCharacter, auth_response) eos.db.save(currentCharacter) wx.PostEvent(self.mainFrame, GE.SsoLogin(character=currentCharacter))
def handleLogin(self, ssoInfo): auth_response = json.loads(base64.b64decode(ssoInfo)) # We need to preload the ESI Security object beforehand with the auth response so that we can use verify to # get character information # init the security object esisecurity = EsiSecurityProxy(sso_url=config.ESI_AUTH_PROXY) esisecurity.update_token(auth_response) # we get the character information cdata = esisecurity.verify() print(cdata) currentCharacter = self.getSsoCharacter(cdata['CharacterName']) if currentCharacter is None: currentCharacter = SsoCharacter(cdata['CharacterID'], cdata['CharacterName'], config.getClientSecret()) currentCharacter.esi_client = Esi.genEsiClient(esisecurity) Esi.update_token( currentCharacter, auth_response) # this also sets the esi security token eos.db.save(currentCharacter) wx.PostEvent(self.mainFrame, GE.SsoLogin(character=currentCharacter))
def delSsoCharacter(self, id): char = eos.db.getSsoCharacter(id, config.getClientSecret()) # There is an issue in which the SSO character is not removed from any linked characters - a reference to the # sso character remains even though the SSO character is deleted which should have deleted the link. This is a # work around until we can figure out why. Manually delete SSOCharacter from all of it's characters for x in char.characters: x._Character__ssoCharacters.remove(char) eos.db.remove(char) wx.PostEvent(self.mainFrame, GE.SsoLogout(charID=id))
def ssoLogin(self, event): self.popCharList() sChar = Character.getInstance() # Update existing pyfa character, if it doesn't exist - create new char = sChar.getCharacter(event.character.characterName) if char is None: char = sChar.new(event.character.characterName) char.setSsoCharacter(event.character, config.getClientSecret()) sChar.apiFetch(char.ID, APIView.fetchCallback) event.Skip()
def fetchSkills(self, event): sEsi = Esi.getInstance() chars = sEsi.getSsoCharacters() for ssoChar in chars: if not ssoChar.characters: char = Character.new(ssoChar.characterName) char.setSsoCharacter(ssoChar, config.getClientSecret()) for char in ssoChar.characters: sChar = Character.getInstance() sChar.apiFetch(char.ID, APIView.fetchCallback)
def getSsoCharacter(self, id): """ Get character, and modify to include the eve connection """ char = eos.db.getSsoCharacter(id, config.getClientSecret()) if char is not None and char.esi_client is None: char.esi_client = Esi.genEsiClient() Esi.update_token( char, Esi.get_sso_data(char) ) # don't use update_token on security directly, se still need to apply the values here eos.db.commit() return char
def ssoLogin(self, event): self.popCharList() sChar = Character.getInstance() # Update existing pyfa character, if it doesn't exist - create new char = sChar.getCharacter(event.character.characterName) newChar = False if char is None: char = sChar.new(event.character.characterName) newChar = True char.setSsoCharacter(event.character, config.getClientSecret()) sChar.apiFetch(char.ID, APIView.fetchCallback) wx.PostEvent(self.mainFrame, GE.CharListUpdated()) event.Skip()
def run(self): network = Network.getInstance() try: try: response = network.get( url= 'https://www.pyfa.io/update_check?pyfa_version={}&client_hash={}' .format(config.version, config.getClientSecret()), type=network.UPDATE, timeout=5) except (KeyboardInterrupt, SystemExit): raise except Exception as e: response = network.get( url='https://api.github.com/repos/pyfa-org/Pyfa/releases', type=network.UPDATE, timeout=5) jsonResponse = response.json() jsonResponse.sort(key=lambda x: calendar.timegm( dateutil.parser.parse(x['published_at']).utctimetuple()), reverse=True) for release in jsonResponse[:5]: rVersion = Version(release['tag_name']) cVersion = Version(config.version) # Suppress pre releases if we're not already on a pre-release (if we are, we want to know about new ones) if not cVersion.is_prerelease and rVersion.is_prerelease and self.settings.get( 'prerelease'): continue # Handle use-case of updating to suppressed version if self.settings.get('version') == 'v' + config.version: self.settings.set('version', None) # Suppress version if release['tag_name'] == self.settings.get('version'): break if rVersion > cVersion: wx.CallAfter(self.callback, release, rVersion) break except (KeyboardInterrupt, SystemExit): raise except Exception as e: pyfalog.error("Caught exception in run") pyfalog.error(e) pass
def getLoginURI(self, redirect=None): self.state = str(uuid.uuid4()) esisecurity = EsiSecurityProxy(sso_url=config.ESI_AUTH_PROXY) args = { 'state': self.state, 'pyfa_version': config.version, 'login_method': self.settings.get('loginMode'), 'client_hash': config.getClientSecret() } if redirect is not None: args['redirect'] = redirect return esisecurity.get_auth_uri(**args)
def handleLogin(self, message): auth_response, data = self.auth(message['code']) currentCharacter = self.getSsoCharacter(data['name']) sub_split = data["sub"].split(":") if (len(sub_split) != 3): raise GenericSsoError("JWT sub does not contain the expected data. Contents: %s" % data["sub"]) cid = sub_split[-1] if currentCharacter is None: currentCharacter = SsoCharacter(cid, data['name'], config.getClientSecret()) Esi.update_token(currentCharacter, auth_response) eos.db.save(currentCharacter) wx.PostEvent(self.mainFrame, GE.SsoLogin(character=currentCharacter))
def run(self): network = Network.getInstance() try: try: response = network.request('https://www.pyfa.io/update_check?pyfa_version={}&client_hash={}'.format( config.version, config.getClientSecret()), network.UPDATE) except Exception as e: response = network.request('https://api.github.com/repos/pyfa-org/Pyfa/releases', network.UPDATE) jsonResponse = response.json() jsonResponse.sort( key=lambda x: calendar.timegm(dateutil.parser.parse(x['published_at']).utctimetuple()), reverse=True ) for release in jsonResponse[:5]: rVersion = Version(release['tag_name']) cVersion = Version(config.version) # Suppress pre releases if we're not already on a pre-release (if we are, we want to know about new ones) if not cVersion.is_prerelease and rVersion.is_prerelease and self.settings.get('prerelease'): continue # Handle use-case of updating to suppressed version if self.settings.get('version') == 'v' + config.version: self.settings.set('version', None) # Suppress version if release['tag_name'] == self.settings.get('version'): break if rVersion > cVersion: wx.CallAfter(self.callback, release, rVersion) break except Exception as e: pyfalog.error("Caught exception in run") pyfalog.error(e) pass
def getSsoCharacter(charID): char = eos.db.getCharacter(charID) sso = char.getSsoCharacter(config.getClientSecret()) return sso
def getSsoCharacter(self, id): char = eos.db.getSsoCharacter(id, config.getClientSecret()) eos.db.commit() return char
def getSsoCharacters(self): chars = eos.db.getSsoCharacters(config.getClientSecret()) return chars
def handleLogin(self, message): # we already have authenticated stuff for the auto mode if self.settings.get('ssoMode') == EsiSsoMode.AUTO: ssoInfo = message['SSOInfo'][0] auth_response = json.loads(base64.b64decode(ssoInfo)) else: # otherwise, we need to fetch the information auth_response = self.auth(message['code'][0]) res = self._session.get( self.oauth_verify, headers=self.get_oauth_header(auth_response['access_token']) ) if res.status_code != 200: raise APIException( self.oauth_verify, res.status_code, res.json() ) cdata = res.json() currentCharacter = self.getSsoCharacter(cdata['CharacterName']) if currentCharacter is None: currentCharacter = SsoCharacter(cdata['CharacterID'], cdata['CharacterName'], config.getClientSecret()) Esi.update_token(currentCharacter, auth_response) eos.db.save(currentCharacter) wx.PostEvent(self.mainFrame, GE.SsoLogin(character=currentCharacter))