@@ -3,8 +3,6 @@ package update
33import (
44 "context"
55 "fmt"
6- "io/fs"
7- "strings"
86
97 "github.com/spf13/cobra"
108 intake "github.com/stackitcloud/stackit-sdk-go/services/intake/v1betaapi"
@@ -31,48 +29,8 @@ const (
3129 passwordFlag = "password"
3230 userTypeFlag = "type"
3331 labelsFlag = "labels"
34-
35- interactivePasswordPlaceholder = "__INTERACTIVE__"
3632)
3733
38- type secretUpdateFlag struct {
39- printer * print.Printer
40- fs fs.FS
41- value string
42- isPrompt bool
43- }
44-
45- func (f * secretUpdateFlag ) String () string {
46- return f .value
47- }
48-
49- func (f * secretUpdateFlag ) Set (value string ) error {
50- if value == interactivePasswordPlaceholder {
51- f .isPrompt = true
52- return nil
53- }
54- if strings .HasPrefix (value , "@" ) {
55- path := strings .Trim (value [1 :], `"'` )
56- bytes , err := fs .ReadFile (f .fs , path )
57- if err != nil {
58- return fmt .Errorf ("reading secret %s: %w" , passwordFlag , err )
59- }
60- val := strings .TrimRight (string (bytes ), "\r \n " )
61- if val == "" {
62- return fmt .Errorf ("the provided secret file %q is empty" , path )
63- }
64- f .value = val
65- return nil
66- }
67- f .printer .Warn ("Passing a secret value on the command line is insecure and deprecated. This usage will stop working October 2026.\n " )
68- f .value = value
69- return nil
70- }
71-
72- func (f * secretUpdateFlag ) Type () string {
73- return "string"
74- }
75-
7634type inputModel struct {
7735 * globalflags.GlobalFlagModel
7836 IntakeId string
@@ -85,11 +43,6 @@ type inputModel struct {
8543}
8644
8745func NewCmd (p * types.CmdParams ) * cobra.Command {
88- password := & secretUpdateFlag {
89- printer : p .Printer ,
90- fs : p .Fs ,
91- }
92-
9346 cmd := & cobra.Command {
9447 Use : fmt .Sprintf ("update %s" , userIdArg ),
9548 Short : "Updates an Intake User" ,
@@ -140,16 +93,16 @@ func NewCmd(p *types.CmdParams) *cobra.Command {
14093 return outputResult (p .Printer , model , resp )
14194 },
14295 }
143- configureFlags (cmd , password )
96+ configureFlags (cmd , p )
14497 return cmd
14598}
14699
147- func configureFlags (cmd * cobra.Command , password * secretUpdateFlag ) {
100+ func configureFlags (cmd * cobra.Command , params * types. CmdParams ) {
148101 cmd .Flags ().Var (flags .UUIDFlag (), intakeIdFlag , "Intake ID" )
149102 cmd .Flags ().String (displayNameFlag , "" , "Display name" )
150103 cmd .Flags ().String (descriptionFlag , "" , "Description" )
151- cmd . Flags (). Var ( password , passwordFlag , "Password. Can be a string (deprecated) or a file path, if prefixed with '@' (example: @./secret.txt). If provided without a value, you will be prompted interactively. Must contain lower, upper, digits, and special characters (min 12 chars)." )
152- cmd .Flags ().Lookup ( passwordFlag ). NoOptDefVal = interactivePasswordPlaceholder
104+ password := flags . SecretFlag ( passwordFlag , params )
105+ cmd .Flags ().Var ( password , passwordFlag , password . Usage ())
153106 cmd .Flags ().String (userTypeFlag , "" , "Type of user. One of 'intake' or 'dead-letter'" )
154107 cmd .Flags ().StringToString (labelsFlag , nil , `Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2".` )
155108
@@ -165,18 +118,13 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu
165118 return nil , & cliErr.ProjectIdError {}
166119 }
167120
168- password , err := parsePassword (p , cmd )
169- if err != nil {
170- return nil , err
171- }
172-
173121 model := & inputModel {
174122 GlobalFlagModel : globalFlags ,
175123 IntakeId : flags .FlagToStringValue (p , cmd , intakeIdFlag ),
176124 UserId : userId ,
177125 DisplayName : flags .FlagToStringPointer (p , cmd , displayNameFlag ),
178126 Description : flags .FlagToStringPointer (p , cmd , descriptionFlag ),
179- Password : password ,
127+ Password : flags . SecretFlagToStringPointer ( p , cmd , passwordFlag ) ,
180128 UserType : flags .FlagToStringPointer (p , cmd , userTypeFlag ),
181129 Labels : flags .FlagToStringToStringPointer (p , cmd , labelsFlag ),
182130 }
@@ -189,29 +137,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu
189137 return model , nil
190138}
191139
192- func parsePassword (p * print.Printer , cmd * cobra.Command ) (* string , error ) {
193- flag := cmd .Flag (passwordFlag )
194- if flag == nil || ! flag .Changed {
195- return nil , nil
196- }
197- if secretFlag , ok := flag .Value .(* secretUpdateFlag ); ok && secretFlag .isPrompt {
198- input , err := p .PromptForPassword ("enter new password: " )
199- if err != nil {
200- return nil , fmt .Errorf ("prompt for password: %w" , err )
201- }
202- input = strings .TrimRight (input , "\r \n " )
203- if input == "" {
204- return nil , fmt .Errorf ("password cannot be empty" )
205- }
206- return & input , nil
207- }
208- val := strings .TrimRight (flag .Value .String (), "\r \n " )
209- if val == "" {
210- return nil , fmt .Errorf ("the provided password (or secret file) is empty" )
211- }
212- return & val , nil
213- }
214-
215140func buildRequest (ctx context.Context , model * inputModel , apiClient * intake.APIClient ) intake.ApiUpdateIntakeUserRequest {
216141 req := apiClient .DefaultAPI .UpdateIntakeUser (ctx , model .ProjectId , model .Region , model .IntakeId , model .UserId )
217142
0 commit comments