NewsBlur/utils/user_functions.py
Samuel Clay b89e7dc429 Merge branch 'django1.11' into django2.0
* django1.11: (152 commits)
  request.raw_post_data -> request.body (django 1.6)
  Upgrading pgbouncer to 1.15.0.
  Finishing off Postgresql 13 upgrade.
  Upgrading to Postgresql 13.
  Ubuntu 20.04
  Fixing supervisor path issues
  Upgrading setuptools
  Fixing flask
  Handling over capacity for twitter.
  Max length for image_urls.
  Properly filtering newsletter feeds.
  Fixing issue with text importer on feed-less urls.
  Removing dependency, fixing encoding issue for pages.
  Fixing DB Monitor.
  Updating User Agent for all fetchers.
  Ignoring VSCode.
  Fixing DB Monitor.
  Updating User Agent for all fetchers.
  Ignoring VSCode.
  Fixing Statistics by fixing how timezones are handled.
  ...
2020-12-03 14:04:26 -05:00

171 lines
5.4 KiB
Python

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