diff --git a/cmd/cmd.go b/cmd/cmd.go index 6969c7d2..7bd5927d 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -46,6 +46,7 @@ func NewCommad() *cobra.Command { command.AddCommand(NewStopCommand()) command.AddCommand(NewContextCommand()) command.AddCommand(NewLoginCommand(&clientOpts)) + command.AddCommand(NewLogoutCommand(&clientOpts)) defaultLocalConfigPath, err := config.DefaultLocalConfigPath() errors.CheckError(err) diff --git a/cmd/logout.go b/cmd/logout.go new file mode 100644 index 00000000..8c1fca9b --- /dev/null +++ b/cmd/logout.go @@ -0,0 +1,54 @@ +package cmd + +import ( + "fmt" + "log" + "os" + + "github.com/microcks/microcks-cli/pkg/config" + "github.com/microcks/microcks-cli/pkg/connectors" + "github.com/microcks/microcks-cli/pkg/errors" + "github.com/spf13/cobra" +) + +func NewLogoutCommand(globalClientOpts *connectors.ClientOptions) *cobra.Command { + + logoutCmd := &cobra.Command{ + Use: "logout CONTEXT", + Short: "Log out from Microcks", + Long: "Log out from Microcks", + Example: `# To log out of Microcks +$ microcks logout`, + + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + cmd.HelpFunc()(cmd, args) + os.Exit(1) + } + + context := args[0] + localCfg, err := config.ReadLocalConfig(globalClientOpts.ConfigPath) + errors.CheckError(err) + if localCfg == nil { + log.Fatalf("Nothing to logout from") + } + + // Remove authToken + ok := localCfg.RemoveToken(context) + if !ok { + log.Fatalf("Context %s does not exist", context) + } + + err = config.ValidateLocalConfig(*localCfg) + if err != nil { + log.Fatalf("Error in loging out: %s", err) + } + err = config.WriteLocalConfig(*localCfg, globalClientOpts.ConfigPath) + errors.CheckError(err) + + fmt.Printf("Logged out from '%s'\n", context) + }, + } + + return logoutCmd +} diff --git a/pkg/config/localconfig.go b/pkg/config/localconfig.go index 0c081653..ca797d26 100644 --- a/pkg/config/localconfig.go +++ b/pkg/config/localconfig.go @@ -222,6 +222,18 @@ func (l *LocalConfig) RemoveContext(serverName string) (string, bool) { return "", false } +// Returns true if user was removed successfully +func (l *LocalConfig) RemoveToken(serverName string) bool { + for i, u := range l.Users { + if u.Name == serverName { + l.Users[i].RefreshToken = "" + l.Users[i].AuthToken = "" + return true + } + } + return false +} + func (l *LocalConfig) GetUser(name string) (*User, error) { for _, u := range l.Users { if u.Name == name {