refactor(auth): Move check for verificated mail address to user class

This commit is contained in:
Georg Krause 2022-11-06 20:14:23 +01:00 committed by Georg Krause
commit 127a10f3d9
6 changed files with 21 additions and 24 deletions

View file

@ -105,13 +105,7 @@ class UserQuerySet(models.QuerySet):
def for_auth(self):
"""Optimization to avoid additional queries during authentication"""
qs = self.select_related("actor__domain")
verified_emails = EmailAddress.objects.filter(
user=models.OuterRef("id"), primary=True
).values("verified")[:1]
subquery = models.Subquery(verified_emails)
return qs.annotate(has_verified_primary_email=subquery).prefetch_related(
"plugins"
)
return qs.prefetch_related("plugins", "emailaddress_set")
class UserManager(BaseUserManager):
@ -315,6 +309,17 @@ class User(AbstractUser):
return
return self.actor.attachment_icon
@property
def has_verified_primary_email(self) -> bool:
return len(self.emailaddress_set.filter(primary=True, verified=True)) > 0
def should_verify_email(self):
if self.is_superuser:
return False
has_unverified_email = not self.has_verified_primary_email
mandatory_verification = settings.ACCOUNT_EMAIL_VERIFICATION != "optional"
return has_unverified_email and mandatory_verification
def generate_code(length=10):
return "".join(

View file

@ -7,7 +7,7 @@ from funkwhale_api.common import authentication
def check(request):
user = request.user
request.user = user.__class__.objects.all().for_auth().get(pk=user.pk)
if authentication.should_verify_email(request.user):
if request.user.should_verify_email():
raise authentication.UnverifiedEmail(user)
return True