Skip to content

Commit 7e8aadf

Browse files
committed
fix(filestore): handle django allauth oauth pass reset
1 parent d899982 commit 7e8aadf

File tree

3 files changed

+59
-11
lines changed

3 files changed

+59
-11
lines changed

users/filestore.py

+52-6
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ def use_filestore_auth(user: User):
3737
user_login = get_user_login(user)
3838
user_token, status = get_filestore_token(user_login, host, verify)
3939
if not user_token:
40-
return None
41-
return user_token
40+
return None, status
41+
return user_token, status
4242

4343

4444
def get_filestore_token(user_login, host, verify):
@@ -95,7 +95,7 @@ def add_filestore_auth(user: User):
9595
if user.is_staff: # admin and staff get root scope
9696
set_filestore_scope(user)
9797

98-
fs_user_token = use_filestore_auth(user)
98+
fs_user_token, status = use_filestore_auth(user)
9999
return fs_user_token
100100

101101

@@ -107,7 +107,7 @@ def set_filestore_scope(user: User):
107107
if not admin_token:
108108
return False
109109
# find user
110-
fs_user_token = use_filestore_auth(user)
110+
fs_user_token, status = use_filestore_auth(user)
111111
if not fs_user_token:
112112
return False
113113
payload = jwt.decode(fs_user_token, options={"verify_signature": False})
@@ -138,7 +138,53 @@ def set_filestore_scope(user: User):
138138
print("{0}: ".format(err))
139139
return False
140140

141-
return True
141+
fs_user_token, status = use_filestore_auth(user)
142+
return fs_user_token
143+
144+
145+
def set_filestore_pass(user: User):
146+
if not user.is_authenticated:
147+
return False
148+
if user.username == os.environ["STORE_ADMIN_USERNAME"]:
149+
return False # root admin not allowed pass renew
150+
verify, host = get_rest_host()
151+
# get auth for removing user
152+
admin_login = get_admin_login()
153+
admin_token, status = get_filestore_token(admin_login, host, verify)
154+
if not admin_token:
155+
return False
156+
# find user without valid pass, loop through all
157+
edit_user = {}
158+
try:
159+
r_users = requests.get(f"https://{host}/storemng/api/users",
160+
headers={"X-Auth": admin_token}, verify=verify, timeout=FS_API_TIMEOUT)
161+
r_users.raise_for_status()
162+
except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err:
163+
print("{0}: ".format(err))
164+
return False
165+
print(r_users.text)
166+
for r_user in json.loads(r_users.text):
167+
if r_user["username"] == user.username:
168+
edit_user = r_user
169+
break
170+
print(edit_user)
171+
# return False
172+
edit_user["password"] = user.password
173+
fs_user = {
174+
"what": "user",
175+
"which": ["all"],
176+
"data": edit_user,
177+
}
178+
try:
179+
r_useradd = requests.put(f"https://{host}/storemng/api/users/{edit_user['id']}",
180+
data=json.dumps(fs_user), headers={"X-Auth": admin_token}, verify=verify, timeout=FS_API_TIMEOUT)
181+
r_useradd.raise_for_status()
182+
except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err:
183+
print("{0}: ".format(err))
184+
return None
185+
186+
fs_user_token, status = use_filestore_auth(user)
187+
return fs_user_token
142188

143189

144190
def delete_filestore_user(user: User):
@@ -153,7 +199,7 @@ def delete_filestore_user(user: User):
153199
if not admin_token:
154200
return False
155201
# find user
156-
fs_user_token = use_filestore_auth(user)
202+
fs_user_token, status = use_filestore_auth(user)
157203
if not fs_user_token:
158204
return False
159205
payload = jwt.decode(fs_user_token, options={"verify_signature": False})

users/persistence.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import json
22

3-
import jwt
43
import requests
54
from requests.exceptions import HTTPError
65

users/views.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
from rest_framework.schemas import AutoSchema
2626

2727
from .filestore import (add_filestore_auth, delete_filestore_user,
28-
set_filestore_scope, use_filestore_auth)
28+
set_filestore_pass, set_filestore_scope,
29+
use_filestore_auth)
2930
from .forms import (DeviceForm, SceneForm, SocialSignupForm, UpdateDeviceForm,
3031
UpdateSceneForm, UpdateStaffForm)
3132
from .models import Device, Scene
@@ -335,7 +336,7 @@ def profile_update_staff(request):
335336
print(f"Setting Filebrowser user {staff_username}, staff={is_staff}")
336337
if not set_filestore_scope(user):
337338
messages.error(
338-
request, f"Unable to update user's filestore status.")
339+
request, "Unable to update user's filestore status.")
339340
return redirect("user_profile")
340341

341342
return redirect("user_profile")
@@ -493,7 +494,7 @@ def user_profile(request):
493494
# delete filestore files/account
494495
if not delete_filestore_user(request.user):
495496
messages.error(
496-
request, f"Unable to delete account/files from the filestore.")
497+
request, "Unable to delete account/files from the filestore.")
497498
return redirect("user_profile")
498499

499500
# Be careful of foreign keys, in that case this is suggested:
@@ -619,7 +620,9 @@ def storelogin(request):
619620
fs_user_token = None
620621
if user.is_authenticated:
621622
# try user auth
622-
fs_user_token = use_filestore_auth(user)
623+
fs_user_token, status = use_filestore_auth(user)
624+
if status == 403: # if django allauth pass updated by oauth, update pass
625+
fs_user_token = set_filestore_pass(user)
623626
if not fs_user_token:
624627
# otherwise user needs to be added
625628
fs_user_token = add_filestore_auth(user)

0 commit comments

Comments
 (0)