Browse Source

Merge branch 'hashed-email'

master
Fr3deric 5 years ago
parent
commit
91006c718b
  1. 33
      bam/admin.py
  2. 18
      bam/forms.py
  3. 25
      bam/migrations/0001_initial.py
  4. 13
      bam/models.py
  5. 8
      bam/urls.py
  6. 1
      bam/views.py

33
bam/admin.py

@ -1,3 +1,34 @@ @@ -1,3 +1,34 @@
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
from django import forms
from .models import Account
# Register your models here.
class AccountInlineForm(forms.ModelForm):
hashed_email_set = forms.EmailField(label='Set hashed email address')
class Meta:
model = Account
fields = ['hashed_email']
def save(self, commit):
self.instance.set_hashed_email(self.cleaned_data['hashed_email_set'])
return super().save(commit)
class AccountInline(admin.StackedInline):
model = Account
can_delete = False
form = AccountInlineForm
readonly_fields = ['hashed_email']
class UserAdmin(BaseUserAdmin):
inlines = (AccountInline,)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
admin.site.register(Account)

18
bam/forms.py

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
import hashlib
from django.contrib.auth.forms import PasswordResetForm
from django.contrib.auth.hashers import check_password
from django import forms
from django.utils.translation import gettext, gettext_lazy as _
from .models import Account
class HashedEmailPasswordResetForm(PasswordResetForm):
username = forms.CharField(label=_('Username'), max_length=254)
def get_users(self, email):
accounts = Account.objects.filter(
user__username=self.cleaned_data['username']
)
return (a.user for a in accounts if a.user.has_usable_password() and
(check_password(email, a.hashed_email)
or a.user.email == email))

25
bam/migrations/0001_initial.py

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
# Generated by Django 2.2 on 2019-04-28 10:12
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Account',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('hashed_email', models.CharField(max_length=128)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

13
bam/models.py

@ -1,3 +1,14 @@ @@ -1,3 +1,14 @@
from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
# Create your models here.
class Account(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
hashed_email = models.CharField(max_length=128)
def __str__(self):
return '%s' % (self.user.username)
def set_hashed_email(self, email):
self.hashed_email = make_password(email)

8
bam/urls.py

@ -3,6 +3,7 @@ from django.urls import path @@ -3,6 +3,7 @@ from django.urls import path
from django.urls import include
from django.views.generic.base import RedirectView
from bam.views import ProfileView
from bam.forms import HashedEmailPasswordResetForm
import django.contrib.auth.views as auth_views
urlpatterns = [
@ -28,7 +29,8 @@ urlpatterns = [ @@ -28,7 +29,8 @@ urlpatterns = [
name='password_change_done'),
path('password_reset/',
auth_views.PasswordResetView.as_view(
template_name='bam/password_reset.html'
template_name='bam/password_reset.html',
form_class=HashedEmailPasswordResetForm
),
name='password_reset'),
path('password_reset_done/',
@ -51,4 +53,8 @@ urlpatterns = [ @@ -51,4 +53,8 @@ urlpatterns = [
template_name='bam/password_reset_complete.html'
),
name='password_reset_complete'),
#path('password_reset_hashed/',
# PasswordResetHashedView.as_view(),
# name='password_reset_hashed'),
]

1
bam/views.py

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
from django.views.generic.base import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin
class ProfileView(LoginRequiredMixin, TemplateView):
template_name = 'bam/profile.html'

Loading…
Cancel
Save