A multipurpose python flask API server and administration SPA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.3 KiB

  1. """Service to handle authentication."""
  2. from datetime import datetime
  3. from typing import Optional
  4. from nacl import pwhash
  5. from nacl.exceptions import InvalidkeyError
  6. from corvus.model import User, UserToken
  7. from corvus.service import user_token_service
  8. def is_valid_password(user: User, password: str) -> bool:
  9. """
  10. User password must pass pwhash verify.
  11. :param user:
  12. :param password:
  13. :return:
  14. """
  15. assert user
  16. try:
  17. return pwhash.verify(
  18. user.password_hash.encode('utf8'), password.encode('utf8'))
  19. except InvalidkeyError:
  20. pass
  21. return False
  22. def is_valid_token(user_token: Optional[UserToken]) -> bool:
  23. """
  24. Validate a token.
  25. Token must be enabled and if it has an expiration, it must be greater
  26. than now.
  27. :param user_token:
  28. :return:
  29. """
  30. if user_token is None:
  31. return False
  32. if not user_token.enabled:
  33. return False
  34. if (user_token.expiration_time is not None
  35. and user_token.expiration_time < datetime.utcnow()):
  36. return False
  37. return True
  38. def logout(user_token: Optional[UserToken] = None) -> None:
  39. """
  40. Remove a user_token associated with a client session.
  41. :param user_token:
  42. :return:
  43. """
  44. if user_token is not None:
  45. user_token_service.delete(user_token)