@@ -15,6 +15,7 @@ import (
1515 "github.com/smallstep/cli-utils/ui"
1616
1717 "github.com/smallstep/cli/flags"
18+ "github.com/smallstep/cli/internal/provisionerflag"
1819 "github.com/smallstep/cli/utils"
1920)
2021
@@ -86,6 +87,17 @@ func (e *ACMETokenError) Error() string {
8687 return "step ACME provisioners do not support token auth flows"
8788}
8889
90+ // SCEPTokenError is the error type returned when the user attempts a Token Flow
91+ // while using a SCEP provisioner.
92+ type SCEPTokenError struct {
93+ Name string
94+ }
95+
96+ // Error implements the error interface.
97+ func (e * SCEPTokenError ) Error () string {
98+ return "step SCEP provisioners do not support token auth flows"
99+ }
100+
89101// NewTokenFlow implements the common flow used to generate a token
90102func NewTokenFlow (ctx * cli.Context , tokType int , subject string , sans []string , caURL , root string , notBefore , notAfter time.Time , certNotBefore , certNotAfter provisioner.TimeDuration , opts ... Option ) (string , error ) {
91103 // Apply options to shared context
@@ -164,6 +176,8 @@ func NewTokenFlow(ctx *cli.Context, tokType int, subject string, sans []string,
164176 return p .GetIdentityToken (subject , caURL )
165177 case * provisioner.ACME : // Return an error with the provisioner ID.
166178 return "" , & ACMETokenError {p .GetName ()}
179+ case * provisioner.SCEP :
180+ return "" , & SCEPTokenError {p .GetName ()}
167181 default :
168182 return "" , errors .Errorf ("unknown provisioner type %T" , p )
169183 }
@@ -212,13 +226,13 @@ func OfflineTokenFlow(ctx *cli.Context, typ int, subject string, sans []string,
212226 }
213227
214228 kid := ctx .String ("kid" )
215- issuer := flags .FirstStringOf (ctx , "provisioner" , "issuer" )
229+ issuer , flag := flags .FirstStringOf (ctx , "provisioner" , "issuer" )
216230
217231 // Require issuer and keyFile if ca.json does not exists.
218232 // kid can be passed or created using jwk.Thumbprint.
219233 switch {
220234 case issuer == "" :
221- return "" , errs .RequiredWithFlag (ctx , "offline" , "issuer" )
235+ return "" , errs .RequiredWithFlag (ctx , "offline" , flag )
222236 case ctx .String ("key" ) == "" :
223237 return "" , errs .RequiredWithFlag (ctx , "offline" , "key" )
224238 }
@@ -293,7 +307,7 @@ func provisionerPrompt(ctx *cli.Context, provisioners provisioner.List) (provisi
293307 provisioners = provisionerFilter (provisioners , func (p provisioner.Interface ) bool {
294308 switch p .GetType () {
295309 case provisioner .TypeJWK , provisioner .TypeOIDC ,
296- provisioner .TypeACME , provisioner .TypeK8sSA ,
310+ provisioner .TypeACME , provisioner .TypeSCEP , provisioner . TypeK8sSA ,
297311 provisioner .TypeX5C , provisioner .TypeSSHPOP , provisioner .TypeNebula :
298312 return true
299313 case provisioner .TypeGCP , provisioner .TypeAWS , provisioner .TypeAzure :
@@ -325,23 +339,27 @@ func provisionerPrompt(ctx *cli.Context, provisioners provisioner.List) (provisi
325339 }
326340 }
327341
328- // Filter by issuer (provisioner name)
329- if issuer := flags . FirstStringOf ( ctx , " provisioner" , "issuer " ); issuer != "" {
342+ // Filter by admin-provisioner (provisioner name)
343+ if issuer := ctx . String ( "admin- provisioner" ); issuer != "" {
330344 provisioners = provisionerFilter (provisioners , func (p provisioner.Interface ) bool {
331345 return p .GetName () == issuer
332346 })
333347 if len (provisioners ) == 0 {
334- return nil , errs .InvalidFlagValue (ctx , "issuer " , issuer , "" )
348+ return nil , errs .InvalidFlagValue (ctx , "admin-provisioner " , issuer , "" )
335349 }
336350 }
337351
338- // Filter by admin- provisioner (provisioner name)
339- if issuer := ctx . String ( "admin- provisioner" ); issuer != "" {
352+ // Filter by provisioner / issuer (provisioner name)
353+ if issuer , flag := flags . FirstStringOf ( ctx , " provisioner" , "issuer " ); issuer != "" {
340354 provisioners = provisionerFilter (provisioners , func (p provisioner.Interface ) bool {
355+ if provisionerflag .ShouldBeIgnored () {
356+ return true // fake match; effectively skipping provisioner flag value for provisioner-dependent policy commands
357+ }
358+
341359 return p .GetName () == issuer
342360 })
343361 if len (provisioners ) == 0 {
344- return nil , errs .InvalidFlagValue (ctx , "admin-provisioner" , issuer , "" )
362+ return nil , errs .InvalidFlagValue (ctx , flag , issuer , "" )
345363 }
346364 }
347365
@@ -364,7 +382,7 @@ func provisionerPrompt(ctx *cli.Context, provisioners provisioner.List) (provisi
364382 Name : fmt .Sprintf ("%s (%s) [tenant: %s]" , p .Name , p .GetType (), p .TenantID ),
365383 Provisioner : p ,
366384 })
367- case * provisioner.GCP , * provisioner.AWS , * provisioner.X5C , * provisioner.SSHPOP , * provisioner.ACME , * provisioner.Nebula :
385+ case * provisioner.GCP , * provisioner.AWS , * provisioner.X5C , * provisioner.SSHPOP , * provisioner.ACME , * provisioner.SCEP , * provisioner. Nebula :
368386 items = append (items , & provisionersSelect {
369387 Name : fmt .Sprintf ("%s (%s)" , p .GetName (), p .GetType ()),
370388 Provisioner : p ,
0 commit comments