Skip to content

Commit 811a527

Browse files
committed
Refactor signature handling in putSignaturesToSigstoreAttachment and getSigstoreAttachmentManifest
Signed-off-by: Ayato Tokubi <[email protected]>
1 parent e8a041e commit 811a527

File tree

3 files changed

+17
-51
lines changed

3 files changed

+17
-51
lines changed

image/oci/layout/oci_dest.go

Lines changed: 8 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -315,33 +315,6 @@ func (d *ociImageDestination) addManifest(desc *imgspecv1.Descriptor) {
315315
d.index.Manifests = append(slices.Clone(d.index.Manifests), *desc)
316316
}
317317

318-
// addSignatureManifest is similar to addManifest, but replace the entry based on imgspecv1.AnnotationRefName
319-
// and returns the old digest to delete it later.
320-
func (d *ociImageDestination) addSignatureManifest(desc *imgspecv1.Descriptor) (*imgspecv1.Descriptor, error) {
321-
if desc.Annotations == nil || desc.Annotations[imgspecv1.AnnotationRefName] == "" {
322-
return nil, errors.New("cannot add signature manifest without ref.name")
323-
}
324-
for i, m := range d.index.Manifests {
325-
if m.Annotations[imgspecv1.AnnotationRefName] == desc.Annotations[imgspecv1.AnnotationRefName] {
326-
// Replace it completely.
327-
oldDesc := d.index.Manifests[i]
328-
d.index.Manifests[i] = *desc
329-
return &oldDesc, nil
330-
}
331-
}
332-
// It shouldn't happen, but if there's no entry with the same ref name, but the same digest, just replace it.
333-
for i, m := range d.index.Manifests {
334-
if m.Digest == desc.Digest && m.Annotations[imgspecv1.AnnotationRefName] == "" {
335-
// Replace it completely.
336-
d.index.Manifests[i] = *desc
337-
return nil, nil
338-
}
339-
}
340-
// It's a new entry to be added to the index. Use slices.Clone() to avoid a remote dependency on how d.index was created.
341-
d.index.Manifests = append(slices.Clone(d.index.Manifests), *desc)
342-
return nil, nil
343-
}
344-
345318
// CommitWithOptions marks the process of storing the image as successful and asks for the image to be persisted.
346319
// WARNING: This does not have any transactional semantics:
347320
// - Uploaded data MAY be visible to others before CommitWithOptions() is called
@@ -409,9 +382,9 @@ func (d *ociImageDestination) PutSignaturesWithFormat(ctx context.Context, signa
409382
}
410383

