def do_security(): global client global app print("security: Authenticating") #Retrieve the tokens from the film with open("tokens.txt", "rb") as fp: tokens_file = pickle.load(fp) fp.close() esi_app = EsiApp(cache=cache, cache_time=0, headers=headers) app = esi_app.get_latest_swagger security = EsiSecurity(redirect_uri=redirect_uri, client_id=client_id, secret_key=secret_key, headers=headers) client = EsiClient(retry_requests=True, headers=headers, security=security) security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': tokens_file['refresh_token'] }) tokens = security.refresh() api_info = security.verify() print("security: Authenticated for " + str(api_info['Scopes']))
def test_esisecurity_verify(self): # this is just for coverage purpose. This doesn't work without valid # jwt token with self.assertRaises(AttributeError): self.security.verify() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with self.assertRaises(JWTError): self.security.verify() with httmock.HTTMock(*_all_auth_mock_): with open(TestEsiSecurity.RSC_JWKS, 'r') as jwks: jwks = json.load(jwks) security_nojwks = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, jwks_key=jwks['keys'][0]) security_nojwks.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with self.assertRaises(JWTError): security_nojwks.verify()
class Char: def __init__(self, token_file): #Retrieve the tokens from the file with open(token_file, "rb") as fp: tokens_file = pickle.load(fp) fp.close() esi_app = EsiApp(cache=cache, cache_time=0, headers=headers) self.app = esi_app.get_latest_swagger self.security = EsiSecurity(redirect_uri=redirect_uri, client_id=client_id, secret_key=secret_key, headers=headers) self.client = EsiClient(retry_requests=True, headers=headers, security=self.security) self.security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': tokens_file['refresh_token'] }) tokens = self.security.refresh() api_info = self.security.verify() print("security: Authenticated for " + str(api_info['Scopes']))
def get_api(fn, scopes): esi_app = App.create( 'https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility') esi_security = EsiSecurity( app=esi_app, redirect_uri='http://localhost:8080/callback', client_id='0b9ac4978a9a4feba20a7eba4f666a46', secret_key='odtDKZWZbwbFnBHNXnOhRX50YrU49owBw1qE3v7p', ) esi_client = EsiClient(retry_requests=True, security=esi_security) def write_refresh_token(refresh_token, **kwargs): with open(fn, "w") as f: f.write(refresh_token) AFTER_TOKEN_REFRESH.add_receiver(write_refresh_token) if os.path.isfile(fn): with open(fn) as f: token = open(fn).read() esi_security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': token }) tokens = esi_security.refresh() else: print(esi_security.get_auth_uri(scopes=scopes)) tokens = esi_security.auth(input()) write_refresh_token(**tokens) api_info = esi_security.verify() return api_info, esi_app, esi_client
def get_esi_security(token=None): """ EsiSecurity is used to refresh and manage EVE Token objects """ client = EveClient.get_instance() esi_security = EsiSecurity(redirect_uri=client.esi_callback_url, client_id=client.esi_client_id, secret_key=client.esi_secret_key, headers={'User-Agent': "Krypted Platform"}) if token: esi_security.update_token(token.populate()) return esi_security
class ESIClient(): """ didn't use esiSecurity for callback handling as flask seems fine """ def __init__(self, token, refresh=False): self.client_id = os.environ.get('EVE_SKILLS_CID') self.secret_id = os.environ.get('EVE_SKILLS_SECRET') self.redir_url = os.environ.get('EVE_SKILLS_REDIR') self.app = App.create( url= "https://esi.evetech.net/latest/swagger.json?datasource=tranquility" ) self.security = EsiSecurity( app=self.app, redirect_uri=self.redir_url, client_id=self.client_id, secret_key=self.secret_id, ) self.client = EsiClient( header={'User-Agent': 'EVE-SKILLS'}, raw_body_only= False, # parse json automatically, slow, bad performance security=self.security) self.token = None if not refresh: self.token = self.security.auth( token) # use code from login redirect if refresh: print('[I] refreshing token') self.security.update_token({ 'access_token': '', 'expires_in': -1, # force refresh anyway 'refresh_token': token }) self.token = self.security.refresh() print(self.token) def get_info(self): return self.security.verify() # verify token, get character info
def setup_esi(app_id, app_secret, refresh_token, cache=DictCache()): """Set up the ESI client Args: app_id (string): SSO Application ID from CCP app_secret (string): SSO Application Secret from CCP refresh_token (string): SSO refresh token cache (False, optional): esipy.cache instance Returns: tuple: esi app definition, esi client >>> setup_esi(CONFIG['SSO_APP_ID'], CONFIG['SSO_APP_KEY'], ... CONFIG['SSO_REFRESH_TOKEN'], cache) # doctest: +ELLIPSIS (<pyswagger.core.App object ...>, <esipy.client.EsiClient object ...>) """ esi_meta = EsiApp(cache=cache) esi = esi_meta.get_latest_swagger esi_security = EsiSecurity( redirect_uri='http://localhost', client_id=app_id, secret_key=app_secret, headers={'User-Agent': 'https://github.com/eve-n0rman/structurebot'}) esi_security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': refresh_token }) esi_client = EsiClient( retry_requests=True, headers={'User-Agent': 'https://github.com/eve-n0rman/structurebot'}, raw_body_only=False, security=esi_security, cache=cache) return (esi, esi_client, esi_security)
app=app, redirect_uri='http://*****:*****@gmail.com'}, security=security) # to update the security object, security.update_token({ 'access_token': '', # leave this empty 'expires_in': -1, # seconds until expiry, so we force refresh anyway 'refresh_token': 'yUI96Q6kOxvQ6ulwDnQ7VLD1I-4LH-Jz8DOY9Di4NhA1' }) tokens = security.refresh() operations = [] for page in range(1, 20): operations.append(app.op['get_markets_structures_structure_id']( structure_id=1022734985679, page=page)) results = client.multi_request(operations) for (req, res) in results: for order in res.data:
class ESI: def __init__(self): self.db = Database() self.config = Config() self.scopes = self.config.getConfig()["settings"]["esiScopes"] self.esi_app = App.create( url=self.config.getConfig()["settings"]["esiURL"], ) self.security = EsiSecurity( app=self.esi_app, redirect_uri=self.config.getConfig()["settings"]["esiCallback"], client_id=self.config.getConfig()["settings"]["esiClientID"], secret_key=self.config.getConfig()["settings"]["esiSecretKey"], headers={ 'User-Agent': self.config.getConfig()["settings"]["esiCustomHeader"] }) self.client = EsiClient( security=self.security, retry_requests=True, headers={ 'User-Agent': self.config.getConfig()["settings"]["esiCustomHeader"] }) def getAuthURI(self): return self.security.get_auth_uri(scopes=self.scopes) def getToken(self, code): return self.security.auth(code) def getESIChar(self, token): self.security.update_token(token) try: self.security.refresh() except APIException as e: if str(e) == "HTTP Error 400: invalid_token": session.pop('token', None) session.pop('char', None) return redirect(url_for('page_routes.logout')) return self.security.verify() def isVerified(self, token): try: self.security.update_token(token) except: return False try: self.security.refresh() character = self.security.verify() except: return False session["char"] = character return True def getESIInfo(self, endpoint, obj): info = self.esi_app.op[endpoint](**obj) res = self.client.request(info) result = res.data try: if "response" in result: result = result["response"] except: pass return result def getESIInfoMP(self, endpoint, obj): info = self.esi_app.op[endpoint](**obj) res = self.client.head(info) if res.status == 200: number_of_pages = res.header["X-Pages"][0] ops = [] for page in range(1, number_of_pages + 1): obj["page"] = page ops.append(self.esi_app.op[endpoint](**obj)) results = self.client.multi_request(ops) return results return {} def subToken(self, refresh_token): self.security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': refresh_token }) def getForceRefresh(self): return self.security.refresh()
class TestEsiSecurity(unittest.TestCase): CALLBACK_URI = "https://foo.bar/baz/callback" CLIENT_ID = 'foo' SECRET_KEY = 'bar' BASIC_TOKEN = six.u('Zm9vOmJhcg==') SECURITY_NAME = 'evesso' TOKEN_IDENTIFIER = 'ESIPY_TEST_TOKEN' CODE_VERIFIER = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk" CODE_CHALLENGE = "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM" RSC_SSO_ENDPOINTS = "test/resources/oauth-authorization-server.json" RSC_JWKS = "test/resources/jwks.json" def setUp(self): warnings.simplefilter('ignore') self.custom_refresh_token_signal = Signal() with httmock.HTTMock(*_all_auth_mock_): self.security = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, signal_token_updated=self.custom_refresh_token_signal, token_identifier=TestEsiSecurity.TOKEN_IDENTIFIER) self.security_pkce = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, code_verifier=TestEsiSecurity.CODE_VERIFIER, ) with open(TestEsiSecurity.RSC_SSO_ENDPOINTS, 'r') as sso_endpoints: self.sso_endpoints = json.load(sso_endpoints) def test_esisecurity_init(self): with httmock.HTTMock(*_all_auth_mock_): with self.assertRaises(AttributeError): EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, sso_endpoints_url="") with self.assertRaises(AttributeError): EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID) with open(TestEsiSecurity.RSC_JWKS, 'r') as jwks: jwks = json.load(jwks) EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, jwks_key=jwks['keys'][0]) self.assertEqual(self.security.security_name, TestEsiSecurity.SECURITY_NAME) self.assertEqual(self.security.redirect_uri, TestEsiSecurity.CALLBACK_URI) self.assertEqual(self.security.client_id, TestEsiSecurity.CLIENT_ID) self.assertEqual(self.security.secret_key, TestEsiSecurity.SECRET_KEY) self.assertEqual(self.security.token_identifier, TestEsiSecurity.TOKEN_IDENTIFIER) self.assertEqual(self.security.oauth_issuer, self.sso_endpoints['issuer']) self.assertEqual(self.security.oauth_authorize, self.sso_endpoints['authorization_endpoint']) self.assertEqual(self.security.oauth_token, self.sso_endpoints['token_endpoint']) self.assertEqual(self.security.oauth_revoke, self.sso_endpoints['revocation_endpoint']) def test_esisecurity_update_token(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) self.assertEqual(self.security.access_token, 'access_token') self.assertEqual(self.security.refresh_token, 'refresh_token') self.assertEqual(self.security.token_expiry, int(time.time() + 60)) def test_esisecurity_get_auth_uri(self): with self.assertRaises(AttributeError): self.security.get_auth_uri(state="") self.assertEqual(self.security.get_auth_uri(state='teststate'), ("%s?response_type=code" "&redirect_uri=%s&client_id=%s&state=teststate") % (self.sso_endpoints['authorization_endpoint'], quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) self.assertEqual( self.security.get_auth_uri(implicit=True, state='teststate'), ("%s?response_type=token" "&redirect_uri=%s&client_id=%s&state=teststate") % (self.sso_endpoints['authorization_endpoint'], quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) scopes = ["Scope1", "Scope2"] self.assertEqual( self.security.get_auth_uri(scopes=scopes, state='teststate'), ("%s?response_type=code&redirect_uri=%s" "&client_id=%s&scope=Scope1+Scope2&state=teststate") % (self.sso_endpoints['authorization_endpoint'], quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) def test_esisecurity_get_access_token_request_params(self): params = self.security.get_access_token_params('foo') self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], self.sso_endpoints['token_endpoint']) self.assertEqual(params['data'], { 'grant_type': 'authorization_code', 'code': 'foo', }) def test_esisecurity_get_refresh_token_request_params(self): with self.assertRaises(AttributeError): self.security.get_refresh_token_params() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) # refresh all scopes params = self.security.get_refresh_token_params() self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], self.sso_endpoints['token_endpoint']) self.assertEqual(params['data'], { 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token', }) # refresh specific scopes params = self.security.get_refresh_token_params(scope_list=['a', 'b']) self.assertEqual( params['data'], { 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token', 'scope': 'a+b' }) # refresh specific scopes exception with self.assertRaises(AttributeError): self.security.get_refresh_token_params(scope_list='notalist') def test_esisecurity_token_expiry(self): self.security.token_expiry = None self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() - 10 self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() + 60 self.assertFalse(self.security.is_token_expired()) self.assertTrue(self.security.is_token_expired(offset=70)) def test_esisecurity_auth(self): with httmock.HTTMock(oauth_token): ret = self.security.auth('let it bee') self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) ret = self.security.auth('no_refresh') self.assertEqual(ret['access_token'], 'access_token') self.assertNotIn('refresh_token', ret) self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.auth('fail_test') def test_esisecurity_refresh(self): with httmock.HTTMock(oauth_token): self.security.refresh_token = 'refresh_token' ret = self.security.refresh() self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.refresh_token = 'fail_test_token' self.security.refresh() def test_esisecurity_revoke(self): with httmock.HTTMock(oauth_revoke): self.security.refresh_token = 'refresh_token' self.security.revoke() self.security.access_token = 'access_token' self.security.revoke() with self.assertRaises(AttributeError): self.security.revoke() def test_esisecurity_verify(self): # this is just for coverage purpose. This doesn't work without valid # jwt token with self.assertRaises(AttributeError): self.security.verify() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with self.assertRaises(JWTError): self.security.verify() with httmock.HTTMock(*_all_auth_mock_): with open(TestEsiSecurity.RSC_JWKS, 'r') as jwks: jwks = json.load(jwks) security_nojwks = EsiSecurity( redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, jwks_key=jwks['keys'][0]) security_nojwks.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with self.assertRaises(JWTError): security_nojwks.verify() def test_esisecurity_call(self): class RequestTest(object): def __init__(self): self._security = [] self._p = {'header': {}} self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) req = RequestTest() self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'unknown_security_name': {}, }) self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'evesso': {}, }) self.security(req) self.assertIn('Authorization', req._p['header']) self.assertEqual('Bearer access_token', req._p['header']['Authorization']) def test_esisecurity_callback_refresh(self): class RequestTest(object): """ pyswagger Request object over simplified for test purpose""" def __init__(self): self._security = ['evesso'] self._p = {'header': {}} def callback_function(**kwargs): callback_function.count += 1 callback_function.count = 0 self.custom_refresh_token_signal.add_receiver(callback_function) self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': -1 }) # test the auto refresh callback event customized with httmock.HTTMock(oauth_token): req = RequestTest() self.security(req) self.assertEqual(callback_function.count, 1) def test_esisecurity_non_json_response(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': -1 }) with httmock.HTTMock(non_json_error): try: self.security.auth('somecode') except APIException as exc: self.assertEqual(exc.status_code, 502) self.assertEqual( exc.response, six.b('<html><body>Some HTML Errors</body></html>')) try: self.security.refresh() except APIException as exc: self.assertEqual(exc.status_code, 502) self.assertEqual( exc.response, six.b('<html><body>Some HTML Errors</body></html>')) def test_esisecurity_pkce(self): uri = self.security_pkce.get_auth_uri('test') self.assertIn('code_challenge=%s' % TestEsiSecurity.CODE_CHALLENGE, uri) params = self.security_pkce.get_access_token_params('test') self.assertEqual(params['data']['code_verifier'], TestEsiSecurity.CODE_VERIFIER) self.assertEqual(params['data']['client_id'], TestEsiSecurity.CLIENT_ID) self.assertNotIn('Authorization', params['headers'])
class ESI: def __init__(self, client_id, secret_key, refresh_token, cache_path, prefix='esipy'): self.client_id = client_id self.secret_key = secret_key self.refresh_token = refresh_token self.cache_path = cache_path self.prefix = prefix self._start() def _start(self): self.cache = FileCache(path=self.cache_path) self.esi_app = EsiApp(cache=self.cache, cache_prefix=self.prefix) self.app = self.esi_app.get_latest_swagger self.security = EsiSecurity( app=self.app, redirect_uri='http://localhost/oauth-callback', # This doesnt matter headers={ 'User-Agent': 'Discord bot by Prozn: https://github.com/prozn/dankcord' }, client_id=self.client_id, secret_key=self.secret_key, ) self.esi = EsiClient( retry_requests= False, # set to retry on http 5xx error (default False) headers={ 'User-Agent': 'Discord bot by Prozn: https://github.com/prozn/dankcord' }, security=self.security) self.security.update_token({ 'access_token': '', # leave this empty 'expires_in': -1, # seconds until expiry, so we force refresh anyway 'refresh_token': self.refresh_token }) self.security.refresh() @esiexcept def character_info(self, character_id): op = self.app.op['get_characters_character_id']( character_id=character_id) character = self.esi.request(op, raise_on_error=True) return character def character_name(self, character_id): character = self.character_info(character_id) if not character: return False return character.data.name @esiexcept def id_name(self, id): op = self.app.op['post_universe_names'](ids=[id]) names = self.esi.request(op, raise_on_error=True) return names.data[0].name @esiexcept def corp_contracts(self, corporation_id, raw=False): op = self.app.op['get_corporations_corporation_id_contracts']( corporation_id=corporation_id) contracts = self.esi.request(op, raise_on_error=True, raw_body_only=raw) if raw: return contracts.raw else: return contracts.data @esiexcept def get_system_name(self, system_id): op = self.app.op['get_universe_systems_system_id'](system_id=system_id) system = self.esi.request(op, raise_on_error=True) return system.data.name @esiexcept def location_details(self, location_id): if location_id > 1000000000000: # it is a citadel location_type = 'citadel' op = self.app.op['get_universe_structures_structure_id']( structure_id=location_id) else: # it is a station location_type = 'station' op = self.app.op['get_universe_stations_station_id']( station_id=location_id) location = self.esi.request(op, raise_on_error=True) if location_type == 'citadel': system = location.data.solar_system_id else: system = location.data.system_id details = { 'location_id': location_id, 'location_type': location_type, 'system_id': system, 'name': location.data.name } return details @esiexcept def personal_contracts(self): raise NotImplementedError
client = EsiClient(security=security, retry_requests=True, headers={'User-Agent': 'something'}, header={'User-Agent': 'something'}) print(f'{KIN3_common.timestamp()} : EsiClient loaded') esi_latest = (app_latest, security, client) # esi_v1 = (app_v1, security, client) esi_v2 = (app_v2, security, client) print(f'{KIN3_common.timestamp()} : --------') #%% if token['expires_in'] < 1200: security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': token['refresh_token'] }) token = security.refresh() token #%% security.update_token({ 'access_token': '', 'expires_in': -1, 'refresh_token': 'Pc4C1iK6p0evpU3dBSkSwg==' }) token = security.refresh() #%%
"token_type":"Bearer", "expires_in": int(file.exp_t_s), "refresh_token":"***static***" } #This was for authentication to generate auth-code to get access token print uri x=raw_input("Paste Code :") esi_security.auth(x) verify=esi_security.verify() #Important stuff, load response header to upload "token" and refresh to get new access token, last verify to get your needed inquiry response esi_security.update_token(header_re) esi_security.refresh() verify=esi_security.verify() #Get access token and time token from esipy code after successful refresh (expiry method is custom changed) accesscode = esi_security._EsiSecurity__get_token_auth_header() accesscode = accesscode['Authorization'][8:] timestp = esi_security.is_token_expired2() #custom changed #The following is processing and your required data inquiry from ESI network myid = verify['CharacterID'] myname = verify['CharacterName']
class TestEsiSecurity(unittest.TestCase): CALLBACK_URI = "https://foo.bar/baz/callback" LOGIN_EVE = "https://login.eveonline.com" OAUTH_VERIFY = "https://esi.tech.ccp.is/verify/" OAUTH_TOKEN = "%s/oauth/token" % LOGIN_EVE OAUTH_AUTHORIZE = "%s/oauth/authorize" % LOGIN_EVE CLIENT_ID = 'foo' SECRET_KEY = 'bar' BASIC_TOKEN = six.u('Zm9vOmJhcg==') SECURITY_NAME = 'evesso' @mock.patch('six.moves.urllib.request.urlopen') def setUp(self, urlopen_mock): # I hate those mock... thx urlopen instead of requests... urlopen_mock.return_value = open('test/resources/swagger.json') self.app = App.create('https://esi.tech.ccp.is/latest/swagger.json') self.security = EsiSecurity( app=self.app, redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, ) def test_esisecurity_init_with_app(self): """ test security init with app and URL""" with self.assertRaises(NameError): EsiSecurity(app=self.app, redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, security_name="security_name_that_does_not_exist") with self.assertRaises(AttributeError): EsiSecurity(app=self.app, redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, esi_url="") self.assertEqual(self.security.security_name, TestEsiSecurity.SECURITY_NAME) self.assertEqual(self.security.redirect_uri, TestEsiSecurity.CALLBACK_URI) self.assertEqual(self.security.client_id, TestEsiSecurity.CLIENT_ID) self.assertEqual(self.security.secret_key, TestEsiSecurity.SECRET_KEY) self.assertEqual(self.security.oauth_verify, TestEsiSecurity.OAUTH_VERIFY) self.assertEqual(self.security.oauth_token, TestEsiSecurity.OAUTH_TOKEN) self.assertEqual(self.security.oauth_authorize, TestEsiSecurity.OAUTH_AUTHORIZE) def test_esisecurity_other_init(self): """ test security init without app and with urls """ with self.assertRaises(AttributeError): EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, sso_url="") security = EsiSecurity(redirect_uri=TestEsiSecurity.CALLBACK_URI, client_id=TestEsiSecurity.CLIENT_ID, secret_key=TestEsiSecurity.SECRET_KEY, sso_url='foo.com', esi_url='bar.baz') self.assertEqual(security.oauth_verify, "bar.baz/verify/") self.assertEqual(security.oauth_token, "foo.com/oauth/token") self.assertEqual(security.oauth_authorize, "foo.com/oauth/authorize") def test_esisecurity_update_token(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) self.assertEqual(self.security.access_token, 'access_token') self.assertEqual(self.security.refresh_token, 'refresh_token') self.assertEqual(self.security.token_expiry, int(time.time() + 60)) def test_esisecurity_get_auth_uri(self): self.assertEqual(self.security.get_auth_uri(), ("%s/oauth/authorize?response_type=code" "&redirect_uri=%s&client_id=%s") % (TestEsiSecurity.LOGIN_EVE, quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) self.assertEqual(self.security.get_auth_uri(implicit=True), ("%s/oauth/authorize?response_type=token" "&redirect_uri=%s&client_id=%s") % (TestEsiSecurity.LOGIN_EVE, quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) scopes = ["Scope1", "Scope2"] state = "foo" self.assertEqual(self.security.get_auth_uri( scopes, state), ("%s/oauth/authorize?response_type=code&redirect_uri=%s" "&client_id=%s&scope=Scope1+Scope2&state=foo") % (TestEsiSecurity.LOGIN_EVE, quote(TestEsiSecurity.CALLBACK_URI, safe=''), TestEsiSecurity.CLIENT_ID)) def test_esisecurity_get_access_token_request_params(self): params = self.security.get_access_token_request_params('foo') self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], TestEsiSecurity.OAUTH_TOKEN) self.assertEqual(params['data'], { 'grant_type': 'authorization_code', 'code': 'foo', }) def test_esisecurity_get_refresh_token_request_params(self): with self.assertRaises(AttributeError): self.security.get_refresh_token_request_params() self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) params = self.security.get_refresh_token_request_params() self.assertEqual( params['headers'], {'Authorization': 'Basic %s' % TestEsiSecurity.BASIC_TOKEN}) self.assertEqual(params['url'], TestEsiSecurity.OAUTH_TOKEN) self.assertEqual(params['data'], { 'grant_type': 'refresh_token', 'refresh_token': 'refresh_token', }) def test_esisecurity_token_expiry(self): self.security.token_expiry = None self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() - 10 self.assertTrue(self.security.is_token_expired()) self.security.token_expiry = time.time() + 60 self.assertFalse(self.security.is_token_expired()) self.assertTrue(self.security.is_token_expired(offset=70)) def test_esisecurity_auth(self): with httmock.HTTMock(oauth_token): ret = self.security.auth('let it bee') self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) ret = self.security.auth('no_refresh') self.assertEqual(ret['access_token'], 'access_token') self.assertNotIn('refresh_token', ret) self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.auth('fail_test') def test_esisecurity_refresh(self): with httmock.HTTMock(oauth_token): self.security.refresh_token = 'refresh_token' ret = self.security.refresh() self.assertEqual(ret['access_token'], 'access_token') self.assertEqual(ret['refresh_token'], 'refresh_token') self.assertEqual(ret['expires_in'], 1200) with self.assertRaises(APIException): self.security.refresh_token = 'fail_test_token' self.security.refresh() def test_esisecurity_verify(self): self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) with httmock.HTTMock(oauth_verify): char_data = self.security.verify() self.assertEqual(char_data['CharacterID'], 123456789) self.assertEqual(char_data['CharacterName'], 'EsiPy Tester') self.assertEqual(char_data['CharacterOwnerHash'], 'YetAnotherHash') with httmock.HTTMock(oauth_verify_fail): with self.assertRaises(APIException): self.security.verify() def test_esisecurity_call(self): class RequestTest(object): def __init__(self): self._security = [] self._p = {'header': {}} self.security.update_token({ 'access_token': 'access_token', 'refresh_token': 'refresh_token', 'expires_in': 60 }) req = RequestTest() self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'unknown_security_name': {}, }) self.security(req) self.assertNotIn('Authorization', req._p['header']) req._security.append({ 'evesso': {}, }) self.security(req) self.assertIn('Authorization', req._p['header']) self.assertEqual('Bearer access_token', req._p['header']['Authorization'])