authentification.py 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import typing
  2. from pyramid.request import Request
  3. from sqlalchemy.orm.exc import NoResultFound
  4. from tracim import TracimRequest
  5. from tracim.exceptions import UserDoesNotExist
  6. from tracim.lib.core.user import UserApi
  7. from tracim.models import User
  8. BASIC_AUTH_WEBUI_REALM = "tracim"
  9. ###
  10. # Pyramid HTTP Basic Auth
  11. ###
  12. def basic_auth_check_credentials(
  13. login: str,
  14. cleartext_password: str,
  15. request: TracimRequest
  16. ) -> typing.Optional[list]:
  17. """
  18. Check credential for pyramid basic_auth
  19. :param login: login of user
  20. :param cleartext_password: user password in cleartext
  21. :param request: Pyramid request
  22. :return: None if auth failed, list of permissions if auth succeed
  23. """
  24. # Do not accept invalid user
  25. user = _get_basic_auth_unsafe_user(request)
  26. if not user \
  27. or user.email != login \
  28. or not user.validate_password(cleartext_password):
  29. return None
  30. return []
  31. def _get_basic_auth_unsafe_user(
  32. request: Request,
  33. ) -> typing.Optional[User]:
  34. """
  35. :param request: pyramid request
  36. :return: User or None
  37. """
  38. app_config = request.registry.settings['CFG']
  39. uapi = UserApi(None, session=request.dbsession, config=app_config)
  40. try:
  41. login = request.unauthenticated_userid
  42. if not login:
  43. return None
  44. user = uapi.get_one_by_email(login)
  45. except UserDoesNotExist:
  46. return None
  47. return user