Skip to content

Commit

Permalink
Merge branch 'pyghassen-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Michał Jaworski committed Jan 9, 2015
2 parents 573c4e5 + 71bae2c commit 26e5571
Show file tree
Hide file tree
Showing 14 changed files with 68 additions and 60 deletions.
4 changes: 2 additions & 2 deletions userena/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

# below are quirks we must use because we can't change some userena API's
# like (url names)
if django.VERSION >= (1, 6, 0): # pragma: no cover
if django.VERSION >= (1, 6, 0): # pragma: no cover
# in django >= 1.6.0 django.contrib.auth.views.reset no longer looks
# for django.contrib.auth.views.password_reset_done but for
# password_reset_done named url. To avoid duplicating urls we
Expand Down Expand Up @@ -41,4 +41,4 @@ class SiteProfileNotAvailable(Exception):
try:
from hashlib import sha1 as sha_constructor, md5 as md5_constructor
except ImportError: # pragma: no cover
from django.utils.hashcompat import sha_constructor, md5_constructor
from django.utils.hashcompat import sha_constructor, md5_constructor
6 changes: 3 additions & 3 deletions userena/decorators.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from django.conf import settings
from django.http import HttpResponsePermanentRedirect
from django.utils.decorators import available_attrs
from django.conf import settings
from django.utils.functional import wraps

from userena import settings as userena_settings

from django.utils.functional import wraps

def secure_required(view_func):
"""
Expand All @@ -21,7 +21,7 @@ def secure_required(view_func):
"""
def _wrapped_view(request, *args, **kwargs):
if not request.is_secure():
if userena_settings.USERENA_USE_HTTPS:
if getattr(settings, 'USERENA_USE_HTTPS', userena_settings.DEFAULT_USERENA_USE_HTTPS):
request_url = request.build_absolute_uri(request.get_full_path())
secure_url = request_url.replace('http://', 'https://')
return HttpResponsePermanentRedirect(secure_url)
Expand Down
4 changes: 2 additions & 2 deletions userena/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def __init__(self, *args, **kwargs):
def save(self):
""" Generate a random username before falling back to parent signup form """
while True:
username = sha_constructor(str(random.random())).hexdigest()[:5]
username = sha_constructor(str(random.random()).encode('utf-8')).hexdigest()[:5]
try:
get_user_model().objects.get(username__iexact=username)
except get_user_model().DoesNotExist: break
Expand Down Expand Up @@ -234,7 +234,7 @@ def __init__(self, *args, **kw):
except AttributeError: # in Django > 1.7
new_order = [('first_name', self.fields['first_name']),
('last_name', self.fields['last_name'])]
new_order.extend(self.fields.items()[:-2])
new_order.extend(list(self.fields.items())[:-2])
self.fields = OrderedDict(new_order)

class Meta:
Expand Down
2 changes: 1 addition & 1 deletion userena/mail.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import re
from StringIO import StringIO

from django.utils.six.moves import StringIO
from django.utils.translation import ugettext as _
from django.core.mail import EmailMultiAlternatives

Expand Down
3 changes: 2 additions & 1 deletion userena/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext as _
from django.conf import settings
from django.utils.six import text_type

from userena import settings as userena_settings
from userena.utils import generate_sha1, get_profile_model, get_datetime_now, \
Expand Down Expand Up @@ -87,7 +88,7 @@ def create_userena_profile(self, user):
:return: The newly created :class:`UserenaSignup` instance.
"""
if isinstance(user.username, unicode):
if isinstance(user.username, text_type):
user.username = user.username.encode('utf-8')
salt, activation_key = generate_sha1(user.username)

Expand Down
4 changes: 3 additions & 1 deletion userena/runtests/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,4 +155,6 @@
}

# Needed for Django guardian
ANONYMOUS_USER_ID = -1
ANONYMOUS_USER_ID = -1

USERENA_USE_HTTPS = False
10 changes: 6 additions & 4 deletions userena/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,20 @@
'USERENA_FORBIDDEN_USERNAMES',
('signup', 'signout', 'signin',
'activate', 'me', 'password'))
DEFAULT_USERENA_USE_HTTPS = False

# NOTE: It is only for internal use. All those settings should be refactored to only defaults
# as specified in #452
_USERENA_USE_HTTPS = getattr(settings, 'USERENA_USE_HTTPS', DEFAULT_USERENA_USE_HTTPS)

USERENA_USE_HTTPS = getattr(settings,
'USERENA_USE_HTTPS',
False)

USERENA_MUGSHOT_GRAVATAR = getattr(settings,
'USERENA_MUGSHOT_GRAVATAR',
True)

USERENA_MUGSHOT_GRAVATAR_SECURE = getattr(settings,
'USERENA_MUGSHOT_GRAVATAR_SECURE',
USERENA_USE_HTTPS)
_USERENA_USE_HTTPS)

USERENA_MUGSHOT_DEFAULT = getattr(settings,
'USERENA_MUGSHOT_DEFAULT',
Expand Down
2 changes: 1 addition & 1 deletion userena/tests/test_privacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def _test_status_codes(self, url, users_status):
for user, status in users_status:
if user:
self.client.login(**user)
response = self.client.get(url)
response = self.client.get(url, follow=True)
self.failUnlessEqual(response.status_code, status)

def test_detail_open_profile_view(self):
Expand Down
19 changes: 8 additions & 11 deletions userena/tests/tests_decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,13 @@ def test_secure_required(self):
to a secured page.
"""
userena_settings.USERENA_USE_HTTPS = True
response = self.client.get(reverse('userena_signin'))
with self.settings(USERENA_USE_HTTPS=True):
response = self.client.get(reverse('userena_signin'))

