11from pathlib import Path
22from tempfile import NamedTemporaryFile
33
4+ from django .db .models import Q
5+
46from pulpcore .plugin .models import (
57 Upload ,
68 UploadChunk ,
2123)
2224from 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
2532def _save_file (fileobj , final_package ):
2633 with fileobj .file .open () as fd :
@@ -37,6 +44,9 @@ def _save_upload(uploadobj, final_package):
3744
3845
3946def _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