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

1
bam/views.py

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

Loading…
Cancel
Save