xtr-security-http 5.2.0__tar.gz → 6.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/PKG-INFO +19 -17
  2. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/README.md +4 -2
  3. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/pyproject.toml +19 -19
  4. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/pyproject.toml.orig +19 -19
  5. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/oidc_token_handler.py +26 -3
  6. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/is_csrf_token_valid.py +3 -1
  7. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/firewall.py +12 -4
  8. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_id_token.py +3 -1
  9. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_signature_verifier.py +7 -2
  10. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/LICENSE +0 -0
  11. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/__init__.py +0 -0
  12. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/_challenge.py +0 -0
  13. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/_parked_session.py +0 -0
  14. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/_request_parameters.py +0 -0
  15. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/_security_state.py +0 -0
  16. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_map.py +0 -0
  17. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_map_interface.py +0 -0
  18. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/__init__.py +0 -0
  19. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/access_token_extractor_interface.py +0 -0
  20. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/access_token_handler_interface.py +0 -0
  21. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/chain_access_token_extractor.py +0 -0
  22. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/form_encoded_body_extractor.py +0 -0
  23. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/header_access_token_extractor.py +0 -0
  24. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oauth2/__init__.py +0 -0
  25. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oauth2/_introspected_user.py +0 -0
  26. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oauth2/_introspection_claims.py +0 -0
  27. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oauth2/_signed_response.py +0 -0
  28. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oauth2/_signed_response_discovery.py +0 -0
  29. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oauth2/oauth2_token_handler.py +0 -0
  30. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/__init__.py +0 -0
  31. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/exception/__init__.py +0 -0
  32. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/exception/invalid_signature_error.py +0 -0
  33. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/exception/missing_claim_error.py +0 -0
  34. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/exception/oidc_key_set_error.py +0 -0
  35. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/oidc_token_generator.py +0 -0
  36. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/oidc_trait.py +0 -0
  37. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/oidc/oidc_user_info_token_handler.py +0 -0
  38. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/query_access_token_extractor.py +0 -0
  39. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/access_token/sender_constraint_interface.py +0 -0
  40. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/__init__.py +0 -0
  41. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/_authentication_outcome.py +0 -0
  42. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/_manager_reporting.py +0 -0
  43. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/_referer.py +0 -0
  44. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/_sensitive.py +0 -0
  45. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/_supports_pass.py +0 -0
  46. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/authentication_failure_handler_interface.py +0 -0
  47. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/authentication_success_handler_interface.py +0 -0
  48. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/authentication_utils.py +0 -0
  49. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/authenticator_manager.py +0 -0
  50. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/authenticator_manager_interface.py +0 -0
  51. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/custom_authentication_failure_handler.py +0 -0
  52. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/custom_authentication_success_handler.py +0 -0
  53. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/default_authentication_failure_handler.py +0 -0
  54. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/default_authentication_success_handler.py +0 -0
  55. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/expose_security_level.py +0 -0
  56. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authentication/user_authenticator_interface.py +0 -0
  57. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/__init__.py +0 -0
  58. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_access_token_challenge.py +0 -0
  59. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_access_token_scopes.py +0 -0
  60. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_form_login_credentials.py +0 -0
  61. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_attempts.py +0 -0
  62. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_authorization.py +0 -0
  63. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_callback.py +0 -0
  64. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_claims.py +0 -0
  65. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_options.py +0 -0
  66. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_public_client.py +0 -0
  67. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/_oidc_login_token.py +0 -0
  68. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/abstract_authenticator.py +0 -0
  69. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/abstract_login_form_authenticator.py +0 -0
  70. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/abstract_pre_authenticated_authenticator.py +0 -0
  71. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/access_token_authenticator.py +0 -0
  72. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/authenticator_interface.py +0 -0
  73. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/debug/__init__.py +0 -0
  74. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/debug/traceable_authenticator.py +0 -0
  75. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/debug/traceable_authenticator_manager_listener.py +0 -0
  76. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/debug/unsupported_reasons.py +0 -0
  77. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/fallback_user_loader.py +0 -0
  78. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/form_login_authenticator.py +0 -0
  79. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/http_basic_authenticator.py +0 -0
  80. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/interactive_authenticator_interface.py +0 -0
  81. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/json_login_authenticator.py +0 -0
  82. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/login_link_authenticator.py +0 -0
  83. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/oidc/__init__.py +0 -0
  84. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/oidc/oidc_jwks.py +0 -0
  85. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/oidc_login_authenticator.py +0 -0
  86. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/__init__.py +0 -0
  87. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/__init__.py +0 -0
  88. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/authentication_method_badge.py +0 -0
  89. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/badge_interface.py +0 -0
  90. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/csrf_token_badge.py +0 -0
  91. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/password_upgrade_badge.py +0 -0
  92. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/pre_authenticated_user_badge.py +0 -0
  93. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/remember_me_badge.py +0 -0
  94. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/badge/user_badge.py +0 -0
  95. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/credentials/__init__.py +0 -0
  96. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/credentials/credentials_interface.py +0 -0
  97. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/credentials/custom_credentials.py +0 -0
  98. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/credentials/password_credentials.py +0 -0
  99. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/passport.py +0 -0
  100. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/passport/self_validating_passport.py +0 -0
  101. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/remember_me_authenticator.py +0 -0
  102. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/remote_user_authenticator.py +0 -0
  103. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/token/__init__.py +0 -0
  104. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/token/post_authentication_token.py +0 -0
  105. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authenticator/x509_authenticator.py +0 -0
  106. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authorization/__init__.py +0 -0
  107. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authorization/access_denied_handler_interface.py +0 -0
  108. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authorization/insufficient_scope_access_denied_handler.py +0 -0
  109. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/authorization/oauth2_scope_voter.py +0 -0
  110. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/command/__init__.py +0 -0
  111. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/command/_registry.py +0 -0
  112. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/command/oidc_token_generate_command.py +0 -0
  113. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/__init__.py +0 -0
  114. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/_methods.py +0 -0
  115. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/current_token.py +0 -0
  116. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/current_user.py +0 -0
  117. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/firewall_listener_order.py +0 -0
  118. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/is_granted.py +0 -0
  119. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/decorator/is_granted_context.py +0 -0
  120. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/entry_point/__init__.py +0 -0
  121. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/entry_point/authentication_entry_point_interface.py +0 -0
  122. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/entry_point/fallback_authentication_entry_point_interface.py +0 -0
  123. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/entry_point/re_authentication_entry_point_interface.py +0 -0
  124. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/__init__.py +0 -0
  125. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/authentication_token_created_event.py +0 -0
  126. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/check_passport_event.py +0 -0
  127. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/check_refreshed_user_event.py +0 -0
  128. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/interactive_login_event.py +0 -0
  129. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/login_failure_event.py +0 -0
  130. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/login_success_event.py +0 -0
  131. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/logout_event.py +0 -0
  132. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/oidc_authorization_request_event.py +0 -0
  133. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/switch_user_event.py +0 -0
  134. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event/token_deauthenticated_event.py +0 -0
  135. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/__init__.py +0 -0
  136. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/authentication_proofs_listener.py +0 -0
  137. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/check_credentials_listener.py +0 -0
  138. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/check_remember_me_conditions_listener.py +0 -0
  139. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/clear_site_data_listener.py +0 -0
  140. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/cleared_cookie.py +0 -0
  141. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/cookie_clearing_listener.py +0 -0
  142. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/csrf_protection_listener.py +0 -0
  143. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/csrf_token_clearing_listener.py +0 -0
  144. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/default_logout_listener.py +0 -0
  145. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/login_throttling_listener.py +0 -0
  146. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/oidc_back_channel_logout_listener.py +0 -0
  147. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/oidc_end_session_listener.py +0 -0
  148. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/password_migrating_listener.py +0 -0
  149. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/remember_me_listener.py +0 -0
  150. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/save_session_listener.py +0 -0
  151. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/session_logout_listener.py +0 -0
  152. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/session_strategy_listener.py +0 -0
  153. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/user_checker_listener.py +0 -0
  154. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/event_listener/user_provider_listener.py +0 -0
  155. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/__init__.py +0 -0
  156. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/expired_login_link_error.py +0 -0
  157. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/impersonation_error.py +0 -0
  158. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/invalid_access_token_error.py +0 -0
  159. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/invalid_csrf_token_error.py +0 -0
  160. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/invalid_login_link_authentication_error.py +0 -0
  161. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/invalid_login_link_error.py +0 -0
  162. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/invalid_login_link_error_interface.py +0 -0
  163. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/invalid_session_strategy_error.py +0 -0
  164. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/logout_error.py +0 -0
  165. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/missing_session_error.py +0 -0
  166. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/missing_state_bag_error.py +0 -0
  167. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/oidc_invalid_grant_error.py +0 -0
  168. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/oidc_session_ended_error.py +0 -0
  169. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/exception/unknown_firewall_error.py +0 -0
  170. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/__init__.py +0 -0
  171. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/_exception_answers.py +0 -0
  172. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/_re_authentication.py +0 -0
  173. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/_switch_load.py +0 -0
  174. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/_switch_request.py +0 -0
  175. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/_switch_uri.py +0 -0
  176. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/_user_refresh.py +0 -0
  177. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/abstract_listener.py +0 -0
  178. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/access_listener.py +0 -0
  179. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/authenticator_manager_listener.py +0 -0
  180. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/channel_listener.py +0 -0
  181. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/context_listener.py +0 -0
  182. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/exception_listener.py +0 -0
  183. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/firewall_listener_interface.py +0 -0
  184. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/logout_listener.py +0 -0
  185. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/oidc_token_refresh_listener.py +0 -0
  186. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/refresh_user_result.py +0 -0
  187. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/switch_user_listener.py +0 -0
  188. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall/user_changed.py +0 -0
  189. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall_context_interface.py +0 -0
  190. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall_map.py +0 -0
  191. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/firewall_map_interface.py +0 -0
  192. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/http_utils.py +0 -0
  193. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/impersonate/__init__.py +0 -0
  194. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/impersonate/impersonate_url_generator.py +0 -0
  195. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/impersonate/impersonation_form.py +0 -0
  196. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/impersonate/switch_user_config.py +0 -0
  197. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/impersonate/switch_user_config_lookup_interface.py +0 -0
  198. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/login_link/__init__.py +0 -0
  199. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/login_link/_presented_link.py +0 -0
  200. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/login_link/login_link_details.py +0 -0
  201. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/login_link/login_link_handler.py +0 -0
  202. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/login_link/login_link_handler_interface.py +0 -0
  203. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/logout/__init__.py +0 -0
  204. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/logout/logout_form.py +0 -0
  205. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/logout/logout_url_generator.py +0 -0
  206. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/__init__.py +0 -0
  207. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/access_token_type/__init__.py +0 -0
  208. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/access_token_type/access_token_type_interface.py +0 -0
  209. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/access_token_type/bearer_token_type.py +0 -0
  210. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/__init__.py +0 -0
  211. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/abstract_client_assertion.py +0 -0
  212. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/abstract_tls_client_auth.py +0 -0
  213. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/client_authentication_interface.py +0 -0
  214. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/client_secret_basic.py +0 -0
  215. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/client_secret_jwt.py +0 -0
  216. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/client_secret_post.py +0 -0
  217. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/no_client_authentication.py +0 -0
  218. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/private_key_jwt.py +0 -0
  219. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/self_signed_tls_client_auth.py +0 -0
  220. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/client_authentication/tls_client_auth.py +0 -0
  221. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oauth2/jws_algorithms.py +0 -0
  222. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/__init__.py +0 -0
  223. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/discovery_oidc_key_set_provider.py +0 -0
  224. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_back_channel_logout.py +0 -0
  225. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_client.py +0 -0
  226. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_client_interface.py +0 -0
  227. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_discovery.py +0 -0
  228. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_ended_sessions.py +0 -0
  229. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_jwks.py +0 -0
  230. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_logout_token.py +0 -0
  231. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/oidc/oidc_token_refresher.py +0 -0
  232. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/py.typed +0 -0
  233. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/rate_limiter/__init__.py +0 -0
  234. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/rate_limiter/default_login_rate_limiter.py +0 -0
  235. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/__init__.py +0 -0
  236. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/_signature_digest.py +0 -0
  237. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/abstract_remember_me_handler.py +0 -0
  238. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/persistent_remember_me_handler.py +0 -0
  239. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/remember_me_cookie.py +0 -0
  240. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/remember_me_details.py +0 -0
  241. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/remember_me_handler_interface.py +0 -0
  242. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/response_listener.py +0 -0
  243. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/remember_me/signature_remember_me_handler.py +0 -0
  244. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/resolver/__init__.py +0 -0
  245. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/resolver/csrf_token_checker.py +0 -0
  246. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/resolver/is_granted_checker.py +0 -0
  247. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/resolver/security_token_resolver.py +0 -0
  248. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/resolver/user_value_resolver.py +0 -0
  249. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/security_events.py +0 -0
  250. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/security_request_attributes.py +0 -0
  251. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/session/__init__.py +0 -0
  252. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/session/session_authentication_strategy.py +0 -0
  253. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/session/session_authentication_strategy_interface.py +0 -0
  254. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/util/__init__.py +0 -0
  255. {xtr_security_http-5.2.0 → xtr_security_http-6.0.0}/src/xtr_security_http/util/target_path.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xtr-security-http