# Test for the permanent redirect
self.assertEqual(response.status_code, 301)
# Test for the permanent redirect
self.assertEqual(response.status_code, 301)

# Test if the redirected url contains 'https'. Couldn't use
# ``assertRedirects`` here because the redirected to page is
# non-existant.
self.assertTrue('https' in str(response))

# Set back to the old settings
userena_settings.USERENA_USE_HTTPS = False
# Test if the redirected url contains 'https'. Couldn't use
# ``assertRedirects`` here because the redirected to page is
# non-existant.
self.assertTrue('https' in response.get('Location'))
2 changes: 1 addition & 1 deletion userena/tests/tests_managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def test_create_inactive_user(self):
"""
# Check that the fields are set.
new_user = UserenaSignup.objects.create_user(**self.user_info)
self.assertEqual(new_user.username, self.user_info['username'])
self.assertEqual(new_user.username.decode('utf-8'), self.user_info['username'])
self.assertEqual(new_user.email, self.user_info['email'])
self.failUnless(new_user.check_password(self.user_info['password']))

Expand Down
33 changes: 18 additions & 15 deletions userena/tests/tests_models.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
from urlparse import urlparse, parse_qs
import datetime
import hashlib
import re

from django.contrib.auth.models import AnonymousUser
from django.core import mail
from django.conf import settings
from django.test import TestCase
from django.utils.six import text_type
from django.utils.six.moves.urllib_parse import urlparse, parse_qs

from userena.models import UserenaSignup, upload_to_mugshot
from userena import settings as userena_settings
from userena.tests.profiles.models import Profile
from userena.utils import get_user_model, get_user_profile

import datetime, hashlib, re

User = get_user_model()

MUGSHOT_RE = re.compile('^[a-f0-9]{40}$')


class UserenaSignupModelTests(TestCase):
""" Test the model of UserenaSignup """
user_info = {'username': 'alice',
Expand Down Expand Up @@ -108,7 +111,7 @@ def test_plain_email(self):
userena_settings.USERENA_HTML_EMAIL = False
new_user = UserenaSignup.objects.create_user(**self.user_info)
self.failUnlessEqual(len(mail.outbox), 1)
self.assertEqual(unicode(mail.outbox[0].message()).find("multipart/alternative"),-1)
self.assertEqual(text_type(mail.outbox[0].message()).find("multipart/alternative"),-1)

def test_html_email(self):
"""
Expand All @@ -123,11 +126,11 @@ def test_html_email(self):
# Reset configuration
userena_settings.USERENA_HTML_EMAIL = False
self.failUnlessEqual(len(mail.outbox), 1)
self.assertTrue(unicode(mail.outbox[0].message()).find("multipart/alternative")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("text/plain")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("text/html")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("<html>")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("<p>Thank you for signing up")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("multipart/alternative")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("text/plain")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("text/html")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("<html>")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("<p>Thank you for signing up")>-1)
self.assertFalse(mail.outbox[0].body.find("<p>Thank you for signing up")>-1)

def test_generated_plain_email(self):
Expand All @@ -146,11 +149,11 @@ def test_generated_plain_email(self):
userena_settings.USERENA_USE_PLAIN_TEMPLATE = True

self.failUnlessEqual(len(mail.outbox), 1)
self.assertTrue(unicode(mail.outbox[0].message()).find("multipart/alternative")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("text/plain")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("text/html")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("<html>")>-1)
self.assertTrue(unicode(mail.outbox[0].message()).find("<p>Thank you for signing up")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("multipart/alternative")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("text/plain")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("text/html")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("<html>")>-1)
self.assertTrue(text_type(mail.outbox[0].message()).find("<p>Thank you for signing up")>-1)
self.assertTrue(mail.outbox[0].body.find("Thank you for signing up")>-1)

