backport patch to fix login problems OBS-URL: https://build.opensuse.org/request/show/1231655 OBS-URL: https://build.opensuse.org/package/show/devel:kubic/perses-cli?expand=0&rev=9
122 lines
4.6 KiB
Diff
122 lines
4.6 KiB
Diff
From b04061023c941d879460d81e6e4c6019621dbc16 Mon Sep 17 00:00:00 2001
|
|
From: Augustin Husson <husson.augustin@gmail.com>
|
|
Date: Tue, 12 Nov 2024 10:42:49 +0100
|
|
Subject: [PATCH] =?UTF-8?q?[BUGFIX]=C2=A0Fix=20login=20command=20avoiding?=
|
|
=?UTF-8?q?=20reusing=20previous=20config?=
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Signed-off-by: Augustin Husson <husson.augustin@gmail.com>
|
|
---
|
|
.github/ISSUE_TEMPLATE/bug_report.yml | 2 +-
|
|
internal/cli/cmd/login/login.go | 29 +++++++++++++++------------
|
|
internal/cli/config/config.go | 23 +++++++++++++++++++++
|
|
3 files changed, 40 insertions(+), 14 deletions(-)
|
|
|
|
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
|
|
index f7fbce82d1..f27470fe29 100644
|
|
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
|
|
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
|
|
@@ -42,7 +42,7 @@ body:
|
|
- type: textarea
|
|
attributes:
|
|
label: Perses configuration file
|
|
- description: Insert relevant configuration here. Don't forget to remove secrets.
|
|
+ description: Insert relevant configuration here. Don't forget to remove secrets. You can use the CLI to get it (all secret will be hidden). percli config --online
|
|
render: yaml
|
|
- type: textarea
|
|
attributes:
|
|
diff --git a/internal/cli/cmd/login/login.go b/internal/cli/cmd/login/login.go
|
|
index b09b7a42b6..831daf2c6e 100644
|
|
--- a/internal/cli/cmd/login/login.go
|
|
+++ b/internal/cli/cmd/login/login.go
|
|
@@ -90,20 +90,22 @@ func (o *option) Complete(args []string) error {
|
|
return fmt.Errorf("no URL has been provided neither found in the previous configuration")
|
|
}
|
|
|
|
- // create a new apiClient
|
|
- o.restConfig = config.Global.RestClientConfig
|
|
- o.restConfig.URL = o.url
|
|
- if o.restConfig.TLSConfig == nil {
|
|
- o.restConfig.TLSConfig = &secret.TLSConfig{}
|
|
+ // Create a new apiClient from scratch.
|
|
+ // We shouldn't use the previous context as for the moment we have a single config.
|
|
+ // So, switching from a Perses instance to another one without restarting from scratch the context/ the Perses client doesn't make sense.
|
|
+ o.restConfig = clientConfig.RestConfigClient{
|
|
+ URL: o.url,
|
|
+ TLSConfig: &secret.TLSConfig{
|
|
+ InsecureSkipVerify: o.insecureTLS,
|
|
+ },
|
|
}
|
|
- o.restConfig.TLSConfig.InsecureSkipVerify = o.insecureTLS
|
|
restClient, err := clientConfig.NewRESTClient(o.restConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
o.apiClient = api.NewWithClient(restClient)
|
|
|
|
- // Finally get the API config, we will need for later
|
|
+ // Finally, get the API config; we will need it for later
|
|
cfg, err := o.apiClient.Config()
|
|
if err != nil {
|
|
return err
|
|
@@ -173,9 +175,10 @@ func (o *option) Execute() error {
|
|
o.accessToken = token.AccessToken
|
|
o.refreshToken = token.RefreshToken
|
|
}
|
|
-
|
|
- o.restConfig.Authorization = secret.NewBearerToken(o.accessToken)
|
|
- if writeErr := config.Write(&config.Config{
|
|
+ if len(o.accessToken) > 0 {
|
|
+ o.restConfig.Authorization = secret.NewBearerToken(o.accessToken)
|
|
+ }
|
|
+ if writeErr := config.WriteFromScratch(&config.Config{
|
|
RestClientConfig: o.restConfig,
|
|
RefreshToken: o.refreshToken,
|
|
}); writeErr != nil {
|
|
@@ -224,9 +227,9 @@ func (o *option) newLoginOption() (loginOption, error) {
|
|
|
|
func (o *option) selectAndSetProvider() error {
|
|
providers := o.remoteConfig.Security.Authentication.Providers
|
|
- // The first step is to collect the different providers and store it into items + modifiers.
|
|
- // items will be the selection items to display to users.
|
|
- // modifiers will be the action to save the different user input into option struct.
|
|
+ // The first step is to collect the different providers and store it into options and modifiers.
|
|
+ // Options will be the selection items to display to users.
|
|
+ // Modifiers will be the action to save the different user input into option struct.
|
|
modifiers := map[string]func(){}
|
|
var options []huh.Option[string]
|
|
|
|
diff --git a/internal/cli/config/config.go b/internal/cli/config/config.go
|
|
index e301642c79..645ce90a20 100644
|
|
--- a/internal/cli/config/config.go
|
|
+++ b/internal/cli/config/config.go
|
|
@@ -220,3 +220,26 @@ func Write(cfg *Config) error {
|
|
|
|
return os.WriteFile(filePath, data, 0600)
|
|
}
|
|
+
|
|
+func WriteFromScratch(cfg *Config) error {
|
|
+ // this value has been set by the root command, and that will be the path where the config must be saved
|
|
+ filePath := Global.filePath
|
|
+ directory := filepath.Dir(filePath)
|
|
+
|
|
+ if _, err := os.Stat(directory); os.IsNotExist(err) {
|
|
+ mkdirError := os.Mkdir(directory, 0700)
|
|
+ if mkdirError != nil {
|
|
+ return err
|
|
+ }
|
|
+ } else if err != nil {
|
|
+ return err
|
|
+ }
|
|
+
|
|
+ data, err := json.Marshal(cfg)
|
|
+
|
|
+ if err != nil {
|
|
+ return err
|
|
+ }
|
|
+
|
|
+ return os.WriteFile(filePath, data, 0600)
|
|
+}
|