mirror of
https://git.linux-kernel.at/oliver/ivatar.git
synced 2025-11-17 21:48:02 +00:00
Digest for ConfirmedEmail and ConfirmedOpenId
This commit is contained in:
25
ivatar/ivataraccount/migrations/0005_auto_20180522_1155.py
Normal file
25
ivatar/ivataraccount/migrations/0005_auto_20180522_1155.py
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Generated by Django 2.0.5 on 2018-05-22 11:55
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ivataraccount', '0004_auto_20180508_0742'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='confirmedemail',
|
||||||
|
name='digest',
|
||||||
|
field=models.CharField(default='', max_length=64),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='confirmedopenid',
|
||||||
|
name='digest',
|
||||||
|
field=models.CharField(default='', max_length=64),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
'''
|
||||||
|
Our models for ivatar.ivataraccount
|
||||||
|
'''
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import hashlib
|
import hashlib
|
||||||
import time
|
import time
|
||||||
@@ -5,6 +9,7 @@ from io import BytesIO
|
|||||||
from os import urandom
|
from os import urandom
|
||||||
from urllib.error import HTTPError, URLError
|
from urllib.error import HTTPError, URLError
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
|
from urllib.parse import urlsplit, urlunsplit
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
@@ -15,8 +20,8 @@ from openid.association import Association as OIDAssociation
|
|||||||
from openid.store import nonce as oidnonce
|
from openid.store import nonce as oidnonce
|
||||||
from openid.store.interface import OpenIDStore
|
from openid.store.interface import OpenIDStore
|
||||||
|
|
||||||
from .gravatar import get_photo as get_gravatar_photo
|
|
||||||
from ivatar.settings import MAX_LENGTH_EMAIL
|
from ivatar.settings import MAX_LENGTH_EMAIL
|
||||||
|
from .gravatar import get_photo as get_gravatar_photo
|
||||||
|
|
||||||
|
|
||||||
MAX_LENGTH_URL = 255 # MySQL can't handle more than that (LP 1018682)
|
MAX_LENGTH_URL = 255 # MySQL can't handle more than that (LP 1018682)
|
||||||
@@ -49,6 +54,9 @@ class BaseAccountModel(models.Model):
|
|||||||
add_date = models.DateTimeField(default=timezone.now)
|
add_date = models.DateTimeField(default=timezone.now)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
'''
|
||||||
|
Class attributes
|
||||||
|
'''
|
||||||
abstract = True
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
@@ -61,6 +69,9 @@ class Photo(BaseAccountModel):
|
|||||||
format = models.CharField(max_length=3)
|
format = models.CharField(max_length=3)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
'''
|
||||||
|
Class attributes
|
||||||
|
'''
|
||||||
verbose_name = _('photo')
|
verbose_name = _('photo')
|
||||||
verbose_name_plural = _('photos')
|
verbose_name_plural = _('photos')
|
||||||
|
|
||||||
@@ -95,12 +106,16 @@ class Photo(BaseAccountModel):
|
|||||||
|
|
||||||
self.format = file_format(img.format)
|
self.format = file_format(img.format)
|
||||||
if not self.format:
|
if not self.format:
|
||||||
|
print('Unable to determine format: %s' % img)
|
||||||
return False
|
return False
|
||||||
self.data = data
|
self.data = data
|
||||||
super().save()
|
super().save()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
'''
|
||||||
|
Override save from parent, taking care about the image
|
||||||
|
'''
|
||||||
# Use PIL to read the file format
|
# Use PIL to read the file format
|
||||||
try:
|
try:
|
||||||
img = Image.open(BytesIO(self.data))
|
img = Image.open(BytesIO(self.data))
|
||||||
@@ -121,6 +136,9 @@ class ConfirmedEmailManager(models.Manager):
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
def create_confirmed_email(self, user, email_address, is_logged_in):
|
def create_confirmed_email(self, user, email_address, is_logged_in):
|
||||||
|
'''
|
||||||
|
Helper method to create confirmed email address
|
||||||
|
'''
|
||||||
confirmed = ConfirmedEmail()
|
confirmed = ConfirmedEmail()
|
||||||
confirmed.user = user
|
confirmed.user = user
|
||||||
confirmed.ip_address = '0.0.0.0'
|
confirmed.ip_address = '0.0.0.0'
|
||||||
@@ -149,16 +167,30 @@ class ConfirmedEmail(BaseAccountModel):
|
|||||||
null=True,
|
null=True,
|
||||||
on_delete=models.deletion.CASCADE,
|
on_delete=models.deletion.CASCADE,
|
||||||
)
|
)
|
||||||
|
digest = models.CharField(max_length=64)
|
||||||
objects = ConfirmedEmailManager()
|
objects = ConfirmedEmailManager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
'''
|
||||||
|
Class attributes
|
||||||
|
'''
|
||||||
verbose_name = _('confirmed email')
|
verbose_name = _('confirmed email')
|
||||||
verbose_name_plural = _('confirmed emails')
|
verbose_name_plural = _('confirmed emails')
|
||||||
|
|
||||||
def set_photo(self, photo):
|
def set_photo(self, photo):
|
||||||
|
'''
|
||||||
|
Helper method to set photo
|
||||||
|
'''
|
||||||
self.photo = photo
|
self.photo = photo
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
'''
|
||||||
|
Override save from parent, add digest
|
||||||
|
'''
|
||||||
|
self.digest = hashlib.md5(self.email.strip().lower().encode('utf-8')).hexdigest()
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class UnconfirmedEmail(BaseAccountModel):
|
class UnconfirmedEmail(BaseAccountModel):
|
||||||
'''
|
'''
|
||||||
@@ -168,6 +200,9 @@ class UnconfirmedEmail(BaseAccountModel):
|
|||||||
verification_key = models.CharField(max_length=64)
|
verification_key = models.CharField(max_length=64)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
'''
|
||||||
|
Class attributes
|
||||||
|
'''
|
||||||
verbose_name = _('unconfirmed_email')
|
verbose_name = _('unconfirmed_email')
|
||||||
verbose_name_plural = _('unconfirmed_emails')
|
verbose_name_plural = _('unconfirmed_emails')
|
||||||
|
|
||||||
@@ -202,6 +237,7 @@ class ConfirmedOpenId(BaseAccountModel):
|
|||||||
null=True,
|
null=True,
|
||||||
on_delete=models.deletion.CASCADE,
|
on_delete=models.deletion.CASCADE,
|
||||||
)
|
)
|
||||||
|
digest = models.CharField(max_length=64)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('confirmed OpenID')
|
verbose_name = _('confirmed OpenID')
|
||||||
@@ -211,6 +247,17 @@ class ConfirmedOpenId(BaseAccountModel):
|
|||||||
self.photo = photo
|
self.photo = photo
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
url = urlsplit(self.openid)
|
||||||
|
if url.username:
|
||||||
|
password = url.password or ''
|
||||||
|
netloc = url.username + ':' + password + '@' + url.hostname
|
||||||
|
else:
|
||||||
|
netloc = url.hostname
|
||||||
|
lowercase_url = urlunsplit((url.scheme.lower(), netloc, url.path, url.query, url.fragment))
|
||||||
|
self.digest = hashlib.sha256(lowercase_url.encode('utf-8')).hexdigest()
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class OpenIDNonce(models.Model):
|
class OpenIDNonce(models.Model):
|
||||||
'''
|
'''
|
||||||
|
|||||||
Reference in New Issue
Block a user