76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
package storage
 | 
						|
 | 
						|
import (
 | 
						|
	"path"
 | 
						|
 | 
						|
	"github.com/docker/distribution"
 | 
						|
	"github.com/docker/distribution/digest"
 | 
						|
)
 | 
						|
 | 
						|
type signatureStore struct {
 | 
						|
	*repository
 | 
						|
}
 | 
						|
 | 
						|
var _ distribution.SignatureService = &signatureStore{}
 | 
						|
 | 
						|
func (s *signatureStore) Get(dgst digest.Digest) ([][]byte, error) {
 | 
						|
	signaturesPath, err := s.pm.path(manifestSignaturesPathSpec{
 | 
						|
		name:     s.Name(),
 | 
						|
		revision: dgst,
 | 
						|
	})
 | 
						|
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	// Need to append signature digest algorithm to path to get all items.
 | 
						|
	// Perhaps, this should be in the pathMapper but it feels awkward. This
 | 
						|
	// can be eliminated by implementing listAll on drivers.
 | 
						|
	signaturesPath = path.Join(signaturesPath, "sha256")
 | 
						|
 | 
						|
	signaturePaths, err := s.driver.List(signaturesPath)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	var signatures [][]byte
 | 
						|
	for _, sigPath := range signaturePaths {
 | 
						|
		// Append the link portion
 | 
						|
		sigPath = path.Join(sigPath, "link")
 | 
						|
 | 
						|
		// TODO(stevvooe): These fetches should be parallelized for performance.
 | 
						|
		p, err := s.blobStore.linked(sigPath)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
 | 
						|
		signatures = append(signatures, p)
 | 
						|
	}
 | 
						|
 | 
						|
	return signatures, nil
 | 
						|
}
 | 
						|
 | 
						|
func (s *signatureStore) Put(dgst digest.Digest, signatures ...[]byte) error {
 | 
						|
	for _, signature := range signatures {
 | 
						|
		signatureDigest, err := s.blobStore.put(signature)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
 | 
						|
		signaturePath, err := s.pm.path(manifestSignatureLinkPathSpec{
 | 
						|
			name:      s.Name(),
 | 
						|
			revision:  dgst,
 | 
						|
			signature: signatureDigest,
 | 
						|
		})
 | 
						|
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
 | 
						|
		if err := s.blobStore.link(signaturePath, signatureDigest); err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 |