From 6ef9c19f4a8dc244b499e0fd812f2a66fc8a5b97 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 14 Apr 2022 09:59:54 +0200 Subject: [PATCH] rojabo token exchange works, refresh not --- rowers/admin.py | 4 +- rowers/models.py | 6 + rowers/rojabo_stuff.py | 167 +++++++++++++++++++++ rowers/templates/rower_exportsettings.html | 10 +- rowers/urls.py | 2 + rowers/views/importviews.py | 61 +++++++- rowers/views/statements.py | 4 +- rowsandall_app/settings.py | 3 +- rowsandall_app/urls.py | 1 + static/img/rojabo.png | Bin 0 -> 37664 bytes 10 files changed, 250 insertions(+), 8 deletions(-) create mode 100644 static/img/rojabo.png diff --git a/rowers/admin.py b/rowers/admin.py index f89d9710..8318dec7 100644 --- a/rowers/admin.py +++ b/rowers/admin.py @@ -49,7 +49,9 @@ class RowerInline(admin.StackedInline): 'stravatoken', 'stravatokenexpirydate', 'stravarefreshtoken', 'stravaexportas', 'strava_auto_export', 'strava_auto_import', - 'garmintoken', 'garminrefreshtoken')}), + 'garmintoken', 'garminrefreshtoken', + 'nktoken','nkrefreshtoken','nktokenexpirydate', + 'rojabo_token','rojabo_refreshtoken','rojabo_tokenexpirydate')}), ('Team', {'fields': ('friends', 'privacy', 'team')}), ) diff --git a/rowers/models.py b/rowers/models.py index e1996516..6c5a679a 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1048,6 +1048,12 @@ class Rower(models.Model): rp3_auto_import = models.BooleanField(default=False) + rojabo_token = models.CharField( + default='', max_length=200, blank=True, null=True) + rojabo_refreshtoken = models.CharField( + default='', max_length=200, blank=True, null=True) + rojabo_tokenexpirydate = models.DateTimeField(blank=True, null=True) + nktoken = models.TextField( default='', max_length=1000, blank=True, null=True) nktokenexpirydate = models.DateTimeField(blank=True, null=True) diff --git a/rowers/rojabo_stuff.py b/rowers/rojabo_stuff.py index d17851b4..5fefec9a 100644 --- a/rowers/rojabo_stuff.py +++ b/rowers/rojabo_stuff.py @@ -1,2 +1,169 @@ from rowers.models import Rower, Workout, TombStone from rowers import utils + +from rowers.imports import * +from rowsandall_app.settings import ( + ROJABO_CLIENT_ID, ROJABO_REDIRECT_URI, ROJABO_CLIENT_SECRET, + SITE_URL, ROJABO_OAUTH_LOCATION, + UPLOAD_SERVICE_URL, UPLOAD_SERVICE_SECRET, +) +import gzip +import rowers.mytypes as mytypes +from rowers.utils import myqueue + +import requests +import base64 + +from rowers.utils import dologging +from json.decoder import JSONDecodeError + +import django_rq +queue = django_rq.get_queue('default') +queuelow = django_rq.get_queue('low') +queuehigh = django_rq.get_queue('low') + +oauth_data = { + 'client_id': ROJABO_CLIENT_ID, + 'client_secret': ROJABO_CLIENT_SECRET, + 'redirect_uri': ROJABO_REDIRECT_URI, + 'autorization_uri': ROJABO_OAUTH_LOCATION+"oauth/authorize", + 'content_type': 'application/json', + 'tokenname': 'nktoken', + 'refreshtokenname': 'nkrefreshtoken', + 'expirydatename': 'nktokenexpirydate', + 'bearer_auth': True, + 'base_url': ROJABO_OAUTH_LOCATION+"oauth/token", + 'scope': 'read', +} + +def get_token(code): # pragma: no cover + + post_data = { + "grant_type": "authorization_code", + "code": code, + "redirect_uri": oauth_data['redirect_uri'], + } + + + auth_string = '{id}:{secret}'.format( + id=ROJABO_CLIENT_ID, + secret=ROJABO_CLIENT_SECRET + ) + + + + try: + headers = {'Authorization': 'Basic %s' % base64.b64encode(auth_string), + 'Content-Type': 'application/x-www-form-urlencoded'} + except TypeError: + headers = {'Authorization': 'Basic %s' % base64.b64encode( + bytes(auth_string, 'utf-8')).decode('utf-8'), + 'Content-Type': 'application/x-www-form-urlencoded'} + + + + response = requests.post(oauth_data['base_url'], + data=post_data, + headers=headers) + + if response.status_code != 200: + return (0,response.reason) + + try: + token_json = response.json() + thetoken = token_json['access_token'] + expires_in = token_json['expires_in'] + refresh_token = token_json['refresh_token'] + except (KeyError, JSONDecodeError) as e: # pragma: no cover + thetoken = 0 + expires_in = 0 + refresh_token = 0 + + return [thetoken, expires_in, refresh_token] + +def rojabo_open(user): + r = Rower.objects.get(user=user) + if (r.rojabo_token == '') or (r.rojabo_token is None): + raise NoTokenError("User has no token") + else: + if (timezone.now() > r.tokenexpirydate): + res = rower_rojabo_token_refresh(user) + if res is None: # pragma: no cover + raise NoTokenError("User has no token") + if res[0] is not None: + thetoken = res[0] + else: # pragma: no cover + raise NoTokenError("User has no token") + else: + thetoken = r.rojabo_token + + return thetoken + +def rower_rojabo_token_refresh(user): + r = Rower.objects.get(user=user) + res = do_refresh_token(r.rojabo_refreshtoken) + if res[0]: + access_token = res[0] + expires_in = res[1] + refresh_token = res[2] + expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in) + + r = Rower.objects.get(user=user) + r.rojabo_token = access_token + r.rojabo_tokenexpirydate = expirydatetime + r.rojabo_refreshtoken = refresh_token + + r.save() + return r.rojabo_token + else: # pragma: no cover + return None + +def do_refresh_token(refreshtoken): + post_data = { + "grant_type": "refresh_token", + "refresh_token": refreshtoken, + #"redirect_uri": oauth_data['redirect_uri'], + } + + + auth_string = '{id}:{secret}'.format( + id=ROJABO_CLIENT_ID, + secret=ROJABO_CLIENT_SECRET + ) + + + + try: + headers = {'Authorization': 'Basic %s' % base64.b64encode(auth_string), + 'Content-Type': 'application/x-www-form-urlencoded'} + except TypeError: + headers = {'Authorization': 'Basic %s' % base64.b64encode( + bytes(auth_string, 'utf-8')).decode('utf-8'), + 'Content-Type': 'application/x-www-form-urlencoded'} + + + + response = requests.post(oauth_data['base_url'], + data=post_data, + headers=headers) + + if response.status_code != 200: + print(oauth_data['base_url']) + print(post_data) + print(auth_string) + print(headers) + print(response.status_code) + print(response.reason) + return (0,response.reason) + + try: + token_json = response.json() + thetoken = token_json['access_token'] + expires_in = token_json['expires_in'] + refresh_token = token_json['refresh_token'] + except (KeyError, JSONDecodeError) as e: # pragma: no cover + thetoken = 0 + expires_in = 0 + refresh_token = 0 + + return [thetoken, expires_in, refresh_token] diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 7f77f1d2..a62ad6a2 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -32,6 +32,10 @@ {% if rower.rp3token is not None and rower.rp3token != '' %} RP3 {% endif %} + {% if rower.rojabo_token is not None and rower.rojabo_token != '' %} + Rojabo + {% endif %} +

