Пример #1
0
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
Пример #2
0
 def ESIMail(self, KilledCharID):
     security = EsiSecurity(
         app=self.app,
         redirect_uri='http://localhost/callback/',
         client_id=GlobalConsts.CLIENTID,
         secret_key=GlobalConsts.SECRETKEY,
     )
     print(security.get_auth_uri(scopes=GlobalConsts.REQUESTSCOPES))
     try:
         tokens = security.auth(GlobalConsts.CHARAUTHTOKEN)
     except:
         security.refresh_token = GlobalConsts.CHARREFRESHTOKEN
         tokens = security.refresh()
     accessToken = tokens[GlobalConsts.TOKENAUTHKEY]
     RefreshToken = tokens[GlobalConsts.TOKENREFRESHKEY]
     expire_date = datetime.fromtimestamp(
         time.time() + tokens[GlobalConsts.TOKENEXPIRESKEY], )
     api_info = security.verify()
     strCharacterID = api_info['CharacterID']
     Response = SendMail(strCharacterID, KilledCharID,
                         GlobalConsts.DEFAULTMESSAGE, accessToken)
     if Response.status_code == GlobalConsts.SUCCESSRESPONSECODE:
         print("Sent message to characterid {0}".format(KilledCharID))
     else:
         print("Failed to send message to characterid {0}".format(
             KilledCharID))
Пример #3
0
def authenticate():
    app = App.create(
        url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility"
    )
    security = EsiSecurity(
        app=app,
        redirect_uri='http://localhost:51350',
        client_id=secret['client_id'],
        secret_key=secret['secret_key'],
    )
    client = EsiClient(retry_requests=True,
                       header={'User-Agent': 'shipLocation'},
                       security=security)
    eve_sso_auth_url = security.get_auth_uri(
        scopes=['esi-location.read_ship_type.v1'])
    webbrowser.open(eve_sso_auth_url, new=2)  # open in a new browser tab
    auth_code = fetch_auth_code(
    )  # fetch authentication code using a temporary web server
    tokens = security.auth(auth_code)

    return (app, client, security, tokens)
Пример #4
0
def do_security(tokens_file, scopes):
    esi_app = EsiApp(cache=cache, cache_time=0)
    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)

    print("Open link in browser and authorize")
    print(security.get_auth_uri(scopes=scopes))
    code = input("Enter in code:\n")
    tokens = security.auth(code)

    print(tokens)
    print("\n Writing tokens to " + str(tokens_file))
    with open(tokens_file, 'wb') as fp:
        pickle.dump(tokens, fp)
    fp.close()
Пример #5
0
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()
Пример #6
0
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'])
Пример #7
0
SECRET_KEY = ''
SCOPES = [
    'esi-universe.read_structures.v1', 'esi-markets.structure_markets.v1'
]

app = Flask(__name__)
esi_app = App.create(
    url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility")

security = EsiSecurity(app=esi_app,
                       redirect_uri='http://127.0.0.1:5000/ESICallback',
                       client_id=CLIENT_ID,
                       secret_key=SECRET_KEY)

client = EsiClient(retry_requests=True,
                   header={'User-Agent': 'ESI Token Fetcher'},
                   security=security)

webbrowser.open_new(security.get_auth_uri(scopes=SCOPES))


@app.route('/ESICallback')
def esi_callback():
    code = request.args.get('code', '')

    if code:
        tokens = security.auth(code)
        return str(tokens)
    else:
        return 'No code returned!'
Пример #8
0
        from esipy import EsiSecurity
        from esipy import App
        from esipy import EsiClient
        from esipy import EsiSecurity

        esi_app = App.create('https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility')

        esi_security = EsiSecurity(
                        app=esi_app,
                        redirect_uri='https://localhost/callback/',
                        client_id='ab6c5ead15684e91914db83850aba714',
                        secret_key='MpHBlfeDZPOVarvJRJB8EzsfM1WPL5u7CYiOXqQx'
        )


        uri = esi_security.get_auth_uri(scopes=['esi-wallet.read_character_wallet.v1'])

        esi_client = EsiClient(esi_security)


        # Create response header to load afterwards back

        header_re = {
             "access_token": '%s' % file.acc,
             "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
Пример #9
0
    client_id=config.ESI_CLIENT_ID,
    secret_key=config.ESI_SECRET_KEY,
    # code_verifier=generate_code_verifier()
    headers={'User-Agent': config.ESI_USER_AGENT})

# init the client
client = EsiClient(
    cache=cache,
    security=security,
    headers={'User-Agent': config.ESI_USER_AGENT},
    retry_requests=True,
)

### Authenticate
eve_sso_auth_url = security.get_auth_uri(
    state=helpers.generate_state_token(),
    # scopes=config.ESI_SCOPES  # or None (default) if you don't need any scope
    scopes=['publicData'])

webbrowser.open_new_tab(eve_sso_auth_url)

code = input('Code: ')

tokens = security.auth(code)
security.verify()

m = trade.Markets(app, client)
# m.get_space_rich_jita()
m.get_space_rich_amarr()

print('debug')
Пример #10
0
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'])
Пример #11
0
# replace the redirect_uri, client_id and secret_key values
# with the values you get from the STEP 1 !
security = EsiSecurity(
    app=app,
    redirect_uri='http://*****:*****@gmail.com'},
                   security=security)