3
- Version: 5.2.0
3
+ Version: 6.0.0
4
4
  Summary: The HTTP edge of xtr security: firewalls, authenticators, bearer access tokens and the request surface.
5
5
  Keywords: security,authentication,firewall,fastapi,oauth2
6
6
  Author: Xterr
@@ -14,20 +14,20 @@ Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
15
  Classifier: Programming Language :: Python :: 3.14
16
16
  Classifier: Typing :: Typed
17
- Requires-Dist: xtr-security-core>=5.0,<6
18
- Requires-Dist: xtr-security-csrf>=5.0,<6
19
- Requires-Dist: xtr-http-kernel>=5.0,<6
20
- Requires-Dist: xtr-http-foundation>=5.0,<6
21
- Requires-Dist: xtr-http-message-contracts>=5.0,<6
22
- Requires-Dist: xtr-http-client-contracts>=5.0,<6
23
- Requires-Dist: xtr-cache-contracts>=5.0,<6
24
- Requires-Dist: xtr-dependency-injection>=5.0,<6
25
- Requires-Dist: xtr-event-dispatcher>=5.0,<6
26
- Requires-Dist: xtr-event-dispatcher-contracts>=5.0,<6
27
- Requires-Dist: xtr-clock>=5.0,<6
28
- Requires-Dist: xtr-logging-contracts>=5.0,<6
29
- Requires-Dist: xtr-password-hasher>=5.0,<6
30
- Requires-Dist: xtr-rate-limiter>=5.0,<6
17
+ Requires-Dist: xtr-security-core>=6.0,<7
18
+ Requires-Dist: xtr-security-csrf>=6.0,<7
19
+ Requires-Dist: xtr-http-kernel>=6.0,<7
20
+ Requires-Dist: xtr-http-foundation>=6.0,<7
21
+ Requires-Dist: xtr-http-message-contracts>=6.0,<7
22
+ Requires-Dist: xtr-http-client-contracts>=6.0,<7
23
+ Requires-Dist: xtr-cache-contracts>=6.0,<7
24
+ Requires-Dist: xtr-dependency-injection>=6.0,<7
25
+ Requires-Dist: xtr-event-dispatcher>=6.0,<7
26
+ Requires-Dist: xtr-event-dispatcher-contracts>=6.0,<7
27
+ Requires-Dist: xtr-clock>=6.0,<7
28
+ Requires-Dist: xtr-logging-contracts>=6.0,<7
29
+ Requires-Dist: xtr-password-hasher>=6.0,<7
30
+ Requires-Dist: xtr-rate-limiter>=6.0,<7
31
31
  Requires-Dist: fastapi>=0.123
