Skip to content

Commit 1d0c402

Browse files
authored
feat: use signed url's for single user photo (#158)
1 parent b2976c5 commit 1d0c402

3 files changed

Lines changed: 24 additions & 15 deletions

File tree

LedenAdministratie/api.py

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from LedenAdministratie.mixins import AllowListedClientCredentialsMixin
1414
from LedenAdministratie.models import Member
15-
from LedenAdministratie.templatetags.photo_filter import img2base64
15+
from LedenAdministratie.utils import Utils
1616

1717

1818
class ApiV1Smoelenboek(AllowListedClientCredentialsMixin):
@@ -29,21 +29,19 @@ def get(self, request, *args, **kwargs):
2929
)
3030

3131
response = []
32-
expiry = int((timezone.now() + timezone.timedelta(days=1)).timestamp())
32+
expiry = int((timezone.now() + timezone.timedelta(hours=2)).timestamp())
3333
for member in members:
3434
# Generate a signed URL for the image
35-
url = request.build_absolute_uri(f"{member.id}/{expiry}/?large={large}")
36-
signature = hmac.new(
37-
settings.SECRET_KEY.encode(), url.encode(), hashlib.sha256
38-
).hexdigest()
39-
url += f"&signature={signature}"
35+
photo_url = Utils.get_signed_url(
36+
request, f"{member.id}/{expiry}/?large={large}"
37+
)
4038
memberdict = {
4139
"id": member.id,
4240
"user_id": f"idp-{member.user.pk}",
4341
"first_name": member.first_name,
4442
"last_name": member.last_name,
4543
"types": ",".join([tmptype.slug for tmptype in member.types.all()]),
46-
"photo": url,
44+
"photo": photo_url,
4745
}
4846
response.append(memberdict)
4947

@@ -86,19 +84,15 @@ def get(self, request, *args, **kwargs):
8684
except Member.DoesNotExist:
8785
return HttpResponse(status=404)
8886

89-
if large:
90-
photo = member.foto
91-
else:
92-
photo = member.thumbnail
93-
if photo is None:
94-
photo = member.foto
87+
expiry = int((timezone.now() + timezone.timedelta(hours=2)).timestamp())
88+
photo_url = Utils.get_signed_url(request, f"{expiry}/?large={large}")
9589

9690
memberdict = {
9791
"id": member.id,
9892
"first_name": member.first_name,
9993
"last_name": member.last_name,
10094
"types": ",".join([tmptype.slug for tmptype in member.types.all()]),
101-
"photo": img2base64(photo),
95+
"photo": photo_url,
10296
}
10397
return JsonResponse(data=memberdict)
10498

LedenAdministratie/mixins.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ def dispatch(self, request, *args, **kwargs):
2727
return super().dispatch(request, *args, **kwargs)
2828

2929
# Set by oauth2_provider.middleware.OAuth2ExtraTokenMiddleware
30+
if not hasattr(request, "access_token"):
31+
return HttpResponseForbidden()
32+
3033
client_id = request.access_token.application.client_id
3134
if client_id not in self.allowed_client_ids:
3235
return HttpResponseForbidden()

LedenAdministratie/utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
import hashlib
2+
import hmac
13
from urllib.parse import urlparse
24

5+
from django.conf import settings
36
from django.core.mail import EmailMessage
47
from django.http.request import HttpRequest
58
from django.shortcuts import reverse
@@ -34,3 +37,12 @@ def get_safe_return_url(request: HttpRequest) -> str:
3437
if path.startswith("/"):
3538
return path
3639
return reverse("members")
40+
41+
@staticmethod
42+
def get_signed_url(request: HttpRequest, path: str) -> str:
43+
url = request.build_absolute_uri(path)
44+
signature = hmac.new(
45+
settings.SECRET_KEY.encode(), url.encode(), hashlib.sha256
46+
).hexdigest()
47+
url += f"&signature={signature}"
48+
return url

0 commit comments

Comments
 (0)