mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-04-13 09:42:01 +00:00

* 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. ...
171 lines
5.4 KiB
Python
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
|