NewsBlur-viq/utils/user_functions.py
2024-04-24 09:50:42 -04:00

189 lines
5.6 KiB
Python

import hashlib
from django.conf import settings
from django.contrib.auth.models import User
from django.core.cache import cache
from django.http import HttpResponse, HttpResponseForbidden
from django.utils.http import urlquote
from simplejson.decoder import JSONDecodeError
from utils import json_functions as json
def ajax_login_required(function=None):
def _dec(view_func):
def _view(request, *args, **kwargs):
if request.user.is_anonymous:
return HttpResponseForbidden()
else:
return view_func(request, *args, **kwargs)
_view.__name__ = view_func.__name__
_view.__dict__ = view_func.__dict__
_view.__doc__ = view_func.__doc__
return _view
if function is None:
return _dec
else:
return _dec(function)
def oauth_login_required(function=None):
def _dec(view_func):
def _view(request, *args, **kwargs):
if request.user.is_anonymous:
return HttpResponse(
content=json.encode(
{
"message": "You must have a valid OAuth token.",
}
),
status=401,
)
else:
try:
setattr(request, "body_json", json.decode(request.body))
except JSONDecodeError:
return HttpResponse(
content=json.encode(
{
"message": "Your JSON body is malformed.",
}
),
status=400,
)
return view_func(request, *args, **kwargs)
_view.__name__ = view_func.__name__
_view.__dict__ = view_func.__dict__
_view.__doc__ = view_func.__doc__
return _view
if function is None:
return _dec
else:
return _dec(function)
def admin_only(function=None):
def _dec(view_func):
def _view(request, *args, **kwargs):
if not request.user.is_staff:
return HttpResponseForbidden()
else:
return view_func(request, *args, **kwargs)
_view.__name__ = view_func.__name__
_view.__dict__ = view_func.__dict__
_view.__doc__ = view_func.__doc__
return _view
if function is None:
return _dec
else:
return _dec(function)
def get_user(request):
if not hasattr(request, "user"):
user = request
else:
user = request.user
if user.is_anonymous and hasattr(request, "POST"):
# Check secret_token parameter
secret_token = request.POST.get("secret_token", None) or request.GET.get("secret_token", None)
if secret_token:
try:
user = User.objects.get(profile__secret_token=secret_token)
request.user = user
except User.DoesNotExist:
pass
if user.is_anonymous:
try:
user = User.objects.get(username=settings.HOMEPAGE_USERNAME)
except User.DoesNotExist:
user = User.objects.create(username=settings.HOMEPAGE_USERNAME)
user.set_password("")
user.save()
return user
def invalidate_template_cache(fragment_name, *variables):
args = hashlib.md5((":".join([urlquote(var) for var in variables]).encode("utf-8")))
cache_key = "template.cache.%s.%s" % (fragment_name, args.hexdigest())
cache.delete(cache_key)
def generate_secret_token(phrase, size=12):
"""Generate a (SHA1) security hash from the provided info."""
info = f"{phrase} {settings.SECRET_KEY}".encode("utf-8")
return hashlib.sha256(info).hexdigest()[:size]
def extract_user_agent(request):
user_agent = request.environ.get("HTTP_USER_AGENT", "").lower()
platform = "------"
if "ipad app" in user_agent:
platform = "iPad"
elif "iphone app" in user_agent:
platform = "iPhone"
elif "blar" in user_agent:
platform = "Blar"
elif "Android app" in user_agent:
platform = "Androd"
elif "android" in user_agent:
platform = "androd"
elif "pluggio" in user_agent:
platform = "Plugio"
elif "msie" in user_agent:
platform = "IE"
if "msie 9" in user_agent:
platform += "9"
elif "msie 10" in user_agent:
platform += "10"
elif "msie 8" in user_agent:
platform += "8"
elif "trident/7" in user_agent:
platform = "IE11"
elif "chrome" in user_agent:
platform = "Chrome"
elif "safari" in user_agent:
platform = "Safari"
elif "meego" in user_agent:
platform = "MeeGo"
elif "firefox" in user_agent:
platform = "FF"
elif "opera" in user_agent:
platform = "Opera"
elif "wp7" in user_agent:
platform = "WP7"
elif "wp8" in user_agent:
platform = "WP8"
elif "tafiti" in user_agent:
platform = "Tafiti"
elif "readkit" in user_agent:
platform = "ReadKt"
elif "reeder" in user_agent:
platform = "Reeder"
elif "metroblur" in user_agent:
platform = "Metrob"
elif "feedme" in user_agent:
platform = "FeedMe"
elif "theoldreader" in user_agent:
platform = "OldRdr"
elif "fever" in user_agent:
platform = "Fever"
elif "superfeedr" in user_agent:
platform = "Suprfd"
elif "feed reader-window" in user_agent:
platform = "FeedRe"
elif "feed reader-background" in user_agent:
platform = "FeReBg"
return platform