From 4fd2ff826aa53d64f3d2c37066a3c186f9d120da Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Wed, 11 Jul 2018 13:13:12 +1000 Subject: [PATCH] Support Libravatar matching by OpenID URL as well as by email address --- users/migrations/0015_user_openid_sha256.py | 21 +++++++++++++++++++++ users/models.py | 8 ++++++++ users/views.py | 7 ++++--- 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 users/migrations/0015_user_openid_sha256.py diff --git a/users/migrations/0015_user_openid_sha256.py b/users/migrations/0015_user_openid_sha256.py new file mode 100644 index 0000000..3070f11 --- /dev/null +++ b/users/migrations/0015_user_openid_sha256.py @@ -0,0 +1,21 @@ +# Generated by Django 2.0.7 on 2018-07-11 03:07 + +import computed_property.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0014_auto_20180711_1248'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='openid_sha256', + field=computed_property.fields.ComputedCharField(compute_from='calc_openid_sha256', default='', editable=False, + help_text="SHA-256 hash of the user's OpenID URL, used for Libravatar", max_length=64, unique=True), + preserve_default=False, + ), + ] diff --git a/users/models.py b/users/models.py index 607a41c..f8bfdee 100644 --- a/users/models.py +++ b/users/models.py @@ -70,6 +70,10 @@ class User(ModelMeta, AbstractUser): compute_from='calc_email_sha256', max_length=64, unique=True, help_text="SHA-256 hash of the user's email, used for Libravatar" ) + openid_sha256 = ComputedCharField( + compute_from='calc_openid_sha256', max_length=64, unique=True, + help_text="SHA-256 hash of the user's OpenID URL, used for Libravatar" + ) @property def calc_email_md5(self): @@ -79,6 +83,10 @@ class User(ModelMeta, AbstractUser): def calc_email_sha256(self): return sha256(self.email.lower().encode('utf-8')).hexdigest() + @property + def calc_openid_sha256(self): + return sha256(self.full_url.encode('utf-8')).hexdigest() + @property def name(self): return '{0} {1}'.format(self.first_name, self.last_name) diff --git a/users/views.py b/users/views.py index addace3..a73f347 100644 --- a/users/views.py +++ b/users/views.py @@ -1,3 +1,4 @@ +from django.db.models import Q from django.http import HttpResponse, HttpResponseRedirect from django.views.decorators.cache import cache_page from PIL import Image @@ -25,9 +26,9 @@ def libravatar(request, hash): return utils.bad_req('size parameter must be between 1 and 512') if len(hash) == 32: - where = {'email_md5': hash} + where = Q(email_md5=hash) elif len(hash) == 64: - where = {'email_sha256': hash} + where = Q(email_sha256=hash) | Q(openid_sha256=hash) else: return utils.bad_req('hash must be either md5 or sha256') @@ -36,7 +37,7 @@ def libravatar(request, hash): # for MD5 hashes, since Gravatar doesn't support SHA-256), so this ensures # all the most likely places are checked. try: - user = User.objects.get(**where) + user = User.objects.get(where) except User.DoesNotExist: return try_libravatar_org(hash, g)