2024-08-04 20:30:54 +00:00
|
|
|
from urllib.parse import urlparse
|
|
|
|
|
|
|
|
from django.http import HttpRequest
|
|
|
|
from django.urls import resolve
|
|
|
|
|
|
|
|
from counter.models import Counter
|
|
|
|
|
|
|
|
|
2024-08-05 08:46:15 +00:00
|
|
|
def is_logged_in_counter(request: HttpRequest) -> bool:
|
2024-08-04 20:30:54 +00:00
|
|
|
"""Check if the request is sent from a device logged to a counter.
|
|
|
|
|
|
|
|
The request must also be sent within the frame of a counter's activity.
|
|
|
|
Trying to use this function to manage access to non-sas
|
|
|
|
related resources probably won't work.
|
|
|
|
|
|
|
|
A request is considered as coming from a logged counter if :
|
|
|
|
|
|
|
|
- Its referer comes from the counter app
|
|
|
|
(eg. fetching user pictures from the click UI)
|
|
|
|
or the request path belongs to the counter app
|
|
|
|
(eg. the barman went back to the main by missclick and go back
|
|
|
|
to the counter)
|
|
|
|
- The current session has a counter token associated with it.
|
|
|
|
- A counter with this token exists.
|
2024-12-07 16:28:34 +00:00
|
|
|
- The counter is open
|
2024-08-04 20:30:54 +00:00
|
|
|
"""
|
2024-08-05 13:53:41 +00:00
|
|
|
referer_ok = (
|
|
|
|
"HTTP_REFERER" in request.META
|
|
|
|
and resolve(urlparse(request.META["HTTP_REFERER"]).path).app_name == "counter"
|
2024-08-04 20:30:54 +00:00
|
|
|
)
|
2024-12-07 16:28:34 +00:00
|
|
|
has_token = (
|
2024-08-05 13:53:41 +00:00
|
|
|
(referer_ok or request.resolver_match.app_name == "counter")
|
2024-08-04 20:30:54 +00:00
|
|
|
and "counter_token" in request.session
|
|
|
|
and request.session["counter_token"]
|
2024-12-07 16:28:34 +00:00
|
|
|
)
|
|
|
|
if not has_token:
|
|
|
|
return False
|
|
|
|
|
|
|
|
return (
|
|
|
|
Counter.objects.annotate_is_open()
|
|
|
|
.filter(token=request.session["counter_token"], is_open=True)
|
|
|
|
.exists()
|
2024-08-04 20:30:54 +00:00
|
|
|
)
|