MCPcopy Create free account
hub / github.com/cli/cli / GetAttestations

Method GetAttestations

pkg/cmd/attestation/artifact/oci/client.go:71–125  ·  view source on GitHub ↗
(ref name.Reference, digest string)

Source from the content-addressed store, hash-verified

69}
70
71func (c LiveClient) GetAttestations(ref name.Reference, digest string) ([]*api.Attestation, error) {
72 attestations := make([]*api.Attestation, 0)
73
74 transportOpts := []remote.Option{remote.WithAuthFromKeychain(authn.DefaultKeychain)}
75 referrers, err := remote.Referrers(ref.Context().Digest(digest), transportOpts...)
76 if err != nil {
77 return attestations, fmt.Errorf("error getting referrers: %w", err)
78 }
79 refManifest, err := referrers.IndexManifest()
80 if err != nil {
81 return attestations, fmt.Errorf("error getting referrers manifest: %w", err)
82 }
83
84 for _, refDesc := range refManifest.Manifests {
85 if !strings.HasPrefix(refDesc.ArtifactType, "application/vnd.dev.sigstore.bundle") {
86 continue
87 }
88
89 refImg, err := remote.Image(ref.Context().Digest(refDesc.Digest.String()), remote.WithAuthFromKeychain(authn.DefaultKeychain))
90 if err != nil {
91 return attestations, fmt.Errorf("error getting referrer image: %w", err)
92 }
93 layers, err := refImg.Layers()
94 if err != nil {
95 return attestations, fmt.Errorf("error getting referrer image: %w", err)
96 }
97
98 if len(layers) > 0 {
99 layer0, err := layers[0].Uncompressed()
100 if err != nil {
101 return attestations, fmt.Errorf("error getting referrer image: %w", err)
102 }
103 defer layer0.Close()
104
105 bundleBytes, err := io.ReadAll(layer0)
106
107 if err != nil {
108 return attestations, fmt.Errorf("error getting referrer image: %w", err)
109 }
110
111 b := &bundle.Bundle{}
112 err = b.UnmarshalJSON(bundleBytes)
113
114 if err != nil {
115 return attestations, fmt.Errorf("error unmarshalling bundle: %w", err)
116 }
117
118 a := api.Attestation{Bundle: b}
119 attestations = append(attestations, &a)
120 } else {
121 return attestations, fmt.Errorf("error getting referrer image: no layers found")
122 }
123 }
124 return attestations, nil
125}
126
127// Unlike other parts of this command set, we cannot pass a custom HTTP client
128// to the go-containerregistry library. This means we have limited visibility

Callers

nothing calls this directly

Calls 5

DigestMethod · 0.80
UnmarshalJSONMethod · 0.80
ErrorfMethod · 0.65
StringMethod · 0.65
CloseMethod · 0.65

Tested by

no test coverage detected