@@ -4,11 +4,13 @@ package distribution
4
4
5
5
import (
6
6
"fmt"
7
+ "io"
7
8
"path/filepath"
8
9
9
10
"github.com/containers/image/docker"
10
11
"github.com/containers/image/docker/daemon/signatures"
11
12
containersImageRef "github.com/containers/image/docker/reference"
13
+ ciImage "github.com/containers/image/image"
12
14
"github.com/containers/image/manifest"
13
15
"github.com/containers/image/signature"
14
16
"github.com/containers/image/types"
@@ -44,19 +46,19 @@ func configurePolicyContext() (*signature.PolicyContext, error) {
44
46
return pc , nil
45
47
}
46
48
47
- // ciImage returns a containers/image/types.Image for ref.
48
- func (p * v2Puller ) ciImage (c gctx.Context , ref reference.Named ) (types. Image , error ) {
49
+ // ciImage returns a * containers/image/image.UnparsedImage and a close callback for ref.
50
+ func (p * v2Puller ) ciImage (c gctx.Context , ref reference.Named ) (* ciImage. UnparsedImage , io. Closer , error ) {
49
51
// we can't use upstream docker/docker/reference since in projectatomic/docker
50
52
// we modified docker/docker/reference and it's not doing any normalization.
51
53
// we instead forked docker/docker/reference in containers/image and we need
52
54
// this parsing here to make sure signature naming checks are consistent.
53
55
dockerRef , err := containersImageRef .ParseNormalizedNamed (ref .String ())
54
56
if err != nil {
55
- return nil , err
57
+ return nil , nil , err
56
58
}
57
59
imgRef , err := docker .NewReference (dockerRef )
58
60
if err != nil {
59
- return nil , err
61
+ return nil , nil , err
60
62
}
61
63
isSecure := (p .endpoint .TLSConfig == nil || ! p .endpoint .TLSConfig .InsecureSkipVerify )
62
64
authConfig := registry .ResolveAuthConfig (p .config .AuthConfigs , p .repoInfo .Index )
@@ -73,16 +75,17 @@ func (p *v2Puller) ciImage(c gctx.Context, ref reference.Named) (types.Image, er
73
75
if p .config .RegistryService .SecureIndex (p .repoInfo .Index .Name ) {
74
76
ctx .DockerCertPath = filepath .Join (registry .CertsDir , p .repoInfo .Index .Name )
75
77
}
76
- img , err := imgRef .NewImage (ctx )
78
+ src , err := imgRef .NewImageSource (ctx )
77
79
if err != nil {
78
- return nil , err
80
+ return nil , nil , err
79
81
}
80
- return img , nil
82
+ unparsed := ciImage .UnparsedInstance (src , nil )
83
+ return unparsed , src , nil
81
84
}
82
85
83
- func (p * v2Puller ) checkTrusted (ref reference.Named , ciImage types.Image ) (reference.Named , error ) {
86
+ func (p * v2Puller ) checkTrusted (ref reference.Named , unparsed types.UnparsedImage ) (reference.Named , error ) {
84
87
p .originalRef = ref
85
- allowed , err := p .policyContext .IsRunningImageAllowed (ciImage )
88
+ allowed , err := p .policyContext .IsRunningImageAllowed (unparsed )
86
89
if ! allowed {
87
90
if err != nil {
88
91
return nil , fmt .Errorf ("%s isn't allowed: %v" , ref .String (), err )
@@ -92,7 +95,7 @@ func (p *v2Puller) checkTrusted(ref reference.Named, ciImage types.Image) (refer
92
95
if err != nil {
93
96
return nil , err
94
97
}
95
- mfst , _ , err := ciImage .Manifest ()
98
+ mfst , _ , err := unparsed .Manifest ()
96
99
if err != nil {
97
100
return nil , err
98
101
}
@@ -108,7 +111,11 @@ func (p *v2Puller) checkTrusted(ref reference.Named, ciImage types.Image) (refer
108
111
}
109
112
110
113
// storeSignature stores the signatures of ciImage and updates the tag in ciImage.Reference() if necessary.
111
- func (p * v2Puller ) storeSignatures (c gctx.Context , ciImage types.Image ) error {
114
+ func (p * v2Puller ) storeSignatures (c gctx.Context , unparsed * ciImage.UnparsedImage ) error {
115
+ img , err := ciImage .FromUnparsedImage (nil , unparsed )
116
+ if err != nil {
117
+ return err
118
+ }
112
119
store := signatures .NewStore (nil )
113
- return store .RecordImage (c , ciImage )
120
+ return store .RecordImage (c , img )
114
121
}
0 commit comments