From 346c65b73d9f92e3817c499111a61ed442588f06 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 19 Apr 2018 12:04:25 +0200 Subject: [PATCH] custom_user: remove base_user (fixes #23272) --- src/authentic2/custom_user/base_user.py | 83 --------------------------------- src/authentic2/custom_user/models.py | 2 +- tox.ini | 2 +- 3 files changed, 2 insertions(+), 85 deletions(-) delete mode 100644 src/authentic2/custom_user/base_user.py diff --git a/src/authentic2/custom_user/base_user.py b/src/authentic2/custom_user/base_user.py deleted file mode 100644 index 1896b9fc..00000000 --- a/src/authentic2/custom_user/base_user.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -This module allows importing AbstractBaseUser even when django.contrib.auth is -not in INSTALLED_APPS. -""" -from __future__ import unicode_literals - -from django.contrib.auth.hashers import ( - check_password, is_password_usable, make_password, -) -from django.db import models -from django.utils.crypto import salted_hmac -from django.utils.encoding import python_2_unicode_compatible -from django.utils.translation import ugettext_lazy as _ - - -@python_2_unicode_compatible -class AbstractBaseUser(models.Model): - password = models.CharField(_('password'), max_length=128) - last_login = models.DateTimeField(_('last login'), blank=True, null=True) - - is_active = True - - REQUIRED_FIELDS = [] - - class Meta: - abstract = True - - def get_username(self): - "Return the identifying username for this User" - return getattr(self, self.USERNAME_FIELD) - - def __str__(self): - return self.get_username() - - def natural_key(self): - return (self.get_username(),) - - def is_anonymous(self): - """ - Always returns False. This is a way of comparing User objects to - anonymous users. - """ - return False - - def is_authenticated(self): - """ - Always return True. This is a way to tell if the user has been - authenticated in templates. - """ - return True - - def set_password(self, raw_password): - self.password = make_password(raw_password) - - def check_password(self, raw_password): - """ - Returns a boolean of whether the raw_password was correct. Handles - hashing formats behind the scenes. - """ - def setter(raw_password): - self.set_password(raw_password) - self.save(update_fields=["password"]) - return check_password(raw_password, self.password, setter) - - def set_unusable_password(self): - # Sets a value that will never be a valid hash - self.password = make_password(None) - - def has_usable_password(self): - return is_password_usable(self.password) - - def get_full_name(self): - raise NotImplementedError('subclasses of AbstractBaseUser must provide a get_full_name() method') - - def get_short_name(self): - raise NotImplementedError('subclasses of AbstractBaseUser must provide a get_short_name() method.') - - def get_session_auth_hash(self): - """ - Returns an HMAC of the password field. - """ - key_salt = "django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash" - return salted_hmac(key_salt, self.password).hexdigest() diff --git a/src/authentic2/custom_user/models.py b/src/authentic2/custom_user/models.py index bf1d226c..4e744dd1 100644 --- a/src/authentic2/custom_user/models.py +++ b/src/authentic2/custom_user/models.py @@ -7,6 +7,7 @@ try: from django.contrib.contenttypes.fields import GenericRelation except ImportError: from django.contrib.contenttypes.generic import GenericRelation +from django.contrib.auth.models import AbstractBaseUser from django_rbac.models import PermissionMixin from django_rbac.utils import get_role_parenting_model @@ -16,7 +17,6 @@ from authentic2.decorators import errorcollector from authentic2.models import Service, AttributeValue, Attribute from .managers import UserManager -from .base_user import AbstractBaseUser class Attributes(object): diff --git a/tox.ini b/tox.ini index 8b1c2201..57dd2499 100644 --- a/tox.ini +++ b/tox.ini @@ -26,7 +26,7 @@ deps = pip > 9 dj18: django>1.8,<1.9 dj19: django>1.8,<1.9 - pg: psycopg2<2.7 + pg: psycopg2 coverage pytest-cov pytest-django -- 2.16.3