Skip to content

Commit 4ba922f

Browse files
committed
split persist token subs by version, 1 min exp
1 parent 9a0e82d commit 4ba922f

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

users/mqtt.py

+18-7
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,33 @@
1414
PUBLIC_NAMESPACE = "public"
1515
ANON_REGEX = "anonymous-(?=.*?[a-zA-Z].*?[a-zA-Z])"
1616
DEF_JWT_DURATION = datetime.timedelta(minutes=1)
17-
TOPIC_SUPPORTED_API_VERSIONS = ["v1", "v2"] # TODO(mwfarb): remove v1
17+
API_V1 = "v1"
18+
API_V2 = "v2"
19+
TOPIC_SUPPORTED_API_VERSIONS = [API_V1, API_V2] # TODO (mwfarb): remove v1
1820

1921

20-
def all_scenes_read_token():
22+
def all_scenes_read_token(version):
2123
config = settings.PUBSUB
2224
privkeyfile = settings.MQTT_TOKEN_PRIVKEY
2325
if not os.path.exists(privkeyfile):
2426
print("Error: keyfile not found" + privkeyfile)
2527
return None
2628
with open(privkeyfile) as privatefile:
2729
private_key = privatefile.read()
28-
payload = {
29-
"sub": config["mqtt_username"],
30-
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=5),
31-
"subs": [f"{config['mqtt_realm']}/s/#"],
32-
}
30+
31+
realm = config["mqtt_realm"]
32+
username = config["mqtt_username"]
33+
duration = datetime.timedelta(minutes=1)
34+
35+
payload = {}
36+
payload["sub"] = username
37+
payload["exp"] = datetime.datetime.utcnow() + duration
38+
39+
if version == API_V2:
40+
payload["subs"] = [f"{realm}/s/+/+/o/#"] # v2
41+
else:
42+
payload["subs"] = [f"{realm}/s/#"] # v1
43+
3344
token = jwt.encode(payload, private_key, algorithm="RS256")
3445
return token
3546

users/views.py

+6-11
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import re
55
import secrets
66

7-
import coreapi
87
from allauth.socialaccount import helpers
98
from allauth.socialaccount.models import SocialAccount
109
from allauth.socialaccount.views import SignupView as SocialSignupViewDefault
@@ -16,14 +15,11 @@
1615
from django.db import transaction
1716
from django.http import HttpResponse, JsonResponse
1817
from django.shortcuts import redirect, render
19-
from django.urls import reverse
2018
from google.auth.transport import requests as grequests
2119
from google.oauth2 import id_token
2220
from rest_framework import permissions, status
23-
from rest_framework.compat import coreapi
2421
from rest_framework.decorators import api_view, permission_classes
2522
from rest_framework.parsers import JSONParser
26-
from rest_framework.schemas import AutoSchema
2723

2824
from .filestore import (delete_filestore_user, login_filestore_user,
2925
set_filestore_scope)
@@ -375,19 +371,19 @@ def my_scenes(request):
375371
except (ValueError, SocialAccount.DoesNotExist) as err:
376372
return JsonResponse({"error": err}, status=status.HTTP_403_FORBIDDEN)
377373

378-
serializer = SceneNameSerializer(get_my_scenes(user), many=True)
374+
serializer = SceneNameSerializer(get_my_scenes(user, request.version), many=True)
379375
return JsonResponse(serializer.data, safe=False)
380376

381377

382-
def get_my_scenes(user):
378+
def get_my_scenes(user, version):
383379
"""
384380
Internal method to update scene permissions table:
385381
1. Requests list of any scenes with objects saved from /persist/!allscenes to add to scene permissions table.
386382
2. Requests and returns list of user's editable scenes from scene permissions table.
387383
"""
388384
# update scene list from object persistance db
389385
if user.is_authenticated:
390-
token = all_scenes_read_token()
386+
token = all_scenes_read_token(version)
391387
if user.is_staff: # admin/staff
392388
p_scenes = get_persist_scenes_all(token)
393389
else: # standard user
@@ -474,9 +470,8 @@ def user_profile(request):
474470
- Shows scenes that the user has permissions to edit and a button to edit them.
475471
- Handles account deletes.
476472
"""
477-
# TODO (mwfarb): make remote post status 426, local post redirect to valid
478-
# if request.version not in TOPIC_SUPPORTED_API_VERSIONS:
479-
# return reverse("users:user_profile", current_app="users")
473+
if request.version not in TOPIC_SUPPORTED_API_VERSIONS:
474+
return redirect(f"/{TOPIC_SUPPORTED_API_VERSIONS[0]}/user_profile/")
480475

481476
if request.method == 'POST':
482477
# account delete request
@@ -512,7 +507,7 @@ def user_profile(request):
512507
except User.DoesNotExist:
513508
messages.error(request, "Unable to complete account delete.")
514509

515-
scenes = get_my_scenes(request.user)
510+
scenes = get_my_scenes(request.user, request.version)
516511
devices = get_my_devices(request.user)
517512
staff = None
518513
if request.user.is_staff: # admin/staff

0 commit comments

Comments
 (0)