Coverage for app/venv/lib/python3.14/site-packages/weblate/accounts/auth.py: 37%
36 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
1# Copyright © Michal Čihař <michal@weblate.org>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
5from __future__ import annotations
7from typing import TYPE_CHECKING
9from django.conf import settings
10from django.contrib.auth.backends import ModelBackend
11from django.db.models.signals import pre_save
12from django.dispatch.dispatcher import receiver
14from weblate.auth.models import User
16if TYPE_CHECKING: 16 ↛ 17line 16 didn't jump to line 17 because the condition on line 16 was never true
17 from weblate.auth.models import AuthenticatedHttpRequest
20def try_get_user(username, list_all=False):
21 """Get User object for authentication."""
22 method = User.objects.filter if list_all else User.objects.get
23 if "@" in username:
24 return method(email=username)
25 return method(username=username)
28class WeblateUserBackend(ModelBackend):
29 """Weblate authentication backend."""
31 def authenticate(
32 self, request: AuthenticatedHttpRequest, username=None, password=None, **kwargs
33 ):
34 """Prohibit login for anonymous user and allows to login by e-mail."""
35 if username == settings.ANONYMOUS_USER_NAME or username is None:
36 return None
38 try:
39 user = try_get_user(username)
40 if user.check_password(password):
41 return user
42 except (User.DoesNotExist, User.MultipleObjectsReturned):
43 pass
44 return None
46 def get_user(self, user_id):
47 try:
48 user = User.objects.select_related("profile").get(pk=user_id)
49 except User.DoesNotExist:
50 return None
51 return user if self.user_can_authenticate(user) else None
54@receiver(pre_save, sender=User)
55def disable_anon_user_password_save(sender, instance, **kwargs) -> None:
56 """Block setting password for anonymous user."""
57 if instance.is_anonymous and instance.has_usable_password(): 57 ↛ 58line 57 didn't jump to line 58 because the condition on line 57 was never true
58 msg = "Anonymous user can not have usable password!"
59 raise ValueError(msg)