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

1# Copyright © Michal Čihař <michal@weblate.org> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4 

5from __future__ import annotations 

6 

7from typing import TYPE_CHECKING 

8 

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 

13 

14from weblate.auth.models import User 

15 

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 

18 

19 

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) 

26 

27 

28class WeblateUserBackend(ModelBackend): 

29 """Weblate authentication backend.""" 

30 

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 

37 

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 

45 

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 

52 

53 

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)