func publishAndPrintToCLI(cmd *cobra.Command, nRepo *notaryclient.NotaryRepository, gun string) error { if err := nRepo.Publish(); err != nil { return err } cmd.Printf("Successfully published changes for repository %s\n", gun) return nil }
// Attempt to add the image target to all the top level delegation roles we can // (based on whether we have the signing key and whether the role's path allows // us to). // If there are no delegation roles, we add to the targets role. func (cli *DockerCli) addTargetToAllSignableRoles(repo *client.NotaryRepository, target *client.Target) error { var signableRoles []string // translate the full key names, which includes the GUN, into just the key IDs allCanonicalKeyIDs := make(map[string]struct{}) for fullKeyID := range repo.CryptoService.ListAllKeys() { allCanonicalKeyIDs[path.Base(fullKeyID)] = struct{}{} } allDelegationRoles, err := repo.GetDelegationRoles() if err != nil { return err } // if there are no delegation roles, then just try to sign it into the targets role if len(allDelegationRoles) == 0 { return repo.AddTarget(target, data.CanonicalTargetsRole) } // there are delegation roles, find every delegation role we have a key for, and // attempt to sign into into all those roles. for _, delegationRole := range allDelegationRoles { // We do not support signing any delegation role that isn't a direct child of the targets role. // Also don't bother checking the keys if we can't add the target // to this role due to path restrictions if path.Dir(delegationRole.Name) != data.CanonicalTargetsRole || !delegationRole.CheckPaths(target.Name) { continue } for _, canonicalKeyID := range delegationRole.KeyIDs { if _, ok := allCanonicalKeyIDs[canonicalKeyID]; ok { signableRoles = append(signableRoles, delegationRole.Name) break } } } if len(signableRoles) == 0 { return fmt.Errorf("no valid signing keys for delegation roles") } return repo.AddTarget(target, signableRoles...) }