# this print a URL where we can log in
print security.get_auth_uri(scopes=['esi-markets.structure_markets.v1'])

tokens = security.auth(
    'drsYPDYBwgMwNKkLOS2egrb-vlpxzITrrDJFiE-lO_4HKjVbLuXOfoGySZlR3hsw0')

print tokens

{
    "access_token": "frenafeifafrbaefluerbfeainb",
    "token_type": "Bearer",
    "expires_in": 1200,
    "refresh_token": "fera48ftea4at64fr684fae"
}

# use the verify endpoint to know who we are
api_info = security.verify()
Пример #12
0
app = Flask(__name__)
esi_app = App.create(
    url="https://esi.evetech.net/latest/swagger.json?datasource=tranquility")

security = EsiSecurity(app=esi_app,
                       redirect_uri='http://127.0.0.1:5000/ESICallback',
                       headers={'User-Agent': 'ESI Token Fetcher'},
                       client_id=CLIENT_ID,
                       secret_key=SECRET_KEY)

client = EsiClient(retry_requests=True,
                   headers={'User-Agent': 'ESI Token Fetcher'},
                   security=security)

state = ''.join(random.choices(string.ascii_letters + string.digits, k=32))
webbrowser.open_new(security.get_auth_uri(scopes=SCOPES, state=state))


@app.route('/ESICallback')
def esi_callback():
    url_state = request.args.get('state', '')

    if url_state != state:
        return 'Invalid state token returned!'

    code = request.args.get('code', '')

    if code:
        tokens = security.auth(code)
        return str(tokens)
    else:
Пример #13
0
connection = database.create_connection(
    "rollcall", "postgres", cfg.db_password, "127.0.0.1", "5432"
)
connection.autocommit = True
cursor = connection.cursor()

security = EsiSecurity(
    redirect_uri='http://51.158.104.35:5000/tokens/new',
    client_id='1922eb4bb2294e1ab3f47f15b50de475',
    secret_key= cfg.secret,
    headers={'User-Agent': cfg.agent},
)


print (security.get_auth_uri(state=randint(100000000, 999999999), scopes=['esi-fleets.read_fleet.v1']))


def create_app(config_filename=None):
    app = Flask(__name__, instance_relative_config=True)
    # app.config.from_pyfile(config_filename)
    register_blueprints(app)
    return app


root_blueprint = Blueprint('root', __name__)


@root_blueprint.route('/tokens/new')
def receive_token():
    auth_code = request.args.get("code")
Пример #14
0
app.config['CORPORATION_ID'] = 98538579

## ESI
from esipy import App as esiapp
from esipy import EsiClient, EsiSecurity
esi_app = esiapp.create(
    url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility")
esi_security = EsiSecurity(
    app=esi_app,
    redirect_uri=app.config['ESI_CALLBACK_URL'],
    client_id=app.config['ESI_CLIENT_ID'],
    secret_key=app.config['ESI_SECRET_KEY'],
)
esi_client = EsiClient(
    retry_requests=True,
    header={
        'User-Agent':
        'Something CCP can use to contact you and that define your app'
    },
    raw_body_only=False,
    security=esi_security)
app.config['ESI_REDIRECT_URL'] = esi_security.get_auth_uri(
    scopes=['esi-contracts.read_corporation_contracts.v1'], state="None")
app.config['esi_security'] = esi_security
app.config['esi_client'] = esi_client
app.config['esi_app'] = esi_app

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://' + app.config[
    'SQL_USER'] + ':' + app.config['SQL_PASSWORD'] + '@localhost/dev'
