From 689363525155dd626751af8561678be380ab5ba2 Mon Sep 17 00:00:00 2001 From: Ozzieisaacs Date: Tue, 18 Feb 2020 20:36:32 +0100 Subject: [PATCH] Handle kobo auth request Handle access from localhost for kobo --- cps/kobo.py | 29 +++++++++++-- cps/kobo_auth.py | 52 ++++++++++++++--------- cps/templates/generate_kobo_auth_url.html | 4 +- 3 files changed, 59 insertions(+), 26 deletions(-) diff --git a/cps/kobo.py b/cps/kobo.py index d58be3c5..094ad3b8 100644 --- a/cps/kobo.py +++ b/cps/kobo.py @@ -18,6 +18,8 @@ # along with this program. If not, see . import sys +import base64 +import os import uuid from time import gmtime, strftime try: @@ -394,10 +396,31 @@ def handle_404(err): log.debug("Unknown Request received: %s", request.base_url) return redirect_or_proxy_request() + @kobo.route("/v1/auth/device", methods=["POST"]) -def login_auth_token(): - log.info('Auth') - return redirect_or_proxy_request(proxy=True) +@requires_kobo_auth +def HandleAuthRequest(): + # Missing feature: Authentication :) + log.debug('Kobo Auth request') + content = request.get_json() + AccessToken = base64.b64encode(os.urandom(24)).decode('utf-8') + RefreshToken = base64.b64encode(os.urandom(24)).decode('utf-8') + if config.config_kobo_proxy: + return redirect_or_proxy_request(proxy=True) + else: + response = make_response( + jsonify( + { + "AccessToken": AccessToken, + "RefreshToken": RefreshToken, + "TokenType": "Bearer", + "TrackingId": str(uuid.uuid4()), + "UserKey": content['UserKey'], + } + ) + ) + return response + @kobo.route("/v1/initialization") @requires_kobo_auth diff --git a/cps/kobo_auth.py b/cps/kobo_auth.py index 5178da69..8507de79 100644 --- a/cps/kobo_auth.py +++ b/cps/kobo_auth.py @@ -60,8 +60,9 @@ particular calls to non-Kobo specific endpoints such as the CalibreWeb book down from binascii import hexlify from datetime import datetime from os import urandom +import os -from flask import g, Blueprint, url_for, abort +from flask import g, Blueprint, url_for, abort, request from flask_login import login_user, login_required from flask_babel import gettext as _ @@ -119,28 +120,37 @@ kobo_auth = Blueprint("kobo_auth", __name__, url_prefix="/kobo_auth") @kobo_auth.route("/generate_auth_token/") @login_required def generate_auth_token(user_id): - # Invalidate any prevously generated Kobo Auth token for this user. - auth_token = ub.session.query(ub.RemoteAuthToken).filter( - ub.RemoteAuthToken.user_id == user_id - ).filter(ub.RemoteAuthToken.token_type==1).first() + host = ':'.join(request.host.rsplit(':')[0:-1]) + if host == '127.0.0.1' or host.lower() == 'localhost' or host =='[::ffff:7f00:1]': + warning = _('PLease access calibre-web from non localhost to get valid api_endpoint for kobo device') + return render_title_template( + "generate_kobo_auth_url.html", + title=_(u"Kobo Set-up"), + warning = warning + ) + else: + # Invalidate any prevously generated Kobo Auth token for this user. + auth_token = ub.session.query(ub.RemoteAuthToken).filter( + ub.RemoteAuthToken.user_id == user_id + ).filter(ub.RemoteAuthToken.token_type==1).first() - if not auth_token: - auth_token = ub.RemoteAuthToken() - auth_token.user_id = user_id - auth_token.expiration = datetime.max - auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8") - auth_token.token_type = 1 + if not auth_token: + auth_token = ub.RemoteAuthToken() + auth_token.user_id = user_id + auth_token.expiration = datetime.max + auth_token.auth_token = (hexlify(urandom(16))).decode("utf-8") + auth_token.token_type = 1 - ub.session.add(auth_token) - ub.session.commit() - - return render_title_template( - "generate_kobo_auth_url.html", - title=_(u"Kobo Set-up"), - kobo_auth_url=url_for( - "kobo.TopLevelEndpoint", auth_token=auth_token.auth_token, _external=True - ), - ) + ub.session.add(auth_token) + ub.session.commit() + return render_title_template( + "generate_kobo_auth_url.html", + title=_(u"Kobo Set-up"), + kobo_auth_url=url_for( + "kobo.TopLevelEndpoint", auth_token=auth_token.auth_token, _external=True + ), + warning = False + ) @kobo_auth.route("/deleteauthtoken/") diff --git a/cps/templates/generate_kobo_auth_url.html b/cps/templates/generate_kobo_auth_url.html index 79f6c46d..fea9aecb 100644 --- a/cps/templates/generate_kobo_auth_url.html +++ b/cps/templates/generate_kobo_auth_url.html @@ -2,10 +2,10 @@ {% block body %}

- {{_('Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):')}}. + {{_('Open the .kobo/Kobo eReader.conf file in a text editor and add (or edit):')}}

- {{_('api_endpoint=')}}{{kobo_auth_url}} + {% if not warning %}{{_('api_endpoint=')}}{{kobo_auth_url}}{% else %}{{warning}}{% endif %}

{{_('Please note that every visit to this current page invalidates any previously generated Authentication url for this user.')}}