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