Skip to content

Commit 5298981

Browse files
committed
Add support for release overrides to signed_add_and_remove
1 parent aeba5bb commit 5298981

3 files changed

Lines changed: 39 additions & 11 deletions

File tree

pulp_deb/app/models/repository.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.db import models
2+
from django.utils.functional import cached_property
23

34
from pulpcore.plugin.models import (
45
AutoAddObjPermsMixin,
@@ -131,13 +132,21 @@ def release_package_signing_fingerprint(self, release):
131132
"""
132133
if isinstance(release, Release):
133134
release = release.distribution
134-
try:
135-
override = self.package_signing_fingerprint_release_overrides.get(
136-
release_distribution=release
137-
)
138-
return override.package_signing_fingerprint
139-
except AptRepositoryReleasePackageSigningFingerprintOverride.DoesNotExist:
135+
if not release:
140136
return self.package_signing_fingerprint
137+
return self.package_signing_fingerprint_release_overrides_map.get(
138+
release, self.package_signing_fingerprint
139+
)
140+
141+
@cached_property
142+
def package_signing_fingerprint_release_overrides_map(self):
143+
"""
144+
Cached mapping of release distributions to package signing fingerprints.
145+
"""
146+
return {
147+
override.release_distribution: override.package_signing_fingerprint
148+
for override in self.package_signing_fingerprint_release_overrides.all()
149+
}
141150

142151
def initialize_new_version(self, new_version):
143152
"""

pulp_deb/app/serializers/repository_serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def to_representation(self, overrides):
4242

4343

4444
class PackageFingerprintOverrideField(serializers.DictField):
45-
child = serializers.CharField(max_length=40)
45+
child = serializers.CharField(max_length=40, allow_blank=True)
4646

4747
def to_representation(self, overrides):
4848
return {x.release_distribution: x.package_signing_fingerprint for x in overrides.all()}

pulp_deb/app/tasks/signing.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from pathlib import Path
22
from tempfile import NamedTemporaryFile
33

4+
from django.db.models import Q
5+
46
from pulpcore.plugin.models import (
57
Upload,
68
UploadChunk,
@@ -21,6 +23,11 @@
2123
)
2224
from pulp_deb.app.models import AptRepository, Package, PackageReleaseComponent
2325

26+
import logging
27+
from gettext import gettext as _
28+
29+
log = logging.getLogger(__name__)
30+
2431

2532
def _save_file(fileobj, final_package):
2633
with fileobj.file.open() as fd:
@@ -37,6 +44,9 @@ def _save_upload(uploadobj, final_package):
3744

3845

3946
def _sign_file(package_file, signing_service, signing_fingerprint):
47+
logging.info(
48+
_("Signing package %s with fingerprint %s"), package_file.name, signing_fingerprint
49+
)
4050
result = signing_service.sign(package_file.name, pubkey_fingerprint=signing_fingerprint)
4151
signed_package_path = Path(result["deb_package"])
4252
if not signed_package_path.exists():
@@ -120,12 +130,23 @@ def signed_add_and_remove(
120130
repo = AptRepository.objects.get(pk=repository_pk)
121131

122132
if repo.package_signing_service:
133+
# map packages to releases
134+
prcs = PackageReleaseComponent.objects.filter(
135+
Q(pk__in=add_content_units) | Q(pk__in=repo.content.all())
136+
).select_related("package", "release_component")
137+
package_release_map = {prc.package_id: prc.release_component.distribution for prc in prcs}
138+
123139
# sign each package and replace it in the add_content_units list
124140
for package in Package.objects.filter(pk__in=add_content_units):
125141
content_artifact = package.contentartifact_set.first()
126142
artifact_obj = content_artifact.artifact
127143
package_id = package.pk
128144

145+
# match the package's release to a fingerprint override if one exists
146+
fingerprint = repo.release_package_signing_fingerprint(
147+
package_release_map.get(package_id)
148+
)
149+
129150
with NamedTemporaryFile(mode="wb", dir=".", delete=False) as final_package:
130151
artifact_file = artifact_obj.file
131152
_save_file(artifact_file, final_package)
@@ -137,15 +158,13 @@ def signed_add_and_remove(
137158
# check if the package has been signed in the past with our fingerprint
138159
if existing_result := DebPackageSigningResult.objects.filter(
139160
sha256=content_artifact.artifact.sha256,
140-
package_signing_fingerprint=repo.package_signing_fingerprint,
161+
package_signing_fingerprint=fingerprint,
141162
).first():
142163
_update_content_units(add_content_units, package_id, existing_result.result.pk)
143164
continue
144165

145166
# create a new signed version of the package
146-
artifact = _sign_file(
147-
final_package, repo.package_signing_service, repo.package_signing_fingerprint
148-
)
167+
artifact = _sign_file(final_package, repo.package_signing_service, fingerprint)
149168
signed_package = package
150169
signed_package.pk = None
151170
signed_package.pulp_id = None

0 commit comments

Comments
 (0)