From fa419aa8c80946cf0fb984c6f9dce10a995c81f0 Mon Sep 17 00:00:00 2001 From: Rita Zerrizuela Date: Thu, 11 Mar 2021 23:39:13 -0300 Subject: [PATCH 1/7] Add flags PoC --- internal/cli/apps.go | 89 ++++++++++++++++++++++++------------------- internal/cli/flags.go | 50 ++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 40 deletions(-) create mode 100644 internal/cli/flags.go diff --git a/internal/cli/apps.go b/internal/cli/apps.go index fcdd0899b..25ddb0a0a 100644 --- a/internal/cli/apps.go +++ b/internal/cli/apps.go @@ -13,10 +13,38 @@ import ( ) const ( - appID = "id" - appName = "name" - appType = "type" - appDescription = "description" + appID = "id" + appType = "type" +) + +var ( + appName = Flag{ + Name: "Name", + LongForm: "name", + ShortForm: "n", + DefaultValue: "", + Help: "Name of the application.", + IsRequired: true, + IsInteractive: true, + } + appDescription = Flag{ + Name: "Description", + LongForm: "description", + ShortForm: "d", + DefaultValue: "", + Help: "Description of the application. Max character count is 140.", + IsRequired: false, + IsInteractive: true, + } + appAuthMethod = Flag{ + Name: "Auth Method", + LongForm: "auth-method", + ShortForm: "a", + DefaultValue: "", + Help: "Defines the requested authentication method for the token endpoint. Possible values are 'None' (public application without a client secret), 'Post' (application uses HTTP POST parameters) or 'Basic' (application uses HTTP Basic).", + IsRequired: false, + IsInteractive: false, + } ) func appsCmd(cli *cli) *cobra.Command { @@ -182,21 +210,14 @@ func createAppCmd(cli *cli) *cobra.Command { Short: "Create a new application", Long: `Create a new application: -auth0 apps create --name myapp --type [native|spa|regular|m2m] +auth0 apps create --Name myapp --type [native|spa|regular|m2m] `, PreRun: func(cmd *cobra.Command, args []string) { prepareInteractivity(cmd) }, RunE: func(cmd *cobra.Command, args []string) error { - if shouldPrompt(cmd, appName) { - input := prompt.TextInput( - appName, "Name:", - "Name of the application. You can change the name later in the application settings.", - true) - - if err := prompt.AskOne(input, &flags); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := appName.Ask(cmd, &flags.Name); err != nil { + return err } if shouldPrompt(cmd, appType) { @@ -215,12 +236,8 @@ auth0 apps create --name myapp --type [native|spa|regular|m2m] } } - if shouldPrompt(cmd, appDescription) { - input := prompt.TextInput(appDescription, "Description:", "Description of the application.", false) - - if err := prompt.AskOne(input, &flags); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := appDescription.Ask(cmd, &flags.Description); err != nil { + return err } a := &management.Client{ @@ -257,20 +274,20 @@ auth0 apps create --name myapp --type [native|spa|regular|m2m] }, } - cmd.Flags().StringVarP(&flags.Name, "name", "n", "", "Name of the application.") + appName.RegisterString(cmd, &flags.Name) cmd.Flags().StringVarP(&flags.Type, "type", "t", "", "Type of application:\n"+ "- native: mobile, desktop, CLI and smart device apps running natively.\n"+ "- spa (single page application): a JavaScript front-end app that uses an API.\n"+ "- regular: Traditional web app using redirects.\n"+ "- m2m (machine to machine): CLIs, daemons or services running on your backend.") - cmd.Flags().StringVarP(&flags.Description, "description", "d", "", "Description of the application. Max character count is 140.") + appDescription.RegisterString(cmd, &flags.Description) cmd.Flags().StringSliceVarP(&flags.Callbacks, "callbacks", "c", nil, "After the user authenticates we will only call back to any of these URLs. You can specify multiple valid URLs by comma-separating them (typically to handle different environments like QA or testing). Make sure to specify the protocol (https://) otherwise the callback may fail in some cases. With the exception of custom URI schemes for native apps, all callbacks should use protocol https://.") cmd.Flags().StringSliceVarP(&flags.AllowedOrigins, "origins", "o", nil, "Comma-separated list of URLs allowed to make requests from JavaScript to Auth0 API (typically used with CORS). By default, all your callback URLs will be allowed. This field allows you to enter other origins if necessary. You can also use wildcards at the subdomain level (e.g., https://*.contoso.com). Query strings and hash information are not taken into account when validating these URLs.") cmd.Flags().StringSliceVarP(&flags.AllowedWebOrigins, "web-origins", "w", nil, "Comma-separated list of allowed origins for use with Cross-Origin Authentication, Device Flow, and web message response mode.") cmd.Flags().StringSliceVarP(&flags.AllowedLogoutURLs, "logout-urls", "l", nil, "Comma-separated list of URLs that are valid to redirect to after logout from Auth0. Wildcards are allowed for subdomains.") - cmd.Flags().StringVarP(&flags.AuthMethod, "auth-method", "a", "", "Defines the requested authentication method for the token endpoint. Possible values are 'None' (public application without a client secret), 'Post' (application uses HTTP POST parameters) or 'Basic' (application uses HTTP Basic).") + appAuthMethod.RegisterString(cmd, &flags.AuthMethod) cmd.Flags().StringSliceVarP(&flags.Grants, "grants", "g", nil, "List of grant types supported for this application. Can include code, implicit, refresh-token, credentials, password, password-realm, mfa-oob, mfa-otp, mfa-recovery-code, and device-code.") - mustRequireFlags(cmd, appName, appType) + mustRequireFlags(cmd, appName.LongForm, appType) return cmd } @@ -296,7 +313,7 @@ func updateAppCmd(cli *cli) *cobra.Command { Short: "Update an application", Long: `Update an application: -auth0 apps update --name myapp --type [native|spa|regular|m2m] +auth0 apps update --Name myapp --type [native|spa|regular|m2m] `, PreRun: func(cmd *cobra.Command, args []string) { prepareInteractivity(cmd) @@ -316,12 +333,8 @@ auth0 apps update --name myapp --type [native|spa|regular|m2m] inputs.ID = args[0] } - if shouldPromptWhenFlagless(cmd, appName) { - input := prompt.TextInput(appName, "Name:", "Name of the application", true) - - if err := prompt.AskOne(input, &inputs); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := appName.AskUpdate(cmd, &inputs.Name); err != nil { + return err } if shouldPromptWhenFlagless(cmd, appType) { @@ -340,12 +353,8 @@ auth0 apps update --name myapp --type [native|spa|regular|m2m] } } - if shouldPromptWhenFlagless(cmd, appDescription) { - input := prompt.TextInput(appDescription, "Description:", "Description of the application.", false) - - if err := prompt.AskOne(input, &inputs); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := appDescription.AskUpdate(cmd, &inputs.Description); err != nil { + return err } if shouldPromptWhenFlagless(cmd, "CallbacksString") { @@ -437,18 +446,18 @@ auth0 apps update --name myapp --type [native|spa|regular|m2m] }, } - cmd.Flags().StringVarP(&inputs.Name, "name", "n", "", "Name of the application.") + appName.RegisterString(cmd, &inputs.Name) cmd.Flags().StringVarP(&inputs.Type, "type", "t", "", "Type of application:\n"+ "- native: mobile, desktop, CLI and smart device apps running natively.\n"+ "- spa (single page application): a JavaScript front-end app that uses an API.\n"+ "- regular: Traditional web app using redirects.\n"+ "- m2m (machine to machine): CLIs, daemons or services running on your backend.") - cmd.Flags().StringVarP(&inputs.Description, "description", "d", "", "Description of the application. Max character count is 140.") + appDescription.RegisterString(cmd, &inputs.Description) cmd.Flags().StringSliceVarP(&inputs.Callbacks, "callbacks", "c", nil, "After the user authenticates we will only call back to any of these URLs. You can specify multiple valid URLs by comma-separating them (typically to handle different environments like QA or testing). Make sure to specify the protocol (https://) otherwise the callback may fail in some cases. With the exception of custom URI schemes for native apps, all callbacks should use protocol https://.") cmd.Flags().StringSliceVarP(&inputs.AllowedOrigins, "origins", "o", nil, "Comma-separated list of URLs allowed to make requests from JavaScript to Auth0 API (typically used with CORS). By default, all your callback URLs will be allowed. This field allows you to enter other origins if necessary. You can also use wildcards at the subdomain level (e.g., https://*.contoso.com). Query strings and hash information are not taken into account when validating these URLs.") cmd.Flags().StringSliceVarP(&inputs.AllowedWebOrigins, "web-origins", "w", nil, "Comma-separated list of allowed origins for use with Cross-Origin Authentication, Device Flow, and web message response mode.") cmd.Flags().StringSliceVarP(&inputs.AllowedLogoutURLs, "logout-urls", "l", nil, "Comma-separated list of URLs that are valid to redirect to after logout from Auth0. Wildcards are allowed for subdomains.") - cmd.Flags().StringVarP(&inputs.AuthMethod, "auth-method", "a", "", "Defines the requested authentication method for the token endpoint. Possible values are 'None' (public application without a client secret), 'Post' (application uses HTTP POST parameters) or 'Basic' (application uses HTTP Basic).") + appAuthMethod.RegisterString(cmd, &inputs.AuthMethod) cmd.Flags().StringSliceVarP(&inputs.Grants, "grants", "g", nil, "List of grant types supported for this application. Can include code, implicit, refresh-token, credentials, password, password-realm, mfa-oob, mfa-otp, mfa-recovery-code, and device-code.") return cmd diff --git a/internal/cli/flags.go b/internal/cli/flags.go new file mode 100644 index 000000000..6d5e2d90c --- /dev/null +++ b/internal/cli/flags.go @@ -0,0 +1,50 @@ +package cli + +import ( + "fmt" + + "github.com/auth0/auth0-cli/internal/prompt" + "github.com/spf13/cobra" +) + +type Flag struct { + Name string + LongForm string + ShortForm string + DefaultValue string + Help string + IsRequired bool + IsInteractive bool +} + +func (f *Flag) Ask(cmd *cobra.Command, value interface{}) error { + return ask(cmd, f, value, false) +} + +func (f *Flag) AskUpdate(cmd *cobra.Command, value interface{}) error { + return ask(cmd, f, value, true) +} + +func (f *Flag) RegisterString(cmd *cobra.Command, value *string) { + cmd.Flags().StringVarP(value, f.LongForm, f.ShortForm, f.DefaultValue, f.Help) +} + +func ask(cmd *cobra.Command, f *Flag, value interface{}, isUpdate bool) error { + var shouldAsk bool + + if isUpdate { + shouldAsk = shouldPromptWhenFlagless(cmd, f.LongForm) + } else { + shouldAsk = shouldPrompt(cmd, f.LongForm) + } + + if f.IsInteractive && shouldAsk { + input := prompt.TextInput("", fmt.Sprintf("%s:", f.Name), f.Help, f.IsRequired) + + if err := prompt.AskOne(input, value); err != nil { + return fmt.Errorf("An unexpected error occurred: %w", err) + } + } + + return nil +} From 47bb30ce89584b6548d23ccfa4c17118d941e9e8 Mon Sep 17 00:00:00 2001 From: Rita Zerrizuela Date: Fri, 12 Mar 2021 00:01:51 -0300 Subject: [PATCH 2/7] Remove IsInteractive --- internal/cli/apps.go | 3 --- internal/cli/flags.go | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/cli/apps.go b/internal/cli/apps.go index 25ddb0a0a..50c8834a4 100644 --- a/internal/cli/apps.go +++ b/internal/cli/apps.go @@ -25,7 +25,6 @@ var ( DefaultValue: "", Help: "Name of the application.", IsRequired: true, - IsInteractive: true, } appDescription = Flag{ Name: "Description", @@ -34,7 +33,6 @@ var ( DefaultValue: "", Help: "Description of the application. Max character count is 140.", IsRequired: false, - IsInteractive: true, } appAuthMethod = Flag{ Name: "Auth Method", @@ -43,7 +41,6 @@ var ( DefaultValue: "", Help: "Defines the requested authentication method for the token endpoint. Possible values are 'None' (public application without a client secret), 'Post' (application uses HTTP POST parameters) or 'Basic' (application uses HTTP Basic).", IsRequired: false, - IsInteractive: false, } ) diff --git a/internal/cli/flags.go b/internal/cli/flags.go index 6d5e2d90c..f8ac5fe68 100644 --- a/internal/cli/flags.go +++ b/internal/cli/flags.go @@ -14,7 +14,6 @@ type Flag struct { DefaultValue string Help string IsRequired bool - IsInteractive bool } func (f *Flag) Ask(cmd *cobra.Command, value interface{}) error { @@ -38,7 +37,7 @@ func ask(cmd *cobra.Command, f *Flag, value interface{}, isUpdate bool) error { shouldAsk = shouldPrompt(cmd, f.LongForm) } - if f.IsInteractive && shouldAsk { + if shouldAsk { input := prompt.TextInput("", fmt.Sprintf("%s:", f.Name), f.Help, f.IsRequired) if err := prompt.AskOne(input, value); err != nil { From 5a0c1a0c534687770a1c49712a04e23214d9415b Mon Sep 17 00:00:00 2001 From: Rita Zerrizuela Date: Fri, 12 Mar 2021 11:47:34 -0300 Subject: [PATCH 3/7] Add RegisterStringU --- internal/cli/apis.go | 58 +++++++++++++++++++++---------------------- internal/cli/apps.go | 12 ++++----- internal/cli/flags.go | 24 ++++++++++++++++-- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/internal/cli/apis.go b/internal/cli/apis.go index 1e6b50d27..6203ed4b7 100644 --- a/internal/cli/apis.go +++ b/internal/cli/apis.go @@ -13,11 +13,28 @@ import ( const ( apiID = "id" - apiName = "name" - apiIdentifier = "identifier" apiScopes = "scopes" ) +var ( + apiName = Flag{ + Name: "Name", + LongForm: "name", + ShortForm: "n", + DefaultValue: "", + Help: "Name of the API.", + IsRequired: true, + } + apiIdentifier = Flag{ + Name: "Identifier", + LongForm: "identifier", + ShortForm: "i", + DefaultValue: "", + Help: "Identifier of the API. Cannot be changed once set.", + IsRequired: true, + } +) + func apisCmd(cli *cli) *cobra.Command { cmd := &cobra.Command{ Use: "apis", @@ -147,26 +164,12 @@ auth0 apis create --name myapi --identifier http://my-api prepareInteractivity(cmd) }, RunE: func(cmd *cobra.Command, args []string) error { - if shouldPrompt(cmd, apiName) { - input := prompt.TextInput( - apiName, "Name:", - "Name of the API. You can change the name later in the API settings.", - true) - - if err := prompt.AskOne(input, &flags); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := apiName.Ask(cmd, &flags.Name); err != nil { + return err } - if shouldPrompt(cmd, apiIdentifier) { - input := prompt.TextInput( - apiIdentifier, "Identifier:", - "Identifier of the API. Cannot be changed once set.", - true) - - if err := prompt.AskOne(input, &flags); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := apiIdentifier.Ask(cmd, &flags.Identifier); err != nil { + return err } if shouldPrompt(cmd, apiScopes) { @@ -199,10 +202,9 @@ auth0 apis create --name myapi --identifier http://my-api }, } - cmd.Flags().StringVarP(&flags.Name, apiName, "n", "", "Name of the API.") - cmd.Flags().StringVarP(&flags.Identifier, apiIdentifier, "i", "", "Identifier of the API.") + apiName.RegisterString(cmd, &flags.Name) + apiIdentifier.RegisterString(cmd, &flags.Identifier) cmd.Flags().StringVarP(&flags.Scopes, apiScopes, "s", "", "Space-separated list of scopes.") - mustRequireFlags(cmd, apiName, apiIdentifier) return cmd } @@ -240,12 +242,8 @@ auth0 apis update --name myapi inputs.ID = args[0] } - if shouldPromptWhenFlagless(cmd, apiName) { - input := prompt.TextInput(apiName, "Name:", "Name of the API.", true) - - if err := prompt.AskOne(input, &inputs); err != nil { - return fmt.Errorf("An unexpected error occurred: %w", err) - } + if err := apiName.AskU(cmd, &inputs.Name); err != nil { + return err } if shouldPromptWhenFlagless(cmd, apiScopes) { @@ -289,7 +287,7 @@ auth0 apis update --name myapi }, } - cmd.Flags().StringVarP(&inputs.Name, apiName, "n", "", "Name of the API.") + apiName.RegisterStringU(cmd, &inputs.Name) cmd.Flags().StringVarP(&inputs.Scopes, apiScopes, "s", "", "Space-separated list of scopes.") return cmd diff --git a/internal/cli/apps.go b/internal/cli/apps.go index 50c8834a4..b0558574d 100644 --- a/internal/cli/apps.go +++ b/internal/cli/apps.go @@ -284,7 +284,7 @@ auth0 apps create --Name myapp --type [native|spa|regular|m2m] cmd.Flags().StringSliceVarP(&flags.AllowedLogoutURLs, "logout-urls", "l", nil, "Comma-separated list of URLs that are valid to redirect to after logout from Auth0. Wildcards are allowed for subdomains.") appAuthMethod.RegisterString(cmd, &flags.AuthMethod) cmd.Flags().StringSliceVarP(&flags.Grants, "grants", "g", nil, "List of grant types supported for this application. Can include code, implicit, refresh-token, credentials, password, password-realm, mfa-oob, mfa-otp, mfa-recovery-code, and device-code.") - mustRequireFlags(cmd, appName.LongForm, appType) + mustRequireFlags(cmd, appType) return cmd } @@ -330,7 +330,7 @@ auth0 apps update --Name myapp --type [native|spa|regular|m2m] inputs.ID = args[0] } - if err := appName.AskUpdate(cmd, &inputs.Name); err != nil { + if err := appName.AskU(cmd, &inputs.Name); err != nil { return err } @@ -350,7 +350,7 @@ auth0 apps update --Name myapp --type [native|spa|regular|m2m] } } - if err := appDescription.AskUpdate(cmd, &inputs.Description); err != nil { + if err := appDescription.AskU(cmd, &inputs.Description); err != nil { return err } @@ -443,18 +443,18 @@ auth0 apps update --Name myapp --type [native|spa|regular|m2m] }, } - appName.RegisterString(cmd, &inputs.Name) + appName.RegisterStringU(cmd, &inputs.Name) cmd.Flags().StringVarP(&inputs.Type, "type", "t", "", "Type of application:\n"+ "- native: mobile, desktop, CLI and smart device apps running natively.\n"+ "- spa (single page application): a JavaScript front-end app that uses an API.\n"+ "- regular: Traditional web app using redirects.\n"+ "- m2m (machine to machine): CLIs, daemons or services running on your backend.") - appDescription.RegisterString(cmd, &inputs.Description) + appDescription.RegisterStringU(cmd, &inputs.Description) cmd.Flags().StringSliceVarP(&inputs.Callbacks, "callbacks", "c", nil, "After the user authenticates we will only call back to any of these URLs. You can specify multiple valid URLs by comma-separating them (typically to handle different environments like QA or testing). Make sure to specify the protocol (https://) otherwise the callback may fail in some cases. With the exception of custom URI schemes for native apps, all callbacks should use protocol https://.") cmd.Flags().StringSliceVarP(&inputs.AllowedOrigins, "origins", "o", nil, "Comma-separated list of URLs allowed to make requests from JavaScript to Auth0 API (typically used with CORS). By default, all your callback URLs will be allowed. This field allows you to enter other origins if necessary. You can also use wildcards at the subdomain level (e.g., https://*.contoso.com). Query strings and hash information are not taken into account when validating these URLs.") cmd.Flags().StringSliceVarP(&inputs.AllowedWebOrigins, "web-origins", "w", nil, "Comma-separated list of allowed origins for use with Cross-Origin Authentication, Device Flow, and web message response mode.") cmd.Flags().StringSliceVarP(&inputs.AllowedLogoutURLs, "logout-urls", "l", nil, "Comma-separated list of URLs that are valid to redirect to after logout from Auth0. Wildcards are allowed for subdomains.") - appAuthMethod.RegisterString(cmd, &inputs.AuthMethod) + appAuthMethod.RegisterStringU(cmd, &inputs.AuthMethod) cmd.Flags().StringSliceVarP(&inputs.Grants, "grants", "g", nil, "List of grant types supported for this application. Can include code, implicit, refresh-token, credentials, password, password-realm, mfa-oob, mfa-otp, mfa-recovery-code, and device-code.") return cmd diff --git a/internal/cli/flags.go b/internal/cli/flags.go index f8ac5fe68..42e98af8f 100644 --- a/internal/cli/flags.go +++ b/internal/cli/flags.go @@ -20,12 +20,16 @@ func (f *Flag) Ask(cmd *cobra.Command, value interface{}) error { return ask(cmd, f, value, false) } -func (f *Flag) AskUpdate(cmd *cobra.Command, value interface{}) error { +func (f *Flag) AskU(cmd *cobra.Command, value interface{}) error { return ask(cmd, f, value, true) } func (f *Flag) RegisterString(cmd *cobra.Command, value *string) { - cmd.Flags().StringVarP(value, f.LongForm, f.ShortForm, f.DefaultValue, f.Help) + registerString(cmd, f, value, false) +} + +func (f *Flag) RegisterStringU(cmd *cobra.Command, value *string) { + registerString(cmd, f, value, true) } func ask(cmd *cobra.Command, f *Flag, value interface{}, isUpdate bool) error { @@ -47,3 +51,19 @@ func ask(cmd *cobra.Command, f *Flag, value interface{}, isUpdate bool) error { return nil } + +func registerString(cmd *cobra.Command, f *Flag, value *string, isUpdate bool) { + cmd.Flags().StringVarP(value, f.LongForm, f.ShortForm, f.DefaultValue, f.Help) + + if err := markFlagRequired(cmd, f, isUpdate); err != nil { + panic(fmt.Errorf("An unexpected error occurred: %w", err)) // TODO: Handle + } +} + +func markFlagRequired(cmd *cobra.Command, f *Flag, isUpdate bool) error { + if f.IsRequired && !isUpdate { + return cmd.MarkFlagRequired(f.LongForm) + } + + return nil +} From 6142d56cbb0b55fc9fc90b6e4a8875b2a1278ed0 Mon Sep 17 00:00:00 2001 From: Rita Zerrizuela Date: Fri, 12 Mar 2021 11:54:18 -0300 Subject: [PATCH 4/7] Fix uppercasing --- internal/cli/apps.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cli/apps.go b/internal/cli/apps.go index b0558574d..460ce69c3 100644 --- a/internal/cli/apps.go +++ b/internal/cli/apps.go @@ -207,7 +207,7 @@ func createAppCmd(cli *cli) *cobra.Command { Short: "Create a new application", Long: `Create a new application: -auth0 apps create --Name myapp --type [native|spa|regular|m2m] +auth0 apps create --name myapp --type [native|spa|regular|m2m] `, PreRun: func(cmd *cobra.Command, args []string) { prepareInteractivity(cmd) @@ -310,7 +310,7 @@ func updateAppCmd(cli *cli) *cobra.Command { Short: "Update an application", Long: `Update an application: -auth0 apps update --Name myapp --type [native|spa|regular|m2m] +auth0 apps update --name myapp --type [native|spa|regular|m2m] `, PreRun: func(cmd *cobra.Command, args []string) { prepareInteractivity(cmd) From f4934d06cd52db8c0db0151da381e9d09b37e6cf Mon Sep 17 00:00:00 2001 From: morganelle Date: Fri, 12 Mar 2021 14:13:11 -0800 Subject: [PATCH 5/7] add prompt for user to change default tenant after login --- internal/cli/login.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/internal/cli/login.go b/internal/cli/login.go index 3102e6c48..3b1ea5719 100644 --- a/internal/cli/login.go +++ b/internal/cli/login.go @@ -8,6 +8,7 @@ import ( "github.com/auth0/auth0-cli/internal/ansi" "github.com/auth0/auth0-cli/internal/auth" "github.com/auth0/auth0-cli/internal/open" + "github.com/auth0/auth0-cli/internal/prompt" "github.com/spf13/cobra" ) @@ -62,7 +63,7 @@ func RunLogin(ctx context.Context, cli *cli, expired bool) error { cli.renderer.Infof("Successfully logged in.") cli.renderer.Infof("Tenant: %s\n", res.Tenant) - return cli.addTenant(tenant{ + err = cli.addTenant(tenant{ Name: res.Tenant, Domain: res.Domain, AccessToken: res.AccessToken, @@ -70,4 +71,20 @@ func RunLogin(ctx context.Context, cli *cli, expired bool) error { time.Duration(res.ExpiresIn) * time.Second, ), }) + if err != nil { + return fmt.Errorf("Unexpected error adding tenant to config: %w", err) + } + + if cli.config.DefaultTenant != res.Tenant { + promptText := fmt.Sprintf("Change the default tenant to %s?", res.Tenant) + if confirmed := prompt.Confirm(promptText); !confirmed { + return nil + } + cli.config.DefaultTenant = res.Tenant + if err := cli.persistConfig(); err != nil { + return fmt.Errorf("An error occurred while setting the default tenant: %w", err) + } + } + + return nil } From a5e26fc2bb90df65108920f58f22b0b195c31d59 Mon Sep 17 00:00:00 2001 From: morganelle Date: Fri, 12 Mar 2021 15:05:32 -0800 Subject: [PATCH 6/7] update prompt text to include current tenant --- internal/cli/login.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cli/login.go b/internal/cli/login.go index 3b1ea5719..d84402c51 100644 --- a/internal/cli/login.go +++ b/internal/cli/login.go @@ -76,7 +76,7 @@ func RunLogin(ctx context.Context, cli *cli, expired bool) error { } if cli.config.DefaultTenant != res.Tenant { - promptText := fmt.Sprintf("Change the default tenant to %s?", res.Tenant) + promptText := fmt.Sprintf("Your default tenant is %s. Do you want to change it to %s?", cli.config.DefaultTenant, res.Tenant) if confirmed := prompt.Confirm(promptText); !confirmed { return nil } From 2bf07c97add35858493300ae9e82c30c4f14bb92 Mon Sep 17 00:00:00 2001 From: Rita Zerrizuela Date: Fri, 12 Mar 2021 20:13:17 -0300 Subject: [PATCH 7/7] Display empty KV fields --- internal/display/display.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/display/display.go b/internal/display/display.go index b89beb07e..b19c436ab 100644 --- a/internal/display/display.go +++ b/internal/display/display.go @@ -113,11 +113,7 @@ func (r *Renderer) Result(data View) { for _, pair := range v.KeyValues() { k := pair[0] v := pair[1] - - // NOTE(cyx): We can either nuke it or annotate with ``. For now we're choosing to nuke it. - if v != "" { - kvs = append(kvs, []string{k, v}) - } + kvs = append(kvs, []string{k, v}) } writeTable(r.ResultWriter, nil, kvs) }