pulpcore 3.119.2__tar.gz → 3.121.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 (534) hide show
  1. {pulpcore-3.119.2 → pulpcore-3.121.0}/CHANGES.md +198 -0
  2. {pulpcore-3.119.2 → pulpcore-3.121.0}/PKG-INFO +5 -4
  3. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/tasks/synchronizing.py +0 -3
  6. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/access_policy.py +12 -0
  7. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/apps.py +1 -1
  8. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/checks.py +102 -0
  9. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/publication.py +4 -3
  10. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/role_util.py +22 -0
  11. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/settings.py +2 -0
  12. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/vulnerability_report.py +3 -1
  13. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/util.py +20 -0
  14. pulpcore-3.121.0/pulpcore/app/workload_identity/__init__.py +5 -0
  15. pulpcore-3.121.0/pulpcore/app/workload_identity/authentication.py +100 -0
  16. pulpcore-3.121.0/pulpcore/app/workload_identity/authz.py +129 -0
  17. pulpcore-3.121.0/pulpcore/app/workload_identity/backend.py +42 -0
  18. pulpcore-3.121.0/pulpcore/app/workload_identity/config.py +44 -0
  19. pulpcore-3.121.0/pulpcore/app/workload_identity/principal.py +66 -0
  20. pulpcore-3.121.0/pulpcore/app/workload_identity/rules.py +32 -0
  21. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/cache/cache.py +18 -9
  22. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/handler.py +96 -6
  23. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/pytest_plugin.py +7 -8
  24. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/worker.py +1 -3
  25. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_workers.py +2 -1
  26. pulpcore-3.121.0/pulpcore/tests/functional/api/using_plugin/test_cdn_cache_validation.py +267 -0
  27. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_publication_retention.py +9 -10
  28. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_vulnerability_report.py +32 -0
  29. pulpcore-3.121.0/pulpcore/tests/unit/workload_identity/__init__.py +0 -0
  30. pulpcore-3.121.0/pulpcore/tests/unit/workload_identity/test_workload_identity.py +653 -0
  31. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/PKG-INFO +5 -4
  32. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/SOURCES.txt +11 -1
  33. pulpcore-3.121.0/pulpcore.egg-info/dependency_links.txt +1 -0
  34. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/requires.txt +4 -3
  35. {pulpcore-3.119.2 → pulpcore-3.121.0}/pyproject.toml +6 -5
  36. pulpcore-3.119.2/pulp_file/app/settings.py +0 -1
  37. {pulpcore-3.119.2 → pulpcore-3.121.0}/CODE_OF_CONDUCT.md +0 -0
  38. {pulpcore-3.119.2 → pulpcore-3.121.0}/COMMITMENT +0 -0
  39. {pulpcore-3.119.2 → pulpcore-3.121.0}/CONTRIBUTING.md +0 -0
  40. {pulpcore-3.119.2 → pulpcore-3.121.0}/COPYRIGHT +0 -0
  41. {pulpcore-3.119.2 → pulpcore-3.121.0}/LICENSE +0 -0
  42. {pulpcore-3.119.2 → pulpcore-3.121.0}/MANIFEST.in +0 -0
  43. {pulpcore-3.119.2 → pulpcore-3.121.0}/README.md +0 -0
  44. {pulpcore-3.119.2 → pulpcore-3.121.0}/ci_requirements.txt +0 -0
  45. {pulpcore-3.119.2 → pulpcore-3.121.0}/functest_requirements.txt +0 -0
  46. {pulpcore-3.119.2 → pulpcore-3.121.0}/manage.py +0 -0
  47. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/__init__.py +0 -0
  48. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  49. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  50. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/migrations/__init__.py +0 -0
  51. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/models.py +0 -0
  52. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/serializers.py +0 -0
  53. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/viewsets.py +0 -0
  54. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/pytest_plugin.py +0 -0
  55. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/rhsm/__init__.py +0 -0
  56. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  57. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/__init__.py +0 -0
  58. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/__init__.py +0 -0
  59. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  60. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  61. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  62. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  63. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  64. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  65. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  66. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  67. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  68. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  69. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  70. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  71. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  72. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  73. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  74. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  75. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  76. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  77. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  78. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  79. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  80. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  81. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  82. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  83. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  84. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  85. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  86. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  87. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  88. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  89. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  90. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  91. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/conftest.py +0 -0
  92. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/constants.py +0 -0
  93. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/unit/__init__.py +0 -0
  94. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/unit/certdata.py +0 -0
  95. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  96. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/__init__.py +0 -0
  97. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  98. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  99. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0018_alter_filecontent_options.py +0 -0
  100. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0019_add_filegitremote.py +0 -0
  101. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0020_filerepository_last_sync_details.py +0 -0
  102. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/__init__.py +0 -0
  103. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/modelresource.py +0 -0
  104. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/models.py +0 -0
  105. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/replica.py +0 -0
  106. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/serializers.py +0 -0
  107. /pulpcore-3.119.2/pulpcore.egg-info/dependency_links.txt → /pulpcore-3.121.0/pulp_file/app/settings.py +0 -0
  108. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/tasks/__init__.py +0 -0
  109. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/tasks/publishing.py +0 -0
  110. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/viewsets.py +0 -0
  111. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/manifest.py +0 -0
  112. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/pytest_plugin.py +0 -0
  113. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/__init__.py +0 -0
  114. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/__init__.py +0 -0
  115. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/__init__.py +0 -0
  116. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
  117. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  118. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  119. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  120. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  121. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  122. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_distributed_publication.py +0 -0
  123. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
  124. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  125. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
  126. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  127. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_git_sync.py +0 -0
  128. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
  129. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  130. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_overwrite_content.py +0 -0
  131. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
  132. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  133. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  134. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  135. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
  136. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_sync_optimization.py +0 -0
  137. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/__init__.py +0 -0
  138. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_git_sync.py +0 -0
  139. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  140. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_serializers.py +0 -0
  141. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_sync_optimization.py +0 -0
  142. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/__init__.py +0 -0
  143. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/__init__.py +0 -0
  144. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/authentication.py +0 -0
  145. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/contexts.py +0 -0
  146. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/entrypoint.py +0 -0
  147. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/files.py +0 -0
  148. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/find_url.py +0 -0
  149. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/global_access_conditions.py +0 -0
  150. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/importexport.py +0 -0
  151. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/loggers.py +0 -0
  152. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/manage.py +0 -0
  153. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/__init__.py +0 -0
  154. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/__init__.py +0 -0
  155. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  156. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  157. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  158. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  159. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/datarepair.py +0 -0
  160. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  161. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  162. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  163. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/list-signing-services.py +0 -0
  164. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
  165. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/openapi.py +0 -0
  166. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/optimizemigration.py +0 -0
  167. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  168. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
  169. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  170. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/repository-size.py +0 -0
  171. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  172. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  173. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/shell.py +0 -0
  174. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  175. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
  176. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  177. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  178. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  179. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  180. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  181. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  182. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  183. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  184. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  185. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  186. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  187. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  188. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  189. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  190. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  191. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  192. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  193. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  194. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  195. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  196. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  197. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  198. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  199. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  200. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  201. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  202. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  203. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  204. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  205. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  206. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  207. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  208. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  209. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  210. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  211. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  212. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  213. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  214. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  215. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  216. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  217. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  218. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  219. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  220. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  221. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  222. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  223. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  224. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
  225. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
  226. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
  227. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0142_task_result.py +0 -0
  228. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
  229. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
  230. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
  231. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0146_repository_retain_checkpoints.py +0 -0
  232. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0147_content_pulp_labels_gin.py +0 -0
  233. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0148_artifact_artifact_domain_size_index.py +0 -0
  234. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0149_distributedpublication.py +0 -0
  235. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0150_taskschedule_task_kwargs.py +0 -0
  236. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0151_upstreampulp_connect_timeout_and_more.py +0 -0
  237. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0152_alter_repositoryversion_content_ids.py +0 -0
  238. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0153_taskschedule_pulp_domain_alter_taskschedule_name_and_more.py +0 -0
  239. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0154_task_api_version.py +0 -0
  240. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0155_create_rel_path_domains.py +0 -0
  241. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0156_alter_contentartifact_relative_path_and_more.py +0 -0
  242. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0157_distribution_base_path_constraint.py +0 -0
  243. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0158_domain_default_content_guard.py +0 -0
  244. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0159_alter_contentartifact_relative_path_and_more.py +0 -0
  245. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0160_envvarheadercontentguard.py +0 -0
  246. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/__init__.py +0 -0
  247. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/mime_types.py +0 -0
  248. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/modelresource.py +0 -0
  249. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/__init__.py +0 -0
  250. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/access_policy.py +0 -0
  251. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/acs.py +0 -0
  252. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/analytics.py +0 -0
  253. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/base.py +0 -0
  254. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/content.py +0 -0
  255. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/domain.py +0 -0
  256. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/exporter.py +0 -0
  257. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/fields.py +0 -0
  258. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/generic.py +0 -0
  259. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/importer.py +0 -0
  260. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/openpgp.py +0 -0
  261. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/progress.py +0 -0
  262. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/replica.py +0 -0
  263. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/repository.py +0 -0
  264. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/role.py +0 -0
  265. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/status.py +0 -0
  266. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/storage.py +0 -0
  267. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/task.py +0 -0
  268. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/upload.py +0 -0
  269. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/vulnerability_report.py +0 -0
  270. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/netutil.py +0 -0
  271. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/openpgp.py +0 -0
  272. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/protobuf/__init__.py +0 -0
  273. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  274. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/pulp_hashlib.py +0 -0
  275. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  276. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/redis_connection.py +0 -0
  277. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/replica.py +0 -0
  278. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/response.py +0 -0
  279. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/__init__.py +0 -0
  280. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/access_policy.py +0 -0
  281. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/acs.py +0 -0
  282. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/base.py +0 -0
  283. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/content.py +0 -0
  284. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/domain.py +0 -0
  285. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/exporter.py +0 -0
  286. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/fields.py +0 -0
  287. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/importer.py +0 -0
  288. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/openpgp.py +0 -0
  289. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/orphans.py +0 -0
  290. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/progress.py +0 -0
  291. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/publication.py +0 -0
  292. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/purge.py +0 -0
  293. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/reclaim.py +0 -0
  294. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/repair.py +0 -0
  295. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/replica.py +0 -0
  296. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/repository.py +0 -0
  297. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/status.py +0 -0
  298. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/task.py +0 -0
  299. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/upload.py +0 -0
  300. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/user.py +0 -0
  301. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  302. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/__init__.py +0 -0
  303. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/analytics.py +0 -0
  304. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/base.py +0 -0
  305. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/datarepair.py +0 -0
  306. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/export.py +0 -0
  307. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/importer.py +0 -0
  308. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/migrate.py +0 -0
  309. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/orphan.py +0 -0
  310. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/purge.py +0 -0
  311. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
  312. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/replica.py +0 -0
  313. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/repository.py +0 -0
  314. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/telemetry.py +0 -0
  315. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/test.py +0 -0
  316. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/upload.py +0 -0
  317. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
  318. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/templatetags/__init__.py +0 -0
  319. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  320. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/urls.py +0 -0
  321. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/__init__.py +0 -0
  322. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/datarepair.py +0 -0
  323. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/importer.py +0 -0
  324. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/orphans.py +0 -0
  325. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/repair.py +0 -0
  326. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/status.py +0 -0
  327. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/__init__.py +0 -0
  328. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/access_policy.py +0 -0
  329. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/acs.py +0 -0
  330. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/base.py +0 -0
  331. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/content.py +0 -0
  332. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
  333. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/domain.py +0 -0
  334. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/exporter.py +0 -0
  335. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/importer.py +0 -0
  336. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/openpgp.py +0 -0
  337. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/orphans.py +0 -0
  338. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/publication.py +0 -0
  339. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/reclaim.py +0 -0
  340. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/replica.py +0 -0
  341. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/repository.py +0 -0
  342. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/task.py +0 -0
  343. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/upload.py +0 -0
  344. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/user.py +0 -0
  345. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  346. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/wsgi.py +0 -0
  347. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/backends.py +0 -0
  348. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/cache/__init__.py +0 -0
  349. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/constants.py +0 -0
  350. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/__init__.py +0 -0
  351. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/authentication.py +0 -0
  352. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/entrypoint.py +0 -0
  353. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/instrumentation.py +0 -0
  354. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/__init__.py +0 -0
  355. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/base.py +0 -0
  356. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/factory.py +0 -0
  357. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/file.py +0 -0
  358. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/http.py +0 -0
  359. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/__init__.py +0 -0
  360. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/base.py +0 -0
  361. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/plugin.py +0 -0
  362. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/validation.py +0 -0
  363. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/filters.py +0 -0
  364. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/metrics.py +0 -0
  365. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/middleware.py +0 -0
  366. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/migrations.py +0 -0
  367. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/openapi/__init__.py +0 -0
  368. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/openapi/hooks.py +0 -0
  369. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/__init__.py +0 -0
  370. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/access_policy.py +0 -0
  371. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/actions.py +0 -0
  372. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/apps.py +0 -0
  373. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/authentication/__init__.py +0 -0
  374. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/cache/__init__.py +0 -0
  375. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/constants.py +0 -0
  376. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/content.py +0 -0
  377. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/download/__init__.py +0 -0
  378. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/exceptions.py +0 -0
  379. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/files.py +0 -0
  380. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/find_url.py +0 -0
  381. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/importexport.py +0 -0
  382. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/migrations.py +0 -0
  383. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/modelresources.py +0 -0
  384. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/models/__init__.py +0 -0
  385. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/models/role.py +0 -0
  386. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/publication_utils.py +0 -0
  387. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
  388. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/replica.py +0 -0
  389. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/repo_version_utils.py +0 -0
  390. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/responses.py +0 -0
  391. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/serializers/__init__.py +0 -0
  392. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/serializers/content.py +0 -0
  393. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/__init__.py +0 -0
  394. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/api.py +0 -0
  395. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  396. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/content_stages.py +0 -0
  397. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
  398. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/models.py +0 -0
  399. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/storage.py +0 -0
  400. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/sync.py +0 -0
  401. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/tasking.py +0 -0
  402. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/util.py +0 -0
  403. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
  404. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/viewsets/content.py +0 -0
  405. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/responses.py +0 -0
  406. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/__init__.py +0 -0
  407. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/_util.py +0 -0
  408. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/entrypoint.py +0 -0
  409. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/kafka.py +0 -0
  410. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/redis_locks.py +0 -0
  411. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/redis_tasks.py +0 -0
  412. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/redis_worker.py +0 -0
  413. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/storage.py +0 -0
  414. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/tasks.py +0 -0
  415. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/__init__.py +0 -0
  416. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/__init__.py +0 -0
  417. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/__init__.py +0 -0
  418. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  419. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  420. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  421. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  422. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
  423. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  424. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  425. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
  426. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
  427. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_login.py +0 -0
  428. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  429. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  430. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
  431. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
  432. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_role.py +0 -0
  433. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  434. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  435. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  436. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_status.py +0 -0
  437. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  438. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_tasking.py +0 -0
  439. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
  440. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  441. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_v4_status.py +0 -0
  442. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  443. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  444. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  445. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  446. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  447. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  448. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  449. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  450. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  451. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  452. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
  453. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
  454. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  455. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  456. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  457. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  458. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  459. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  460. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
  461. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  462. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  463. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  464. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  465. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  466. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
  467. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  468. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/utils.py +0 -0
  469. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/performance/__init__.py +0 -0
  470. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/performance/test_performance.py +0 -0
  471. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/__init__.py +0 -0
  472. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/conftest.py +0 -0
  473. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/content/__init__.py +0 -0
  474. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
  475. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
  476. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/__init__.py +0 -0
  477. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  478. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  479. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/test_downloader_file.py +0 -0
  480. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  481. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  482. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  483. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  484. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
  485. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/__init__.py +0 -0
  486. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_base.py +0 -0
  487. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_content.py +0 -0
  488. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_content_ids_migration.py +0 -0
  489. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_distribution.py +0 -0
  490. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
  491. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_repository.py +0 -0
  492. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_task.py +0 -0
  493. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
  494. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/roles/test_adjust_roles.py +0 -0
  495. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  496. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  497. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  498. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  499. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  500. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  501. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  502. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  503. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  504. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
  505. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  506. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/test_resource_budget.py +0 -0
  507. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  508. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/__init__.py +0 -0
  509. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_delete_tasks.py +0 -0
  510. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_missing_worker_cleanup.py +0 -0
  511. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_orphan_redis_locks.py +0 -0
  512. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_redis_fetch_task.py +0 -0
  513. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_waiting_tasks_metric.py +0 -0
  514. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_cache.py +0 -0
  515. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  516. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
  517. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_fetch_task_hol_blocking.py +0 -0
  518. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_files.py +0 -0
  519. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_gpg_verify.py +0 -0
  520. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
  521. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_list_signing_services_command.py +0 -0
  522. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_middleware.py +0 -0
  523. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  524. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_replica.py +0 -0
  525. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_settings.py +0 -0
  526. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_util.py +0 -0
  527. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
  528. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  529. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  530. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/entry_points.txt +0 -0
  531. {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/top_level.txt +0 -0
  532. {pulpcore-3.119.2 → pulpcore-3.121.0}/setup.cfg +0 -0
  533. {pulpcore-3.119.2 → pulpcore-3.121.0}/test_requirements.txt +0 -0
  534. {pulpcore-3.119.2 → pulpcore-3.121.0}/unittest_requirements.txt +0 -0
@@ -8,6 +8,69 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.121.0 (2026-10-06) {: #3.121.0 }
12
+
13
+ ### REST API {: #3.121.0-rest-api }
14
+
15
+ #### Features {: #3.121.0-rest-api-feature }
16
+
17
+ - Added `ETag`/`If-None-Match` and `Last-Modified`/`If-Modified-Since` (`304 Not Modified`) support on content-app responses so edge caches can revalidate without re-downloading.
18
+ [#7929](https://github.com/pulp/pulpcore/issues/7929)
19
+
20
+ #### Bugfixes {: #3.121.0-rest-api-bugfix }
21
+
22
+ - Avoid loading repository version content IDs when serving fallback content during the grace period.
23
+ - Fixed vulnerability report rescans to update existing reports.
24
+
25
+ ### Plugin API {: #3.121.0-plugin-api }
26
+
27
+ No significant changes.
28
+
29
+ ### Pulp File {: #3.121.0-pulp-file }
30
+
31
+ #### Bugfixes {: #3.121.0-pulp-file-bugfix }
32
+
33
+ - Fixed `optimize` in file sync to honor the value `False`.
34
+ [#8141](https://github.com/pulp/pulpcore/issues/8141)
35
+
36
+ ### Pulp Cert Guard {: #3.121.0-pulp-cert-guard }
37
+
38
+ No significant changes.
39
+
40
+ ---
41
+
42
+ ## 3.120.0 (2026-09-29) {: #3.120.0 }
43
+
44
+ ### REST API {: #3.120.0-rest-api }
45
+
46
+ #### Features {: #3.120.0-rest-api-feature }
47
+
48
+ - Added workload identity authentication, so a CI job can authenticate with a short-lived OIDC token instead of a stored secret and receive per-request roles computed from the `WORKLOAD_IDENTITY` setting.
49
+
50
+ #### Bugfixes {: #3.120.0-rest-api-bugfix }
51
+
52
+ - Improved the performance of the latest publication lookup when serving content
53
+ from a repository-backed distribution.
54
+ [#1995](https://github.com/pulp/pulpcore/issues/1995)
55
+ - Fixed file downloader path sanitation. CVE-2026-90959
56
+ - Fixed the `long_running` pytest-mark, so that it correctly applies even when "nightly"
57
+ is selected. This includes fixing a window in the task-cleanup path, where a missing
58
+ worker's jobs were not getting cleaned up until a new task entered the system.
59
+
60
+ ### Plugin API {: #3.120.0-plugin-api }
61
+
62
+ No significant changes.
63
+
64
+ ### Pulp File {: #3.120.0-pulp-file }
65
+
66
+ No significant changes.
67
+
68
+ ### Pulp Cert Guard {: #3.120.0-pulp-cert-guard }
69
+
70
+ No significant changes.
71
+
72
+ ---
73
+
11
74
  ## 3.119.2 (2026-09-29) {: #3.119.2 }
12
75
 
13
76
  ### REST API {: #3.119.2-rest-api }
@@ -1210,6 +1273,52 @@ No significant changes.
1210
1273
 
1211
1274
  ---
1212
1275
 
1276
+ ## 3.105.21 (2026-10-01) {: #3.105.21 }
1277
+
1278
+ ### REST API {: #3.105.21-rest-api }
1279
+
1280
+ #### Bugfixes {: #3.105.21-rest-api-bugfix }
1281
+
1282
+ - Preserve OpenPGP verification compatibility for failed signatures and fix key ID calculation for OpenPGP v6.
1283
+
1284
+ ### Plugin API {: #3.105.21-plugin-api }
1285
+
1286
+ No significant changes.
1287
+
1288
+ ### Pulp File {: #3.105.21-pulp-file }
1289
+
1290
+ No significant changes.
1291
+
1292
+ ### Pulp Cert Guard {: #3.105.21-pulp-cert-guard }
1293
+
1294
+ No significant changes.
1295
+
1296
+ ---
1297
+
1298
+ ## 3.105.20 (2026-09-23) {: #3.105.20 }
1299
+
1300
+ ### REST API {: #3.105.20-rest-api }
1301
+
1302
+ #### Bugfixes {: #3.105.20-rest-api-bugfix }
1303
+
1304
+ - Fixed file downloader path sanitation. CVE-2026-90959
1305
+ - Fixed post-migrate hooks to prevent failing on incomplete or rolled back migrations.
1306
+ - Reduce the number and size of queries made for each content app request.
1307
+
1308
+ ### Plugin API {: #3.105.20-plugin-api }
1309
+
1310
+ No significant changes.
1311
+
1312
+ ### Pulp File {: #3.105.20-pulp-file }
1313
+
1314
+ No significant changes.
1315
+
1316
+ ### Pulp Cert Guard {: #3.105.20-pulp-cert-guard }
1317
+
1318
+ No significant changes.
1319
+
1320
+ ---
1321
+
1213
1322
  ## 3.105.19 (2026-09-02) {: #3.105.19 }
1214
1323
 
1215
1324
  ### REST API {: #3.105.19-rest-api }
@@ -2652,6 +2761,29 @@ No significant changes.
2652
2761
 
2653
2762
  ---
2654
2763
 
2764
+ ## 3.85.31 (2026-09-23) {: #3.85.31 }
2765
+
2766
+ ### REST API {: #3.85.31-rest-api }
2767
+
2768
+ #### Bugfixes {: #3.85.31-rest-api-bugfix }
2769
+
2770
+ - Fixed file downloader path sanitation. CVE-2026-90959
2771
+ - Fixed post-migrate hooks to prevent failing on incomplete or rolled back migrations.
2772
+
2773
+ ### Plugin API {: #3.85.31-plugin-api }
2774
+
2775
+ No significant changes.
2776
+
2777
+ ### Pulp File {: #3.85.31-pulp-file }
2778
+
2779
+ No significant changes.
2780
+
2781
+ ### Pulp Cert Guard {: #3.85.31-pulp-cert-guard }
2782
+
2783
+ No significant changes.
2784
+
2785
+ ---
2786
+
2655
2787
  ## 3.85.30 (2026-09-01) {: #3.85.30 }
2656
2788
 
2657
2789
  ### REST API {: #3.85.30-rest-api }
@@ -4115,6 +4247,28 @@ No significant changes.
4115
4247
 
4116
4248
  ---
4117
4249
 
4250
+ ## 3.73.45 (2026-09-24) {: #3.73.45 }
4251
+
4252
+ ### REST API {: #3.73.45-rest-api }
4253
+
4254
+ #### Bugfixes {: #3.73.45-rest-api-bugfix }
4255
+
4256
+ - Fixed file downloader path sanitation. CVE-2026-90959
4257
+
4258
+ ### Plugin API {: #3.73.45-plugin-api }
4259
+
4260
+ No significant changes.
4261
+
4262
+ ### Pulp File {: #3.73.45-pulp-file }
4263
+
4264
+ No significant changes.
4265
+
4266
+ ### Pulp Cert Guard {: #3.73.45-pulp-cert-guard }
4267
+
4268
+ No significant changes.
4269
+
4270
+ ---
4271
+
4118
4272
  ## 3.73.44 (2026-09-02) {: #3.73.44 }
4119
4273
 
4120
4274
  ### REST API {: #3.73.44-rest-api }
@@ -5822,6 +5976,28 @@ No significant changes.
5822
5976
 
5823
5977
  ---
5824
5978
 
5979
+ ## 3.63.48 (2026-09-24) {: #3.63.48 }
5980
+
5981
+ ### REST API {: #3.63.48-rest-api }
5982
+
5983
+ #### Bugfixes {: #3.63.48-rest-api-bugfix }
5984
+
5985
+ - Fixed file downloader path sanitation. CVE-2026-90959
5986
+
5987
+ ### Plugin API {: #3.63.48-plugin-api }
5988
+
5989
+ No significant changes.
5990
+
5991
+ ### Pulp File {: #3.63.48-pulp-file }
5992
+
5993
+ No significant changes.
5994
+
5995
+ ### Pulp Cert Guard {: #3.63.48-pulp-cert-guard }
5996
+
5997
+ No significant changes.
5998
+
5999
+ ---
6000
+
5825
6001
  ## 3.63.47 (2026-09-02) {: #3.63.47 }
5826
6002
 
5827
6003
  ### REST API {: #3.63.47-rest-api }
@@ -7747,6 +7923,28 @@ No significant changes.
7747
7923
 
7748
7924
  ---
7749
7925
 
7926
+ ## 3.49.71 (2026-09-24) {: #3.49.71 }
7927
+
7928
+ ### REST API {: #3.49.71-rest-api }
7929
+
7930
+ #### Bugfixes {: #3.49.71-rest-api-bugfix }
7931
+
7932
+ - Fixed file downloader path sanitation. CVE-2026-90959
7933
+
7934
+ ### Plugin API {: #3.49.71-plugin-api }
7935
+
7936
+ No significant changes.
7937
+
7938
+ ### Pulp File {: #3.49.71-pulp-file }
7939
+
7940
+ No significant changes.
7941
+
7942
+ ### Pulp Cert Guard {: #3.49.71-pulp-cert-guard }
7943
+
7944
+ No significant changes.
7945
+
7946
+ ---
7947
+
7750
7948
  ## 3.49.70 (2026-09-02) {: #3.49.70 }
7751
7949
 
7752
7950
  ### REST API {: #3.49.70-rest-api }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.119.2
3
+ Version: 3.121.0
4
4
  Summary: Pulp Django Application and Related Modules
5
5
  Author-email: Pulp Team <pulp-list@redhat.com>
6
6
  License-Expression: GPL-2.0-or-later
@@ -25,6 +25,7 @@ Requires-Dist: asyncio-throttle<=1.0.2,>=1.0
25
25
  Requires-Dist: backoff<2.3,>=2.1.2
26
26
  Requires-Dist: click<8.6,>=8.1.0
27
27
  Requires-Dist: cryptography<51.0,>=49.0.0
28
+ Requires-Dist: pyjwt<3,>=2.4
28
29
  Requires-Dist: Django<5.3,>=5.2.0
29
30
  Requires-Dist: django-filter<=26.1,>=24.3
30
31
  Requires-Dist: django-guid<3.7,>=3.4.0
@@ -41,9 +42,9 @@ Requires-Dist: gunicorn<26.3.0,>=22.0
41
42
  Requires-Dist: jinja2<=3.1.6,>=3.1
42
43
  Requires-Dist: json_stream<2.6,>=2.3.2
43
44
  Requires-Dist: jq<1.13.0,>=1.6.0
44
- Requires-Dist: opentelemetry-api<1.45,>=1.27.0
45
- Requires-Dist: opentelemetry-sdk<1.45,>=1.27.0
46
- Requires-Dist: opentelemetry-exporter-otlp-proto-http<1.45,>=1.27.0
45
+ Requires-Dist: opentelemetry-api<1.46,>=1.27.0
46
+ Requires-Dist: opentelemetry-sdk<1.46,>=1.27.0
47
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http<1.46,>=1.27.0
47
48
  Requires-Dist: protobuf<8.0,>=4.21.1
48
49
  Requires-Dist: pulp-glue<0.41,>=0.35.0
49
50
  Requires-Dist: PyOpenSSL<27.0,>=26.3.0
@@ -6,6 +6,6 @@ class PulpCertGuardPluginAppConfig(PulpPluginAppConfig):
6
6
 
7
7
  name = "pulp_certguard.app"
8
8
  label = "certguard"
9
- version = "3.119.2"
9
+ version = "3.121.0"
10
10
  python_package_name = "pulpcore"
11
11
  domain_compatible = True
@@ -8,6 +8,6 @@ class PulpFilePluginAppConfig(PulpPluginAppConfig):
8
8
 
9
9
  name = "pulp_file.app"
10
10
  label = "file"
11
- version = "3.119.2"
11
+ version = "3.121.0"
12
12
  python_package_name = "pulpcore"
13
13
  domain_compatible = True
@@ -7,7 +7,6 @@ from gettext import gettext as _
7
7
  from hashlib import sha256
8
8
  from urllib.parse import quote, urlparse, urlunparse
9
9
 
10
- from django.conf import settings
11
10
  from django.core.files import File
12
11
 
13
12
  from pulpcore.plugin.exceptions import SyncError
@@ -113,8 +112,6 @@ def synchronize(remote_pk, repository_pk, mirror, optimize=False, url=None, **kw
113
112
  remote = Remote.objects.get(pk=remote_pk).cast()
114
113
  repository = FileRepository.objects.get(pk=repository_pk)
115
114
 
116
- optimize = optimize or settings.FILE_SYNC_OPTIMIZATION
117
-
118
115
  if not remote.url:
119
116
  raise SyncError(_("A remote must have a url specified to synchronize."))
120
117
 
@@ -1,6 +1,7 @@
1
1
  from copy import deepcopy
2
2
 
3
3
  from django.conf import settings
4
+ from django.contrib.auth import get_user_model
4
5
  from rest_access_policy import AccessPolicy
5
6
  from rest_framework.exceptions import APIException
6
7
 
@@ -15,6 +16,17 @@ class DefaultAccessPolicy(AccessPolicy):
15
16
  An AccessPolicy that takes default statements from the view(set).
16
17
  """
17
18
 
19
+ def get_user_group_values(self, user):
20
+ """Read groups from the ORM only for real database users.
21
+
22
+ drf-access-policy assumes groups live in `django.contrib.auth` and prefetches them,
23
+ which does not work for a stateless principal. Any non-database user (a workload-identity
24
+ principal, or another one added later) supplies its groups via a `group_names` attribute.
25
+ """
26
+ if isinstance(user, get_user_model()):
27
+ return super().get_user_group_values(user)
28
+ return list(getattr(user, "group_names", []))
29
+
18
30
  @classmethod
19
31
  def get_access_policy(cls, view):
20
32
  """
@@ -238,7 +238,7 @@ class PulpAppConfig(PulpPluginAppConfig):
238
238
  label = "core"
239
239
 
240
240
  # The version of this app
241
- version = "3.119.2"
241
+ version = "3.121.0"
242
242
 
243
243
  # The python package name providing this app
244
244
  python_package_name = "pulpcore"
@@ -123,3 +123,105 @@ def check_artifact_checksums(app_configs, **kwargs):
123
123
  )
124
124
 
125
125
  return messages
126
+
127
+
128
+ _WORKLOAD_IDENTITY_BACKEND = "pulpcore.app.workload_identity.backend.WorkloadIdentityBackend"
129
+
130
+
131
+ @register(deploy=True)
132
+ def workload_identity_reserved_username(app_configs, **kwargs):
133
+ if _WORKLOAD_IDENTITY_BACKEND not in settings.AUTHENTICATION_BACKENDS:
134
+ return []
135
+
136
+ from pulpcore.app.workload_identity import config
137
+
138
+ messages = []
139
+ if not config.config():
140
+ return messages
141
+
142
+ username = config.basic_username()
143
+ try:
144
+ from django.contrib.auth import get_user_model
145
+
146
+ collides = get_user_model().objects.filter(username=username).exists()
147
+ except Exception:
148
+ return messages
149
+
150
+ if collides:
151
+ messages.append(
152
+ CheckWarning(
153
+ f"The WORKLOAD_IDENTITY basic_auth_username '{username}' is also a database user. "
154
+ "A token presented with this username over Basic auth is validated as a workload "
155
+ "identity token, not as that user's password. Set basic_auth_username to a name "
156
+ "that is not a real user to avoid ambiguity.",
157
+ id="pulpcore.W006",
158
+ )
159
+ )
160
+
161
+ return messages
162
+
163
+
164
+ @register(deploy=True)
165
+ def workload_identity_domain_scopes(app_configs, **kwargs):
166
+ if _WORKLOAD_IDENTITY_BACKEND not in settings.AUTHENTICATION_BACKENDS:
167
+ return []
168
+
169
+ from pulpcore.app.workload_identity import config
170
+
171
+ messages = []
172
+ if settings.DOMAIN_ENABLED or not config.config():
173
+ return messages
174
+
175
+ uses_domain = any(
176
+ grant.get("scope", {}).get("type") == "domain" or "domain" in grant.get("scope", {})
177
+ for provider in config.providers().values()
178
+ for rule in provider.get("rules", [])
179
+ for grant in rule.get("grants", [])
180
+ )
181
+ if uses_domain:
182
+ messages.append(
183
+ CheckWarning(
184
+ "WORKLOAD_IDENTITY has grant scopes that reference a domain, but DOMAIN_ENABLED is "
185
+ "False. Domain scoping has no effect while domains are disabled.",
186
+ id="pulpcore.W007",
187
+ )
188
+ )
189
+
190
+ return messages
191
+
192
+
193
+ @register(deploy=True)
194
+ def workload_identity_unqualified_name_scopes(app_configs, **kwargs):
195
+ if _WORKLOAD_IDENTITY_BACKEND not in settings.AUTHENTICATION_BACKENDS:
196
+ return []
197
+
198
+ from pulpcore.app.workload_identity import config
199
+
200
+ messages = []
201
+ if not settings.DOMAIN_ENABLED or not config.config():
202
+ return messages
203
+
204
+ risky = False
205
+ for provider in config.providers().values():
206
+ for rule in provider.get("rules", []):
207
+ for grant in rule.get("grants", []):
208
+ scope = grant.get("scope", {})
209
+ if (
210
+ scope.get("type") == "object"
211
+ and "name" in scope
212
+ and "domain" not in scope
213
+ and "prn" not in scope
214
+ ):
215
+ risky = True
216
+
217
+ if risky:
218
+ messages.append(
219
+ CheckWarning(
220
+ "WORKLOAD_IDENTITY has object scopes matched by name only while DOMAIN_ENABLED is "
221
+ "True. A bare name matches that object in every domain, breaking domain isolation. "
222
+ "Add a 'domain' to the scope or use a 'prn'.",
223
+ id="pulpcore.W008",
224
+ )
225
+ )
226
+
227
+ return messages
@@ -868,7 +868,7 @@ class Distribution(MasterModel):
868
868
 
869
869
  def get_fallback_ca(self, path):
870
870
  """
871
- Return a ContentArtifact for path from the grace-period publication history, or None.
871
+ Return the ContentArtifact and RepositoryVersion for path from publication history, or None.
872
872
 
873
873
  Iterates DistributedPublication records for this distribution from newest to oldest,
874
874
  trying each publication until the path is found. Handles both pass-through and
@@ -883,6 +883,7 @@ class Distribution(MasterModel):
883
883
  .filter(distribution=self)
884
884
  .order_by("-pulp_created")
885
885
  .select_related("publication__repository_version")
886
+ .defer("publication__repository_version__content_ids")
886
887
  )
887
888
  for dp in recent_dp.iterator():
888
889
  pub = dp.publication
@@ -893,7 +894,7 @@ class Distribution(MasterModel):
893
894
  .first()
894
895
  )
895
896
  if ca is not None:
896
- return ca
897
+ return ca, pub.repository_version
897
898
  else:
898
899
  pa = (
899
900
  pub.published_artifact.select_related(
@@ -904,7 +905,7 @@ class Distribution(MasterModel):
904
905
  .first()
905
906
  )
906
907
  if pa is not None:
907
- return pa.content_artifact
908
+ return pa.content_artifact, pub.repository_version
908
909
  return None
909
910
 
910
911
  @hook(BEFORE_CREATE)
@@ -173,6 +173,28 @@ def get_objects_for_user(
173
173
  accept_domain_perms=True,
174
174
  accept_global_perms=True,
175
175
  ):
176
+ if (
177
+ "pulpcore.app.workload_identity.backend.WorkloadIdentityBackend"
178
+ in settings.AUTHENTICATION_BACKENDS
179
+ ):
180
+ from pulpcore.app.workload_identity.principal import WorkloadIdentityPrincipal
181
+
182
+ if isinstance(user, WorkloadIdentityPrincipal):
183
+ from pulpcore.app.workload_identity.authz import grants_queryset
184
+
185
+ grants = user.grants
186
+ if isinstance(perms, str):
187
+ return grants_queryset(grants, perms, qs)
188
+ if any_perm:
189
+ result = qs.none()
190
+ for permission_name in perms:
191
+ result |= grants_queryset(grants, permission_name, qs)
192
+ return result
193
+ result = qs.all()
194
+ for permission_name in perms:
195
+ result &= grants_queryset(grants, permission_name, qs)
196
+ return result
197
+
176
198
  new_qs = qs.none()
177
199
  replace = False
178
200
  if "pulpcore.backends.ObjectRolePermissionBackend" in settings.AUTHENTICATION_BACKENDS:
@@ -317,6 +317,8 @@ AUTHENTICATION_JSON_HEADER = ""
317
317
  AUTHENTICATION_JSON_HEADER_JQ_FILTER = ""
318
318
  AUTHENTICATION_JSON_HEADER_OPENAPI_SECURITY_SCHEME = {}
319
319
 
320
+ WORKLOAD_IDENTITY = {}
321
+
320
322
  ALLOWED_IMPORT_PATHS = []
321
323
 
322
324
  ALLOWED_EXPORT_PATHS = []
@@ -131,7 +131,9 @@ class VulnerabilityReportScanner:
131
131
  """
132
132
 
133
133
  vuln_report, created = await sync_to_async(VulnerabilityReport.objects.update_or_create)(
134
- vulns=vulns, pulp_domain=get_domain(), content=content
134
+ pulp_domain=get_domain(),
135
+ content=content,
136
+ defaults={"vulns": vulns},
135
137
  )
136
138
  await vuln_report.repo_versions.aadd(repo_version)
137
139
 
@@ -17,6 +17,7 @@ from django.apps import apps
17
17
  from django.conf import settings
18
18
  from django.db import connection
19
19
  from django.db.models import Model, UUIDField
20
+ from django.utils.http import parse_http_date
20
21
  from rest_framework.reverse import reverse as drf_reverse
21
22
  from rest_framework.serializers import ValidationError
22
23
 
@@ -714,6 +715,25 @@ def normalize_http_status(status):
714
715
  return ""
715
716
 
716
717
 
718
+ def check_request_was_modified(request, last_modified, etag=None):
719
+ if_none_match = request.headers.get("If-None-Match")
720
+ if_modified_since = request.headers.get("If-Modified-Since")
721
+
722
+ if not if_none_match and not (last_modified and if_modified_since):
723
+ return True
724
+
725
+ if if_none_match:
726
+ client_etags = [etag == client_etag.strip() for client_etag in if_none_match.split(",")]
727
+ return not any(client_etags)
728
+
729
+ try:
730
+ last_modified_ts = parse_http_date(last_modified)
731
+ if_modified_ts = parse_http_date(if_modified_since)
732
+ return last_modified_ts > if_modified_ts
733
+ except (TypeError, ValueError):
734
+ return True
735
+
736
+
717
737
  class HashingFileWriter(RawIOBase):
718
738
  """
719
739
  A file-like object that handles writing data to disk with simultaneous
@@ -0,0 +1,5 @@
1
+ """Workload identity authentication for CI clients.
2
+
3
+ A short-lived OIDC token from a third-party provider (for example GitHub Actions) becomes a
4
+ stateless principal whose grants are computed per request from the `WORKLOAD_IDENTITY` setting.
5
+ """
@@ -0,0 +1,100 @@
1
+ """DRF authentication that validates a third-party OIDC token against its provider's JWKS.
2
+
3
+ The token arrives as a `Bearer` token, or as the password of a `Basic` header whose username
4
+ is the reserved workload-identity name. On success its claims map to grants and a stateless
5
+ `WorkloadIdentityPrincipal` is returned.
6
+ """
7
+
8
+ import base64
9
+ import binascii
10
+ import logging
11
+
12
+ import jwt
13
+ from rest_framework.authentication import BaseAuthentication
14
+ from rest_framework.exceptions import AuthenticationFailed
15
+
16
+ from pulpcore.app.workload_identity import config, rules
17
+ from pulpcore.app.workload_identity.principal import WorkloadIdentityPrincipal
18
+
19
+ _logger = logging.getLogger("pulpcore.workload_identity")
20
+
21
+
22
+ class WorkloadIdentityAuthentication(BaseAuthentication):
23
+ """Authenticate requests bearing a third-party OIDC token.
24
+
25
+ On success this returns a stateless `WorkloadIdentityPrincipal` whose permissions are
26
+ derived entirely from the grants earned by the token's claims. When the
27
+ request carries no token, or a token that is not meant for us, the
28
+ authenticator returns `None` so that other authenticators may run.
29
+ """
30
+
31
+ def _get_token(self, request):
32
+ """Return the token from the Authorization header, or None.
33
+
34
+ Accepts a `Bearer` token, or a token carried as the password of a `Basic` header whose
35
+ username is the reserved workload-identity name. Any other `Basic` header is left for the
36
+ regular authenticators.
37
+ """
38
+ header = request.META.get("HTTP_AUTHORIZATION", "")
39
+ parts = header.split()
40
+ if len(parts) != 2:
41
+ return None
42
+ scheme, value = parts
43
+ scheme = scheme.lower()
44
+ if scheme == "bearer":
45
+ return value
46
+ if scheme == "basic":
47
+ try:
48
+ decoded = base64.b64decode(value).decode("utf-8")
49
+ except (binascii.Error, ValueError, UnicodeDecodeError):
50
+ return None
51
+ username, sep, password = decoded.partition(":")
52
+ if not sep or username != config.basic_username():
53
+ return None
54
+ return password
55
+ return None
56
+
57
+ def authenticate(self, request):
58
+ """Validate the token and return `(principal, claims)`, or `None` if it is not ours."""
59
+ token = self._get_token(request)
60
+ if not token:
61
+ return None
62
+
63
+ try:
64
+ unverified = jwt.decode(token, options={"verify_signature": False})
65
+ except jwt.PyJWTError:
66
+ return None
67
+ issuer = unverified.get("iss")
68
+
69
+ provider = config.provider_for_issuer(issuer)
70
+ if provider is None:
71
+ return None
72
+
73
+ try:
74
+ signing_key = config.jwks_client(provider).get_signing_key_from_jwt(token)
75
+ claims = jwt.decode(
76
+ token,
77
+ signing_key.key,
78
+ algorithms=provider.get("algorithms", ["RS256"]),
79
+ issuer=provider["issuer"],
80
+ audience=provider["audience"],
81
+ options={"require": ["exp", "iss", "aud"]},
82
+ )
83
+ except jwt.PyJWTError as exc:
84
+ _logger.info("Rejecting OIDC token from %s: %s", issuer, exc)
85
+ raise AuthenticationFailed("Invalid OIDC token.")
86
+
87
+ grants = rules.grants_for(provider, claims)
88
+ if not grants:
89
+ _logger.info(
90
+ "No matching OIDC rule for sub=%r repository=%r",
91
+ claims.get("sub"),
92
+ claims.get("repository"),
93
+ )
94
+ raise AuthenticationFailed("No matching OIDC rule.")
95
+
96
+ return (WorkloadIdentityPrincipal(grants, username=""), claims)
97
+
98
+ def authenticate_header(self, request):
99
+ """Return the `WWW-Authenticate` value so failures are 401, not 403."""
100
+ return "Bearer"