import hashlib from simplejson.decoder import JSONDecodeError from utils import json_functions as json from django.contrib.auth.models import User from django.core.cache import cache from django.utils.http import urlquote from django.http import HttpResponseForbidden from django.http import HttpResponse from django.conf import settings 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