db = SQLAlchemy(app)
Пример #15
0
SCOPES = ['esi-universe.read_structures.v1', 'esi-markets.structure_markets.v1']

app = Flask(__name__)
esi_app = App.create(url="https://esi.tech.ccp.is/latest/swagger.json?datasource=tranquility")

security = EsiSecurity(
    app=esi_app,
    redirect_uri='http://127.0.0.1:5000/ESICallback',
    client_id=CLIENT_ID,
    secret_key=SECRET_KEY
)

client = EsiClient(
    retry_requests=True,
    header={'User-Agent': 'ESI Token Fetcher'},
    security=security
)

webbrowser.open_new(security.get_auth_uri(scopes=SCOPES))

@app.route('/ESICallback')
def esi_callback():
    code = request.args.get('code', '')
    
    if code:
        tokens = security.auth(code)
        return str(tokens)
    else:
        return 'No code returned!'

Пример #16
0
    headers={'User-Agent': 'your app name'},
    security=security
)

# import scope

# with open ('scopes', 'rb') as fp:
#     scopeslist = pickle.load(fp)

sscp = app.root._Swagger__securityDefinitions['evesso']._SecurityScheme__scopes
scopeslist = list()
for i in sscp:
    scopeslist.append(i)

# this print a URL where we can log in
print(security.get_auth_uri(scopes=scopeslist))
print("please copy your code and paste here\n")
authcode = input()

# YOUR_CODE is the code you got from Step 3. (do not forget quotes around it)
tokens = security.auth(authcode)
print(tokens)

# use the verify endpoint to know who we are
api_info = security.verify()

print(api_info)
# api_info contains data like this
# {
#   "Scopes": "esi-wallet.read_character_wallet.v1",
#   "ExpiresOn": "2017-07-14T21:09:20",
Пример #17
0
from esipy import App, EsiClient, EsiSecurity
from esipy.exceptions import APIException
from .settings import ESI_URL, ESI_CONNECT_IMG_BAR, ESI_CLIENT_ID, ESI_SECRET_KEY, ESI_CALLBACK_URL, ESI_SCOPES

esi_app = App.create(ESI_URL)
esi_security = EsiSecurity(app=esi_app,
                           redirect_uri=ESI_CALLBACK_URL,
                           client_id=ESI_CLIENT_ID,
                           secret_key=ESI_SECRET_KEY)
esi_client = EsiClient(security=esi_security)
esi_scopes = ESI_SCOPES

esi_secure = esi_security.get_auth_uri(scopes=esi_scopes)
esi_secure_url = "<a href='" + esi_secure + "'><img src='" + ESI_CONNECT_IMG_BAR + "'></a>"


def esi_update_token(request):
    esi_security.update_token(request.session['token'])


def esi_refresh_verify(request):
    esi_security.update_token(request.session['token'])
    esi_security.refresh()
    return esi_security.verify()


def esi_verify():
    return esi_security.verify()
Пример #18
0
admin_id = int(bot_token_lines[1].strip())

keywords_auth = {'auth', '인증', '등록'}
keywords_auth_cancel = {'auth_cancel', '인증취소', '등록취소'}
keywords_dps = {'dps', 'vindi', 'vindicator', '디피', '빈디', '빈디케이터'}
keywords_snp = {
    'snp', 'sniper', 'nightmare', 'machariel', '스나', '나메', '나이트메어', '마차',
    '마차리엘'
}
keywords_logi = {'logi', 'scimitar', 'basilisk', '로지', '시미타', '바실리스크', '바실'}
keywords_cancel = {'cancel', '취소'}

esi_scopes = [
    'esi-location.read_location.v1', 'esi-fleets.read_fleet.v1',
    'esi-fleets.write_fleet.v1', 'esi-fittings.read_fittings.v1',
    'esi-characters.read_chat_channels.v1', 'esi-location.read_online.v1'
]
auth_url = security.get_auth_uri(state='KIN3_FC_Auth', scopes=esi_scopes)
auth_description = 'EVE 계정과 KIN3 대기열 봇을 연결\n인증명령어: `ㅊ인증 코드`'
auth_embed = discord.Embed(title='계정등록 링크',
                           url=auth_url,
                           description=auth_description)

server_list = KIN3_waitlist.server_list()
periodic_5s_running = False
periodic_60s_running = False
tcp_server_online = False

print(f'{KIN3_common.timestamp()} : Starting bot')
bot.run(bot_token)