mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-31 21:41:33 +00:00

* master: Adding dev role, updating hosts, and checking for wp-cron in broken wordpress plugin PuSH pings. Stupid broken Wordpress PuSH plugin tries to set wp-admin/post.php to its topic. Adding logging to PuSH push requests. Change OPML export filename to use ISO date format Fixing broken redirected PuSH urls. Typo on datetime. Refactoring updated urls in PuSH feeds. Adding db04 to hosts. Feeds are OneToOne with PushSubscriptions, so remove the db inconsistency. Cranking manual refresh polling when disconnected from pubsub. Client-side push/pubsub should reconnect and degrade gracefully.
222 lines
No EOL
9.4 KiB
Python
222 lines
No EOL
9.4 KiB
Python
import datetime
|
|
import urllib
|
|
import urlparse
|
|
from utils import log as logging
|
|
import oauth2 as oauth
|
|
import uuid
|
|
from django.contrib.sites.models import Site
|
|
from django.db import IntegrityError
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
from django.conf import settings
|
|
from django.core.urlresolvers import reverse
|
|
from django.template import RequestContext
|
|
from django.contrib.auth import login as login_user
|
|
from django.shortcuts import render_to_response
|
|
from apps.reader.forms import SignupForm
|
|
from apps.reader.models import UserSubscription
|
|
from apps.feed_import.models import OAuthToken, OPMLImporter, OPMLExporter, GoogleReaderImporter
|
|
from utils import json_functions as json
|
|
from utils.user_functions import ajax_login_required, get_user
|
|
|
|
|
|
@ajax_login_required
|
|
@json.json_view
|
|
def opml_upload(request):
|
|
xml_opml = None
|
|
message = "OK"
|
|
code = 1
|
|
payload = {}
|
|
|
|
if request.method == 'POST':
|
|
if 'file' in request.FILES:
|
|
logging.user(request, "~FR~SBOPML upload starting...")
|
|
file = request.FILES['file']
|
|
xml_opml = file.read()
|
|
opml_importer = OPMLImporter(xml_opml, request.user)
|
|
folders = opml_importer.process()
|
|
feeds = UserSubscription.objects.filter(user=request.user).values()
|
|
payload = dict(folders=folders, feeds=feeds)
|
|
logging.user(request, "~FR~SBOPML Upload: ~SK%s~SN~SB~FR feeds" % (len(feeds)))
|
|
|
|
request.session['import_from_google_reader'] = False
|
|
else:
|
|
message = "Attach an .opml file."
|
|
code = -1
|
|
|
|
return dict(message=message, code=code, payload=payload)
|
|
|
|
def opml_export(request):
|
|
user = get_user(request)
|
|
exporter = OPMLExporter(user)
|
|
opml = exporter.process()
|
|
now = datetime.datetime.now()
|
|
|
|
response = HttpResponse(opml, mimetype='text/xml')
|
|
response['Content-Disposition'] = 'attachment; filename=NewsBlur Subscriptions - %s' % (
|
|
now.strftime('%Y-%m-%d')
|
|
)
|
|
|
|
return response
|
|
|
|
def reader_authorize(request):
|
|
is_modal = request.GET.get('modal', False)
|
|
logging.user(request, "~BB~FW~SBAuthorize Google Reader import - %s" % (
|
|
request.META['REMOTE_ADDR'],
|
|
))
|
|
oauth_key = settings.OAUTH_KEY
|
|
oauth_secret = settings.OAUTH_SECRET
|
|
scope = "http://www.google.com/reader/api"
|
|
request_token_url = ("https://www.google.com/accounts/OAuthGetRequestToken?"
|
|
"scope=%s&secure=1&session=1&oauth_callback=http://%s%s%s") % (
|
|
urllib.quote_plus(scope),
|
|
Site.objects.get_current().domain,
|
|
reverse('google-reader-callback'),
|
|
'?modal=true' if is_modal else ''
|
|
)
|
|
authorize_url = 'https://www.google.com/accounts/OAuthAuthorizeToken'
|
|
|
|
# Grab request token from Google's OAuth
|
|
consumer = oauth.Consumer(oauth_key, oauth_secret)
|
|
client = oauth.Client(consumer)
|
|
resp, content = client.request(request_token_url, "GET")
|
|
request_token = dict(urlparse.parse_qsl(content))
|
|
|
|
# Save request token and delete old tokens
|
|
auth_token_dict = dict(request_token=request_token['oauth_token'],
|
|
request_token_secret=request_token['oauth_token_secret'])
|
|
if request.user.is_authenticated():
|
|
OAuthToken.objects.filter(user=request.user).delete()
|
|
auth_token_dict['user'] = request.user
|
|
else:
|
|
OAuthToken.objects.filter(session_id=request.session.session_key).delete()
|
|
OAuthToken.objects.filter(remote_ip=request.META['REMOTE_ADDR']).delete()
|
|
auth_token_dict['uuid'] = str(uuid.uuid4())
|
|
auth_token_dict['session_id'] = request.session.session_key
|
|
auth_token_dict['remote_ip'] = request.META['REMOTE_ADDR']
|
|
OAuthToken.objects.create(**auth_token_dict)
|
|
|
|
redirect = "%s?oauth_token=%s" % (authorize_url, request_token['oauth_token'])
|
|
|
|
if is_modal:
|
|
response = render_to_response('social/social_connect.xhtml', {
|
|
'next': redirect,
|
|
}, context_instance=RequestContext(request))
|
|
else:
|
|
response = HttpResponseRedirect(redirect)
|
|
|
|
response.set_cookie('newsblur_reader_uuid', auth_token_dict['uuid'])
|
|
return response
|
|
|
|
def reader_callback(request):
|
|
is_modal = request.GET.get('modal', False)
|
|
access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken'
|
|
consumer = oauth.Consumer(settings.OAUTH_KEY, settings.OAUTH_SECRET)
|
|
user_token = None
|
|
if request.user.is_authenticated():
|
|
user_token = OAuthToken.objects.filter(user=request.user).order_by('-created_date')
|
|
if not user_token:
|
|
user_uuid = request.COOKIES.get('newsblur_reader_uuid')
|
|
if user_uuid:
|
|
user_token = OAuthToken.objects.filter(uuid=user_uuid).order_by('-created_date')
|
|
if not user_token:
|
|
session = request.session
|
|
if session.session_key:
|
|
user_token = OAuthToken.objects.filter(session_id=request.session.session_key).order_by('-created_date')
|
|
if not user_token:
|
|
user_token = OAuthToken.objects.filter(remote_ip=request.META['REMOTE_ADDR']).order_by('-created_date')
|
|
# logging.info("Found ip user_tokens: %s" % user_tokens)
|
|
|
|
if user_token:
|
|
user_token = user_token[0]
|
|
user_token.session_id = request.session.session_key
|
|
user_token.save()
|
|
|
|
if user_token and request.GET.get('oauth_verifier'):
|
|
# logging.info("Google Reader request.GET: %s" % request.GET)
|
|
# Authenticated in Google, so verify and fetch access tokens
|
|
token = oauth.Token(user_token.request_token, user_token.request_token_secret)
|
|
token.set_verifier(request.GET['oauth_verifier'])
|
|
client = oauth.Client(consumer, token)
|
|
resp, content = client.request(access_token_url, "POST")
|
|
access_token = dict(urlparse.parse_qsl(content))
|
|
user_token.access_token = access_token.get('oauth_token')
|
|
user_token.access_token_secret = access_token.get('oauth_token_secret')
|
|
try:
|
|
if not user_token.access_token:
|
|
raise IntegrityError
|
|
user_token.save()
|
|
except IntegrityError:
|
|
if is_modal:
|
|
return render_to_response('social/social_connect.xhtml', {
|
|
'error': 'There was an error trying to import from Google Reader. Trying again will probably fix the issue.'
|
|
}, context_instance=RequestContext(request))
|
|
logging.info(" ***> [%s] Bad token from Google Reader. Re-authenticating." % (request.user,))
|
|
return HttpResponseRedirect(reverse('google-reader-authorize'))
|
|
|
|
# Fetch imported feeds on next page load
|
|
request.session['import_from_google_reader'] = True
|
|
|
|
logging.user(request, "~BB~FW~SBFinishing Google Reader import - %s" % (request.META['REMOTE_ADDR'],))
|
|
|
|
if request.user.is_authenticated():
|
|
if is_modal:
|
|
return render_to_response('social/social_connect.xhtml', {}, context_instance=RequestContext(request))
|
|
else:
|
|
return HttpResponseRedirect(reverse('index'))
|
|
else:
|
|
logging.info(" ***> [%s] Bad token from Google Reader. Re-authenticating." % (request.user,))
|
|
return HttpResponseRedirect(reverse('google-reader-authorize'))
|
|
|
|
return HttpResponseRedirect(reverse('import-signup'))
|
|
|
|
@json.json_view
|
|
def import_from_google_reader(request):
|
|
code = 0
|
|
|
|
if request.user.is_authenticated():
|
|
reader_importer = GoogleReaderImporter(request.user)
|
|
try:
|
|
reader_importer.import_feeds()
|
|
reader_importer.import_starred_items()
|
|
except AssertionError:
|
|
code = -1
|
|
else:
|
|
code = 1
|
|
if 'import_from_google_reader' in request.session:
|
|
del request.session['import_from_google_reader']
|
|
|
|
return dict(code=code)
|
|
|
|
def import_signup(request):
|
|
if request.method == "POST":
|
|
signup_form = SignupForm(prefix='signup', data=request.POST)
|
|
if signup_form.is_valid():
|
|
new_user = signup_form.save()
|
|
|
|
user_token = OAuthToken.objects.filter(user=new_user)
|
|
if not user_token:
|
|
user_uuid = request.COOKIES.get('newsblur_reader_uuid')
|
|
if user_uuid:
|
|
user_token = OAuthToken.objects.filter(uuid=user_uuid).order_by('-created_date')
|
|
if not user_token:
|
|
if request.session.session_key:
|
|
user_token = OAuthToken.objects.filter(session_id=request.session.session_key).order_by('-created_date')
|
|
if not user_token:
|
|
user_token = OAuthToken.objects.filter(remote_ip=request.META['REMOTE_ADDR']).order_by('-created_date')
|
|
|
|
if user_token:
|
|
user_token = user_token[0]
|
|
user_token.session_id = request.session.session_key
|
|
user_token.user = new_user
|
|
user_token.save()
|
|
login_user(request, new_user)
|
|
return HttpResponseRedirect(reverse('index'))
|
|
else:
|
|
logging.user(request, "~BR~FW ***> Can't find user token during import/signup. Re-authenticating...")
|
|
return HttpResponseRedirect(reverse('google-reader-authorize'))
|
|
else:
|
|
signup_form = SignupForm(prefix='signup')
|
|
|
|
return render_to_response('import/signup.xhtml', {
|
|
'signup_form': signup_form,
|
|
}, context_instance=RequestContext(request)) |