Source code for evesrp.auth.bravecore
from __future__ import absolute_import
from ecdsa import SigningKey, VerifyingKey, NIST256p
from brave.api.client import SignedAuth, API
from sqlalchemy.orm.exc import NoResultFound
from flask import flash, url_for, redirect, abort, current_app, request
from hashlib import sha256
from binascii import unhexlify
from .. import db, requests_session
from ..util import ensure_unicode
from . import AuthMethod, AuthForm
from .models import User, Group, Pilot
[docs]class BraveCore(AuthMethod):
def __init__(self, client_key, server_key, identifier,
url='https://core.braveineve.com', **kwargs):
self.api = API(url, identifier, client_key, server_key,
requests_session).api
if 'name' not in kwargs:
kwargs['name'] = u'Brave Core'
super(BraveCore, self).__init__(**kwargs)
def login(self, form):
# Redirect to Core for the authorization token. Give URLs to return to.
# Sidenote: At this time, Brave has nearly 0 API documentation. The
# kinda-sorta hidden TEST Auth API documentation is more complete.
result_url = url_for('login.auth_method_login', _external=True,
auth_method=self.safe_name)
response = self.api.core.authorize(success=result_url,
failure=result_url)
core_url = response[u'location']
return redirect(core_url)
def list_groups(self, user=None):
pass
def view(self):
token = ensure_unicode(request.args.get('token'))
if token is not None:
info = self.api.core.info(token=token)
char_name = info.character.name
try:
user = CoreUser.query.filter_by(name=char_name,
authmethod=self.name).one()
user.token = token
except NoResultFound:
user = CoreUser(name=char_name, authmethod=self.name,
token=token)
db.session.add(user)
# Apply admin flag
user.admin = user.name in self.admins
# Sync up group membership
for group_name in info.tags:
try:
group = CoreGroup.query.filter_by(name=group_name,
authmethod=self.name).one()
except NoResultFound:
group = CoreGroup(group_name, self.name)
db.session.add(group)
user.groups.add(group)
for group in user.groups:
if group.name not in info.tags:
user.groups.remove(group)
# Sync pilot (just the primary for now)
pilot = Pilot.query.get(info.character.id)
if not pilot:
pilot = Pilot(user, char_name, info.character.id)
db.session.add(pilot)
else:
pilot.user = user
db.session.commit()
self.login_user(user)
# TODO Have a meaningful redirect for this
return redirect(url_for('index'))
else:
flash(u"Login failed.", u'error')
return redirect(url_for('login.login'))
[docs]class CoreUser(User):
id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
token = db.Column(db.String(100, convert_unicode=True))
[docs]class CoreGroup(Group):
id = db.Column(db.Integer, db.ForeignKey('group.id'), primary_key=True)
description = db.Column(db.Text(convert_unicode=True))