{% if form.errors %} @@ -80,8 +84,10 @@

connect with Garmin

-

connect with RP3

+

connect with RP3

+

connect with Rojabo

{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 49cfa865..c1040181 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -757,6 +757,8 @@ urlpatterns = [ name='rower_c2_authorize'), re_path(r'^me/nkauthorize/$', views.rower_nk_authorize, name='rower_nk_authorize'), + re_path(r'^me/rojaboauthorize/$', views.rower_rojabo_authorize, + name='rower_rojabo_authorize'), re_path(r'^me/polarauthorize/$', views.rower_polar_authorize, name='rower_polar_authorize'), re_path(r'^me/revokeapp/(?P\d+)/$', diff --git a/rowers/views/importviews.py b/rowers/views/importviews.py index b80126d5..2aca1b09 100644 --- a/rowers/views/importviews.py +++ b/rowers/views/importviews.py @@ -1,4 +1,4 @@ -from rowsandall_app.settings import NK_OAUTH_LOCATION +from rowsandall_app.settings import NK_OAUTH_LOCATION, ROJABO_OAUTH_LOCATION from rowers.views.statements import * from rowers.plannedsessions import get_dates_timeperiod @@ -139,6 +139,23 @@ def workout_sporttracks_upload_view(request, id=0): return HttpResponseRedirect(url) # pragma: no cover +# ROJABO authorization +def rower_rojabo_authorize(request): # pragma: no cover + state = str(uuid4()) + scope = "read" + params = { + # "grant_type": "authorization_code", + # "response_type": "code", + "client_id": ROJABO_CLIENT_ID, + #"client_secret": ROJABO_CLIENT_SECRET, + # "scope": scope, + #"state": state, + "redirect_uri": ROJABO_REDIRECT_URI, + } + + url = ROJABO_OAUTH_LOCATION+'oauth/authorize?'+urllib.parse.urlencode(params) + + return HttpResponseRedirect(url) # NK Logbook authorization @login_required() @@ -496,9 +513,47 @@ def rower_process_garmincallback(request): # pragma: no cover url = reverse('rower_exportsettings_view') return HttpResponseRedirect(url) +# Process Rojabo callback +@login_required() +def rower_process_rojabocallback(request): # prgrma: no cover + # do stuff + try: + code = request.GET.get('code', None) + res = rojabo_stuff.get_token(code) + except MultiValueDictKeyError: + message = "The resource owner or authorization server denied the request" + messages.error(request, message) + + url = reverse('rower_exportsettings_view') + return HttpResponseRedirect(url) + + access_token = res[0] + if access_token == 0: + message = res[1] + message += ' Contact support@rowsandall.com if this behavior persists' + messages.error(request, message) + + url = reverse('rower_exportsettings_view') + + return HttpResponseRedirect(url) + + expires_in = res[1] + refresh_token = res[2] + expirydatetime = timezone.now()+datetime.timedelta(seconds=expires_in) + + r = getrower(request.user) + r.rojabo_token = access_token + r.rojabo_tokenexpirydate = expirydatetime + r.rojabo_refreshtoken = refresh_token + + r.save() + + successmessage = "Tokens stored. Good to go. Please check your import/export settings" + messages.info(request, successmessage) + url = reverse('rower_exportsettings_view') + return HttpResponseRedirect(url) + # Process NK Callback - - @login_required() def rower_process_nkcallback(request): # pragma: no cover # do stuff diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 257391fe..0bbed467 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -190,6 +190,7 @@ import datetime import iso8601 import rowers.c2stuff as c2stuff import rowers.nkstuff as nkstuff +import rowers.rojabo_stuff as rojabo_stuff from rowers.c2stuff import c2_open from rowers.nkstuff import nk_open from rowers.rp3stuff import rp3_open @@ -218,7 +219,8 @@ from rowsandall_app.settings import ( BRAINTREE_MERCHANT_ID, BRAINTREE_PUBLIC_KEY, BRAINTREE_PRIVATE_KEY, PAYMENT_PROCESSING_ON, RECAPTCHA_SITE_KEY, RECAPTCHA_SITE_SECRET, - NK_REDIRECT_URI, NK_CLIENT_ID, NK_CLIENT_SECRET + NK_REDIRECT_URI, NK_CLIENT_ID, NK_CLIENT_SECRET, + ROJABO_REDIRECT_URI, ROJABO_CLIENT_ID, ROJABO_CLIENT_SECRET, ) from django.contrib import messages diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index 80fbb290..caa32dfc 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -285,7 +285,8 @@ STRAVA_REDIRECT_URI = CFG['strava_callback'] ROJABO_CLIENT_ID = CFG['rojabo_client_id'] ROJABO_CLIENT_SECRET = CFG['rojabo_client_secret'] -ROJABO_CALLBACK = CFG['rojabo_callback'] +ROJABO_REDIRECT_URI = CFG['rojabo_callback'] +ROJABO_OAUTH_LOCATION = CFG['rojabo_oauth_location'] # Garmin GARMIN_CLIENT_KEY = CFG["garmin_client_key"] diff --git a/rowsandall_app/urls.py b/rowsandall_app/urls.py index 5692ba76..e7fdbfba 100644 --- a/rowsandall_app/urls.py +++ b/rowsandall_app/urls.py @@ -84,6 +84,7 @@ urlpatterns += [ # re_path(r'^admin/rq/',include('django_rq_dashboard.urls')), re_path(r'^call\_back', rowersviews.rower_process_callback), re_path(r'^nk\_callback', rowersviews.rower_process_nkcallback), + re_path(r'^rojabo\_callback', rowersviews.rower_process_rojabocallback), re_path(r'^stravacall\_back', rowersviews.rower_process_stravacallback), re_path(r'^garmin\_callback', rowersviews.rower_process_garmincallback), re_path(r'^sporttracks\_callback', rowersviews.rower_process_sporttrackscallback), diff --git a/static/img/rojabo.png b/static/img/rojabo.png new file mode 100644 index 0000000000000000000000000000000000000000..843e01748824934ddee85245a40cb44ecb60797f GIT binary patch literal 37664 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