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