32
32
  Requires-Dist: starlette>=0.40
33
33
  Requires-Dist: anyio>=4.0
@@ -215,8 +215,10 @@ dispatcher. At the request it matches the map, runs the matched firewall's chain
215
215
  routing, so a request no route would answer is still challenged as a request — and parks the
216
216
  matched firewall and its exception listener on the request's security state; a failure the
217
217
  chain raises is announced on the exception event and answered by that listener, exactly once;
218
- the finish of the request puts the stored listener away. A route documents its security with
219
- the framework's own params; the firewall contributes no OpenAPI scheme of its own.
218
+ a failure no listener answers is raised as it was raised, so the request fails rather than
219
+ going on with the rest of the chain — the access decision included — never asked. The finish
220
+ of the request puts the stored listener away. A route documents its security with the
221
+ framework's own params; the firewall contributes no OpenAPI scheme of its own.
220
222
 
221
223
  ### Firewall listeners
222
224
 
@@ -176,8 +176,10 @@ dispatcher. At the request it matches the map, runs the matched firewall's chain
176
176
  routing, so a request no route would answer is still challenged as a request — and parks the
177
177
  matched firewall and its exception listener on the request's security state; a failure the
178
178
  chain raises is announced on the exception event and answered by that listener, exactly once;
179
- the finish of the request puts the stored listener away. A route documents its security with
180
- the framework's own params; the firewall contributes no OpenAPI scheme of its own.
179
+ a failure no listener answers is raised as it was raised, so the request fails rather than
180
+ going on with the rest of the chain — the access decision included — never asked. The finish
181
+ of the request puts the stored listener away. A route documents its security with the
182
+ framework's own params; the firewall contributes no OpenAPI scheme of its own.
181
183
 
