@@ -3,7 +3,6 @@ package trust
33import (
44 "context"
55 "fmt"
6- "os"
76 "strings"
87
98 "github.com/docker/cli/cli"
@@ -76,6 +75,22 @@ func isLastSignerForReleases(roleWithSig data.Role, allRoles []client.RoleWithSi
7675 return counter < releasesRoleWithSigs .Threshold , nil
7776}
7877
78+ func maybePromptForSignerRemoval (ctx context.Context , dockerCLI command.Cli , repoName , signerName string , isLastSigner , forceYes bool ) (bool , error ) {
79+ if isLastSigner && ! forceYes {
80+ message := fmt .Sprintf ("The signer \" %s\" signed the last released version of %s. " +
81+ "Removing this signer will make %s unpullable. " +
82+ "Are you sure you want to continue?" ,
83+ signerName , repoName , repoName ,
84+ )
85+ removeSigner , err := command .PromptForConfirmation (ctx , dockerCLI .In (), dockerCLI .Out (), message )
86+ if err != nil {
87+ return false , err
88+ }
89+ return removeSigner , nil
90+ }
91+ return false , nil
92+ }
93+
7994// removeSingleSigner attempts to remove a single signer and returns whether signer removal happened.
8095// The signer not being removed doesn't necessarily raise an error e.g. user choosing "No" when prompted for confirmation.
8196func removeSingleSigner (ctx context.Context , dockerCLI command.Cli , repoName , signerName string , forceYes bool ) (bool , error ) {
@@ -110,31 +125,26 @@ func removeSingleSigner(ctx context.Context, dockerCLI command.Cli, repoName, si
110125 if err != nil {
111126 return false , err
112127 }
113- if ok , err := isLastSignerForReleases (role , allRoles ); ok && ! forceYes {
114- removeSigner , err := command .PromptForConfirmation (ctx , os .Stdin , dockerCLI .Out (), fmt .Sprintf ("The signer \" %s\" signed the last released version of %s. " +
115- "Removing this signer will make %s unpullable. " +
116- "Are you sure you want to continue?" ,
117- signerName , repoName , repoName ,
118- ))
119- if err != nil {
120- return false , err
121- }
122128
123- if ! removeSigner {
124- fmt .Fprintf (dockerCLI .Out (), "\n Aborting action.\n " )
125- return false , nil
126- }
127- } else if err != nil {
129+ isLastSigner , err := isLastSignerForReleases (role , allRoles )
130+ if err != nil {
128131 return false , err
129132 }
130- if err = notaryRepo .RemoveDelegationKeys (releasesRoleTUFName , role .KeyIDs ); err != nil {
133+
134+ ok , err := maybePromptForSignerRemoval (ctx , dockerCLI , repoName , signerName , isLastSigner , forceYes )
135+ if err != nil || ! ok {
136+ fmt .Fprintf (dockerCLI .Out (), "\n Aborting action.\n " )
137+ return false , err
138+ }
139+
140+ if err := notaryRepo .RemoveDelegationKeys (releasesRoleTUFName , role .KeyIDs ); err != nil {
131141 return false , err
132142 }
133- if err = notaryRepo .RemoveDelegationRole (signerDelegation ); err != nil {
143+ if err : = notaryRepo .RemoveDelegationRole (signerDelegation ); err != nil {
134144 return false , err
135145 }
136146
137- if err = notaryRepo .Publish (); err != nil {
147+ if err : = notaryRepo .Publish (); err != nil {
138148 return false , err
139149 }
140150
0 commit comments