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.
- {pulpcore-3.119.2 → pulpcore-3.121.0}/CHANGES.md +198 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/PKG-INFO +5 -4
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/__init__.py +1 -1
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/__init__.py +1 -1
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/tasks/synchronizing.py +0 -3
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/access_policy.py +12 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/apps.py +1 -1
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/checks.py +102 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/publication.py +4 -3
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/role_util.py +22 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/settings.py +2 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/vulnerability_report.py +3 -1
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/util.py +20 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/__init__.py +5 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/authentication.py +100 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/authz.py +129 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/backend.py +42 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/config.py +44 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/principal.py +66 -0
- pulpcore-3.121.0/pulpcore/app/workload_identity/rules.py +32 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/cache/cache.py +18 -9
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/handler.py +96 -6
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/pytest_plugin.py +7 -8
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/worker.py +1 -3
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_workers.py +2 -1
- pulpcore-3.121.0/pulpcore/tests/functional/api/using_plugin/test_cdn_cache_validation.py +267 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_publication_retention.py +9 -10
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_vulnerability_report.py +32 -0
- pulpcore-3.121.0/pulpcore/tests/unit/workload_identity/__init__.py +0 -0
- pulpcore-3.121.0/pulpcore/tests/unit/workload_identity/test_workload_identity.py +653 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/PKG-INFO +5 -4
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/SOURCES.txt +11 -1
- pulpcore-3.121.0/pulpcore.egg-info/dependency_links.txt +1 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/requires.txt +4 -3
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pyproject.toml +6 -5
- pulpcore-3.119.2/pulp_file/app/settings.py +0 -1
- {pulpcore-3.119.2 → pulpcore-3.121.0}/CODE_OF_CONDUCT.md +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/COMMITMENT +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/CONTRIBUTING.md +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/COPYRIGHT +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/LICENSE +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/MANIFEST.in +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/README.md +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/ci_requirements.txt +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/functest_requirements.txt +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/manage.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/migrations/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/models.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/serializers.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/app/viewsets.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/pytest_plugin.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/rhsm/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/conftest.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/functional/constants.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/unit/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/unit/certdata.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0018_alter_filecontent_options.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0019_add_filegitremote.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/0020_filerepository_last_sync_details.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/migrations/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/modelresource.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/models.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/serializers.py +0 -0
- /pulpcore-3.119.2/pulpcore.egg-info/dependency_links.txt → /pulpcore-3.121.0/pulp_file/app/settings.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/tasks/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/tasks/publishing.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/app/viewsets.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/manifest.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/pytest_plugin.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_distributed_publication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_git_sync.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_overwrite_content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/functional/api/test_sync_optimization.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_git_sync.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_serializers.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulp_file/tests/unit/test_sync_optimization.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/authentication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/contexts.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/entrypoint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/files.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/find_url.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/global_access_conditions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/importexport.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/loggers.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/manage.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/datarepair.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/list-signing-services.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/openapi.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/optimizemigration.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/repository-size.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/management/commands/shell.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0142_task_result.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0146_repository_retain_checkpoints.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0147_content_pulp_labels_gin.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0148_artifact_artifact_domain_size_index.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0149_distributedpublication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0150_taskschedule_task_kwargs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0151_upstreampulp_connect_timeout_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0152_alter_repositoryversion_content_ids.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0153_taskschedule_pulp_domain_alter_taskschedule_name_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0154_task_api_version.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0155_create_rel_path_domains.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0156_alter_contentartifact_relative_path_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0157_distribution_base_path_constraint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0158_domain_default_content_guard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0159_alter_contentartifact_relative_path_and_more.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/0160_envvarheadercontentguard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/migrations/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/mime_types.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/modelresource.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/access_policy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/acs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/analytics.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/domain.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/exporter.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/fields.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/generic.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/importer.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/openpgp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/progress.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/repository.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/role.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/status.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/storage.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/task.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/upload.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/models/vulnerability_report.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/netutil.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/openpgp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/protobuf/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/pulp_hashlib.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/redis_connection.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/response.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/access_policy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/acs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/domain.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/exporter.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/fields.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/importer.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/openpgp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/orphans.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/progress.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/publication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/purge.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/reclaim.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/repair.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/repository.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/status.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/task.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/upload.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/user.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/analytics.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/datarepair.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/export.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/importer.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/migrate.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/orphan.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/purge.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/repository.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/telemetry.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/test.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/tasks/upload.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/templatetags/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/urls.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/datarepair.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/importer.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/orphans.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/repair.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/views/status.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/access_policy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/acs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/domain.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/exporter.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/importer.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/openpgp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/orphans.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/publication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/reclaim.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/repository.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/task.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/upload.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/user.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/app/wsgi.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/backends.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/cache/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/constants.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/authentication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/entrypoint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/content/instrumentation.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/factory.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/file.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/download/http.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/plugin.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/exceptions/validation.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/filters.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/metrics.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/middleware.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/migrations.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/openapi/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/openapi/hooks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/access_policy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/actions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/apps.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/authentication/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/cache/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/constants.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/download/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/exceptions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/files.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/find_url.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/importexport.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/migrations.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/modelresources.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/models/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/models/role.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/publication_utils.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/repo_version_utils.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/responses.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/serializers/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/serializers/content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/api.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/content_stages.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/stages/models.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/storage.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/sync.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/tasking.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/util.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/plugin/viewsets/content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/responses.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/_util.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/entrypoint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/kafka.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/redis_locks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/redis_tasks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/redis_worker.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/storage.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tasking/tasks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_login.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_role.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_status.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_tasking.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/test_v4_status.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/functional/utils.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/performance/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/performance/test_performance.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/conftest.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/content/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/download/test_downloader_file.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_content.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_content_ids_migration.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_distribution.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_repository.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/models/test_task.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/roles/test_adjust_roles.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/test_resource_budget.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_delete_tasks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_missing_worker_cleanup.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_orphan_redis_locks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_redis_fetch_task.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/tasking/test_waiting_tasks_metric.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_cache.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_fetch_task_hol_blocking.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_files.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_gpg_verify.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_list_signing_services_command.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_middleware.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_replica.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_settings.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_util.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/entry_points.txt +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/pulpcore.egg-info/top_level.txt +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/setup.cfg +0 -0
- {pulpcore-3.119.2 → pulpcore-3.121.0}/test_requirements.txt +0 -0
- {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.
|
|
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
|
-
Requires-Dist: opentelemetry-sdk<1.
|
|
46
|
-
Requires-Dist: opentelemetry-exporter-otlp-proto-http<1.
|
|
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
|
|
@@ -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
|
"""
|
|
@@ -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
|
|
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:
|
|
@@ -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
|
-
|
|
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,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"
|