pulpcore 3.119.2__tar.gz → 3.120.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 (532) hide show
  1. {pulpcore-3.119.2 → pulpcore-3.120.0}/CHANGES.md +127 -6
  2. {pulpcore-3.119.2 → pulpcore-3.120.0}/PKG-INFO +2 -1
  3. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/access_policy.py +12 -0
  6. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/apps.py +1 -1
  7. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/checks.py +102 -0
  8. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/role_util.py +22 -0
  9. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/settings.py +2 -0
  10. pulpcore-3.120.0/pulpcore/app/workload_identity/__init__.py +5 -0
  11. pulpcore-3.120.0/pulpcore/app/workload_identity/authentication.py +100 -0
  12. pulpcore-3.120.0/pulpcore/app/workload_identity/authz.py +129 -0
  13. pulpcore-3.120.0/pulpcore/app/workload_identity/backend.py +42 -0
  14. pulpcore-3.120.0/pulpcore/app/workload_identity/config.py +44 -0
  15. pulpcore-3.120.0/pulpcore/app/workload_identity/principal.py +66 -0
  16. pulpcore-3.120.0/pulpcore/app/workload_identity/rules.py +32 -0
  17. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/pytest_plugin.py +7 -8
  18. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/worker.py +1 -3
  19. pulpcore-3.120.0/pulpcore/tests/unit/workload_identity/__init__.py +0 -0
  20. pulpcore-3.120.0/pulpcore/tests/unit/workload_identity/test_workload_identity.py +653 -0
  21. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore.egg-info/PKG-INFO +2 -1
  22. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore.egg-info/SOURCES.txt +10 -1
  23. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore.egg-info/requires.txt +1 -0
  24. {pulpcore-3.119.2 → pulpcore-3.120.0}/pyproject.toml +3 -2
  25. {pulpcore-3.119.2 → pulpcore-3.120.0}/CODE_OF_CONDUCT.md +0 -0
  26. {pulpcore-3.119.2 → pulpcore-3.120.0}/COMMITMENT +0 -0
  27. {pulpcore-3.119.2 → pulpcore-3.120.0}/CONTRIBUTING.md +0 -0
  28. {pulpcore-3.119.2 → pulpcore-3.120.0}/COPYRIGHT +0 -0
  29. {pulpcore-3.119.2 → pulpcore-3.120.0}/LICENSE +0 -0
  30. {pulpcore-3.119.2 → pulpcore-3.120.0}/MANIFEST.in +0 -0
  31. {pulpcore-3.119.2 → pulpcore-3.120.0}/README.md +0 -0
  32. {pulpcore-3.119.2 → pulpcore-3.120.0}/ci_requirements.txt +0 -0
  33. {pulpcore-3.119.2 → pulpcore-3.120.0}/functest_requirements.txt +0 -0
  34. {pulpcore-3.119.2 → pulpcore-3.120.0}/manage.py +0 -0
  35. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/__init__.py +0 -0
  36. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  37. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  38. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/migrations/__init__.py +0 -0
  39. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/models.py +0 -0
  40. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/serializers.py +0 -0
  41. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/app/viewsets.py +0 -0
  42. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/pytest_plugin.py +0 -0
  43. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/rhsm/__init__.py +0 -0
  44. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  45. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/__init__.py +0 -0
  46. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/__init__.py +0 -0
  47. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  48. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  49. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  50. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  51. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  52. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  53. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  54. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  55. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  56. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  57. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  58. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  59. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  60. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  61. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  62. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  63. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  64. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  65. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  66. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  67. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  68. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  69. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  70. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  71. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  72. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  73. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  74. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  75. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  76. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  77. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  78. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  79. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/conftest.py +0 -0
  80. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/functional/constants.py +0 -0
  81. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/unit/__init__.py +0 -0
  82. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/unit/certdata.py +0 -0
  83. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  84. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/__init__.py +0 -0
  85. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  86. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  87. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/migrations/0018_alter_filecontent_options.py +0 -0
  88. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/migrations/0019_add_filegitremote.py +0 -0
  89. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/migrations/0020_filerepository_last_sync_details.py +0 -0
  90. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/migrations/__init__.py +0 -0
  91. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/modelresource.py +0 -0
  92. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/models.py +0 -0
  93. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/replica.py +0 -0
  94. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/serializers.py +0 -0
  95. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/settings.py +0 -0
  96. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/tasks/__init__.py +0 -0
  97. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/tasks/publishing.py +0 -0
  98. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/tasks/synchronizing.py +0 -0
  99. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/app/viewsets.py +0 -0
  100. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/manifest.py +0 -0
  101. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/pytest_plugin.py +0 -0
  102. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/__init__.py +0 -0
  103. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/__init__.py +0 -0
  104. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/__init__.py +0 -0
  105. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
  106. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  107. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  108. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  109. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  110. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  111. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_distributed_publication.py +0 -0
  112. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
  113. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  114. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
  115. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  116. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_git_sync.py +0 -0
  117. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
  118. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  119. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_overwrite_content.py +0 -0
  120. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
  121. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  122. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  123. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  124. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
  125. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/functional/api/test_sync_optimization.py +0 -0
  126. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/unit/__init__.py +0 -0
  127. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/unit/test_git_sync.py +0 -0
  128. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  129. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/unit/test_serializers.py +0 -0
  130. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulp_file/tests/unit/test_sync_optimization.py +0 -0
  131. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/__init__.py +0 -0
  132. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/__init__.py +0 -0
  133. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/authentication.py +0 -0
  134. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/contexts.py +0 -0
  135. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/entrypoint.py +0 -0
  136. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/files.py +0 -0
  137. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/find_url.py +0 -0
  138. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/global_access_conditions.py +0 -0
  139. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/importexport.py +0 -0
  140. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/loggers.py +0 -0
  141. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/manage.py +0 -0
  142. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/__init__.py +0 -0
  143. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/__init__.py +0 -0
  144. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  145. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  146. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  147. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  148. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/datarepair.py +0 -0
  149. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  150. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  151. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  152. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/list-signing-services.py +0 -0
  153. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
  154. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/openapi.py +0 -0
  155. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/optimizemigration.py +0 -0
  156. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  157. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
  158. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  159. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/repository-size.py +0 -0
  160. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  161. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  162. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/management/commands/shell.py +0 -0
  163. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  164. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
  165. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  166. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  167. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  168. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  169. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  170. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  171. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  172. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  173. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  174. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  175. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  176. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  177. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  178. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  179. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  180. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  181. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  182. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  183. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  184. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  185. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  186. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  187. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  188. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  189. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  190. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  191. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  192. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  193. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  194. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  195. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  196. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  197. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  198. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  199. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  200. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  201. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  202. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  203. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  204. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  205. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  206. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  207. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  208. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  209. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  210. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  211. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  212. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  213. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
  214. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
  215. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
  216. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0142_task_result.py +0 -0
  217. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
  218. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
  219. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
  220. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0146_repository_retain_checkpoints.py +0 -0
  221. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0147_content_pulp_labels_gin.py +0 -0
  222. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0148_artifact_artifact_domain_size_index.py +0 -0
  223. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0149_distributedpublication.py +0 -0
  224. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0150_taskschedule_task_kwargs.py +0 -0
  225. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0151_upstreampulp_connect_timeout_and_more.py +0 -0
  226. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0152_alter_repositoryversion_content_ids.py +0 -0
  227. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0153_taskschedule_pulp_domain_alter_taskschedule_name_and_more.py +0 -0
  228. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0154_task_api_version.py +0 -0
  229. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0155_create_rel_path_domains.py +0 -0
  230. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0156_alter_contentartifact_relative_path_and_more.py +0 -0
  231. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0157_distribution_base_path_constraint.py +0 -0
  232. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0158_domain_default_content_guard.py +0 -0
  233. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0159_alter_contentartifact_relative_path_and_more.py +0 -0
  234. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/0160_envvarheadercontentguard.py +0 -0
  235. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/migrations/__init__.py +0 -0
  236. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/mime_types.py +0 -0
  237. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/modelresource.py +0 -0
  238. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/__init__.py +0 -0
  239. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/access_policy.py +0 -0
  240. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/acs.py +0 -0
  241. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/analytics.py +0 -0
  242. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/base.py +0 -0
  243. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/content.py +0 -0
  244. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/domain.py +0 -0
  245. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/exporter.py +0 -0
  246. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/fields.py +0 -0
  247. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/generic.py +0 -0
  248. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/importer.py +0 -0
  249. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/openpgp.py +0 -0
  250. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/progress.py +0 -0
  251. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/publication.py +0 -0
  252. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/replica.py +0 -0
  253. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/repository.py +0 -0
  254. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/role.py +0 -0
  255. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/status.py +0 -0
  256. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/storage.py +0 -0
  257. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/task.py +0 -0
  258. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/upload.py +0 -0
  259. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/models/vulnerability_report.py +0 -0
  260. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/netutil.py +0 -0
  261. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/openpgp.py +0 -0
  262. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/protobuf/__init__.py +0 -0
  263. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  264. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/pulp_hashlib.py +0 -0
  265. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  266. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/redis_connection.py +0 -0
  267. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/replica.py +0 -0
  268. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/response.py +0 -0
  269. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/__init__.py +0 -0
  270. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/access_policy.py +0 -0
  271. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/acs.py +0 -0
  272. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/base.py +0 -0
  273. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/content.py +0 -0
  274. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/domain.py +0 -0
  275. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/exporter.py +0 -0
  276. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/fields.py +0 -0
  277. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/importer.py +0 -0
  278. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/openpgp.py +0 -0
  279. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/orphans.py +0 -0
  280. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/progress.py +0 -0
  281. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/publication.py +0 -0
  282. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/purge.py +0 -0
  283. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/reclaim.py +0 -0
  284. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/repair.py +0 -0
  285. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/replica.py +0 -0
  286. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/repository.py +0 -0
  287. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/status.py +0 -0
  288. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/task.py +0 -0
  289. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/upload.py +0 -0
  290. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/user.py +0 -0
  291. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  292. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/__init__.py +0 -0
  293. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/analytics.py +0 -0
  294. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/base.py +0 -0
  295. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/datarepair.py +0 -0
  296. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/export.py +0 -0
  297. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/importer.py +0 -0
  298. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/migrate.py +0 -0
  299. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/orphan.py +0 -0
  300. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/purge.py +0 -0
  301. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
  302. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/replica.py +0 -0
  303. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/repository.py +0 -0
  304. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/telemetry.py +0 -0
  305. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/test.py +0 -0
  306. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/upload.py +0 -0
  307. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/tasks/vulnerability_report.py +0 -0
  308. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
  309. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/templatetags/__init__.py +0 -0
  310. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  311. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/urls.py +0 -0
  312. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/util.py +0 -0
  313. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/views/__init__.py +0 -0
  314. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/views/datarepair.py +0 -0
  315. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/views/importer.py +0 -0
  316. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/views/orphans.py +0 -0
  317. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/views/repair.py +0 -0
  318. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/views/status.py +0 -0
  319. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/__init__.py +0 -0
  320. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/access_policy.py +0 -0
  321. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/acs.py +0 -0
  322. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/base.py +0 -0
  323. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/content.py +0 -0
  324. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
  325. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/domain.py +0 -0
  326. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/exporter.py +0 -0
  327. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/importer.py +0 -0
  328. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/openpgp.py +0 -0
  329. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/orphans.py +0 -0
  330. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/publication.py +0 -0
  331. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/reclaim.py +0 -0
  332. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/replica.py +0 -0
  333. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/repository.py +0 -0
  334. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/task.py +0 -0
  335. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/upload.py +0 -0
  336. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/user.py +0 -0
  337. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  338. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/app/wsgi.py +0 -0
  339. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/backends.py +0 -0
  340. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/cache/__init__.py +0 -0
  341. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/cache/cache.py +0 -0
  342. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/constants.py +0 -0
  343. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/content/__init__.py +0 -0
  344. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/content/authentication.py +0 -0
  345. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/content/entrypoint.py +0 -0
  346. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/content/handler.py +0 -0
  347. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/content/instrumentation.py +0 -0
  348. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/download/__init__.py +0 -0
  349. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/download/base.py +0 -0
  350. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/download/factory.py +0 -0
  351. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/download/file.py +0 -0
  352. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/download/http.py +0 -0
  353. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/exceptions/__init__.py +0 -0
  354. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/exceptions/base.py +0 -0
  355. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/exceptions/plugin.py +0 -0
  356. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/exceptions/validation.py +0 -0
  357. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/filters.py +0 -0
  358. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/metrics.py +0 -0
  359. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/middleware.py +0 -0
  360. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/migrations.py +0 -0
  361. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/openapi/__init__.py +0 -0
  362. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/openapi/hooks.py +0 -0
  363. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/__init__.py +0 -0
  364. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/access_policy.py +0 -0
  365. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/actions.py +0 -0
  366. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/apps.py +0 -0
  367. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/authentication/__init__.py +0 -0
  368. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/cache/__init__.py +0 -0
  369. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/constants.py +0 -0
  370. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/content.py +0 -0
  371. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/download/__init__.py +0 -0
  372. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/exceptions.py +0 -0
  373. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/files.py +0 -0
  374. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/find_url.py +0 -0
  375. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/importexport.py +0 -0
  376. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/migrations.py +0 -0
  377. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/modelresources.py +0 -0
  378. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/models/__init__.py +0 -0
  379. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/models/role.py +0 -0
  380. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/publication_utils.py +0 -0
  381. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
  382. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/replica.py +0 -0
  383. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/repo_version_utils.py +0 -0
  384. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/responses.py +0 -0
  385. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/serializers/__init__.py +0 -0
  386. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/serializers/content.py +0 -0
  387. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/stages/__init__.py +0 -0
  388. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/stages/api.py +0 -0
  389. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  390. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/stages/content_stages.py +0 -0
  391. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
  392. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/stages/models.py +0 -0
  393. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/storage.py +0 -0
  394. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/sync.py +0 -0
  395. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/tasking.py +0 -0
  396. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/util.py +0 -0
  397. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
  398. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/plugin/viewsets/content.py +0 -0
  399. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/responses.py +0 -0
  400. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/__init__.py +0 -0
  401. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/_util.py +0 -0
  402. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/entrypoint.py +0 -0
  403. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/kafka.py +0 -0
  404. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/redis_locks.py +0 -0
  405. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/redis_tasks.py +0 -0
  406. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/redis_worker.py +0 -0
  407. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/storage.py +0 -0
  408. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tasking/tasks.py +0 -0
  409. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/__init__.py +0 -0
  410. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/__init__.py +0 -0
  411. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/__init__.py +0 -0
  412. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  413. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  414. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  415. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  416. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
  417. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  418. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  419. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
  420. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
  421. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_login.py +0 -0
  422. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  423. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  424. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
  425. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
  426. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_role.py +0 -0
  427. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  428. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  429. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  430. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_status.py +0 -0
  431. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  432. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_tasking.py +0 -0
  433. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
  434. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  435. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_v4_status.py +0 -0
  436. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/test_workers.py +0 -0
  437. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  438. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  439. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  440. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  441. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  442. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  443. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  444. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  445. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  446. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  447. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
  448. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
  449. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  450. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  451. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  452. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  453. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  454. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  455. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
  456. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  457. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  458. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  459. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  460. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  461. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
  462. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  463. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/functional/utils.py +0 -0
  464. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/performance/__init__.py +0 -0
  465. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/performance/test_performance.py +0 -0
  466. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/__init__.py +0 -0
  467. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/conftest.py +0 -0
  468. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/content/__init__.py +0 -0
  469. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
  470. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
  471. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/download/__init__.py +0 -0
  472. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  473. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  474. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/download/test_downloader_file.py +0 -0
  475. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  476. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  477. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  478. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  479. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
  480. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/__init__.py +0 -0
  481. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_base.py +0 -0
  482. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_content.py +0 -0
  483. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_content_ids_migration.py +0 -0
  484. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_distribution.py +0 -0
  485. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_publication_retention.py +0 -0
  486. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
  487. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_repository.py +0 -0
  488. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/models/test_task.py +0 -0
  489. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
  490. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/roles/test_adjust_roles.py +0 -0
  491. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  492. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  493. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  494. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  495. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  496. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  497. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  498. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  499. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  500. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
  501. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  502. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/stages/test_resource_budget.py +0 -0
  503. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  504. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/tasking/__init__.py +0 -0
  505. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/tasking/test_delete_tasks.py +0 -0
  506. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/tasking/test_missing_worker_cleanup.py +0 -0
  507. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/tasking/test_orphan_redis_locks.py +0 -0
  508. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/tasking/test_redis_fetch_task.py +0 -0
  509. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/tasking/test_waiting_tasks_metric.py +0 -0
  510. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_cache.py +0 -0
  511. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  512. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
  513. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_fetch_task_hol_blocking.py +0 -0
  514. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_files.py +0 -0
  515. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_gpg_verify.py +0 -0
  516. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
  517. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_list_signing_services_command.py +0 -0
  518. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_middleware.py +0 -0
  519. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  520. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_replica.py +0 -0
  521. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_settings.py +0 -0
  522. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_util.py +0 -0
  523. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
  524. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
  525. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  526. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  527. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore.egg-info/dependency_links.txt +0 -0
  528. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore.egg-info/entry_points.txt +0 -0
  529. {pulpcore-3.119.2 → pulpcore-3.120.0}/pulpcore.egg-info/top_level.txt +0 -0
  530. {pulpcore-3.119.2 → pulpcore-3.120.0}/setup.cfg +0 -0
  531. {pulpcore-3.119.2 → pulpcore-3.120.0}/test_requirements.txt +0 -0
  532. {pulpcore-3.119.2 → pulpcore-3.120.0}/unittest_requirements.txt +0 -0
