From 5aa57e9f3e75651ba25662a8915d4459de3566a6 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Thu, 12 May 2022 16:57:56 +0200 Subject: [PATCH] peroxide-cfg: Login and store slot-based credentials Issue #13 --- cmd/peroxide-cfg/accounts.go | 27 +++++++++++++++++++++++---- cmd/peroxide-cfg/main.go | 6 +++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/cmd/peroxide-cfg/accounts.go b/cmd/peroxide-cfg/accounts.go index 17a0d72..80f5dea 100644 --- a/cmd/peroxide-cfg/accounts.go +++ b/cmd/peroxide-cfg/accounts.go @@ -49,14 +49,14 @@ func askPass(prompt string) ([]byte, error) { } func listAccounts(b *bridge.Bridge) { - spacing := "%3d: %-20s %-20s %-20s %-15s " + spacing := "%3d: %-20s %-20s %-15s " for idx, user := range b.Users.GetUsers() { connected := "disconnected" if user.IsConnected() { connected = "connected" } - fmt.Printf(spacing, idx, user.Username(), user.GetBridgePassword(), user.GetPrimaryAddress(), connected) + fmt.Printf(spacing, idx, user.Username(), user.GetPrimaryAddress(), connected) for _, address := range user.GetAddresses() { fmt.Printf("%-20s", address) @@ -100,11 +100,27 @@ func deleteAccount(b *bridge.Bridge, accountName string) error { return nil } -func addAccount(b *bridge.Bridge, accountName string) error { +func loginAccount(b *bridge.Bridge, accountName string) error { if accountName == "" { return fmt.Errorf("Missing account name") } + user, _ := b.Users.GetUser(accountName) + if user != nil { + mainKey, err := askPass("Main key") + if err != nil { + return fmt.Errorf("The main key is required to modify an existing user: %s", err) + } + + if err := user.UnlockCredentials("main", string(mainKey)); err != nil { + return fmt.Errorf("Unable to unlock credentials: %s", err) + } + + if err := user.Logout(); err != nil { + return fmt.Errorf("Unable to logout previous session: %s", err) + } + } + password, err := askPass("Password") if err != nil { return fmt.Errorf("Unable to read password: %s", err) @@ -148,12 +164,15 @@ func addAccount(b *bridge.Bridge, accountName string) error { return fmt.Errorf("Empty mailbox password") } - user, err := b.Users.FinishLogin(client, auth, mailboxPassword) + user, key, err := b.Users.FinishLogin(client, auth, mailboxPassword, "") if err != nil { return fmt.Errorf("Login of account %s failed: %s", accountName, err) } fmt.Printf("Account %s has been added successfully.\n", user.Username()) + if len(key) != 0 { + fmt.Printf("Main key: %s\n", key) + } return nil } diff --git a/cmd/peroxide-cfg/main.go b/cmd/peroxide-cfg/main.go index 62fea74..545426d 100644 --- a/cmd/peroxide-cfg/main.go +++ b/cmd/peroxide-cfg/main.go @@ -40,7 +40,7 @@ var x509KeyFile = flag.String("x509-key", "key.pem", "output file for the RSA ke var x509CertFile = flag.String("x509-cert", "cert.pem", "output file for the X509 certificate") var list = flag.Bool("list-accounts", false, "list user accounts") var delete = flag.Bool("delete-account", false, "delete user account") -var add = flag.Bool("add-account", false, "add user account") +var login = flag.Bool("login-account", false, "log in user account") var name = flag.String("name", "", "account name") var logLevel = flag.String("log-level", "Warning", "account name") @@ -79,8 +79,8 @@ func main() { } else if *delete { err = deleteAccount(b, *name) done = true - } else if *add { - err = addAccount(b, *name) + } else if *login { + err = loginAccount(b, *name) done = true }