class BaseProfileModelTest(TestCase):
Expand Down Expand Up @@ -200,7 +203,7 @@ def test_get_mugshot_url_with_gravatar(self):
"""
profile = Profile.objects.get(pk=1)

gravatar_hash = hashlib.md5(profile.user.email).hexdigest()
gravatar_hash = hashlib.md5(profile.user.email.encode('utf-8')).hexdigest()

# Test with the default settings
mugshot_url = profile.get_mugshot_url()
Expand Down
8 changes: 3 additions & 5 deletions userena/tests/tests_utils.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from urlparse import urlparse, parse_qs

from django.test import TestCase
from django.conf import settings
from django.utils.six.moves.urllib_parse import urlparse, parse_qs

from userena.utils import (get_gravatar, signin_redirect, get_profile_model,
get_protocol, get_user_model)
from userena import settings as userena_settings
from userena.compat import SiteProfileNotAvailable

import hashlib

class UtilsTests(TestCase):
""" Test the extra utils methods """
Expand Down Expand Up @@ -75,6 +74,5 @@ def test_get_protocol(self):
""" Test if the correct protocol is returned """
self.failUnlessEqual(get_protocol(), 'http')

userena_settings.USERENA_USE_HTTPS = True
self.failUnlessEqual(get_protocol(), 'https')
userena_settings.USERENA_USE_HTTPS = False
with self.settings(USERENA_USE_HTTPS=True):
self.failUnlessEqual(get_protocol(), 'https')
4 changes: 2 additions & 2 deletions userena/tests/tests_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ def test_password_reset_view_success(self):
# check if there was success redirect to userena_password_reset_done
# and email was sent
self.assertEqual(response.status_code, 302)
self.assertIn(reverse('userena_password_reset_done'), str(response))
self.assertIn(reverse('userena_password_reset_done'), response.get('Location'))
self.assertTrue(mail.outbox)

def test_password_reset_view_failure(self):
Expand All @@ -480,4 +480,4 @@ def test_password_reset_confirm(self):
data={'new_password1': 'pass',
'new_password2': 'pass',})
self.assertEqual(response.status_code, 302)
self.assertIn(reverse('userena_password_reset_complete'), str(response))
self.assertIn(reverse('userena_password_reset_complete'), response.get('Location'))
27 changes: 16 additions & 11 deletions userena/utils.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django.conf import settings
from django.db.models import get_model
from django.utils.six import text_type
from django.utils.six.moves.urllib.parse import urlencode

from userena import settings as userena_settings
from userena.compat import SiteProfileNotAvailable
Expand All @@ -16,7 +18,7 @@
def truncate_words(s, num, end_text='...'):
truncate = end_text and ' %s' % end_text or ''
return Truncator(s).words(num, truncate=truncate)
truncate_words = allow_lazy(truncate_words, unicode)
truncate_words = allow_lazy(truncate_words, text_type)

def get_gravatar(email, size=80, default='identicon'):
""" Get's a Gravatar for a email address.
Expand Down Expand Up @@ -56,10 +58,12 @@ def get_gravatar(email, size=80, default='identicon'):

gravatar_url = '%(base_url)s%(gravatar_id)s?' % \
{'base_url': base_url,
'gravatar_id': md5_constructor(email.lower()).hexdigest()}
'gravatar_id': md5_constructor(email.lower().encode('utf-8')).hexdigest()}

gravatar_url += urllib.urlencode({'s': str(size),
'd': default})
gravatar_url += urlencode({
's': str(size),
'd': default
})
return gravatar_url

def signin_redirect(redirect=None, user=None):
Expand Down Expand Up @@ -102,15 +106,16 @@ def generate_sha1(string, salt=None):
:return: Tuple containing the salt and hash.
"""
if not isinstance(string, (str, unicode)):
if not isinstance(string, (str, text_type)):
string = str(string)
if isinstance(string, unicode):
string = string.encode("utf-8")

if not salt:
salt = sha_constructor(str(random.random())).hexdigest()[:5]
hash = sha_constructor(salt+string).hexdigest()
salt = sha_constructor(str(random.random()).encode('utf-8')).hexdigest()[:5]

salted_bytes = (salt.encode('utf-8') + string.encode('utf-8'))
hash_ = sha_constructor(salted_bytes).hexdigest()

return (salt, hash)
return salt, hash_

def get_profile_model():
"""
Expand Down Expand Up @@ -156,7 +161,7 @@ def get_protocol():
"""
protocol = 'http'
if userena_settings.USERENA_USE_HTTPS:
if getattr(settings, 'USERENA_USE_HTTPS', userena_settings.DEFAULT_USERENA_USE_HTTPS):
protocol = 'https'
return protocol

Expand Down

0 comments on commit 26e5571

Please sign in to comment.