@@ -8,25 +8,33 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
- ## 3.119.2 (2026-09-29) {: #3.119.2 }
11
+ ## 3.120.0 (2026-09-29) {: #3.120.0 }
12
12
 
13
- ### REST API {: #3.119.2-rest-api }
13
+ ### REST API {: #3.120.0-rest-api }
14
14
 
15
- #### Bugfixes {: #3.119.2-rest-api-bugfix }
15
+ #### Features {: #3.120.0-rest-api-feature }
16
+
17
+ - 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.
18
+
19
+ #### Bugfixes {: #3.120.0-rest-api-bugfix }
16
20
 
17
21
  - Improved the performance of the latest publication lookup when serving content
18
22
  from a repository-backed distribution.
19
23
  [#1995](https://github.com/pulp/pulpcore/issues/1995)
24
+ - Fixed file downloader path sanitation. CVE-2026-90959
25
+ - Fixed the `long_running` pytest-mark, so that it correctly applies even when "nightly"
26
+ is selected. This includes fixing a window in the task-cleanup path, where a missing
27
+ worker's jobs were not getting cleaned up until a new task entered the system.
20
28
 
21
- ### Plugin API {: #3.119.2-plugin-api }
29
+ ### Plugin API {: #3.120.0-plugin-api }
22
30
 
23
31
  No significant changes.
24
32
 
25
- ### Pulp File {: #3.119.2-pulp-file }
33
+ ### Pulp File {: #3.120.0-pulp-file }
26
34
 
27
35
  No significant changes.
28
36
 
29
- ### Pulp Cert Guard {: #3.119.2-pulp-cert-guard }
37
+ ### Pulp Cert Guard {: #3.120.0-pulp-cert-guard }
30
38
 
31
39
  No significant changes.
32
40
 
@@ -1210,6 +1218,30 @@ No significant changes.
1210
1218
 
1211
1219
  ---
1212
1220
 
1221
+ ## 3.105.20 (2026-09-23) {: #3.105.20 }
1222
+
1223
+ ### REST API {: #3.105.20-rest-api }
1224
+
1225
+ #### Bugfixes {: #3.105.20-rest-api-bugfix }
1226
+
1227
+ - Fixed file downloader path sanitation. CVE-2026-90959
1228
+ - Fixed post-migrate hooks to prevent failing on incomplete or rolled back migrations.
1229
+ - Reduce the number and size of queries made for each content app request.
1230
+
1231
+ ### Plugin API {: #3.105.20-plugin-api }
1232
+
1233
+ No significant changes.
1234
+
1235
+ ### Pulp File {: #3.105.20-pulp-file }
1236
+
1237
+ No significant changes.
1238
+
1239
+ ### Pulp Cert Guard {: #3.105.20-pulp-cert-guard }
1240
+
1241
+ No significant changes.
1242
+
1243
+ ---
1244
+
1213
1245
  ## 3.105.19 (2026-09-02) {: #3.105.19 }
1214
1246
 
1215
1247
  ### REST API {: #3.105.19-rest-api }
@@ -2652,6 +2684,29 @@ No significant changes.
2652
2684
 
2653
2685
  ---
2654
2686
 
2687
+ ## 3.85.31 (2026-09-23) {: #3.85.31 }
2688
+
2689
+ ### REST API {: #3.85.31-rest-api }
2690
+
2691
+ #### Bugfixes {: #3.85.31-rest-api-bugfix }
2692
+
2693
+ - Fixed file downloader path sanitation. CVE-2026-90959
2694
+ - Fixed post-migrate hooks to prevent failing on incomplete or rolled back migrations.
2695
+
2696
+ ### Plugin API {: #3.85.31-plugin-api }
2697
+
2698
+ No significant changes.
2699
+
2700
+ ### Pulp File {: #3.85.31-pulp-file }
2701
+
2702
+ No significant changes.
2703
+
2704
+ ### Pulp Cert Guard {: #3.85.31-pulp-cert-guard }
2705
+
2706
+ No significant changes.
2707
+
2708
+ ---
2709
+
2655
2710
  ## 3.85.30 (2026-09-01) {: #3.85.30 }
2656
2711
 
2657
2712
  ### REST API {: #3.85.30-rest-api }
@@ -4115,6 +4170,28 @@ No significant changes.
4115
4170
 
4116
4171
  ---
4117
4172
 
4173
+ ## 3.73.45 (2026-09-24) {: #3.73.45 }
4174
+
4175
+ ### REST API {: #3.73.45-rest-api }
4176
+
4177
+ #### Bugfixes {: #3.73.45-rest-api-bugfix }
4178
+
4179
+ - Fixed file downloader path sanitation. CVE-2026-90959
4180
+
4181
+ ### Plugin API {: #3.73.45-plugin-api }
4182
+
4183
+ No significant changes.
4184
+
4185
+ ### Pulp File {: #3.73.45-pulp-file }
4186
+
4187
+ No significant changes.
4188
+
4189
+ ### Pulp Cert Guard {: #3.73.45-pulp-cert-guard }
4190
+
4191
+ No significant changes.
4192
+
4193
+ ---
4194
+
4118
4195
  ## 3.73.44 (2026-09-02) {: #3.73.44 }
4119
4196
 
4120
4197
  ### REST API {: #3.73.44-rest-api }
@@ -5822,6 +5899,28 @@ No significant changes.
5822
5899
 
5823
5900
  ---
5824
5901
 
5902
+ ## 3.63.48 (2026-09-24) {: #3.63.48 }
5903
+
5904
+ ### REST API {: #3.63.48-rest-api }
5905
+
5906
+ #### Bugfixes {: #3.63.48-rest-api-bugfix }
5907
+
5908
+ - Fixed file downloader path sanitation. CVE-2026-90959
5909
+
5910
+ ### Plugin API {: #3.63.48-plugin-api }
5911
+
5912
+ No significant changes.
5913
+
5914
+ ### Pulp File {: #3.63.48-pulp-file }
5915
+
5916
+ No significant changes.
5917
+
5918
+ ### Pulp Cert Guard {: #3.63.48-pulp-cert-guard }
5919
+
5920
+ No significant changes.
5921
+
5922
+ ---
5923
+
5825
5924
  ## 3.63.47 (2026-09-02) {: #3.63.47 }
5826
5925
 
5827
5926
  ### REST API {: #3.63.47-rest-api }
@@ -7747,6 +7846,28 @@ No significant changes.
7747
7846
 
7748
7847
  ---
7749
7848
 
7849
+ ## 3.49.71 (2026-09-24) {: #3.49.71 }
7850
+
7851
+ ### REST API {: #3.49.71-rest-api }
7852
+
7853
+ #### Bugfixes {: #3.49.71-rest-api-bugfix }
7854
+
7855
+ - Fixed file downloader path sanitation. CVE-2026-90959
7856
+
7857
+ ### Plugin API {: #3.49.71-plugin-api }
7858
+
7859
+ No significant changes.
7860
+
7861
+ ### Pulp File {: #3.49.71-pulp-file }
7862
+
7863
+ No significant changes.
7864
+
7865
+ ### Pulp Cert Guard {: #3.49.71-pulp-cert-guard }
7866
+
7867
+ No significant changes.
7868
+
7869
+ ---
7870
+
7750
7871
  ## 3.49.70 (2026-09-02) {: #3.49.70 }
7751
7872
 
7752
7873
  ### 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.120.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
@@ -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.120.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.120.0"
12
12
  python_package_name = "pulpcore"
13
13
  domain_compatible = True
@@ -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.120.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
@@ -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 = []
@@ -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"
@@ -0,0 +1,129 @@
1
+ """Shared authorization logic over a list of grants.
2
+
3
+ A grant is `{"role": <role name>, "scope": {...}}`. Scope is one of:
4
+
5
+ * `{"type": "global"}`
6
+ * `{"type": "domain", "domain": "<name>"}`
7
+ * `{"type": "object", "name": "<name>"}` (or `"prn"`)
8
+
9
+ Roles are read from the database to resolve their permissions; the grant assignment is never stored.
10
+ """
11
+
12
+ from django.db.models import Q
13
+
14
+ from pulpcore.app.models import Domain
15
+ from pulpcore.app.models.role import Role
16
+ from pulpcore.app.util import extract_pk, get_prn
17
+
18
+
19
+ def _split(permission):
20
+ app_label, _, codename = permission.partition(".")
21
+ return app_label, codename
22
+
23
+
24
+ def _role_has_perm(role_name, app_label, codename):
25
+ if not role_name:
26
+ return False
27
+ try:
28
+ role = Role.objects.get(name=role_name)
29
+ except Role.DoesNotExist:
30
+ return False
31
+ return role.permissions.filter(content_type__app_label=app_label, codename=codename).exists()
32
+
33
+
34
+ def _scope_matches(scope, obj):
35
+ """Whether a scope applies to a single object (`obj` may be `None` for model-level)."""
36
+ stype = scope.get("type")
37
+ if stype == "global":
38
+ return True
39
+ if obj is None:
40
+ return False
41
+ if stype == "domain":
42
+ if isinstance(obj, Domain):
43
+ return obj.name == scope.get("domain")
44
+ domain = getattr(obj, "pulp_domain", None)
45
+ return domain is not None and domain.name == scope.get("domain")
46
+ if stype == "object":
47
+ if "prn" not in scope and "name" not in scope:
48
+ return False
49
+ if "prn" in scope:
50
+ try:
51
+ if get_prn(obj) != scope["prn"]:
52
+ return False
53
+ except Exception:
54
+ return False
55
+ if "name" in scope and str(getattr(obj, "name", None)) != str(scope["name"]):
56
+ return False
57
+ if "domain" in scope:
58
+ domain = getattr(obj, "pulp_domain", None)
59
+ if domain is None or domain.name != scope["domain"]:
60
+ return False
61
+ return True
62
+ return False
63
+
64
+
65
+ def has_grant_perm(grants, permission, obj=None):
66
+ """True if any grant confers `permission` and its scope matches `obj`."""
67
+ app_label, codename = _split(permission)
68
+ for grant in grants:
69
+ if _role_has_perm(grant.get("role"), app_label, codename) and _scope_matches(
70
+ grant.get("scope", {}), obj
71
+ ):
72
+ return True
73
+ return False
74
+
75
+
76
+ def permissions_for(grants, obj=None):
77
+ """The set of `app_label.codename` the grants confer, scoped to `obj` when given."""
78
+ names = {g.get("role") for g in grants if g.get("role")}
79
+ if not names:
80
+ return set()
81
+ role_perms = {}
82
+ for role in Role.objects.filter(name__in=names).prefetch_related("permissions__content_type"):
83
+ role_perms[role.name] = {
84
+ f"{perm.content_type.app_label}.{perm.codename}" for perm in role.permissions.all()
85
+ }
86
+ perms = set()
87
+ for grant in grants:
88
+ conferred = role_perms.get(grant.get("role"))
89
+ if not conferred:
90
+ continue
91
+ if obj is not None and not _scope_matches(grant.get("scope", {}), obj):
92
+ continue
93
+ perms |= conferred
94
+ return perms
95
+
96
+
97
+ def grants_queryset(grants, permission, queryset):
98
+ """Return `queryset` filtered to the objects the grants allow for `permission`."""
99
+ app_label, codename = _split(permission)
100
+ relevant = [g for g in grants if _role_has_perm(g.get("role"), app_label, codename)]
101
+ if not relevant:
102
+ return queryset.none()
103
+
104
+ has_domain = hasattr(queryset.model, "pulp_domain")
105
+ predicate = None
106
+ for grant in relevant:
107
+ scope = grant.get("scope", {})
108
+ stype = scope.get("type")
109
+ if stype == "global":
110
+ return queryset
111
+ clause = None
112
+ if stype == "domain" and has_domain:
113
+ clause = Q(pulp_domain__name=scope.get("domain"))
114
+ elif stype == "object":
115
+ if "prn" in scope:
116
+ try:
117
+ clause = Q(pk=extract_pk(scope["prn"], only_prn=True))
118
+ except Exception:
119
+ clause = None
120
+ elif "name" in scope:
121
+ clause = Q(name=scope["name"])
122
+ if has_domain and "domain" in scope:
123
+ clause &= Q(pulp_domain__name=scope["domain"])
124
+ if clause is not None:
125
+ predicate = clause if predicate is None else (predicate | clause)
126
+
127
+ if predicate is None:
128
+ return queryset.none()
129
+ return queryset.filter(predicate)
@@ -0,0 +1,42 @@
1
+ """A Django authentication backend that resolves permissions for a workload-identity principal.
2
+
3
+ Permission checks on a `WorkloadIdentityPrincipal` are answered here, from the per-request
4
+ grants carried on the principal, so the feature plugs into the normal `AUTHENTICATION_BACKENDS`
5
+ machinery. For any other user this backend defers by returning nothing.
6
+ """
7
+
8
+ from django.contrib.auth.backends import BaseBackend
9
+
10
+ from pulpcore.app.workload_identity.authz import has_grant_perm, permissions_for
11
+ from pulpcore.app.workload_identity.principal import WorkloadIdentityPrincipal
12
+
13
+
14
+ class WorkloadIdentityBackend(BaseBackend):
15
+ @staticmethod
16
+ def _grants(user_obj):
17
+ if isinstance(user_obj, WorkloadIdentityPrincipal):
18
+ return user_obj.grants
19
+ return None
20
+
21
+ def has_perm(self, user_obj, perm, obj=None):
22
+ grants = self._grants(user_obj)
23
+ if grants is None:
24
+ return False
25
+ return has_grant_perm(grants, perm, obj)
26
+
27
+ def has_module_perms(self, user_obj, app_label):
28
+ # BaseBackend has no has_module_perms, so we provide it (mirrors ModelBackend).
29
+ if self._grants(user_obj) is None:
30
+ return False
31
+ prefix = f"{app_label}."
32
+ return any(perm.startswith(prefix) for perm in self.get_all_permissions(user_obj))
33
+
34
+ def get_all_permissions(self, user_obj, obj=None):
35
+ grants = self._grants(user_obj)
36
+ if grants is None:
37
+ return set()
38
+ perms = permissions_for(grants, obj)
39
+ if obj is None:
40
+ return perms
41
+ # Match ObjectRolePermissionBackend, which returns bare codenames for object-level checks.
42
+ return {perm.split(".", 1)[1] for perm in perms}