summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-03-27 16:06:23 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-03-27 16:07:39 -0400
commitacd9aeca8e697b6d1f8f7ac29d7e3afac07b2e8a (patch)
treedbb232a017f71934cfb05b264db0cca40ac00164
parent40ea3f482ffdfd648366ed20a87335dc31e92231 (diff)
downloadaskbot-acd9aeca8e697b6d1f8f7ac29d7e3afac07b2e8a.tar.gz
askbot-acd9aeca8e697b6d1f8f7ac29d7e3afac07b2e8a.tar.bz2
askbot-acd9aeca8e697b6d1f8f7ac29d7e3afac07b2e8a.zip
removed authentication module to be replaced with a dedicated app, also switched to table layout for openid signin template temporarily so that it works on IE7 and maybe earlier
-rw-r--r--TODO.rst (renamed from TODO)14
-rwxr-xr-xforum/authentication/__init__.py27
-rwxr-xr-xforum/authentication/base.py44
-rwxr-xr-xforum/authentication/forms.py73
-rwxr-xr-xforum/skins/default/media/jquery-openid/jquery.openid.js24
-rwxr-xr-xforum/skins/default/media/jquery-openid/openid.css14
-rwxr-xr-xforum/skins/default/templates/auth/auth_settings.html35
-rwxr-xr-xforum/skins/default/templates/auth/complete.html95
-rwxr-xr-xforum/skins/default/templates/auth/email_validation.html20
-rwxr-xr-xforum/skins/default/templates/auth/signin.html165
-rwxr-xr-xforum/skins/default/templates/auth/signup.html32
-rwxr-xr-xforum/skins/default/templates/auth/temp_login_email.html20
-rwxr-xr-xforum/skins/default/templates/auth/temp_login_request.html28
-rwxr-xr-xforum/skins/default/templates/authopenid/signin.html92
-rw-r--r--forum/views/auth.py359
-rwxr-xr-xforum_modules/facebookauth/__init__.py0
-rwxr-xr-xforum_modules/facebookauth/authentication.py85
-rwxr-xr-xforum_modules/facebookauth/settings.py3
-rwxr-xr-xforum_modules/facebookauth/templates/button.html38
-rwxr-xr-xforum_modules/facebookauth/templates/xd_receiver.html1
-rwxr-xr-xforum_modules/facebookauth/urls.py9
-rwxr-xr-xforum_modules/facebookauth/views.py11
-rwxr-xr-xforum_modules/localauth/__init__.py0
-rwxr-xr-xforum_modules/localauth/authentication.py18
-rwxr-xr-xforum_modules/localauth/forms.py77
-rwxr-xr-xforum_modules/localauth/templates/loginform.html31
-rwxr-xr-xforum_modules/localauth/urls.py8
-rwxr-xr-xforum_modules/localauth/views.py31
-rwxr-xr-xforum_modules/oauthauth/__init__.py0
-rwxr-xr-xforum_modules/oauthauth/authentication.py41
-rwxr-xr-xforum_modules/oauthauth/consumer.py87
-rwxr-xr-xforum_modules/oauthauth/lib/__init__.py0
-rwxr-xr-xforum_modules/oauthauth/lib/oauth.py594
-rwxr-xr-xforum_modules/oauthauth/settings.py3
-rwxr-xr-xforum_modules/openidauth/__init__.py0
-rwxr-xr-xforum_modules/openidauth/authentication.py196
-rwxr-xr-xforum_modules/openidauth/consumer.py112
-rwxr-xr-xforum_modules/openidauth/models.py26
-rwxr-xr-xforum_modules/openidauth/settings.py9
-rwxr-xr-xforum_modules/openidauth/store.py79
-rwxr-xr-xforum_modules/openidauth/templates/openidurl.html20
41 files changed, 79 insertions, 2442 deletions
diff --git a/TODO b/TODO.rst
index d6a4ced1..6ad2acd3 100644
--- a/TODO
+++ b/TODO.rst
@@ -1,16 +1,22 @@
note: there is also WISH_LIST. Here is only stuff that will be done soon.
-Cleanups
-==========
+Site looks
+===========
+* make links within posts blue so that they are visible
+
+Code Cleanups
+==============
* remove usage of EXTERNAL_LEGACY_LOGIN
* remove forum_modules and replace them with normal Python imports
* pack dependency apps inside 'forum' directory
Features
===========
-* new login system, please see http://groups.google.com/group/askbot/browse_thread/thread/1916dfcf666dd56c
+* new login system, please see
+ http://groups.google.com/group/askbot/browse_thread/thread/1916dfcf666dd56c
+ on a separate branch multi-auth-app, then merge
* forum admin interface, some badge configuration
Development environment
==========================
-* set up environment for closure developmen
+* set up environment for closure development
diff --git a/forum/authentication/__init__.py b/forum/authentication/__init__.py
deleted file mode 100755
index 75099303..00000000
--- a/forum/authentication/__init__.py
+++ /dev/null
@@ -1,27 +0,0 @@
-import re
-from forum.modules import get_modules_script_classes
-from forum.authentication.base import AuthenticationConsumer, ConsumerTemplateContext
-
-class ConsumerAndContext():
- def __init__(self, id, consumer, context):
- self.id = id
- self.consumer = consumer()
-
- context.id = id #add extra field to context
- self.context = context
-
-consumers = dict([
- (re.sub('AuthConsumer$', '', name).lower(), cls) for name, cls
- in get_modules_script_classes('authentication', AuthenticationConsumer).items()
- if not re.search('AbstractAuthConsumer$', name)
- ])
-
-contexts = dict([
- (re.sub('AuthContext$', '', name).lower(), cls) for name, cls
- in get_modules_script_classes('authentication', ConsumerTemplateContext).items()
- ])
-
-AUTH_PROVIDERS = dict([
- (name, ConsumerAndContext(name, consumers[name], contexts[name])) for name in consumers.keys()
- if name in contexts
- ])
diff --git a/forum/authentication/base.py b/forum/authentication/base.py
deleted file mode 100755
index 99005866..00000000
--- a/forum/authentication/base.py
+++ /dev/null
@@ -1,44 +0,0 @@
-
-class AuthenticationConsumer(object):
-
- def prepare_authentication_request(self, request, redirect_to):
- raise NotImplementedError()
-
- def process_authentication_request(self, response):
- raise NotImplementedError()
-
- def get_user_data(self, key):
- raise NotImplementedError()
-
-
-class ConsumerTemplateContext(object):
- """
- Class that provides information about a certain authentication provider context in the signin page.
-
- class attributes:
-
- mode - one of BIGICON, SMALLICON, FORM
-
- human_name - the human readable name of the provider
-
- extra_js - some providers require us to load extra javascript on the signin page for them to work,
- this is the place to add those files in the form of a list
-
- extra_css - same as extra_js but for css files
- """
- mode = ''
- weight = 500
- human_name = ''
- extra_js = []
- extra_css = []
- show_to_logged_in_user = True
-
- @classmethod
- def readable_key(cls, key):
- return key.key
-
-class InvalidAuthentication(Exception):
- def __init__(self, message):
- self.message = message
-
- \ No newline at end of file
diff --git a/forum/authentication/forms.py b/forum/authentication/forms.py
deleted file mode 100755
index 24e76c08..00000000
--- a/forum/authentication/forms.py
+++ /dev/null
@@ -1,73 +0,0 @@
-from forum.utils.forms import NextUrlField, UserNameField, UserEmailField, SetPasswordForm
-from forum.models import EmailFeedSetting, Question, User
-from django.contrib.contenttypes.models import ContentType
-from django.utils.translation import ugettext as _
-from django.utils.safestring import mark_safe
-from django import forms
-from forum.forms import EditUserEmailFeedsForm
-import logging
-
-class SimpleRegistrationForm(forms.Form):
- next = NextUrlField()
- username = UserNameField()
- email = UserEmailField()
-
-class TemporaryLoginRequestForm(forms.Form):
- def __init__(self, data=None):
- super(TemporaryLoginRequestForm, self).__init__(data)
- self.user_cache = None
-
- email = forms.EmailField(
- required=True,
- label=_("Your account email"),
- error_messages={
- 'required': _("You cannot leave this field blank"),
- 'invalid': _('please enter a valid email address'),
- }
- )
-
- def clean_email(self):
- try:
- user = User.objects.get(email=self.cleaned_data['email'])
- except:
- raise forms.ValidationError(_("Sorry, but this email is not on our database."))
-
- self.user_cache = user
- return self.cleaned_data['email']
-
-
-class SimpleEmailSubscribeForm(forms.Form):
- SIMPLE_SUBSCRIBE_CHOICES = (
- ('y',_('okay, let\'s try!')),
- ('n',_('no community email please, thanks'))
- )
- subscribe = forms.ChoiceField(widget=forms.widgets.RadioSelect(), \
- error_messages={'required':_('please choose one of the options above')},
- choices=SIMPLE_SUBSCRIBE_CHOICES)
-
- def save(self,user=None):
- EFF = EditUserEmailFeedsForm
- if self.cleaned_data['subscribe'] == 'y':
- email_settings_form = EFF()
- logging.debug('%s wants to subscribe' % user.username)
- else:
- email_settings_form = EFF(initial=EFF.NO_EMAIL_INITIAL)
- email_settings_form.save(user,save_unbound=True)
-
-class ChangePasswordForm(SetPasswordForm):
- """ change password form """
- oldpw = forms.CharField(widget=forms.PasswordInput(attrs={'class':'required'}),
- label=mark_safe(_('Current password')))
-
- def __init__(self, data=None, user=None, *args, **kwargs):
- if user is None:
- raise TypeError("Keyword argument 'user' must be supplied")
- super(ChangePasswordForm, self).__init__(data, *args, **kwargs)
- self.user = user
-
- def clean_oldpw(self):
- """ test old password """
- if not self.user.check_password(self.cleaned_data['oldpw']):
- raise forms.ValidationError(_("Old password is incorrect. \
- Please enter the correct password."))
- return self.cleaned_data['oldpw']
diff --git a/forum/skins/default/media/jquery-openid/jquery.openid.js b/forum/skins/default/media/jquery-openid/jquery.openid.js
index 8d1cd204..eae7b3ea 100755
--- a/forum/skins/default/media/jquery-openid/jquery.openid.js
+++ b/forum/skins/default/media/jquery-openid/jquery.openid.js
@@ -36,7 +36,7 @@ $.fn.openid = function() {
};
var local = function() {
var $li = $(this);
- $('#openid_form .providers li').removeClass('highlight');
+ $('#openid_form .providers td').removeClass('highlight');
$li.addClass('highlight');
$usrfs.hide();
$idfs.hide();
@@ -47,19 +47,19 @@ $.fn.openid = function() {
var direct = function() {
var $li = $(this);
- $('#openid_form .providers li').removeClass('highlight');
+ $('#openid_form .providers td').removeClass('highlight');
$li.addClass('highlight');
$usrfs.fadeOut('slow');
$localfs.fadeOut('slow');
$idfs.fadeOut('slow');
- $id.val($this.find("li.highlight span").text());
+ $id.val($this.find("td.highlight span").text());
setTimeout(function(){$('#bsignin').click();},1000);
return false;
};
var openid = function() {
var $li = $(this);
- $('#openid_form .providers li').removeClass('highlight');
+ $('#openid_form .providers td').removeClass('highlight');
$li.addClass('highlight');
$usrfs.hide();
$localfs.hide();
@@ -71,7 +71,7 @@ $.fn.openid = function() {
var username = function() {
var $li = $(this);
- $('#openid_form .providers li').removeClass('highlight');
+ $('#openid_form .providers td').removeClass('highlight');
$li.addClass('highlight');
$idfs.hide();
$localfs.hide();
@@ -84,10 +84,10 @@ $.fn.openid = function() {
return false;
};
- $this.find('li.local').click(local);
- $this.find('li.direct').click(direct);
- $this.find('li.openid').click(openid);
- $this.find('li.username').click(username);
+ $this.find('td.local').click(local);
+ $this.find('td.direct').click(direct);
+ $this.find('td.openid').click(openid);
+ $this.find('td.username').click(username);
$id.keypress(function(e) {
if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
return submitid();
@@ -98,12 +98,12 @@ $.fn.openid = function() {
return submitusr();
}
});
- $this.find('li span').hide();
- $this.find('li').css('line-height', 0).css('cursor', 'pointer');
+ $this.find('td span').hide();
+ $this.find('td').css('line-height', 0).css('cursor', 'pointer');
$usrfs.hide();
$idfs.hide();
$localfs.hide();
- $this.find('li:eq(0)').click();
+ $this.find('td:eq(0)').click();
return this;
};
diff --git a/forum/skins/default/media/jquery-openid/openid.css b/forum/skins/default/media/jquery-openid/openid.css
index 1b7aaf82..307d5624 100755
--- a/forum/skins/default/media/jquery-openid/openid.css
+++ b/forum/skins/default/media/jquery-openid/openid.css
@@ -1,7 +1,7 @@
fieldset { border-style:none; }
img {border-style:none;}
-.logo_box {display:inline-block;float:left;width:90px;height:40px;background:white;border:1px solid #dddddd;}
+.logo_box {width:90px;height:40px;background:white;border:1px solid #dddddd;}
.openid_box img {margin-top:6px;}
.aol_box img {margin-top:6px;}
.yahoo_box img {margin-top:13px;}
@@ -9,13 +9,11 @@ img {border-style:none;}
.local_login_box img {margin-top:2px;margin-left:-3px;}
form.openid ul{ margin:0;padding:0;text-align:center; list-style-type:none; display:block;}
-form.openid ul li {float:left; padding:4px;display:inline-block;}
-form.openid ul li div {display:inline-block;}
+form.openid ul li {padding:4px;}
form.openid ul li span {padding:0 1em 0 3px}
form.openid ul li.first_tiny_li {clear:left;}
form.openid fieldset {clear:both;padding:10px 0px 0px 0px;}
form.openid div+fieldset {display:none}
-form.openid label {display:block; font-weight:bold;}
input[name=openid_username] {width:8em}
input[name=openid_identifier] {width:18em}
form.openid ul li.highlight { -moz-border-radius:4px; -webkit-border-radius:4px; background-color: #FD6}
@@ -24,7 +22,6 @@ form.openid fieldset div {
-webkit-border-radius:4px;
background: #DCDCDC;
padding:10px;
- display:inline-block;
float:left;
}
form.openid p {margin-bottom:4px;}
@@ -67,9 +64,16 @@ form.openid ul.errorlist li {
float: none;
color:blue;
}
+ul.providers {
+ clear:left;
+ float:left;
+}
#openid_small_providers li {
margin-top:4px;
}
#openid_small_providers li.facebook {
margin-top:0px;
}
+ul.providers {
+ display: block;
+}
diff --git a/forum/skins/default/templates/auth/auth_settings.html b/forum/skins/default/templates/auth/auth_settings.html
deleted file mode 100755
index 051fb6ba..00000000
--- a/forum/skins/default/templates/auth/auth_settings.html
+++ /dev/null
@@ -1,35 +0,0 @@
-{% extends "base.html" %}
-<!-- changepw.html -->
-{% load i18n %}
-{% block head %}{% endblock %}
-{% block title %}{% spaceless %}{% trans "Authentication settings" %}{% endspaceless %}{% endblock %}
-{% block content %}
-<div class="headNormal">{% trans "Authentication settings" %}</div>
-{% if auth_keys %}
- <p class="message">{% blocktrans %}These are the external authentication providers currently associated with your account.{% endblocktrans %}</p>
- <div>
- {% for key in auth_keys %}
- <p>{{ key.name }} (<a href="{% url user_remove_external_provider id=key.id %}">{% trans "remove" %}</a>)</p>
- {% endfor %}
- </div>
-{% endif %}
-{% if not auth_keys %}
- <p class="message">{% blocktrans %}You currently have no external authentication provider associated with your account.{% endblocktrans %}</p>
-{% endif %}
-<input type="button" class="submit" value="{% trans "Add new provider" %}" onclick="window.location='{% url user_add_external_provider %}'" />
-{% if has_password %}
- <p class="message">{% blocktrans %}This is where you can change your password. Make sure you remember it!{% endblocktrans %}</p>
-{% endif %}
-{% if not has_password %}
- <p class="message">{% blocktrans %}You can set up a password for your account, so you can login using standard username and password!{% endblocktrans %}</p>
-{% endif %}
-<div class="aligned">
- <form action="" method="post" accept-charset="utf-8">
- <ul id="changepw-form" class="form-horizontal-rows">
- {{form.as_ul}}
- </ul>
- <div class="submit-row"><input type="submit" class="submit" value="{% if has_password %}{% trans "Change password" %}{% endif %}{% if not has_password %}{% trans "Create password" %}{% endif %}" /></div>
- </form>
- </div>
-{% endblock %}
-<!-- end changepw.html -->
diff --git a/forum/skins/default/templates/auth/complete.html b/forum/skins/default/templates/auth/complete.html
deleted file mode 100755
index cb2dc5aa..00000000
--- a/forum/skins/default/templates/auth/complete.html
+++ /dev/null
@@ -1,95 +0,0 @@
-{% extends "base_content.html" %}
-<!-- complete.html -->
-{% load i18n %}
-{% block head %}{% endblock %}
-{% block title %}{% spaceless %}{% trans "Connect your OpenID with this site" %}{% endspaceless %}{% endblock %}
-{% block content %}
- <div id="main-bar" class="headNormal">
- {% trans "Connect your OpenID with your account on this site" %}
- </div>
- <div id="completetxt" >
- <div class="message">
- <b>{% trans "You are here for the first time with " %}{{ provider }}</b>
- {% trans "Please create your screen name and save your email address. Saved email address will let you subscribe for the updates on the most interesting questions and will be used to create and retrieve your unique avatar image. " %}
- </div>
- <p style="display:none">{% trans "This account already exists, please use another." %}</p>
- </div>
-
- {% if form1.errors %}
- <ul class="errorlist">
- {% if form1.non_field_errors %}
- {% for error in form1.non_field_errors %}
- <li>{{error}}</li>
- {% endfor %}
- {% endif %}
- </ul>
- {% endif %}
- {% comment %}
- {% if form2.errors %}<!--form2 is dysfunctional so commented out -->
- <div class="errors">
- <span class="big">{% trans "Sorry, looks like we have some errors:" %}</span><br/>
- <ul class="error-list">
- {% if form2.username.errors %}
- <li><span class="error">{{ form2.username.errors|join:", " }}</span></li>
- {% endif %}
- {% if form2.password.errors %}
- <li><span class="error">{{ form2.password.errors|join:", " }}</span></li>
- {% endif %}
- </ul>
- </div>
- {% endif %}
- {% endcomment %}
-
- <div class="login">
- <form name="fregister" action="" method="POST">
- {{ form1.next }}
- <div class="form-row-vertical">
- <label for="id_username">{% trans "Screen name label" %}</label>
- {% if form1.username.errors %}
- <p class="error">{{ form1.username.errors|join:", " }}</p>
- {% endif %}
- {{ form1.username }}
- </div>
- <div class="form-row-vertical margin-bottom">
- <label for="id_email">{% trans "Email address label" %}</label>
- {% if form1.email.errors %}
- <p class="error">{{ form1.email.errors|join:", " }}</p>
- {% endif %}
- {{ form1.email }}
- </div>
- <p>{% trans "receive updates motivational blurb" %}</p>
- <div class='simple-subscribe-options'>
- {{email_feeds_form.subscribe}}
- {% if email_feeds_form.errors %}
- <p class="error">{% trans "please select one of the options above" %}</p>
- {% endif %}
- </div>
- <p class='space-above'>{% trans "Tag filter tool will be your right panel, once you log in." %}</p>
- <div class="submit-row"><input type="submit" class="submit" name="bnewaccount" value="{% trans "create account" %}"/></div>
- </form>
- </div>
- {% comment %}<!-- this form associates openID with an existing password-protected account, not yet functional -->
- {% if form2 %}
- <div class="login" style="display:none">
- <form name="fverify" action="{% url user_register %}" method="POST">
- {{ form2.next }}
- <fieldset style="padding:10px">
- <legend class="big">{% trans "Existing account" %}</legend>
- <div class="form-row"><label for="id_username">{% trans "user name" %}</label><br/>{{ form2.username }}</div>
- <div class="form-row"><label for="id_passwordl">{% trans "password" %}</label><br/>{{ form2.password }}</div>
- <p><span class='big strong'>(Optional) receive updates by email</span> - only sent when there are any.</p>
- <div class='simple-subscribe-options'>
- {{email_feeds_form.subscribe}}
- </div>
- <!--todo double check translation from chinese 确认 = "Register" -->
- <div class="submit-row">
- <input type="submit" class="submit" name="bverify" value="{% trans "Register" %}"/>
- <a href="{% url user_sendpw %}">{% trans "Forgot your password?" %}</a>
- </div>
- </fieldset>
- </form>
- </div>
- {% endif %}
- {% endcomment %}
-{% endblock %}
-<!-- end complete.html -->
diff --git a/forum/skins/default/templates/auth/email_validation.html b/forum/skins/default/templates/auth/email_validation.html
deleted file mode 100755
index a4126a69..00000000
--- a/forum/skins/default/templates/auth/email_validation.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% extends "email_base.html" %}
-{% load i18n %}
-{% load extra_tags %}
-
-{% block content %}
- <p>{% trans "Greetings from the Q&A forum" %},</p>
-
- <p>{% trans "To make use of the Forum, please follow the link below:" %}</p>
-
- <a href="{% fullurl auth_validate_email user=user.id,code=validation_code %}">{% fullurl auth_validate_email user=user.id,code=validation_code %}</a>
-
- <p>{% trans "Following the link above will help us verify your email address." %}</p>
-
- <p>{% blocktrans %}If you beleive that this message was sent in mistake -
- no further action is needed. Just ingore this email, we apologize
- for any inconvenience{% endblocktrans %}</p>
-
- <p>{% blocktrans %}Sincerely,<br />
- Forum Administrator{% endblocktrans %}</p>
-{% endblock %}
diff --git a/forum/skins/default/templates/auth/signin.html b/forum/skins/default/templates/auth/signin.html
deleted file mode 100755
index 78e6c76d..00000000
--- a/forum/skins/default/templates/auth/signin.html
+++ /dev/null
@@ -1,165 +0,0 @@
-{% extends "base.html" %}
-
-{% load i18n %}
-{% load extra_tags %}
-
-{% block forejs %}
- <link rel="stylesheet" type="text/css" media="screen" href="{% media "/media/style/auth.css" %}"/>
- {% for provider in all_providers %}
- {% for location in provider.extra_css %}
- <link rel="stylesheet" type="text/css" media="screen" href="{{ location }}"/>
- {% endfor %}
- {% endfor %}
-{% endblock %}
-
-{% block content %}
- {% for provider in all_providers %}
- {% if provider.pre_code %}
- {{ provider.pre_code|safe }}
- {% endif %}
- {% endfor %}
- <div class="headNormal">
- {% trans "User login" %}
- </div>
- {% if msg %}
- <p class="warning">{{ msg }}</p>
- {% endif %}
-
- <div style="width:600px;float:left;margin-bottom:5px;">
- {% trans "Click to sign in through any of these services." %}
- </div>
- {% if request.user.is_anonymous %}
- <div style="width:600px;float:left;margin-bottom:5px;">
- <input type="checkbox" checked="checked" id="validate_email" />
- {% trans "Take the oppurtunity to validate my email next to the external provider I choose." %}
- </div>
- {% endif %}
- <div id="bigicon_providers">
- {% for provider in bigicon_providers %}
- <div class="provider_logo big" name="{{ provider.id }}">
- {% ifequal provider.type "DIRECT" %}
- <a class="provider_direct" href="{% url auth_provider_signin provider=provider.id %}">
- <img src="{% media provider.icon %}" />
- </a>
- {% endifequal %}
- {% ifequal provider.type "CUSTOM" %}
- {% include provider.code_template %}
- {% endifequal %}
- {% ifequal provider.type "SIMPLE_FORM" %}
- <img alt="{{ provider.simple_form_context.your_what }}" class="simple_form_provider" src="{% media provider.icon %}" />
- {% endifequal %}
- </div>
- {% endfor %}
- </div>
- <div id="smallicon_providers">
- {% for provider in smallicon_providers %}
- <div class="provider_logo small" name="{{ provider.id }}">
- {% ifequal provider.type "DIRECT" %}
- <a class="provider_direct" href="{% url auth_provider_signin provider=provider.id %}">
- <img src="{% media provider.icon %}" />
- </a>
- {% endifequal %}
- {% ifequal provider.type "CUSTOM" %}
- {% include provider.code_template %}
- {% endifequal %}
- {% ifequal provider.type "SIMPLE_FORM" %}
- <img alt="{{ provider.simple_form_context.your_what }}" class="simple_form_provider" src="{% media provider.icon %}" />
- {% endifequal %}
- </div>
- {% endfor %}
- </div>
- <form name="signin_form" id="signin_form" class="signin_form" method="POST" action="">
- <div id="signin_form_slot"></div>
- <input type="hidden" class="validate_email" name="validate_email" value="yes" />
- </form>
- {% for provider in stackitem_providers %}
- <h3 class="or_label">{% trans 'Or...' %}</h3>
- <form class="signin_form" method="POST" action="{% url auth_provider_signin provider=provider.id %}">
- {% include provider.stack_item_template %}
- <input type="hidden" class="validate_email" name="validate_email" value="yes" />
- </form>
- {% endfor %}
- <h3 class="or_label">{% trans 'Or...' %}</h3>
- <fieldset>
- {% trans 'Click' %} <a href="{% url auth_request_tempsignin %}">here</a> {% trans "if you're having troubles signing in." %}
- </fieldset>
- <script type="text/html" id="simple_form_template">
- <fieldset id="slot_form">
- <p id="provider_name_slot">{% trans 'Enter your ' %}%%YOUR_WHAT%%</p>
- <div><p><span></span>
- <input id="input_field" type="text" name="input_field" /><span></span>
- <input id="ssignin" name="ssignin" type="submit" value="Login" />
- </p></div>
- <input type="hidden" class="validate_email" name="validate_email" value="yes" />
- </fieldset>
- </script>
- <script type="text/javascript">
- $(function() {
- var signin_url = "{% url auth_provider_signin provider='PROVIDER' %}";
-
- function set_validate_email() {
- var validate = $('#validate_email').attr('checked') ? 'yes' : 'no';
- $('.validate_email').attr('value', validate);
-
- $('.provider_direct').each(function() {
- var current_url = $(this).attr('href');
- if (!/\?validate_email\=(yes|no)$/.test(current_url)) {
- current_url += ('?validate_email=' + validate);
- } else {
- current_url = current_url.replace(/(yes|no)$/, validate);
- }
-
- $(this).attr('href', current_url);
- })
- }
-
- $('#validate_email').change(set_validate_email);
-
- function set_form_action(el) {
- var provider = el.parents('.provider_logo').attr('name');
- $('#signin_form').attr('action', signin_url.replace('PROVIDER', provider));
- }
-
- $('.provider_logo').click(function() {
- $('.provider_logo').removeClass('selected');
- $(this).addClass('selected');
- });
-
- $('.simple_form_provider').click(function() {
- $('#signin_form_slot').html('');
- var new_html = $('#simple_form_template').html()
- .replace('%%YOUR_WHAT%%', $(this).attr('alt'));
- $('#signin_form_slot').html(new_html);
- set_form_action($(this));
- set_validate_email();
- })
-
- set_validate_email();
- });
- </script>
-{% endblock %}
-
-{% block sidebar %}
-<div class="boxC">
- <h3 class="subtitle">{% trans "Why use OpenID?" %}</h3>
- <ul class="list-item">
- <li>
- {% trans "with openid it is easier" %}
- </li>
- <li>
- {% trans "reuse openid" %}
- </li>
- <li>
- {% trans "openid is widely adopted" %}
- </li>
- <li>
- {% trans "openid is supported open standard" %}
- </li>
-
- </ul>
- <p class="info-box-follow-up-links">
- <a href="http://openid.net/what/" target="_blank">{% trans "Find out more" %} </a><br/>
- <a href="http://openid.net/get/" target="_blank">{% trans "Get OpenID" %} </a>
- </p>
-</div>
-{% endblock%} \ No newline at end of file
diff --git a/forum/skins/default/templates/auth/signup.html b/forum/skins/default/templates/auth/signup.html
deleted file mode 100755
index ac5eb241..00000000
--- a/forum/skins/default/templates/auth/signup.html
+++ /dev/null
@@ -1,32 +0,0 @@
-{% extends "base_content.html" %}
-<!--signup.html-->
-{% load i18n %}
-{% block title %}{% spaceless %}{% trans "Signup" %}{% endspaceless %}{% endblock %}
-
-{% block content %}
-<div class="headNormal">
- {% trans "Create login name and password" %}
-</div>
-<p class="message">{% trans "Traditional signup info" %}</p>
-<form action="" method="post" accept-charset="utf-8">
- <ul class="form-horizontal-rows">
- <li><label for="usename_id">{{form.username.label}}</label>{{form.username}}{{form.username.errors}}</li>
- <li><label for="email_id">{{form.email.label}}</label>{{form.email}}{{form.email.errors}}</li>
- <li><label for="password1_id">{{form.password1.label}}</label>{{form.password1}}{{form.password1.errors}}</li>
- <li><label for="password2_id">{{form.password2.label}}</label>{{form.password2}}{{form.password2.errors}}</li>
- </ul>
- <p class="margin-top">{% trans "receive updates motivational blurb" %}</p>
- <div class='simple-subscribe-options'>
- {{ email_feeds_form.subscribe }}
- {% if email_feeds_form.errors %}
- <p class="error">{% trans "please select one of the options above" %}</p>
- {% endif %}
- </div>
- {% comment %}<p class="signup_p">{% trans "Please read and type in the two words below to help us prevent automated account creation." %}</p>
- {{form.recaptcha}}{% endcomment %}
- <div class="submit-row"><input type="submit" class="submit" value="{% trans "Create Account" %}" />
- <strong>{% trans "or" %}
- <a href="{% url user_signin %}">{% trans "return to login page" %}</a></strong></div>
-</form>
-{% endblock %}
-<!--end signup.html-->
diff --git a/forum/skins/default/templates/auth/temp_login_email.html b/forum/skins/default/templates/auth/temp_login_email.html
deleted file mode 100755
index 063608fe..00000000
--- a/forum/skins/default/templates/auth/temp_login_email.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% extends "email_base.html" %}
-{% load i18n %}
-{% load extra_tags %}
-
-{% block content %}
- <p>{% trans "Greetings from the Q&A forum" %},</p>
-
- <p>{% trans "You're seeing this because someone requested a temporary login link" %}</p>
-
- <a href="{% fullurl auth_tempsignin user=user.id,code=temp_login_code %}">{% fullurl auth_tempsignin user=user.id,code=temp_login_code %}</a>
-
- <p>{% trans "Following the link above will give you access to your account." %}</p>
-
- <p>{% blocktrans %}If you beleive that this message was sent in mistake -
- no further action is needed. Just ingore this email, we apologize
- for any inconvenience{% endblocktrans %}</p>
-
- <p>{% blocktrans %}Sincerely,<br />
- Forum Administrator{% endblocktrans %}</p>
-{% endblock %}
diff --git a/forum/skins/default/templates/auth/temp_login_request.html b/forum/skins/default/templates/auth/temp_login_request.html
deleted file mode 100755
index 772f18fb..00000000
--- a/forum/skins/default/templates/auth/temp_login_request.html
+++ /dev/null
@@ -1,28 +0,0 @@
-{% extends "base.html" %}
-
-{% load i18n %}
-{% block head %}{% endblock %}
-{% block title %}{% spaceless %}{% trans "Request temporary login key" %}{% endspaceless %}{% endblock %}
-{% block content %}
-<div class="headNormal">{% trans "Account: request temporary login key" %}</div>
-<p class="message">{% blocktrans %}
- If you're experiencing problems accessing your account, or if you forgot your password,
- here you can request a temporary login key. Fill out your account email and we'll send you a temporary access link that
- will enable you to access your account. This token is valid only once and for a limited period of time.
- {% endblocktrans %}</p>
-<div class="aligned">
- {% if form.errors %}
- <ul class="errorlist">
- {% for error in form.errors %}
- <li>{{ error }}</li>
- {% endfor %}
- </ul>
- {% endif %}
- <form action="" method="post" accept-charset="utf-8">
- <ul id="changepw-form" class="form-horizontal-rows">
- {{form.as_ul}}
- </ul>
- <div class="submit-row"><input type="submit" class="submit" value="{% trans "Send link" %}" /></div>
- </form>
- </div>
-{% endblock %} \ No newline at end of file
diff --git a/forum/skins/default/templates/authopenid/signin.html b/forum/skins/default/templates/authopenid/signin.html
index 04e58255..66ef2f78 100755
--- a/forum/skins/default/templates/authopenid/signin.html
+++ b/forum/skins/default/templates/authopenid/signin.html
@@ -38,10 +38,10 @@
</div>
{% endif %}
<form id="openid_form" name="openid_form" class="openid" method="post" action="{% url user_signin %}">
- <div style="width:600px;float:left;margin-bottom:5px;">
+ <div><!-- style="width:600px;float:left;margin-bottom:5px;"> -->
{% trans "Click to sign in through any of these services." %}
</div>
- <ul class="providers">
+ <table>
{% comment %}
<li class="local" title="Local login">
<div class="logo_box local_login_box">
@@ -50,29 +50,32 @@
<span></span>
</li>
{% endcomment %}
- <li class="username" title="OpenID URL">
- <div class="logo_box openid_box">
- <img src="{% media "/media/jquery-openid/images/openid.gif" %}" alt="icon" />
- <span>http://<strong>username</strong></span>
- </div>
- </li>
- <li class="direct" title="Google">
- <div class="logo_box google_box">
- <img src="{% media "/media/jquery-openid/images/google.gif" %}" alt="icon" /><span>https://www.google.com/accounts/o8/id</span>
- </div>
- </li>
- <li class="direct" title="Yahoo">
- <div class="logo_box yahoo_box">
- <img src="{% media "/media/jquery-openid/images/yahoo.gif" %}" alt="icon" /><span>http://yahoo.com/</span>
- </div>
- </li>
- <li class="username" title="AOL screen name">
- <div class="logo_box aol_box">
- <img src="{% media "/media/jquery-openid/images/aol.gif" %}" alt="icon" /><span>http://openid.aol.com/<strong>username</strong></span>
- </div>
- </li>
- </ul>
- <ul id="openid_small_providers" class="providers">
+ <tr class="providers">
+ <td class="username" title="OpenID URL">
+ <div class="logo_box openid_box">
+ <img src="{% media "/media/jquery-openid/images/openid.gif" %}" alt="icon" />
+ <span>http://<strong>username</strong></span>
+ </div>
+ </td>
+ <td class="direct" title="Google">
+ <div class="logo_box google_box">
+ <img src="{% media "/media/jquery-openid/images/google.gif" %}" alt="icon" /><span>https://www.google.com/accounts/o8/id</span>
+ </div>
+ </td>
+ <td class="direct" title="Yahoo">
+ <div class="logo_box yahoo_box">
+ <img src="{% media "/media/jquery-openid/images/yahoo.gif" %}" alt="icon" /><span>http://yahoo.com/</span>
+ </div>
+ </td>
+ <td class="username" title="AOL screen name">
+ <div class="logo_box aol_box">
+ <img src="{% media "/media/jquery-openid/images/aol.gif" %}" alt="icon" /><span>http://openid.aol.com/<strong>username</strong></span>
+ </div>
+ </td>
+ </tr>
+ </table>
+ <table>
+ <tr id="openid_small_providers" class="providers">
<!--<li class="openid" title="OpenID">
<div class="logo_box openid_box">
<img src="/media/jquery-openid/images/openid.gif" alt="icon" />
@@ -98,43 +101,44 @@
<span>http://{your-openid-url}</span>
</li>
{% endcomment %}
- <li class="username first_tiny_li" title="MyOpenID user name">
+ <td class="username first_tiny_li" title="MyOpenID user name">
<img src="{% media "/media/jquery-openid/images/myopenid-2.png" %}" alt="icon" />
<span>http://<strong>username</strong>.myopenid.com/</span>
- </li>
- <li class="username" title="Flickr user name">
+ </td>
+ <td class="username" title="Flickr user name">
<img src="{% media "/media/jquery-openid/images/flickr.png" %}" alt="icon" />
<span>http://flickr.com/<strong>username</strong>/</span>
- </li>
- <li class="username" title="Technorati user name">
+ </td>
+ <td class="username" title="Technorati user name">
<img src="{% media "/media/jquery-openid/images/technorati-1.png" %}" alt="icon" />
<span>http://technorati.com/people/technorati/<strong>username</strong>/</span>
- </li>
- <li class="username" title="Wordpress blog name">
+ </td>
+ <td class="username" title="Wordpress blog name">
<img src="{% media "/media/jquery-openid/images/wordpress.png" %}" alt="icon" />
<span>http://<strong>username</strong>.wordpress.com</span>
- </li>
- <li class="username" title="Blogger blog name">
+ </td>
+ <td class="username" title="Blogger blog name">
<img src="{% media "/media/jquery-openid/images/blogger-1.png" %}" alt="icon" />
<span>http://<strong>username</strong>.blogspot.com/</span>
- </li>
- <li class="username" title="LiveJournal blog name">
+ </td>
+ <td class="username" title="LiveJournal blog name">
<img src="{% media "/media/jquery-openid/images/livejournal-1.png" %}" alt="icon" />
<span>http://<strong>username</strong>.livejournal.com</span>
- </li>
- <li class="username" title="ClaimID user name">
+ </td>
+ <td class="username" title="ClaimID user name">
<img src="{% media "/media/jquery-openid/images/claimid-0.png" %}" alt="icon" />
<span>http://claimid.com/<strong>username</strong></span>
- </li>
- <li class="username" title="Vidoop user name">
+ </td>
+ <td class="username" title="Vidoop user name">
<img src="{% media "/media/jquery-openid/images/vidoop.png" %}" alt="icon" />
<span>http://<strong>username</strong>.myvidoop.com/</span>
- </li>
- <li class="username" title="Verisign user name">
+ </td>
+ <td class="username" title="Verisign user name">
<img src="{% media "/media/jquery-openid/images/verisign-2.png" %}" alt="icon" />
<span>http://<strong>username</strong>.pip.verisignlabs.com/</span>
- </li>
- </ul>
+ </td>
+ </tr>
+ </table>
{{ form2.next }}
<fieldset>
<p id="provider_name_slot">{% trans 'Enter your <span id="enter_your_what">Provider user name</span>' %}</p>
diff --git a/forum/views/auth.py b/forum/views/auth.py
deleted file mode 100644
index 648bda80..00000000
--- a/forum/views/auth.py
+++ /dev/null
@@ -1,359 +0,0 @@
-from django.shortcuts import render_to_response, get_object_or_404
-from django.template import RequestContext
-from django.core.urlresolvers import reverse
-from django.contrib.auth.models import User
-from django.http import HttpResponseRedirect, Http404
-from django.utils.safestring import mark_safe
-from django.utils.translation import ugettext as _
-from django.utils.http import urlquote_plus
-from django.contrib.auth.decorators import login_required
-from django.contrib.auth import login, logout
-from django.http import get_host
-import types
-import datetime
-
-from forum.models import AuthKeyUserAssociation, ValidationHash
-from forum.authentication.forms import SimpleRegistrationForm, SimpleEmailSubscribeForm, \
- TemporaryLoginRequestForm, ChangePasswordForm, SetPasswordForm
-from forum.utils.email import send_email
-
-from forum.authentication.base import InvalidAuthentication
-from forum.authentication import AUTH_PROVIDERS
-
-from forum.models import Question, Answer
-
-def signin_page(request, action=None):
- if action is None:
- request.session['on_signin_url'] = request.META.get('HTTP_REFERER', '/')
- else:
- request.session['on_signin_action'] = action
- request.session['on_signin_url'] = reverse('auth_action_signin', kwargs={'action': action})
-
- all_providers = [provider.context for provider in AUTH_PROVIDERS.values()]
-
- sort = lambda c1, c2: c1.weight - c2.weight
- can_show = lambda c: not request.user.is_authenticated() or c.show_to_logged_in_user
-
- bigicon_providers = sorted([
- context for context in all_providers if context.mode == 'BIGICON' and can_show(context)
- ], sort)
-
- smallicon_providers = sorted([
- context for context in all_providers if context.mode == 'SMALLICON' and can_show(context)
- ], sort)
-
- stackitem_providers = sorted([
- context for context in all_providers if context.mode == 'STACK_ITEM' and can_show(context)
- ], sort)
-
- try:
- msg = request.session['auth_error']
- del request.session['auth_error']
- except:
- msg = None
-
- return render_to_response(
- 'auth/signin.html',
- {
- 'msg': msg,
- 'all_providers': all_providers,
- 'bigicon_providers': bigicon_providers,
- 'stackitem_providers': stackitem_providers,
- 'smallicon_providers': smallicon_providers,
- },
- RequestContext(request))
-
-def prepare_provider_signin(request, provider):
- force_email_request = request.REQUEST.get('validate_email', 'yes') == 'yes'
- request.session['force_email_request'] = force_email_request
-
- if provider in AUTH_PROVIDERS:
- provider_class = AUTH_PROVIDERS[provider].consumer
-
- try:
- request_url = provider_class.prepare_authentication_request(request,
- reverse('auth_provider_done', kwargs={'provider': provider}))
-
- return HttpResponseRedirect(request_url)
- except NotImplementedError, e:
- return process_provider_signin(request, provider)
- except InvalidAuthentication, e:
- request.session['auth_error'] = e.message
-
- return HttpResponseRedirect(reverse('user_signin'))
-
-
-def process_provider_signin(request, provider):
- if provider in AUTH_PROVIDERS:
- provider_class = AUTH_PROVIDERS[provider].consumer
-
- try:
- assoc_key = provider_class.process_authentication_request(request)
- except InvalidAuthentication, e:
- request.session['auth_error'] = e.message
- return HttpResponseRedirect(reverse('user_signin'))
-
- if request.user.is_authenticated():
- if isinstance(assoc_key, (type, User)):
- if request.user != assoc_key:
- request.session['auth_error'] = _("Sorry, these login credentials belong to anoother user. Plese terminate your current session and try again.")
- else:
- request.session['auth_error'] = _("You are already logged in with that user.")
- else:
- try:
- assoc = AuthKeyUserAssociation.objects.get(key=assoc_key)
- if assoc.user == request.user:
- request.session['auth_error'] = _("These login credentials are already associated with your account.")
- else:
- request.session['auth_error'] = _("Sorry, these login credentials belong to anoother user. Plese terminate your current session and try again.")
- except:
- uassoc = AuthKeyUserAssociation(user=request.user, key=assoc_key, provider=provider)
- uassoc.save()
- request.user.message_set.create(message=_('The new credentials are now associated with your account'))
- return HttpResponseRedirect(reverse('user_authsettings'))
-
- return HttpResponseRedirect(reverse('user_signin'))
- else:
- if isinstance(assoc_key, (type, User)):
- return login_and_forward(request, assoc_key)
-
- try:
- assoc = AuthKeyUserAssociation.objects.get(key=assoc_key)
- user_ = assoc.user
- return login_and_forward(request, user_)
- except:
- request.session['assoc_key'] = assoc_key
- request.session['auth_provider'] = provider
- return HttpResponseRedirect(reverse('auth_external_register'))
-
- return HttpResponseRedirect(reverse('user_signin'))
-
-def external_register(request):
- if request.method == 'POST' and 'bnewaccount' in request.POST:
- form1 = SimpleRegistrationForm(request.POST)
- email_feeds_form = SimpleEmailSubscribeForm(request.POST)
-
- if (form1.is_valid() and email_feeds_form.is_valid()):
- user_ = User(username=form1.cleaned_data['username'], email=form1.cleaned_data['email'])
- user_.email_isvalid = request.session.get('auth_validated_email', '') == form1.cleaned_data['email']
- user_.set_unusable_password()
-
- user_.save()
-
- if not user_.email_isvalid:
- send_validation_email(user_)
-
- try:
- assoc_key = request.session['assoc_key']
- auth_provider = request.session['auth_provider']
- except:
- request.session['auth_error'] = _("Oops, something went wrong in the middle of this process. Please try again.")
- return HttpResponseRedirect(request.session.get('on_signin_url', reverse('user_signin')))
-
- uassoc = AuthKeyUserAssociation(user=user_, key=request.session['assoc_key'], provider=request.session['auth_provider'])
- uassoc.save()
-
- email_feeds_form.save(user_)
-
- del request.session['assoc_key']
- del request.session['auth_provider']
-
- if user_.email_isvalid:
- return login_and_forward(request, user_)
- else:
- return HttpResponseRedirect(reverse('index'))
- else:
- provider_class = AUTH_PROVIDERS[request.session['auth_provider']].consumer
- user_data = provider_class.get_user_data(request.session['assoc_key'])
-
- username = user_data.get('username', '')
- email = user_data.get('email', '')
-
- if not email:
- email = request.session.get('auth_email_request', '')
-
- if email:
- request.session['auth_validated_email'] = email
-
- form1 = SimpleRegistrationForm(initial={
- 'next': '/',
- 'username': username,
- 'email': email,
- })
- email_feeds_form = SimpleEmailSubscribeForm()
-
- provider_context = AUTH_PROVIDERS[request.session['auth_provider']].context
-
- return render_to_response('auth/complete.html', {
- 'form1': form1,
- 'email_feeds_form': email_feeds_form,
- 'provider':mark_safe(provider_context.human_name),
- 'login_type':provider_context.id,
- 'gravatar_faq_url':reverse('faq') + '#gravatar',
- }, context_instance=RequestContext(request))
-
-def request_temp_login(request):
- if request.method == 'POST':
- form = TemporaryLoginRequestForm(request.POST)
-
- if form.is_valid():
- user = form.user_cache
-
- try:
- hash = get_object_or_404(ValidationHash, user=user, type='templogin')
- if hash.expiration < datetime.datetime.now():
- hash.delete()
- return request_temp_login(request)
- except:
- hash = ValidationHash.objects.create_new(user, 'templogin', [user.id])
-
- send_email(_("Temporary login link"), [user.email], "auth/temp_login_email.html", {
- 'temp_login_code': hash,
- 'user': user
- })
-
- request.user.message_set.create(message=_("An email has been sent with your temporary login key"))
-
- return HttpResponseRedirect(reverse('index'))
- else:
- form = TemporaryLoginRequestForm()
-
- return render_to_response(
- 'auth/temp_login_request.html', {'form': form},
- context_instance=RequestContext(request))
-
-def temp_signin(request, user, code):
- user = get_object_or_404(User, id=user)
-
- if (ValidationHash.objects.validate(code, user, 'templogin', [user.id])):
- return login_and_forward(request, user, reverse('user_authsettings'),
- _("You are logged in with a temporary access key, please take the time to fix your issue with authentication."))
- else:
- raise Http404()
-
-def send_validation_email(user):
- hash = ValidationHash.objects.create_new(user, 'email', [user.email])
- send_email(_("Email Validation"), [user.email], "auth/email_validation.html", {
- 'validation_code': hash,
- 'user': user
- })
-
-def validate_email(request, user, code):
- user = get_object_or_404(User, id=user)
-
- if (ValidationHash.objects.validate(code, user, 'email', [user.email])):
- user.email_isvalid = True
- user.save()
- return login_and_forward(request, user, None, _("Thank you, your email is now validated."))
- else:
- raise Http404()
-
-@login_required
-def auth_settings(request):
- """
- change password view.
-
- url : /changepw/
- template: authopenid/changepw.html
- """
- user_ = request.user
- auth_keys = user_.auth_keys.all()
-
- if user_.has_usable_password():
- FormClass = ChangePasswordForm
- else:
- FormClass = SetPasswordForm
-
- if request.POST:
- form = FormClass(request.POST, user=user_)
- if form.is_valid():
- if user_.has_usable_password():
- request.user.message_set.create(message=_("Your password was changed"))
- else:
- request.user.message_set.create(message=_("New password set"))
- form = ChangePasswordForm(user=user_)
-
- user_.set_password(form.cleaned_data['password1'])
- user_.save()
- return HttpResponseRedirect(reverse('user_authsettings'))
- else:
- form = FormClass(user=user_)
-
- auth_keys_list = []
-
- for k in auth_keys:
- provider = AUTH_PROVIDERS.get(k.provider, None)
-
- if provider is not None:
- name = "%s: %s" % (provider.context.human_name, provider.context.readable_key(k))
- else:
- from forum.authentication.base import ConsumerTemplateContext
- "unknown: %s" % ConsumerTemplateContext.readable_key(k)
-
- auth_keys_list.append({
- 'name': name,
- 'id': k.id
- })
-
- return render_to_response('auth/auth_settings.html', {
- 'form': form,
- 'has_password': user_.has_usable_password(),
- 'auth_keys': auth_keys_list,
- }, context_instance=RequestContext(request))
-
-def remove_external_provider(request, id):
- association = get_object_or_404(AuthKeyUserAssociation, id=id)
- request.user.message_set.create(message=_("You removed the association with %s") % association.provider)
- association.delete()
- return HttpResponseRedirect(reverse('user_authsettings'))
-
-def newquestion_signin_action(user):
- question = Question.objects.filter(author=user).order_by('-added_at')[0]
- return question.get_absolute_url()
-
-def newanswer_signin_action(user):
- answer = Answer.objects.filter(author=user).order_by('-added_at')[0]
- return answer.get_absolute_url()
-
-POST_SIGNIN_ACTIONS = {
- 'newquestion': newquestion_signin_action,
- 'newanswer': newanswer_signin_action,
-}
-
-def login_and_forward(request, user, forward=None, message=None):
- old_session = request.session.session_key
- user.backend = "django.contrib.auth.backends.ModelBackend"
- login(request, user)
-
- from forum.models import user_logged_in
- user_logged_in.send(user=user,session_key=old_session,sender=None)
-
- if not forward:
- signin_action = request.session.get('on_signin_action', None)
- if not signin_action:
- forward = request.session.get('on_signin_url', None)
-
- if not forward:
- forward = reverse('index')
- else:
- try:
- forward = POST_SIGNIN_ACTIONS[signin_action](user)
- except:
- forward = reverse('index')
-
- if message is None:
- message = _("Welcome back %s, you are now logged in") % user.username
-
- request.user.message_set.create(message=message)
- return HttpResponseRedirect(forward)
-
-@login_required
-def signout(request):
- """
- signout from the website. Remove openid from session and kill it.
-
- url : /signout/"
- """
-
- logout(request)
- return HttpResponseRedirect(reverse('index'))
diff --git a/forum_modules/facebookauth/__init__.py b/forum_modules/facebookauth/__init__.py
deleted file mode 100755
index e69de29b..00000000
--- a/forum_modules/facebookauth/__init__.py
+++ /dev/null
diff --git a/forum_modules/facebookauth/authentication.py b/forum_modules/facebookauth/authentication.py
deleted file mode 100755
index 512367a3..00000000
--- a/forum_modules/facebookauth/authentication.py
+++ /dev/null
@@ -1,85 +0,0 @@
-import hashlib
-from time import time
-from datetime import datetime
-from urllib import urlopen, urlencode
-from forum.authentication.base import AuthenticationConsumer, ConsumerTemplateContext, InvalidAuthentication
-from django.utils.translation import ugettext as _
-
-import settings
-
-try:
- from json import load as load_json
-except:
- from django.utils.simplejson import JSONDecoder
-
- def load_json(json):
- decoder = JSONDecoder()
- return decoder.decode(json.read())
-
-class FacebookAuthConsumer(AuthenticationConsumer):
-
- def process_authentication_request(self, request):
- API_KEY = settings.FB_API_KEY
-
- if API_KEY in request.COOKIES:
- if self.check_cookies_signature(request.COOKIES):
- if self.check_session_expiry(request.COOKIES):
- return request.COOKIES[API_KEY + '_user']
- else:
- raise InvalidAuthentication(_('Sorry, your Facebook session has expired, please try again'))
- else:
- raise InvalidAuthentication(_('The authentication with Facebook connect failed due to an invalid signature'))
- else:
- raise InvalidAuthentication(_('The authentication with Facebook connect failed, cannot find authentication tokens'))
-
- def generate_signature(self, values):
- keys = []
-
- for key in sorted(values.keys()):
- keys.append(key)
-
- signature = ''.join(['%s=%s' % (key, values[key]) for key in keys]) + settings.FB_APP_SECRET
- return hashlib.md5(signature).hexdigest()
-
- def check_session_expiry(self, cookies):
- return datetime.fromtimestamp(float(cookies[settings.FB_API_KEY+'_expires'])) > datetime.now()
-
- def check_cookies_signature(self, cookies):
- API_KEY = settings.FB_API_KEY
-
- values = {}
-
- for key in cookies.keys():
- if (key.startswith(API_KEY + '_')):
- values[key.replace(API_KEY + '_', '')] = cookies[key]
-
- return self.generate_signature(values) == cookies[API_KEY]
-
- def get_user_data(self, key):
- request_data = {
- 'method': 'Users.getInfo',
- 'api_key': settings.FB_API_KEY,
- 'call_id': time(),
- 'v': '1.0',
- 'uids': key,
- 'fields': 'name,first_name,last_name,email',
- 'format': 'json',
- }
-
- request_data['sig'] = self.generate_signature(request_data)
- fb_response = load_json(urlopen(settings.REST_SERVER, urlencode(request_data)))[0]
-
- return {
- 'username': fb_response['first_name'] + ' ' + fb_response['last_name'],
- 'email': fb_response['email']
- }
-
-class FacebookAuthContext(ConsumerTemplateContext):
- mode = 'BIGICON'
- type = 'CUSTOM'
- weight = 100
- human_name = 'Facebook'
- code_template = 'modules/facebookauth/button.html'
- extra_css = ["http://www.facebook.com/css/connect/connect_button.css"]
-
- API_KEY = settings.FB_API_KEY \ No newline at end of file
diff --git a/forum_modules/facebookauth/settings.py b/forum_modules/facebookauth/settings.py
deleted file mode 100755
index 67bf80c1..00000000
--- a/forum_modules/facebookauth/settings.py
+++ /dev/null
@@ -1,3 +0,0 @@
-REST_SERVER = 'http://api.facebook.com/restserver.php'
-FB_API_KEY = 'f773fab7be12aea689948208f37ad336'
-FB_APP_SECRET = '894547c1b8db54d77f919b1695ae879c' \ No newline at end of file
diff --git a/forum_modules/facebookauth/templates/button.html b/forum_modules/facebookauth/templates/button.html
deleted file mode 100755
index ceae1fc2..00000000
--- a/forum_modules/facebookauth/templates/button.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US" type="text/javascript"></script>
-<script type="text/javascript">
- var FB_API_KEY = "{{ provider.API_KEY }}";
- var FB_CHANNEL_PATH = "{% url xd_receiver %}";
-
- FB.init(FB_API_KEY, FB_CHANNEL_PATH, {permsToRequestOnConnect : "email"});
-
- function FB_ConnectPostAuthorization() {
- if ($('#validate_email').attr('checked')) {
- FB_RequireFeatures(["Api"], function(){
- var api = FB.Facebook.apiClient;
- var fb_uid = api.get_session().uid;
-
- $.post('{% url facebook_user_is_registered %}', {'fb_uid': fb_uid}, function(response) {
- if (response != "yes") {
- api.users_hasAppPermission("email", function(result) {
- if (!result) {
- FB.Connect.showPermissionDialog("email", redirect_to_done_page);
- } else {
- redirect_to_done_page()
- }
- })
- } else {
- redirect_to_done_page()
- }
- });
- });
- } else {
- redirect_to_done_page();
- }
- }
-
- function redirect_to_done_page() {
- window.location = "{% url auth_provider_done provider=provider.id %}";
- }
-
-</script>
-<fb:login-button v="2" size="medium" onlogin="FB_ConnectPostAuthorization()">Facebook</fb:login-button> \ No newline at end of file
diff --git a/forum_modules/facebookauth/templates/xd_receiver.html b/forum_modules/facebookauth/templates/xd_receiver.html
deleted file mode 100755
index 9c1664d2..00000000
--- a/forum_modules/facebookauth/templates/xd_receiver.html
+++ /dev/null
@@ -1 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <body> <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script> </body> </html>
diff --git a/forum_modules/facebookauth/urls.py b/forum_modules/facebookauth/urls.py
deleted file mode 100755
index cbe3b6c7..00000000
--- a/forum_modules/facebookauth/urls.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from django.conf.urls.defaults import *
-from django.views.generic.simple import direct_to_template
-
-from views import user_is_registered
-
-urlpatterns = patterns('',
- url(r'^xd_receiver.htm$', direct_to_template, {'template': 'modules/facebookauth/xd_receiver.html'}, name='xd_receiver'),
- url(r'^facebook/user_is_registered/', user_is_registered, name="facebook_user_is_registered"),
-) \ No newline at end of file
diff --git a/forum_modules/facebookauth/views.py b/forum_modules/facebookauth/views.py
deleted file mode 100755
index f77c6282..00000000
--- a/forum_modules/facebookauth/views.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from forum.models import AuthKeyUserAssociation
-from django.http import HttpResponse
-
-def user_is_registered(request):
- try:
- fb_uid = request.POST['fb_uid']
- #print fb_uid
- AuthKeyUserAssociation.objects.get(key=fb_uid)
- return HttpResponse('yes')
- except:
- return HttpResponse('no') \ No newline at end of file
diff --git a/forum_modules/localauth/__init__.py b/forum_modules/localauth/__init__.py
deleted file mode 100755
index e69de29b..00000000
--- a/forum_modules/localauth/__init__.py
+++ /dev/null
diff --git a/forum_modules/localauth/authentication.py b/forum_modules/localauth/authentication.py
deleted file mode 100755
index 770ea08f..00000000
--- a/forum_modules/localauth/authentication.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from forum.authentication.base import AuthenticationConsumer, ConsumerTemplateContext, InvalidAuthentication
-from forms import ClassicLoginForm
-
-class LocalAuthConsumer(AuthenticationConsumer):
- def process_authentication_request(self, request):
- form_auth = ClassicLoginForm(request.POST)
-
- if form_auth.is_valid():
- return form_auth.get_user()
- else:
- raise InvalidAuthentication(" ".join(form_auth.errors.values()[0]))
-
-class LocalAuthContext(ConsumerTemplateContext):
- mode = 'STACK_ITEM'
- weight = 1000
- human_name = 'Local authentication'
- stack_item_template = 'modules/localauth/loginform.html'
- show_to_logged_in_user = False \ No newline at end of file
diff --git a/forum_modules/localauth/forms.py b/forum_modules/localauth/forms.py
deleted file mode 100755
index 8afa2b05..00000000
--- a/forum_modules/localauth/forms.py
+++ /dev/null
@@ -1,77 +0,0 @@
-from forum.utils.forms import NextUrlField, UserNameField, UserEmailField, SetPasswordForm
-from forum.models import EmailFeedSetting, Question
-from django.contrib.contenttypes.models import ContentType
-from django.utils.translation import ugettext as _
-from django.contrib.auth import authenticate
-from django import forms
-import logging
-
-class ClassicRegisterForm(SetPasswordForm):
- """ legacy registration form """
-
- next = NextUrlField()
- username = UserNameField()
- email = UserEmailField()
- #fields password1 and password2 are inherited
- #recaptcha = ReCaptchaField()
-
-class ClassicLoginForm(forms.Form):
- """ legacy account signin form """
- next = NextUrlField()
- username = UserNameField(required=False,skip_clean=True)
- password = forms.CharField(max_length=128,
- widget=forms.widgets.PasswordInput(attrs={'class':'required login'}),
- required=False)
-
- def __init__(self, data=None, files=None, auto_id='id_%s',
- prefix=None, initial=None):
- super(ClassicLoginForm, self).__init__(data, files, auto_id,
- prefix, initial)
- self.user_cache = None
-
- def _clean_nonempty_field(self,field):
- value = None
- if field in self.cleaned_data:
- value = str(self.cleaned_data[field]).strip()
- if value == '':
- value = None
- self.cleaned_data[field] = value
- return value
-
- def clean_username(self):
- return self._clean_nonempty_field('username')
-
- def clean_password(self):
- return self._clean_nonempty_field('password')
-
- def clean(self):
- error_list = []
- username = self.cleaned_data['username']
- password = self.cleaned_data['password']
-
- self.user_cache = None
- if username and password:
- self.user_cache = authenticate(username=username, password=password)
-
- if self.user_cache is None:
- del self.cleaned_data['username']
- del self.cleaned_data['password']
- error_list.insert(0,(_("Please enter valid username and password "
- "(both are case-sensitive).")))
- elif self.user_cache.is_active == False:
- error_list.append(_("This account is inactive."))
- if len(error_list) > 0:
- error_list.insert(0,_('Login failed.'))
- elif password == None and username == None:
- error_list.append(_('Please enter username and password'))
- elif password == None:
- error_list.append(_('Please enter your password'))
- elif username == None:
- error_list.append(_('Please enter user name'))
- if len(error_list) > 0:
- self._errors['__all__'] = forms.util.ErrorList(error_list)
- return self.cleaned_data
-
- def get_user(self):
- """ get authenticated user """
- return self.user_cache \ No newline at end of file
diff --git a/forum_modules/localauth/templates/loginform.html b/forum_modules/localauth/templates/loginform.html
deleted file mode 100755
index b1784fb6..00000000
--- a/forum_modules/localauth/templates/loginform.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{% load i18n %}
-
-<fieldset id='local_login_fs'>
- <p><span class='big strong'>Enter your local user name and password</span><br/><span class='grey'>(or select your external provider above)</span></p>
- <table>
- <tr>
- <td>
- <label for="id_username">Login name</label>
- </td>
- <td>
- <input id="id_username" type="text" class="required login" name="username" maxlength="30" />
- </td>
- </tr>
- <tr>
- <td>
- <label for="id_password">Password</label>
- </td>
- <td>
- <input id="id_password" type="password" class="required login" name="password" maxlength="128" />
- </td>
- </tr>
- <tr>
- <td>
- <input id="blogin" name="blogin" type="submit" value="Login" />
- </td>
- <td>
- <a href="{% url auth_local_register %}">Create account</a><span>&nbsp;|&nbsp;</span><a href="{% url auth_request_tempsignin %}">Forgot your password?</a>
- </td>
- </tr>
- </table>
-</fieldset> \ No newline at end of file
diff --git a/forum_modules/localauth/urls.py b/forum_modules/localauth/urls.py
deleted file mode 100755
index aeebc40a..00000000
--- a/forum_modules/localauth/urls.py
+++ /dev/null
@@ -1,8 +0,0 @@
-from django.conf.urls.defaults import *
-from django.views.generic.simple import direct_to_template
-from django.utils.translation import ugettext as _
-import views as app
-
-urlpatterns = patterns('',
- url(r'^%s%s%s$' % (_('account/'), _('local/'), _('register/')), app.register, name='auth_local_register'),
-) \ No newline at end of file
diff --git a/forum_modules/localauth/views.py b/forum_modules/localauth/views.py
deleted file mode 100755
index db71e902..00000000
--- a/forum_modules/localauth/views.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from django.contrib.auth.models import User
-from django.shortcuts import render_to_response
-from django.template import RequestContext
-from django.utils.translation import ugettext as _
-
-from forms import ClassicRegisterForm
-from forum.authentication.forms import SimpleEmailSubscribeForm
-from forum.views.auth import login_and_forward, send_validation_email
-
-def register(request):
- if request.method == 'POST':
- form = ClassicRegisterForm(request.POST)
- email_feeds_form = SimpleEmailSubscribeForm(request.POST)
-
- if form.is_valid() and email_feeds_form.is_valid():
- username = form.cleaned_data['username']
- password = form.cleaned_data['password1']
- email = form.cleaned_data['email']
-
- user_ = User.objects.create_user( username,email,password )
- send_validation_email(user_)
- email_feeds_form.save(user_)
- return login_and_forward(request, user_, None, _("A validation email has been sent to your email address. "))
- else:
- form = ClassicRegisterForm(initial={'next':'/'})
- email_feeds_form = SimpleEmailSubscribeForm()
-
- return render_to_response('auth/signup.html', {
- 'form': form,
- 'email_feeds_form': email_feeds_form
- }, context_instance=RequestContext(request)) \ No newline at end of file
diff --git a/forum_modules/oauthauth/__init__.py b/forum_modules/oauthauth/__init__.py
deleted file mode 100755
index e69de29b..00000000
--- a/forum_modules/oauthauth/__init__.py
+++ /dev/null
diff --git a/forum_modules/oauthauth/authentication.py b/forum_modules/oauthauth/authentication.py
deleted file mode 100755
index 04145461..00000000
--- a/forum_modules/oauthauth/authentication.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from consumer import OAuthAbstractAuthConsumer
-from forum.authentication.base import ConsumerTemplateContext
-
-try:
- import json as simplejson
-except ImportError:
- from django.utils import simplejson
-
-from lib import oauth
-import settings
-
-class TwitterAuthConsumer(OAuthAbstractAuthConsumer):
- def __init__(self):
- OAuthAbstractAuthConsumer.__init__(self,
- settings.TWITTER_CONSUMER_KEY,
- settings.TWITTER_CONSUMER_SECRET,
- "twitter.com",
- "https://twitter.com/oauth/request_token",
- "https://twitter.com/oauth/access_token",
- "https://twitter.com/oauth/authorize",
- )
-
- def get_user_data(self, key):
- json = self.fetch_data(key, "https://twitter.com/account/verify_credentials.json")
-
- if 'screen_name' in json:
- creds = simplejson.loads(json)
-
- return {
- 'username': creds['screen_name']
- }
-
-
- return {}
-
-class TwitterAuthContext(ConsumerTemplateContext):
- mode = 'BIGICON'
- type = 'DIRECT'
- weight = 150
- human_name = 'Twitter'
- icon = '/media/images/openid/twitter.png' \ No newline at end of file
diff --git a/forum_modules/oauthauth/consumer.py b/forum_modules/oauthauth/consumer.py
deleted file mode 100755
index 74734145..00000000
--- a/forum_modules/oauthauth/consumer.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import urllib
-import urllib2
-import httplib
-import time
-
-from forum.authentication.base import AuthenticationConsumer, InvalidAuthentication
-from django.utils.translation import ugettext as _
-
-from lib import oauth
-
-class OAuthAbstractAuthConsumer(AuthenticationConsumer):
-
- def __init__(self, consumer_key, consumer_secret, server_url, request_token_url, access_token_url, authorization_url):
- self.consumer_secret = consumer_secret
- self.consumer_key = consumer_key
-
- self.consumer = oauth.OAuthConsumer(consumer_key, consumer_secret)
- self.signature_method = oauth.OAuthSignatureMethod_HMAC_SHA1()
-
- self.server_url = server_url
- self.request_token_url = request_token_url
- self.access_token_url = access_token_url
- self.authorization_url = authorization_url
-
- def prepare_authentication_request(self, request, redirect_to):
- request_token = self.fetch_request_token()
- request.session['unauthed_token'] = request_token.to_string()
- return self.authorize_token_url(request_token)
-
- def process_authentication_request(self, request):
- unauthed_token = request.session.get('unauthed_token', None)
- if not unauthed_token:
- raise InvalidAuthentication(_('Error, the oauth token is not on the server'))
-
- token = oauth.OAuthToken.from_string(unauthed_token)
-
- if token.key != request.GET.get('oauth_token', 'no-token'):
- raise InvalidAuthentication(_("Something went wrong! Auth tokens do not match"))
-
- access_token = self.fetch_access_token(token)
-
- return access_token.to_string()
-
- def get_user_data(self, key):
- #token = oauth.OAuthToken.from_string(access_token)
- return {}
-
- def fetch_request_token(self):
- oauth_request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, http_url=self.request_token_url)
- oauth_request.sign_request(self.signature_method, self.consumer, None)
- params = oauth_request.parameters
- data = urllib.urlencode(params)
- full_url='%s?%s'%(self.request_token_url, data)
- response = urllib2.urlopen(full_url)
- return oauth.OAuthToken.from_string(response.read())
-
- def authorize_token_url(self, token, callback_url=None):
- oauth_request = oauth.OAuthRequest.from_token_and_callback(token=token,\
- callback=callback_url, http_url=self.authorization_url)
- params = oauth_request.parameters
- data = urllib.urlencode(params)
- full_url='%s?%s'%(self.authorization_url, data)
- return full_url
-
- def fetch_access_token(self, token):
- oauth_request = oauth.OAuthRequest.from_consumer_and_token(self.consumer, token=token, http_url=self.access_token_url)
- oauth_request.sign_request(self.signature_method, self.consumer, token)
- params = oauth_request.parameters
- data = urllib.urlencode(params)
- full_url='%s?%s'%(self.access_token_url, data)
- response = urllib2.urlopen(full_url)
- return oauth.OAuthToken.from_string(response.read())
-
- def fetch_data(self, token, http_url, parameters=None):
- access_token = oauth.OAuthToken.from_string(token)
- oauth_request = oauth.OAuthRequest.from_consumer_and_token(
- self.consumer, token=access_token, http_method="GET",
- http_url=http_url, parameters=parameters,
- )
- oauth_request.sign_request(self.signature_method, self.consumer, access_token)
-
- url = oauth_request.to_url()
- connection = httplib.HTTPSConnection(self.server_url)
- connection.request(oauth_request.http_method, url)
-
- return connection.getresponse().read()
-
diff --git a/forum_modules/oauthauth/lib/__init__.py b/forum_modules/oauthauth/lib/__init__.py
deleted file mode 100755
index e69de29b..00000000
--- a/forum_modules/oauthauth/lib/__init__.py
+++ /dev/null
diff --git a/forum_modules/oauthauth/lib/oauth.py b/forum_modules/oauthauth/lib/oauth.py
deleted file mode 100755
index 89abf858..00000000
--- a/forum_modules/oauthauth/lib/oauth.py
+++ /dev/null
@@ -1,594 +0,0 @@
-"""
-The MIT License
-
-Copyright (c) 2007 Leah Culver
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-"""
-
-import cgi
-import urllib
-import time
-import random
-import urlparse
-import hmac
-import binascii
-
-
-VERSION = '1.0' # Hi Blaine!
-HTTP_METHOD = 'GET'
-SIGNATURE_METHOD = 'PLAINTEXT'
-
-
-class OAuthError(RuntimeError):
- """Generic exception class."""
- def __init__(self, message='OAuth error occured.'):
- self.message = message
-
-def build_authenticate_header(realm=''):
- """Optional WWW-Authenticate header (401 error)"""
- return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
-
-def escape(s):
- """Escape a URL including any /."""
- return urllib.quote(s, safe='~')
-
-def _utf8_str(s):
- """Convert unicode to utf-8."""
- if isinstance(s, unicode):
- return s.encode("utf-8")
- else:
- return str(s)
-
-def generate_timestamp():
- """Get seconds since epoch (UTC)."""
- return int(time.time())
-
-def generate_nonce(length=8):
- """Generate pseudorandom number."""
- return ''.join([str(random.randint(0, 9)) for i in range(length)])
-
-
-class OAuthConsumer(object):
- """Consumer of OAuth authentication.
-
- OAuthConsumer is a data type that represents the identity of the Consumer
- via its shared secret with the Service Provider.
-
- """
- key = None
- secret = None
-
- def __init__(self, key, secret):
- self.key = key
- self.secret = secret
-
-
-class OAuthToken(object):
- """OAuthToken is a data type that represents an End User via either an access
- or request token.
-
- key -- the token
- secret -- the token secret
-
- """
- key = None
- secret = None
-
- def __init__(self, key, secret):
- self.key = key
- self.secret = secret
-
- def to_string(self):
- return urllib.urlencode({'oauth_token': self.key,
- 'oauth_token_secret': self.secret})
-
- def from_string(s):
- """ Returns a token from something like:
- oauth_token_secret=xxx&oauth_token=xxx
- """
- params = cgi.parse_qs(s, keep_blank_values=False)
- key = params['oauth_token'][0]
- secret = params['oauth_token_secret'][0]
- return OAuthToken(key, secret)
- from_string = staticmethod(from_string)
-
- def __str__(self):
- return self.to_string()
-
-
-class OAuthRequest(object):
- """OAuthRequest represents the request and can be serialized.
-
- OAuth parameters:
- - oauth_consumer_key
- - oauth_token
- - oauth_signature_method
- - oauth_signature
- - oauth_timestamp
- - oauth_nonce
- - oauth_version
- ... any additional parameters, as defined by the Service Provider.
- """
- parameters = None # OAuth parameters.
- http_method = HTTP_METHOD
- http_url = None
- version = VERSION
-
- def __init__(self, http_method=HTTP_METHOD, http_url=None, parameters=None):
- self.http_method = http_method
- self.http_url = http_url
- self.parameters = parameters or {}
-
- def set_parameter(self, parameter, value):
- self.parameters[parameter] = value
-
- def get_parameter(self, parameter):
- try:
- return self.parameters[parameter]
- except:
- raise OAuthError('Parameter not found: %s' % parameter)
-
- def _get_timestamp_nonce(self):
- return self.get_parameter('oauth_timestamp'), self.get_parameter(
- 'oauth_nonce')
-
- def get_nonoauth_parameters(self):
- """Get any non-OAuth parameters."""
- parameters = {}
- for k, v in self.parameters.iteritems():
- # Ignore oauth parameters.
- if k.find('oauth_') < 0:
- parameters[k] = v
- return parameters
-
- def to_header(self, realm=''):
- """Serialize as a header for an HTTPAuth request."""
- auth_header = 'OAuth realm="%s"' % realm
- # Add the oauth parameters.
- if self.parameters:
- for k, v in self.parameters.iteritems():
- if k[:6] == 'oauth_':
- auth_header += ', %s="%s"' % (k, escape(str(v)))
- return {'Authorization': auth_header}
-
- def to_postdata(self):
- """Serialize as post data for a POST request."""
- return '&'.join(['%s=%s' % (escape(str(k)), escape(str(v))) \
- for k, v in self.parameters.iteritems()])
-
- def to_url(self):
- """Serialize as a URL for a GET request."""
- return '%s?%s' % (self.get_normalized_http_url(), self.to_postdata())
-
- def get_normalized_parameters(self):
- """Return a string that contains the parameters that must be signed."""
- params = self.parameters
- try:
- # Exclude the signature if it exists.
- del params['oauth_signature']
- except:
- pass
- # Escape key values before sorting.
- key_values = [(escape(_utf8_str(k)), escape(_utf8_str(v))) \
- for k,v in params.items()]
- # Sort lexicographically, first after key, then after value.
- key_values.sort()
- # Combine key value pairs into a string.
- return '&'.join(['%s=%s' % (k, v) for k, v in key_values])
-
- def get_normalized_http_method(self):
- """Uppercases the http method."""
- return self.http_method.upper()
-
- def get_normalized_http_url(self):
- """Parses the URL and rebuilds it to be scheme://host/path."""
- parts = urlparse.urlparse(self.http_url)
- scheme, netloc, path = parts[:3]
- # Exclude default port numbers.
- if scheme == 'http' and netloc[-3:] == ':80':
- netloc = netloc[:-3]
- elif scheme == 'https' and netloc[-4:] == ':443':
- netloc = netloc[:-4]
- return '%s://%s%s' % (scheme, netloc, path)
-
- def sign_request(self, signature_method, consumer, token):
- """Set the signature parameter to the result of build_signature."""
- # Set the signature method.
- self.set_parameter('oauth_signature_method',
- signature_method.get_name())
- # Set the signature.
- self.set_parameter('oauth_signature',
- self.build_signature(signature_method, consumer, token))
-
- def build_signature(self, signature_method, consumer, token):
- """Calls the build signature method within the signature method."""
- return signature_method.build_signature(self, consumer, token)
-
- def from_request(http_method, http_url, headers=None, parameters=None,
- query_string=None):
- """Combines multiple parameter sources."""
- if parameters is None:
- parameters = {}
-
- # Headers
- if headers and 'Authorization' in headers:
- auth_header = headers['Authorization']
- # Check that the authorization header is OAuth.
- if auth_header.index('OAuth') > -1:
- auth_header = auth_header.lstrip('OAuth ')
- try:
- # Get the parameters from the header.
- header_params = OAuthRequest._split_header(auth_header)
- parameters.update(header_params)
- except:
- raise OAuthError('Unable to parse OAuth parameters from '
- 'Authorization header.')
-
- # GET or POST query string.
- if query_string:
- query_params = OAuthRequest._split_url_string(query_string)
- parameters.update(query_params)
-
- # URL parameters.
- param_str = urlparse.urlparse(http_url)[4] # query
- url_params = OAuthRequest._split_url_string(param_str)
- parameters.update(url_params)
-
- if parameters:
- return OAuthRequest(http_method, http_url, parameters)
-
- return None
- from_request = staticmethod(from_request)
-
- def from_consumer_and_token(oauth_consumer, token=None,
- http_method=HTTP_METHOD, http_url=None, parameters=None):
- if not parameters:
- parameters = {}
-
- defaults = {
- 'oauth_consumer_key': oauth_consumer.key,
- 'oauth_timestamp': generate_timestamp(),
- 'oauth_nonce': generate_nonce(),
- 'oauth_version': OAuthRequest.version,
- }
-
- defaults.update(parameters)
- parameters = defaults
-
- if token:
- parameters['oauth_token'] = token.key
-
- return OAuthRequest(http_method, http_url, parameters)
- from_consumer_and_token = staticmethod(from_consumer_and_token)
-
- def from_token_and_callback(token, callback=None, http_method=HTTP_METHOD,
- http_url=None, parameters=None):
- if not parameters:
- parameters = {}
-
- parameters['oauth_token'] = token.key
-
- if callback:
- parameters['oauth_callback'] = callback
-
- return OAuthRequest(http_method, http_url, parameters)
- from_token_and_callback = staticmethod(from_token_and_callback)
-
- def _split_header(header):
- """Turn Authorization: header into parameters."""
- params = {}
- parts = header.split(',')
- for param in parts:
- # Ignore realm parameter.
- if param.find('realm') > -1:
- continue
- # Remove whitespace.
- param = param.strip()
- # Split key-value.
- param_parts = param.split('=', 1)
- # Remove quotes and unescape the value.
- params[param_parts[0]] = urllib.unquote(param_parts[1].strip('\"'))
- return params
- _split_header = staticmethod(_split_header)
-
- def _split_url_string(param_str):
- """Turn URL string into parameters."""
- parameters = cgi.parse_qs(param_str, keep_blank_values=False)
- for k, v in parameters.iteritems():
- parameters[k] = urllib.unquote(v[0])
- return parameters
- _split_url_string = staticmethod(_split_url_string)
-
-class OAuthServer(object):
- """A worker to check the validity of a request against a data store."""
- timestamp_threshold = 300 # In seconds, five minutes.
- version = VERSION
- signature_methods = None
- data_store = None
-
- def __init__(self, data_store=None, signature_methods=None):
- self.data_store = data_store
- self.signature_methods = signature_methods or {}
-
- def set_data_store(self, data_store):
- self.data_store = data_store
-
- def get_data_store(self):
- return self.data_store
-
- def add_signature_method(self, signature_method):
- self.signature_methods[signature_method.get_name()] = signature_method
- return self.signature_methods
-
- def fetch_request_token(self, oauth_request):
- """Processes a request_token request and returns the
- request token on success.
- """
- try:
- # Get the request token for authorization.
- token = self._get_token(oauth_request, 'request')
- except OAuthError:
- # No token required for the initial token request.
- version = self._get_version(oauth_request)
- consumer = self._get_consumer(oauth_request)
- self._check_signature(oauth_request, consumer, None)
- # Fetch a new token.
- token = self.data_store.fetch_request_token(consumer)
- return token
-
- def fetch_access_token(self, oauth_request):
- """Processes an access_token request and returns the
- access token on success.
- """
- version = self._get_version(oauth_request)
- consumer = self._get_consumer(oauth_request)
- # Get the request token.
- token = self._get_token(oauth_request, 'request')
- self._check_signature(oauth_request, consumer, token)
- new_token = self.data_store.fetch_access_token(consumer, token)
- return new_token
-
- def verify_request(self, oauth_request):
- """Verifies an api call and checks all the parameters."""
- # -> consumer and token
- version = self._get_version(oauth_request)
- consumer = self._get_consumer(oauth_request)
- # Get the access token.
- token = self._get_token(oauth_request, 'access')
- self._check_signature(oauth_request, consumer, token)
- parameters = oauth_request.get_nonoauth_parameters()
- return consumer, token, parameters
-
- def authorize_token(self, token, user):
- """Authorize a request token."""
- return self.data_store.authorize_request_token(token, user)
-
- def get_callback(self, oauth_request):
- """Get the callback URL."""
- return oauth_request.get_parameter('oauth_callback')
-
- def build_authenticate_header(self, realm=''):
- """Optional support for the authenticate header."""
- return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
-
- def _get_version(self, oauth_request):
- """Verify the correct version request for this server."""
- try:
- version = oauth_request.get_parameter('oauth_version')
- except:
- version = VERSION
- if version and version != self.version:
- raise OAuthError('OAuth version %s not supported.' % str(version))
- return version
-
- def _get_signature_method(self, oauth_request):
- """Figure out the signature with some defaults."""
- try:
- signature_method = oauth_request.get_parameter(
- 'oauth_signature_method')
- except:
- signature_method = SIGNATURE_METHOD
- try:
- # Get the signature method object.
- signature_method = self.signature_methods[signature_method]
- except:
- signature_method_names = ', '.join(self.signature_methods.keys())
- raise OAuthError('Signature method %s not supported try one of the '
- 'following: %s' % (signature_method, signature_method_names))
-
- return signature_method
-
- def _get_consumer(self, oauth_request):
- consumer_key = oauth_request.get_parameter('oauth_consumer_key')
- consumer = self.data_store.lookup_consumer(consumer_key)
- if not consumer:
- raise OAuthError('Invalid consumer.')
- return consumer
-
- def _get_token(self, oauth_request, token_type='access'):
- """Try to find the token for the provided request token key."""
- token_field = oauth_request.get_parameter('oauth_token')
- token = self.data_store.lookup_token(token_type, token_field)
- if not token:
- raise OAuthError('Invalid %s token: %s' % (token_type, token_field))
- return token
-
- def _check_signature(self, oauth_request, consumer, token):
- timestamp, nonce = oauth_request._get_timestamp_nonce()
- self._check_timestamp(timestamp)
- self._check_nonce(consumer, token, nonce)
- signature_method = self._get_signature_method(oauth_request)
- try:
- signature = oauth_request.get_parameter('oauth_signature')
- except:
- raise OAuthError('Missing signature.')
- # Validate the signature.
- valid_sig = signature_method.check_signature(oauth_request, consumer,
- token, signature)
- if not valid_sig:
- key, base = signature_method.build_signature_base_string(
- oauth_request, consumer, token)
- raise OAuthError('Invalid signature. Expected signature base '
- 'string: %s' % base)
- built = signature_method.build_signature(oauth_request, consumer, token)
-
- def _check_timestamp(self, timestamp):
- """Verify that timestamp is recentish."""
- timestamp = int(timestamp)
- now = int(time.time())
- lapsed = now - timestamp
- if lapsed > self.timestamp_threshold:
- raise OAuthError('Expired timestamp: given %d and now %s has a '
- 'greater difference than threshold %d' %
- (timestamp, now, self.timestamp_threshold))
-
- def _check_nonce(self, consumer, token, nonce):
- """Verify that the nonce is uniqueish."""
- nonce = self.data_store.lookup_nonce(consumer, token, nonce)
- if nonce:
- raise OAuthError('Nonce already used: %s' % str(nonce))
-
-
-class OAuthClient(object):
- """OAuthClient is a worker to attempt to execute a request."""
- consumer = None
- token = None
-
- def __init__(self, oauth_consumer, oauth_token):
- self.consumer = oauth_consumer
- self.token = oauth_token
-
- def get_consumer(self):
- return self.consumer
-
- def get_token(self):
- return self.token
-
- def fetch_request_token(self, oauth_request):
- """-> OAuthToken."""
- raise NotImplementedError
-
- def fetch_access_token(self, oauth_request):
- """-> OAuthToken."""
- raise NotImplementedError
-
- def access_resource(self, oauth_request):
- """-> Some protected resource."""
- raise NotImplementedError
-
-
-class OAuthDataStore(object):
- """A database abstraction used to lookup consumers and tokens."""
-
- def lookup_consumer(self, key):
- """-> OAuthConsumer."""
- raise NotImplementedError
-
- def lookup_token(self, oauth_consumer, token_type, token_token):
- """-> OAuthToken."""
- raise NotImplementedError
-
- def lookup_nonce(self, oauth_consumer, oauth_token, nonce):
- """-> OAuthToken."""
- raise NotImplementedError
-
- def fetch_request_token(self, oauth_consumer):
- """-> OAuthToken."""
- raise NotImplementedError
-
- def fetch_access_token(self, oauth_consumer, oauth_token):
- """-> OAuthToken."""
- raise NotImplementedError
-
- def authorize_request_token(self, oauth_token, user):
- """-> OAuthToken."""
- raise NotImplementedError
-
-
-class OAuthSignatureMethod(object):
- """A strategy class that implements a signature method."""
- def get_name(self):
- """-> str."""
- raise NotImplementedError
-
- def build_signature_base_string(self, oauth_request, oauth_consumer, oauth_token):
- """-> str key, str raw."""
- raise NotImplementedError
-
- def build_signature(self, oauth_request, oauth_consumer, oauth_token):
- """-> str."""
- raise NotImplementedError
-
- def check_signature(self, oauth_request, consumer, token, signature):
- built = self.build_signature(oauth_request, consumer, token)
- return built == signature
-
-
-class OAuthSignatureMethod_HMAC_SHA1(OAuthSignatureMethod):
-
- def get_name(self):
- return 'HMAC-SHA1'
-
- def build_signature_base_string(self, oauth_request, consumer, token):
- sig = (
- escape(oauth_request.get_normalized_http_method()),
- escape(oauth_request.get_normalized_http_url()),
- escape(oauth_request.get_normalized_parameters()),
- )
-
- key = '%s&' % escape(consumer.secret)
- if token:
- key += escape(token.secret)
- raw = '&'.join(sig)
- return key, raw
-
- def build_signature(self, oauth_request, consumer, token):
- """Builds the base signature string."""
- key, raw = self.build_signature_base_string(oauth_request, consumer,
- token)
-
- # HMAC object.
- try:
- import hashlib # 2.5
- hashed = hmac.new(key, raw, hashlib.sha1)
- except:
- import sha # Deprecated
- hashed = hmac.new(key, raw, sha)
-
- # Calculate the digest base 64.
- return binascii.b2a_base64(hashed.digest())[:-1]
-
-
-class OAuthSignatureMethod_PLAINTEXT(OAuthSignatureMethod):
-
- def get_name(self):
- return 'PLAINTEXT'
-
- def build_signature_base_string(self, oauth_request, consumer, token):
- """Concatenates the consumer key and secret."""
- sig = '%s&' % escape(consumer.secret)
- if token:
- sig = sig + escape(token.secret)
- return sig, sig
-
- def build_signature(self, oauth_request, consumer, token):
- key, raw = self.build_signature_base_string(oauth_request, consumer,
- token)
- return key \ No newline at end of file
diff --git a/forum_modules/oauthauth/settings.py b/forum_modules/oauthauth/settings.py
deleted file mode 100755
index 67567b63..00000000
--- a/forum_modules/oauthauth/settings.py
+++ /dev/null
@@ -1,3 +0,0 @@
-TWITTER_CONSUMER_KEY = "sAAGwWILliIbgbrG37GztQ"
-TWITTER_CONSUMER_SECRET = "AZv0pHTZQaf4rxxZOrj3Jm1RKgmlV4MnYJAsrY7M0"
-
diff --git a/forum_modules/openidauth/__init__.py b/forum_modules/openidauth/__init__.py
deleted file mode 100755
index e69de29b..00000000
--- a/forum_modules/openidauth/__init__.py
+++ /dev/null
diff --git a/forum_modules/openidauth/authentication.py b/forum_modules/openidauth/authentication.py
deleted file mode 100755
index c04c44b9..00000000
--- a/forum_modules/openidauth/authentication.py
+++ /dev/null
@@ -1,196 +0,0 @@
-from consumer import OpenIdAbstractAuthConsumer
-from forum.authentication.base import ConsumerTemplateContext
-
-class GoogleAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- return 'https://www.google.com/accounts/o8/id'
-
-class GoogleAuthContext(ConsumerTemplateContext):
- mode = 'BIGICON'
- type = 'DIRECT'
- weight = 200
- human_name = 'Google'
- icon = '/media/images/openid/google.gif'
-
-
-
-class YahooAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- return 'http://yahoo.com/'
-
-class YahooAuthContext(ConsumerTemplateContext):
- mode = 'BIGICON'
- type = 'DIRECT'
- weight = 300
- human_name = 'Yahoo'
- icon = '/media/images/openid/yahoo.gif'
-
-
-
-class AolAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- uname = request.POST['input_field']
- return 'http://openid.aol.com/' + uname
-
-class AolAuthContext(ConsumerTemplateContext):
- mode = 'BIGICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'AOL screen name'
- }
- weight = 400
- human_name = 'AOL'
- icon = '/media/images/openid/aol.gif'
-
-
-class MyOpenIdAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://%s.myopenid.com/" % blog_name
-
-class MyOpenIdAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'MyOpenID user name'
- }
- weight = 200
- human_name = 'MyOpenID'
- icon = '/media/images/openid/myopenid.ico'
-
-
-class FlickrAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://flickr.com/%s/" % blog_name
-
-class FlickrAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'Flickr user name'
- }
- weight = 250
- human_name = 'Flickr'
- icon = '/media/images/openid/flickr.ico'
-
-
-class TechnoratiAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://technorati.com/people/technorati/%s/" % blog_name
-
-class TechnoratiAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'Technorati user name'
- }
- weight = 260
- human_name = 'Technorati'
- icon = '/media/images/openid/technorati.ico'
-
-
-class WordpressAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://%s.wordpress.com/" % blog_name
-
-class WordpressAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'Wordpress blog name'
- }
- weight = 270
- human_name = 'Wordpress'
- icon = '/media/images/openid/wordpress.ico'
-
-
-class BloggerAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://%s.blogspot.com/" % blog_name
-
-class BloggerAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'Blogger blog name'
- }
- weight = 300
- human_name = 'Blogger'
- icon = '/media/images/openid/blogger.ico'
-
-
-class LiveJournalAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://%s.livejournal.com/" % blog_name
-
-class LiveJournalAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'LiveJournal blog name'
- }
- weight = 310
- human_name = 'LiveJournal'
- icon = '/media/images/openid/livejournal.ico'
-
-
-class ClaimIdAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://claimid.com/%s" % blog_name
-
-class ClaimIdAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'ClaimID user name'
- }
- weight = 320
- human_name = 'ClaimID'
- icon = '/media/images/openid/claimid.ico'
-
-class VidoopAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://%s.myvidoop.com/" % blog_name
-
-class VidoopAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'Vidoop user name'
- }
- weight = 330
- human_name = 'Vidoop'
- icon = '/media/images/openid/vidoop.ico'
-
-class VerisignAuthConsumer(OpenIdAbstractAuthConsumer):
- def get_user_url(self, request):
- blog_name = request.POST['input_field']
- return "http://%s.pip.verisignlabs.com/" % blog_name
-
-class VerisignAuthContext(ConsumerTemplateContext):
- mode = 'SMALLICON'
- type = 'SIMPLE_FORM'
- simple_form_context = {
- 'your_what': 'Verisign user name'
- }
- weight = 340
- human_name = 'Verisign'
- icon = '/media/images/openid/verisign.ico'
-
-
-class OpenIdUrlAuthConsumer(OpenIdAbstractAuthConsumer):
- pass
-
-class OpenIdUrlAuthContext(ConsumerTemplateContext):
- mode = 'STACK_ITEM'
- weight = 300
- human_name = 'OpenId url'
- stack_item_template = 'modules/openidauth/openidurl.html'
- icon = '/media/images/openid/openid-inputicon.gif' \ No newline at end of file
diff --git a/forum_modules/openidauth/consumer.py b/forum_modules/openidauth/consumer.py
deleted file mode 100755
index 68035968..00000000
--- a/forum_modules/openidauth/consumer.py
+++ /dev/null
@@ -1,112 +0,0 @@
-from django.utils.html import escape
-from django.http import get_host
-
-from forum.authentication.base import AuthenticationConsumer, InvalidAuthentication
-import settings
-
-from openid.yadis import xri
-from openid.consumer.consumer import Consumer, SUCCESS, CANCEL, FAILURE, SETUP_NEEDED
-from openid.consumer.discover import DiscoveryFailure
-from openid.extensions.sreg import SRegRequest, SRegResponse
-from openid.extensions.ax import FetchRequest as AXFetchRequest, AttrInfo, FetchResponse as AXFetchResponse
-from django.utils.translation import ugettext as _
-
-from store import OsqaOpenIDStore
-
-class OpenIdAbstractAuthConsumer(AuthenticationConsumer):
-
- def get_user_url(self, request):
- try:
- return request.POST['openid_identifier']
- except:
- raise NotImplementedError()
-
- def prepare_authentication_request(self, request, redirect_to):
- if not redirect_to.startswith('http://') or redirect_to.startswith('https://'):
- redirect_to = get_url_host(request) + redirect_to
-
- user_url = self.get_user_url(request)
-
- if xri.identifierScheme(user_url) == 'XRI' and getattr(
- settings, 'OPENID_DISALLOW_INAMES', False
- ):
- raise InvalidAuthentication('i-names are not supported')
-
- consumer = Consumer(request.session, OsqaOpenIDStore())
-
- try:
- auth_request = consumer.begin(user_url)
- except DiscoveryFailure:
- raise InvalidAuthentication(_('Sorry, but your input is not a valid OpenId'))
-
- #sreg = getattr(settings, 'OPENID_SREG', False)
-
- #if sreg:
- # s = SRegRequest()
- # for sarg in sreg:
- # if sarg.lower().lstrip() == "policy_url":
- # s.policy_url = sreg[sarg]
- # else:
- # for v in sreg[sarg].split(','):
- # s.requestField(field_name=v.lower().lstrip(), required=(sarg.lower().lstrip() == "required"))
- # auth_request.addExtension(s)
-
- #auth_request.addExtension(SRegRequest(required=['email']))
-
- if request.session.get('force_email_request', True):
- axr = AXFetchRequest()
- axr.add(AttrInfo("http://axschema.org/contact/email", 1, True, "email"))
- auth_request.addExtension(axr)
-
- trust_root = getattr(
- settings, 'OPENID_TRUST_ROOT', get_url_host(request) + '/'
- )
-
-
- return auth_request.redirectURL(trust_root, redirect_to)
-
- def process_authentication_request(self, request):
- consumer = Consumer(request.session, OsqaOpenIDStore())
-
- query_dict = dict([
- (k.encode('utf8'), v.encode('utf8')) for k, v in request.GET.items()
- ])
-
- #for i in query_dict.items():
- # print "%s : %s" % i
-
- url = get_url_host(request) + request.path
- openid_response = consumer.complete(query_dict, url)
-
- if openid_response.status == SUCCESS:
- if request.session.get('force_email_request', True):
- try:
- ax = AXFetchResponse.fromSuccessResponse(openid_response)
- email = ax.getExtensionArgs()['value.ext0.1']
- request.session['auth_email_request'] = email
- except Exception, e:
- pass
-
- return request.GET['openid.identity']
- elif openid_response.status == CANCEL:
- raise InvalidAuthentication(_('The OpenId authentication request was canceled'))
- elif openid_response.status == FAILURE:
- raise InvalidAuthentication(_('The OpenId authentication failed: ') + openid_response.message)
- elif openid_response.status == SETUP_NEEDED:
- raise InvalidAuthentication(_('Setup needed'))
- else:
- raise InvalidAuthentication(_('The OpenId authentication failed with an unknown status: ') + openid_response.status)
-
- def get_user_data(self, key):
- return {}
-
-def get_url_host(request):
- if request.is_secure():
- protocol = 'https'
- else:
- protocol = 'http'
- host = escape(get_host(request))
- return '%s://%s' % (protocol, host)
-
-def get_full_url(request):
- return get_url_host(request) + request.get_full_path() \ No newline at end of file
diff --git a/forum_modules/openidauth/models.py b/forum_modules/openidauth/models.py
deleted file mode 100755
index d76902df..00000000
--- a/forum_modules/openidauth/models.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from django.db import models
-
-class OpenIdNonce(models.Model):
- server_url = models.URLField()
- timestamp = models.IntegerField()
- salt = models.CharField( max_length=50 )
-
- def __unicode__(self):
- return "Nonce: %s" % self.nonce
-
- class Meta:
- app_label = 'forum'
-
-class OpenIdAssociation(models.Model):
- server_url = models.TextField(max_length=2047)
- handle = models.CharField(max_length=255)
- secret = models.TextField(max_length=255) # Stored base64 encoded
- issued = models.IntegerField()
- lifetime = models.IntegerField()
- assoc_type = models.TextField(max_length=64)
-
- def __unicode__(self):
- return "Association: %s, %s" % (self.server_url, self.handle)
-
- class Meta:
- app_label = 'forum'
diff --git a/forum_modules/openidauth/settings.py b/forum_modules/openidauth/settings.py
deleted file mode 100755
index f7c641a1..00000000
--- a/forum_modules/openidauth/settings.py
+++ /dev/null
@@ -1,9 +0,0 @@
-OPENID_SREG = {
- "required": "nickname, email",
- "optional": "postcode, country",
- "policy_url": ""
-}
-OPENID_AX = [
- {"type_uri": "http://axschema.org/contact/email", "count": 1, "required": True, "alias": "email"},
- {"type_uri": "fullname", "count":1 , "required": False, "alias": "fullname"}
- ] \ No newline at end of file
diff --git a/forum_modules/openidauth/store.py b/forum_modules/openidauth/store.py
deleted file mode 100755
index fa61ea6d..00000000
--- a/forum_modules/openidauth/store.py
+++ /dev/null
@@ -1,79 +0,0 @@
-import time, base64, md5
-
-from openid.store import nonce as oid_nonce
-from openid.store.interface import OpenIDStore
-from openid.association import Association as OIDAssociation
-from django.conf import settings
-
-from models import OpenIdNonce as Nonce, OpenIdAssociation as Association
-
-class OsqaOpenIDStore(OpenIDStore):
- def __init__(self):
- self.max_nonce_age = 6 * 60 * 60 # Six hours
-
- def storeAssociation(self, server_url, association):
- assoc = Association(
- server_url = server_url,
- handle = association.handle,
- secret = base64.encodestring(association.secret),
- issued = association.issued,
- lifetime = association.issued,
- assoc_type = association.assoc_type
- )
- assoc.save()
-
- def getAssociation(self, server_url, handle=None):
- assocs = []
- if handle is not None:
- assocs = Association.objects.filter(
- server_url = server_url, handle = handle
- )
- else:
- assocs = Association.objects.filter(
- server_url = server_url
- )
- if not assocs:
- return None
- associations = []
- for assoc in assocs:
- association = OIDAssociation(
- assoc.handle, base64.decodestring(assoc.secret), assoc.issued,
- assoc.lifetime, assoc.assoc_type
- )
- if association.getExpiresIn() == 0:
- self.removeAssociation(server_url, assoc.handle)
- else:
- associations.append((association.issued, association))
- if not associations:
- return None
- return associations[-1][1]
-
- def removeAssociation(self, server_url, handle):
- assocs = list(Association.objects.filter(
- server_url = server_url, handle = handle
- ))
- assocs_exist = len(assocs) > 0
- for assoc in assocs:
- assoc.delete()
- return assocs_exist
-
- def storeNonce(self, nonce):
- nonce, created = Nonce.objects.get_or_create(
- nonce = nonce, defaults={'expires': int(time.time())}
- )
-
- def useNonce(self, server_url, timestamp, salt):
- if abs(timestamp - time.time()) > oid_nonce.SKEW:
- return False
-
- try:
- nonce = Nonce( server_url=server_url, timestamp=timestamp, salt=salt)
- nonce.save()
- except:
- raise
- else:
- return 1
-
- def getAuthKey(self):
- # Use first AUTH_KEY_LEN characters of md5 hash of SECRET_KEY
- return md5.new(settings.SECRET_KEY).hexdigest()[:self.AUTH_KEY_LEN]
diff --git a/forum_modules/openidauth/templates/openidurl.html b/forum_modules/openidauth/templates/openidurl.html
deleted file mode 100755
index cd4e77dc..00000000
--- a/forum_modules/openidauth/templates/openidurl.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{% load i18n %}
-{% load extra_tags %}
-
-<fieldset>
- <table>
- <tr>
- <td><p id="provider_name_slot">{% trans 'Enter your OpenId Url' %}</p></td>
- </tr>
- <tr>
- <td>
- <input id="openid_identifier" class="icon_input" name="openid_identifier" type="text"
- style="width: 500px; background: url('{% media provider.icon %}') no-repeat left center" />
- </td>
- <td>
- <input type="submit" name="ssignin" value="Login" />
- </td>
- </tr>
- </table>
-</fieldset>
-