182
184
  ### Firewall listeners
183
185
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "xtr-security-http"
3
- version = "5.2.0"
3
+ version = "6.0.0"
4
4
  description = "The HTTP edge of xtr security: firewalls, authenticators, bearer access tokens and the request surface."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -23,20 +23,20 @@ classifiers = [
23
23
  "Typing :: Typed",
24
24
  ]
25
25
  dependencies = [
26
- "xtr-security-core>=5.0,<6",
27
- "xtr-security-csrf>=5.0,<6",
28
- "xtr-http-kernel>=5.0,<6",
29
- "xtr-http-foundation>=5.0,<6",
30
- "xtr-http-message-contracts>=5.0,<6",
31
- "xtr-http-client-contracts>=5.0,<6",
32
- "xtr-cache-contracts>=5.0,<6",
33
- "xtr-dependency-injection>=5.0,<6",
34
- "xtr-event-dispatcher>=5.0,<6",
35
- "xtr-event-dispatcher-contracts>=5.0,<6",
36
- "xtr-clock>=5.0,<6",
37
- "xtr-logging-contracts>=5.0,<6",
38
- "xtr-password-hasher>=5.0,<6",
39
- "xtr-rate-limiter>=5.0,<6",
26
+ "xtr-security-core>=6.0,<7",
27
+ "xtr-security-csrf>=6.0,<7",
28
+ "xtr-http-kernel>=6.0,<7",
29
+ "xtr-http-foundation>=6.0,<7",
30
+ "xtr-http-message-contracts>=6.0,<7",
31
+ "xtr-http-client-contracts>=6.0,<7",
32
+ "xtr-cache-contracts>=6.0,<7",
33
+ "xtr-dependency-injection>=6.0,<7",
34
+ "xtr-event-dispatcher>=6.0,<7",
35
+ "xtr-event-dispatcher-contracts>=6.0,<7",
36
+ "xtr-clock>=6.0,<7",
37
+ "xtr-logging-contracts>=6.0,<7",
38
+ "xtr-password-hasher>=6.0,<7",
39
+ "xtr-rate-limiter>=6.0,<7",
40
40
  "fastapi>=0.123",
41
41
  "starlette>=0.40",
42
42
  "anyio>=4.0",
@@ -59,10 +59,10 @@ dev = [
59
59
  "anyio>=4.0",
60
60
  "ty>=0.0.83",
61
61
  "joserfc>=1.7",
62
- "xtr-http-message>=5.0,<6",
63
- "xtr-http-client>=5.0,<6",
64
- "xtr-cache>=5.0,<6",
65
- "xtr-console>=5.0,<6",
62
+ "xtr-http-message>=6.0,<7",
63
+ "xtr-http-client>=6.0,<7",
64
+ "xtr-cache>=6.0,<7",
65
+ "xtr-console>=6.0,<7",
66
66
  ]
67
67
 
68
68
  [build-system]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "xtr-security-http"
3
- version = "5.2.0"
3
+ version = "6.0.0"
4
4
  description = "The HTTP edge of xtr security: firewalls, authenticators, bearer access tokens and the request surface."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -20,24 +20,24 @@ classifiers = [
20
20
  "Typing :: Typed",
21
21
  ]
22
22
  dependencies = [
23
- "xtr-security-core>=5.0,<6",
24
- "xtr-security-csrf>=5.0,<6",
25
- "xtr-http-kernel>=5.0,<6",
26
- "xtr-http-foundation>=5.0,<6",
27
- "xtr-http-message-contracts>=5.0,<6",
23
+ "xtr-security-core>=6.0,<7",
24
+ "xtr-security-csrf>=6.0,<7",
25
+ "xtr-http-kernel>=6.0,<7",
26
+ "xtr-http-foundation>=6.0,<7",
27
+ "xtr-http-message-contracts>=6.0,<7",
28
28
  # The client interface the introspection endpoint is reached through; the client
29
29
  # itself is installed by the application that introspects.
30
- "xtr-http-client-contracts>=5.0,<6",
30
+ "xtr-http-client-contracts>=6.0,<7",
31
31
  # The cache contract the introspection responses are cached under; the pool
32
32
  # behind it is the application's choice.
33
- "xtr-cache-contracts>=5.0,<6",
34
- "xtr-dependency-injection>=5.0,<6",
35
- "xtr-event-dispatcher>=5.0,<6",
36
- "xtr-event-dispatcher-contracts>=5.0,<6",
37
- "xtr-clock>=5.0,<6",
38
- "xtr-logging-contracts>=5.0,<6",
39
- "xtr-password-hasher>=5.0,<6",
40
- "xtr-rate-limiter>=5.0,<6",
33
+ "xtr-cache-contracts>=6.0,<7",
34
+ "xtr-dependency-injection>=6.0,<7",
35
+ "xtr-event-dispatcher>=6.0,<7",
36
+ "xtr-event-dispatcher-contracts>=6.0,<7",
37
+ "xtr-clock>=6.0,<7",
38
+ "xtr-logging-contracts>=6.0,<7",
39
+ "xtr-password-hasher>=6.0,<7",
40
+ "xtr-rate-limiter>=6.0,<7",
41
41
  "fastapi>=0.123",
42
42
  "starlette>=0.40",
43
43
  "anyio>=4.0",
@@ -59,12 +59,12 @@ dev = [
59
59
  "ty>=0.0.83",
60
60
  "joserfc>=1.7",
61
61
  # The tests match real requests, so they build the request messages.
62
- "xtr-http-message>=5.0,<6",
62
+ "xtr-http-message>=6.0,<7",
63
63
  # The tests drive the introspection endpoint through the scripted client and
64
64
  # cache the responses in the in-memory pool.
65
- "xtr-http-client>=5.0,<6",
66
- "xtr-cache>=5.0,<6",
67
- "xtr-console>=5.0,<6",
65
+ "xtr-http-client>=6.0,<7",
66
+ "xtr-cache>=6.0,<7",
67
+ "xtr-console>=6.0,<7",
68
68
  ]
69
69
 
70
70
  [build-system]
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from typing import TYPE_CHECKING, cast, final
6
6
 
7
- from joserfc import jwt
7
+ from joserfc import jws, jwt
8
8
  from joserfc.errors import InvalidKeyIdError, JoseError
9
9
  from joserfc.jwt import JWTClaimsRegistry
10
10
  from xtr_clock import SystemClock
@@ -122,15 +122,23 @@ class OidcTokenHandler:
122
122
  async def _decode(self, access_token: str) -> Token:
123
123
  """Verify the signature, refetching the key set once on an unknown ``kid``.
124
124
 
125
+ A header nesting deeper than the decoder follows is read before the
126
+ signature can be checked, and ends in a ``RecursionError`` on some
127
+ interpreters: the token cannot be read, so it is refused as any other.
128
+ A header that is no JSON object is refused before joserfc judges it,
129
+ and one whose members have the wrong shape — a ``crit`` that is no
130
+ list of names — fails joserfc's own check with a ``TypeError``.
131
+
125
132
  Raises:
126
133
  InvalidAccessTokenError: When the token cannot be verified.
127
134
  """
128
135
  try:
136
+ _require_object_header(access_token)
129
137
  key_set = await self._key_set_provider.get_key_set()
130
138
  return jwt.decode(access_token, key_set, algorithms=list(self._algorithms))
131
139
  except InvalidKeyIdError as error:
132
140
  return await self._decode_after_refresh(access_token, error)
133
- except (JoseError, OidcKeySetError, ValueError) as error:
141
+ except (JoseError, OidcKeySetError, ValueError, TypeError, RecursionError) as error:
134
142
  raise InvalidAccessTokenError(f"The token could not be verified: {error}") from error
135
143
 
136
144
  async def _decode_after_refresh(self, access_token: str, cause: InvalidKeyIdError) -> Token:
@@ -142,7 +150,7 @@ class OidcTokenHandler:
142
150
  try:
143
151
  key_set = await self._key_set_provider.get_key_set(force_refresh=True)
144
152
  return jwt.decode(access_token, key_set, algorithms=list(self._algorithms))
145
- except (JoseError, OidcKeySetError, ValueError) as error:
153
+ except (JoseError, OidcKeySetError, ValueError, TypeError, RecursionError) as error:
146
154
  raise InvalidAccessTokenError(
147
155
  f"The token names an unknown key: {cause}",
148
156
  ) from error
@@ -248,3 +256,18 @@ def _scopes(claims: Mapping[str, object]) -> list[str]:
248
256
  if isinstance(scp, (list, tuple)):
249
257
  return [str(one) for one in cast("Sequence[object]", scp)]
250
258
  return []
259
+
260
+
261
+ def _require_object_header(access_token: str) -> None:
262
+ """Refuse a token whose protected header is no JSON object.
263
+
264
+ joserfc reads the header's members by name, so an array or a string
265
+ standing where the object should be is turned away here, before it is
266
+ judged.
267
+
268
+ Raises:
269
+ InvalidAccessTokenError: When the header is no JSON object.
270
+ """
271
+ header = cast("object", jws.extract_compact(access_token.encode()).headers())
272
+ if not isinstance(header, dict):
273
+ raise InvalidAccessTokenError("The token header is not a JSON object.")
@@ -108,8 +108,10 @@ async def _payload_value(request: Request, token_key: str) -> str | None:
108
108
  """Read the value from the request payload: the JSON body, else the parsed form."""
109
109
  try:
110
110
  payload = cast("object", await request.json())
111
- except ValueError:
111
+ except (ValueError, RecursionError):
112
112
  # A body that is not JSON is not an error: the form is the payload then.
113
+ # Nesting deeper than the parser goes is a RecursionError, not a ValueError,
114
+ # and is the same body that does not decode.
113
115
  payload = None
114
116
  if isinstance(payload, dict):
115
117
  value = cast("Mapping[str, object]", payload).get(token_key)
@@ -67,8 +67,12 @@ class Firewall(EventSubscriberInterface):
67
67
  answers it — the matched firewall's stored listener first, the
68
68
  listeners that only observe the failure after it — has its response
69
69
  set on the request's event, so the request is answered rather than
70
- failing. A caller driving the events by hand, with no dispatcher
71
- handed to ``on_request``, sees the failure raise as it was raised.
70
+ failing. A failure no listener answers is raised as it was raised: the
71
+ steps after the one that failed — the access decision among them — never
72
+ ran, so letting the request go on would hand the route a request nobody
73
+ decided about. The firewall fails closed, and the request fails with the
74
+ error. A caller driving the events by hand, with no dispatcher handed to
75
+ ``on_request``, sees every failure raise as it was raised.
72
76
 
73
77
  The kernel has one lifecycle per request — no request is handled inside
74
78
  another — so the main-request-only guard the upstream subscriber opens
@@ -123,6 +127,9 @@ class Firewall(EventSubscriberInterface):
123
127
  dispatcher: Where a failure the chain raises is announced. The
124
128
  dispatcher passes itself; a caller driving the events by
125
129
  hand leaves it out and sees the failure raise.
130
+
131
+ Raises:
132
+ Exception: Whatever a step raised, when no listener answered it.
126
133
  """
127
134
  del name
128
135
  context = await self._firewall_map.match(event.request)
@@ -148,8 +155,9 @@ class Firewall(EventSubscriberInterface):
148
155
  raise
149
156
  failure = ExceptionEvent(event.request, event.state, error)
150
157
  _ = await dispatcher.dispatch(failure)
151
- if failure.response is not None:
152
- event.set_response(failure.response)
158
+ if failure.response is None:
159
+ raise
160
+ event.set_response(failure.response)
153
161
 
154
162
  async def on_exception(self, event: ExceptionEvent) -> None:
155
163
  """Route the failure to the listener of the firewall that ran the request.
@@ -66,7 +66,9 @@ class OidcIdToken:
66
66
  raise AuthenticationError("Invalid ID token format.") from error
67
67
  try:
68
68
  claims = cast("object", json.loads(payload or b""))
69
- except ValueError as error:
69
+ except (ValueError, RecursionError) as error:
70
+ # A nesting deeper than the decoder follows is a payload it
71
+ # cannot read, whichever of the two the interpreter raises.
70
72
  raise AuthenticationError("Invalid ID token payload.") from error
71
73
  if not isinstance(claims, dict):
72
74
  raise AuthenticationError("Invalid ID token payload.")
@@ -126,7 +126,10 @@ class OidcSignatureVerifier:
126
126
  # any request is sent to its JWKS — and no MAC algorithm is ever
127
127
  # accepted, so a public key published by the provider can never be
128
128
  # turned into the shared secret of an "HS256" token (key confusion).
129
- headers = cast("Mapping[str, object]", signature.headers())
129
+ protected = cast("object", signature.headers())
130
+ if not isinstance(protected, dict):
131
+ raise AuthenticationError("Invalid ID token format: the header is not a JSON object.")
132
+ headers = cast("Mapping[str, object]", protected)
130
133
  algorithm = headers.get("alg")
131
134
  if not isinstance(algorithm, str) or algorithm not in self._algorithms:
132
135
  expected = '", "'.join(self._algorithms)
@@ -145,7 +148,9 @@ class OidcSignatureVerifier:
145
148
  key_set = _key_set(keys)
146
149
  try:
147
150
  token = jwt.decode(id_token, key_set, algorithms=list(self._algorithms))
148
- except (JoseError, ValueError) as error:
151
+ except (JoseError, ValueError, TypeError) as error:
152
+ # A header member of the wrong shape (a ``crit`` that is no list
153
+ # of names) fails joserfc's header check with a TypeError.
149
154
  raise AuthenticationError(
150
155
  f"The ID token signature could not be verified: {error}",
151
156
  ) from error