summaryrefslogtreecommitdiffstats
path: root/fbconnect
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-06-12 22:34:13 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-06-12 22:34:13 -0400
commit8b6a10ead45bcd915f5da223de2b3fd3c30fc7b5 (patch)
tree56b3c7ab03e9b2531a141f4f8b933c7847934a79 /fbconnect
parentaddfbf446b113dbff8c97165686fa19c035a2a47 (diff)
downloadaskbot-8b6a10ead45bcd915f5da223de2b3fd3c30fc7b5.tar.gz
askbot-8b6a10ead45bcd915f5da223de2b3fd3c30fc7b5.tar.bz2
askbot-8b6a10ead45bcd915f5da223de2b3fd3c30fc7b5.zip
removed some old cruft
Diffstat (limited to 'fbconnect')
-rw-r--r--fbconnect/__init__.py0
-rw-r--r--fbconnect/fb.py96
-rw-r--r--fbconnect/forms.py8
-rw-r--r--fbconnect/models.py6
-rw-r--r--fbconnect/pjson.py313
-rw-r--r--fbconnect/tests.py23
-rw-r--r--fbconnect/urls.py21
-rw-r--r--fbconnect/views.py112
8 files changed, 0 insertions, 579 deletions
diff --git a/fbconnect/__init__.py b/fbconnect/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/fbconnect/__init__.py
+++ /dev/null
diff --git a/fbconnect/fb.py b/fbconnect/fb.py
deleted file mode 100644
index 8d41c3a2..00000000
--- a/fbconnect/fb.py
+++ /dev/null
@@ -1,96 +0,0 @@
-from forum.conf import settings as forum_settings
-from time import time
-from datetime import datetime
-from urllib import urlopen, urlencode
-
-try:
- from json import load as load_json
-except:
- from pjson import fread as load_json
-
-from models import FBAssociation
-import hashlib
-import logging
-
-REST_SERVER = 'http://api.facebook.com/restserver.php'
-
-def generate_sig(values):
- keys = []
-
- for key in sorted(values.keys()):
- keys.append(key)
-
- signature = ''.join(['%s=%s' % (key, values[key]) for key in keys]) + forum_settings.FB_SECRET
- return hashlib.md5(signature).hexdigest()
-
-def check_cookies_signature(cookies):
- API_KEY = forum_settings.FB_API_KEY
-
- values = {}
-
- for key in cookies.keys():
- if (key.startswith(API_KEY + '_')):
- values[key.replace(API_KEY + '_', '')] = cookies[key]
-
- return generate_sig(values) == cookies[API_KEY]
-
-def get_user_data(cookies):
- request_data = {
- 'method': 'Users.getInfo',
- 'api_key': forum_settings.FB_API_KEY,
- 'call_id': time(),
- 'v': '1.0',
- 'uids': cookies[forum_settings.FB_API_KEY + '_user'],
- 'fields': 'name,first_name,last_name',
- 'format': 'json',
- }
-
- request_data['sig'] = generate_sig(request_data)
- fb_response = urlopen(REST_SERVER, urlencode(request_data))
- #print(fb_response)
- return load_json(fb_response)[0]
-
-
-def delete_cookies(response):
- API_KEY = forum_settings.FB_API_KEY
-
- response.delete_cookie(API_KEY + '_user')
- response.delete_cookie(API_KEY + '_session_key')
- response.delete_cookie(API_KEY + '_expires')
- response.delete_cookie(API_KEY + '_ss')
- response.delete_cookie(API_KEY)
- response.delete_cookie('fbsetting_' + API_KEY)
-
-def check_session_expiry(cookies):
- return datetime.fromtimestamp(float(cookies[forum_settings.FB_API_KEY+'_expires'])) > datetime.now()
-
-STATES = {
- 'FIRSTTIMER': 1,
- 'SESSIONEXPIRED': 2,
- 'RETURNINGUSER': 3,
- 'INVALIDSTATE': 4,
-}
-
-def get_user_state(request):
- API_KEY = forum_settings.FB_API_KEY
- logging.debug('')
-
- if API_KEY in request.COOKIES:
- logging.debug('FB API key is in request cookies')
- if check_cookies_signature(request.COOKIES):
- logging.debug('FB cookie signature is fine')
- if check_session_expiry(request.COOKIES):
- logging.debug('FB session is not expired')
- try:
- uassoc = FBAssociation.objects.get(fbuid=request.COOKIES[API_KEY + '_user'])
- logging.debug('found existing FB user association')
- return (STATES['RETURNINGUSER'], uassoc.user)
- except:
- logging.debug('dont have FB association for this user')
- return (STATES['FIRSTTIMER'], get_user_data(request.COOKIES))
- else:
- logging.debug('FB session expired')
- return (STATES['SESSIONEXPIRED'], None)
- logging.debug('FB state is INVALID')
-
- return (STATES['INVALIDSTATE'], None)
diff --git a/fbconnect/forms.py b/fbconnect/forms.py
deleted file mode 100644
index 94f86816..00000000
--- a/fbconnect/forms.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from django_authopenid.forms import NextUrlField, UserNameField, UserEmailField
-
-from django import forms
-
-class FBConnectRegisterForm(forms.Form):
- next = NextUrlField()
- username = UserNameField()
- email = UserEmailField()
diff --git a/fbconnect/models.py b/fbconnect/models.py
deleted file mode 100644
index 2172217d..00000000
--- a/fbconnect/models.py
+++ /dev/null
@@ -1,6 +0,0 @@
-from django.db import models
-from django.contrib.auth.models import User
-
-class FBAssociation(models.Model):
- user = models.ForeignKey(User)
- fbuid = models.CharField(max_length=12, unique=True)
diff --git a/fbconnect/pjson.py b/fbconnect/pjson.py
deleted file mode 100644
index 273b684e..00000000
--- a/fbconnect/pjson.py
+++ /dev/null
@@ -1,313 +0,0 @@
-import string
-import types
-
-## json.py implements a JSON (http://json.org) reader and writer.
-## Copyright (C) 2005 Patrick D. Logan
-## Contact mailto:patrickdlogan@stardecisions.com
-##
-## This library is free software; you can redistribute it and/or
-## modify it under the terms of the GNU Lesser General Public
-## License as published by the Free Software Foundation; either
-## version 2.1 of the License, or (at your option) any later version.
-##
-## This library is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-## Lesser General Public License for more details.
-##
-## You should have received a copy of the GNU Lesser General Public
-## License along with this library; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-class _StringGenerator(object):
- def __init__(self, string):
- self.string = string
- self.index = -1
- def peek(self):
- i = self.index + 1
- if i < len(self.string):
- return self.string[i]
- else:
- return None
- def next(self):
- self.index += 1
- if self.index < len(self.string):
- return self.string[self.index]
- else:
- raise StopIteration
- def all(self):
- return self.string
-
-class WriteException(Exception):
- pass
-
-class ReadException(Exception):
- pass
-
-class JsonReader(object):
- hex_digits = {'A': 10,'B': 11,'C': 12,'D': 13,'E': 14,'F':15}
- escapes = {'t':'\t','n':'\n','f':'\f','r':'\r','b':'\b'}
-
- def read(self, s):
- self._generator = _StringGenerator(s)
- result = self._read()
- return result
-
- def _read(self):
- self._eatWhitespace()
- peek = self._peek()
- if peek is None:
- raise ReadException, "Nothing to read: '%s'" % self._generator.all()
- if peek == '{':
- return self._readObject()
- elif peek == '[':
- return self._readArray()
- elif peek == '"':
- return self._readString()
- elif peek == '-' or peek.isdigit():
- return self._readNumber()
- elif peek == 't':
- return self._readTrue()
- elif peek == 'f':
- return self._readFalse()
- elif peek == 'n':
- return self._readNull()
- elif peek == '/':
- self._readComment()
- return self._read()
- else:
- raise ReadException, "Input is not valid JSON: '%s'" % self._generator.all()
-
- def _readTrue(self):
- self._assertNext('t', "true")
- self._assertNext('r', "true")
- self._assertNext('u', "true")
- self._assertNext('e', "true")
- return True
-
- def _readFalse(self):
- self._assertNext('f', "false")
- self._assertNext('a', "false")
- self._assertNext('l', "false")
- self._assertNext('s', "false")
- self._assertNext('e', "false")
- return False
-
- def _readNull(self):
- self._assertNext('n', "null")
- self._assertNext('u', "null")
- self._assertNext('l', "null")
- self._assertNext('l', "null")
- return None
-
- def _assertNext(self, ch, target):
- if self._next() != ch:
- raise ReadException, "Trying to read %s: '%s'" % (target, self._generator.all())
-
- def _readNumber(self):
- isfloat = False
- result = self._next()
- peek = self._peek()
- while peek is not None and (peek.isdigit() or peek == "."):
- isfloat = isfloat or peek == "."
- result = result + self._next()
- peek = self._peek()
- try:
- if isfloat:
- return float(result)
- else:
- return int(result)
- except ValueError:
- raise ReadException, "Not a valid JSON number: '%s'" % result
-
- def _readString(self):
- result = ""
- assert self._next() == '"'
- try:
- while self._peek() != '"':
- ch = self._next()
- if ch == "\\":
- ch = self._next()
- if ch in 'brnft':
- ch = self.escapes[ch]
- elif ch == "u":
- ch4096 = self._next()
- ch256 = self._next()
- ch16 = self._next()
- ch1 = self._next()
- n = 4096 * self._hexDigitToInt(ch4096)
- n += 256 * self._hexDigitToInt(ch256)
- n += 16 * self._hexDigitToInt(ch16)
- n += self._hexDigitToInt(ch1)
- ch = unichr(n)
- elif ch not in '"/\\':
- raise ReadException, "Not a valid escaped JSON character: '%s' in %s" % (ch, self._generator.all())
- result = result + ch
- except StopIteration:
- raise ReadException, "Not a valid JSON string: '%s'" % self._generator.all()
- assert self._next() == '"'
- return result
-
- def _hexDigitToInt(self, ch):
- try:
- result = self.hex_digits[ch.upper()]
- except KeyError:
- try:
- result = int(ch)
- except ValueError:
- raise ReadException, "The character %s is not a hex digit." % ch
- return result
-
- def _readComment(self):
- assert self._next() == "/"
- second = self._next()
- if second == "/":
- self._readDoubleSolidusComment()
- elif second == '*':
- self._readCStyleComment()
- else:
- raise ReadException, "Not a valid JSON comment: %s" % self._generator.all()
-
- def _readCStyleComment(self):
- try:
- done = False
- while not done:
- ch = self._next()
- done = (ch == "*" and self._peek() == "/")
- if not done and ch == "/" and self._peek() == "*":
- raise ReadException, "Not a valid JSON comment: %s, '/*' cannot be embedded in the comment." % self._generator.all()
- self._next()
- except StopIteration:
- raise ReadException, "Not a valid JSON comment: %s, expected */" % self._generator.all()
-
- def _readDoubleSolidusComment(self):
- try:
- ch = self._next()
- while ch != "\r" and ch != "\n":
- ch = self._next()
- except StopIteration:
- pass
-
- def _readArray(self):
- result = []
- assert self._next() == '['
- done = self._peek() == ']'
- while not done:
- item = self._read()
- result.append(item)
- self._eatWhitespace()
- done = self._peek() == ']'
- if not done:
- ch = self._next()
- if ch != ",":
- raise ReadException, "Not a valid JSON array: '%s' due to: '%s'" % (self._generator.all(), ch)
- assert ']' == self._next()
- return result
-
- def _readObject(self):
- result = {}
- assert self._next() == '{'
- done = self._peek() == '}'
- while not done:
- key = self._read()
- if type(key) is not types.StringType:
- raise ReadException, "Not a valid JSON object key (should be a string): %s" % key
- self._eatWhitespace()
- ch = self._next()
- if ch != ":":
- raise ReadException, "Not a valid JSON object: '%s' due to: '%s'" % (self._generator.all(), ch)
- self._eatWhitespace()
- val = self._read()
- result[key] = val
- self._eatWhitespace()
- done = self._peek() == '}'
- if not done:
- ch = self._next()
- if ch != ",":
- raise ReadException, "Not a valid JSON array: '%s' due to: '%s'" % (self._generator.all(), ch)
- assert self._next() == "}"
- return result
-
- def _eatWhitespace(self):
- p = self._peek()
- while p is not None and p in string.whitespace or p == '/':
- if p == '/':
- self._readComment()
- else:
- self._next()
- p = self._peek()
-
- def _peek(self):
- return self._generator.peek()
-
- def _next(self):
- return self._generator.next()
-
-class JsonWriter(object):
-
- def _append(self, s):
- self._results.append(s)
-
- def write(self, obj, escaped_forward_slash=False):
- self._escaped_forward_slash = escaped_forward_slash
- self._results = []
- self._write(obj)
- return "".join(self._results)
-
- def _write(self, obj):
- ty = type(obj)
- if ty is types.DictType:
- n = len(obj)
- self._append("{")
- for k, v in obj.items():
- self._write(k)
- self._append(":")
- self._write(v)
- n = n - 1
- if n > 0:
- self._append(",")
- self._append("}")
- elif ty is types.ListType or ty is types.TupleType:
- n = len(obj)
- self._append("[")
- for item in obj:
- self._write(item)
- n = n - 1
- if n > 0:
- self._append(",")
- self._append("]")
- elif ty is types.StringType or ty is types.UnicodeType:
- self._append('"')
- obj = obj.replace('\\', r'\\')
- if self._escaped_forward_slash:
- obj = obj.replace('/', r'\/')
- obj = obj.replace('"', r'\"')
- obj = obj.replace('\b', r'\b')
- obj = obj.replace('\f', r'\f')
- obj = obj.replace('\n', r'\n')
- obj = obj.replace('\r', r'\r')
- obj = obj.replace('\t', r'\t')
- self._append(obj)
- self._append('"')
- elif ty is types.IntType or ty is types.LongType:
- self._append(str(obj))
- elif ty is types.FloatType:
- self._append("%f" % obj)
- elif obj is True:
- self._append("true")
- elif obj is False:
- self._append("false")
- elif obj is None:
- self._append("null")
- else:
- raise WriteException, "Cannot write in JSON: %s" % repr(obj)
-
-def write(obj, escaped_forward_slash=False):
- return JsonWriter().write(obj, escaped_forward_slash)
-
-def read(s):
- return JsonReader().read(s)
-
-def fread(f):
- return read(f.read())
diff --git a/fbconnect/tests.py b/fbconnect/tests.py
deleted file mode 100644
index 2247054b..00000000
--- a/fbconnect/tests.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-This file demonstrates two different styles of tests (one doctest and one
-unittest). These will both pass when you run "manage.py test".
-
-Replace these with more appropriate tests for your application.
-"""
-
-from django.test import TestCase
-
-class SimpleTest(TestCase):
- def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
- self.failUnlessEqual(1 + 1, 2)
-
-__test__ = {"doctest": """
-Another way to test that 1 + 1 is equal to 2.
-
->>> 1 + 1 == 2
-True
-"""}
-
diff --git a/fbconnect/urls.py b/fbconnect/urls.py
deleted file mode 100644
index 81b0cb0f..00000000
--- a/fbconnect/urls.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from django.conf.urls.defaults import *
-from django.utils.translation import ugettext as _
-from django.views.generic.simple import direct_to_template
-from views import signin, register
-
-urlpatterns = patterns('',
- url(
- r'^xd_receiver$',
- direct_to_template,
- {'template': 'fbconnect/xd_receiver.html',},
- name='xd_receiver'
- ),
-
- url(r'^%s$' % _('signin/'), signin, name="fb_signin"),
- url(r'^%s%s$' % (_('signin/'), _('newquestion/')), signin, {'newquestion': True}, name="fb_signin_new_question"),
- url(r'^%s%s$' % (_('signin/'), _('newanswer/')), signin, {'newanswer': True}, name="fb_signin_new_answer"),
-
- url(r'^%s$' % _('register/'), register, name="fb_user_register"),
- url(r'^%s%s$' % (_('register/'), _('newquestion/')), register, {'newquestion': True}, name="fb_user_register_new_question"),
- url(r'^%s%s$' % (_('register/'), _('newanswer/')), register, {'newanswer': True}, name="fb_user_register_new_answer"),
-)
diff --git a/fbconnect/views.py b/fbconnect/views.py
deleted file mode 100644
index 91ea757a..00000000
--- a/fbconnect/views.py
+++ /dev/null
@@ -1,112 +0,0 @@
-from django.shortcuts import render_to_response as render
-from django.template import RequestContext
-from django.http import HttpResponseRedirect
-from django.utils.safestring import mark_safe
-from django.core.urlresolvers import reverse
-from django.contrib.auth.models import User
-from django.contrib.auth import login, logout
-from models import FBAssociation
-from forum.forms import SimpleEmailSubscribeForm
-from django.conf import settings
-
-import fb
-import forms
-
-import logging
-
-def signin(request, newquestion = False, newanswer = False):
- logging.debug('')
- state, context = fb.get_user_state(request)
-
- if state == fb.STATES['FIRSTTIMER']:
- logging.debug('FB state = FIRSTTIMER')
- if newquestion:
- register_url = 'fb_user_register_new_question'
- elif newanswer:
- register_url = 'fb_user_register_new_answer'
- else:
- register_url = 'fb_user_register'
- return HttpResponseRedirect(reverse(register_url))
- elif state == fb.STATES['RETURNINGUSER']:
- logging.debug('FB state = RETURNINGUSER')
- return login_and_forward(request, context, newquestion, newanswer)
- elif state == fb.STATES['SESSIONEXPIRED']:
- logging.debug('FB state = SESSIONEXPIRED')
- response = logout(request, next_page=reverse('index'))
- fb.delete_cookies(response)
- return response
-
- return HttpResponseRedirect(reverse('index'))
-
-def register(request, newquestion = False, newanswer = False):
- logging.debug('')
- state, context = fb.get_user_state(request)
-
- if state == fb.STATES['FIRSTTIMER']:
- logging.debug('FB FIRSTTIMER - try to register locally')
- logging.debug('request method is %s' % request.method)
- if request.method == 'POST' and 'bnewaccount' in request.POST:
- form1 = forms.FBConnectRegisterForm(request.POST)
- email_feeds_form = SimpleEmailSubscribeForm(request.POST)
-
- if (form1.is_valid() and email_feeds_form.is_valid()):
- tmp_pwd = User.objects.make_random_password()
- user_ = User.objects.create_user(form1.cleaned_data['username'],
- form1.cleaned_data['email'], tmp_pwd)
-
- user_.set_unusable_password()
- logging.debug('created new internal user %s' % form1.cleaned_data['username'])
-
- uassoc = FBAssociation(user=user_, fbuid=context['uid'])
- uassoc.save()
- logging.debug('created new user association')
-
- email_feeds_form.save(user_)
-
- return login_and_forward(request, user_, newquestion, newanswer)
- else:
- logging.debug('form user input is invalid')
- else:
- form1 = forms.FBConnectRegisterForm(initial={
- 'next': '/',
- 'username': context['name'],
- 'email': '',
- })
- email_feeds_form = SimpleEmailSubscribeForm()
-
- return render('authopenid/complete.html', {
- 'form1': form1,
- 'email_feeds_form': email_feeds_form,
- 'provider':mark_safe('facebook'),
- 'login_type':'facebook',
- 'gravatar_faq_url':reverse('faq') + '#gravatar',
- }, context_instance=RequestContext(request))
- else:
- logging.debug('not a FIRSTTIMER --> redirect to index view')
- return HttpResponseRedirect(reverse('index'))
-
-def login_and_forward(request, user, newquestion = False, newanswer = False):
- old_session = request.session.session_key
- user.backend = "django.contrib.auth.backends.ModelBackend"
- logging.debug('attached auth.backends.ModelBackend to this FB user')
- login(request, user)
- logging.debug('user logged in!')
-
- from forum.models import signals#todo: move to authentication app
- signals.user_logged_in.send(user=user,session_key=old_session,sender=None)
- logging.debug('user_logged_in signal sent')
-
- if (newquestion):
- from forum.models import Question
- question = Question.objects.filter(author=user).order_by('-added_at')[0]
- logging.debug('redirecting to newly posted question')
- return HttpResponseRedirect(question.get_absolute_url())
-
- if (newanswer):
- from forum.models import Answer
- answer = Answer.objects.filter(author=user).order_by('-added_at')[0]
- logging.debug('redirecting to newly posted answer')
- return HttpResponseRedirect(answer.get_absolute_url())
-
- logging.debug('redirecting to front page')
- return HttpResponseRedirect('/')