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 @@ - + + {% 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