func (cli *DockerCli) trustedReference(repo string, ref registry.Reference) (registry.Reference, error) { repoInfo, err := registry.ParseRepositoryInfo(repo) if err != nil { return nil, err } // Resolve the Auth config relevant for this server authConfig := registry.ResolveAuthConfig(cli.configFile, repoInfo.Index) notaryRepo, err := cli.getNotaryRepository(repoInfo, authConfig) if err != nil { fmt.Fprintf(cli.out, "Error establishing connection to trust repository: %s\n", err) return nil, err } t, err := notaryRepo.GetTargetByName(ref.String()) if err != nil { return nil, err } r, err := convertTarget(*t) if err != nil { return nil, err } return registry.DigestReference(r.digest), nil }
func (cli *DockerCli) trustedPull(repoInfo *registry.RepositoryInfo, ref registry.Reference, authConfig cliconfig.AuthConfig) error { var ( v = url.Values{} refs = []target{} ) notaryRepo, err := cli.getNotaryRepository(repoInfo, authConfig) if err != nil { fmt.Fprintf(cli.out, "Error establishing connection to trust repository: %s\n", err) return err } if ref.String() == "" { // List all targets targets, err := notaryRepo.ListTargets() if err != nil { return notaryError(err) } for _, tgt := range targets { t, err := convertTarget(*tgt) if err != nil { fmt.Fprintf(cli.out, "Skipping target for %q\n", repoInfo.LocalName) continue } refs = append(refs, t) } } else { t, err := notaryRepo.GetTargetByName(ref.String()) if err != nil { return notaryError(err) } r, err := convertTarget(*t) if err != nil { return err } refs = append(refs, r) } v.Set("fromImage", repoInfo.LocalName) for i, r := range refs { displayTag := r.reference.String() if displayTag != "" { displayTag = ":" + displayTag } fmt.Fprintf(cli.out, "Pull (%d of %d): %s%s@%s\n", i+1, len(refs), repoInfo.LocalName, displayTag, r.digest) v.Set("tag", r.digest.String()) _, _, err = cli.clientRequestAttemptLogin("POST", "/images/create?"+v.Encode(), nil, cli.out, repoInfo.Index, "pull") if err != nil { return err } // If reference is not trusted, tag by trusted reference if !r.reference.HasDigest() { if err := cli.tagTrusted(repoInfo, registry.DigestReference(r.digest), r.reference); err != nil { return err } } } return nil }