411384
func (d *ociImageDestination) putSignaturesToSigstoreAttachment(ctx context.Context, signatures []signature.Sigstore, manifestDigest digest.Digest) error {
412-
var signConfig imgspecv1.Image // Most fields empty by default
413-
414-
signManifest, err := d.ref.getSigstoreAttachmentManifest(manifestDigest, &d.index, d.sharedBlobDir)
385+
var signConfig imgspecv1.Image // Most fields empty by default
386+
var oldConfigDigest *digest.Digest // It is used for cleanup when updated
387+
signManifest, signDesc, err := d.ref.getSigstoreAttachmentManifest(manifestDigest, &d.index, d.sharedBlobDir)
415388
if err != nil {
416389
return err
417390
}
@@ -423,6 +396,7 @@ func (d *ociImageDestination) putSignaturesToSigstoreAttachment(ctx context.Cont
423396
}, nil)
424397
signConfig.RootFS.Type = "layers"
425398
} else {
399+
oldConfigDigest = &signManifest.Config.Digest
426400
logrus.Debugf("Fetching sigstore attachment config %s", signManifest.Config.Digest.String())
427401
configBlob, err := d.ref.getOCIDescriptorContents(signManifest.Config.Digest, iolimits.MaxConfigBodySize, d.sharedBlobDir)
428402
if err != nil {
@@ -500,25 +474,17 @@ func (d *ociImageDestination) putSignaturesToSigstoreAttachment(ctx context.Cont
500474
if err != nil {
501475
return err
502476
}
503-
oldDesc, err := d.addSignatureManifest(&imgspecv1.Descriptor{
477+
d.addManifest(&imgspecv1.Descriptor{
504478
MediaType: signManifest.MediaType,
505479
Digest: signDigest,
506480
Size: int64(len(signManifestBlob)),
507481
Annotations: map[string]string{
508482
imgspecv1.AnnotationRefName: signTag,
509483
},
510484
})
511-
if err != nil {
512-
return err
513-
}
514-
// If it overwrote an existing signature manifest, delete blobs referenced by the old manifest.
515-
if oldDesc != nil {
516-
referencedBlobs := make(map[digest.Digest]int)
517-
err = d.ref.countBlobsForDescriptor(referencedBlobs, oldDesc, d.sharedBlobDir)
518-
if err != nil {
519-
return fmt.Errorf("error counting blobs for digest %s: %w", oldDesc.Digest.String(), err)
520-
}
521-
d.blobDeleteCandidates.AddSeq(maps.Keys(referencedBlobs))
485+
if signDesc != nil && oldConfigDigest != nil {
486+
d.blobDeleteCandidates.Add(signDesc.Digest)
487+
d.blobDeleteCandidates.Add(*oldConfigDigest)
522488
}
523489
return nil
524490
}

image/oci/layout/oci_src.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ func (s *ociImageSource) GetSignaturesWithFormat(ctx context.Context, instanceDi
240240
instanceDigest = &s.descriptor.Digest
241241
}
242242

243-
ociManifest, err := s.ref.getSigstoreAttachmentManifest(*instanceDigest, s.index, s.sharedBlobDir)
243+
ociManifest, _, err := s.ref.getSigstoreAttachmentManifest(*instanceDigest, s.index, s.sharedBlobDir)
244244
if err != nil {
245245
return nil, err
246246
}

image/oci/layout/oci_transport.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,10 @@ func sigstoreAttachmentTag(d digest.Digest) (string, error) {
338338
return strings.Replace(d.String(), ":", "-", 1) + ".sig", nil
339339
}
340340

341-
func (ref ociReference) getSigstoreAttachmentManifest(d digest.Digest, idx *imgspecv1.Index, sharedBlobDir string) (*manifest.OCI1, error) {
341+
func (ref ociReference) getSigstoreAttachmentManifest(d digest.Digest, idx *imgspecv1.Index, sharedBlobDir string) (*manifest.OCI1, *imgspecv1.Descriptor, error) {
342342
signTag, err := sigstoreAttachmentTag(d)
343343
if err != nil {
344-
return nil, err
344+
return nil, nil, err
345345
}
346346
var signDesc *imgspecv1.Descriptor
347347
for _, m := range idx.Manifests {
@@ -352,26 +352,26 @@ func (ref ociReference) getSigstoreAttachmentManifest(d digest.Digest, idx *imgs
352352
}
353353
if signDesc == nil {
354354
// No signature found
355-
return nil, nil
355+
return nil, nil, nil
356356
}
357357
if signDesc.MediaType != imgspecv1.MediaTypeImageManifest {
358-
return nil, fmt.Errorf("unexpected MIME type for sigstore attachment manifest %s: %q",
358+
return nil, nil, fmt.Errorf("unexpected MIME type for sigstore attachment manifest %s: %q",
359359
signTag, signDesc.MediaType)
360360
}
361361
blobReader, _, err := ref.getBlob(signDesc.Digest, sharedBlobDir)
362362
if err != nil {
363-
return nil, fmt.Errorf("failed to get Blob %s: %w", signTag, err)
363+
return nil, nil, fmt.Errorf("failed to get Blob %s: %w", signTag, err)
364364
}
365365
defer blobReader.Close()
366366
signBlob, err := iolimits.ReadAtMost(blobReader, iolimits.MaxManifestBodySize)
367367
if err != nil {
368-
return nil, fmt.Errorf("failed to read blob: %w", err)
368+
return nil, nil, fmt.Errorf("failed to read blob: %w", err)
369369
}
370370
res, err := manifest.OCI1FromManifest(signBlob)
371371
if err != nil {
372-
return nil, fmt.Errorf("parsing manifest %s: %w", signDesc.Digest, err)
372+
return nil, nil, fmt.Errorf("parsing manifest %s: %w", signDesc.Digest, err)
373373
}
374-
return res, nil
374+
return res, signDesc, nil
375375
}
376376

377377
func (ref ociReference) getBlob(d digest.Digest, sharedBlobDir string) (io.ReadCloser, int64, error) {

0 commit comments

Comments
 (0)