Fix api token breaking authentication

This commit is contained in:
Bernd Schoolmann 2024-01-04 23:40:07 +01:00
parent 6631979e2f
commit 7c53863578
No known key found for this signature in database
5 changed files with 24 additions and 4 deletions

View file

@ -34,10 +34,13 @@ func handleLogin(msg messages.IPCMessage, cfg *config.Config, vault *vault.Vault
var masterpasswordHash string var masterpasswordHash string
if secret, err := cfg.GetClientSecret(); err == nil && secret != "" { if secret, err := cfg.GetClientSecret(); err == nil && secret != "" {
actionsLog.Info("Logging in with client secret")
token, masterKey, masterpasswordHash, err = bitwarden.LoginWithApiKey(ctx, req.Email, cfg, vault) token, masterKey, masterpasswordHash, err = bitwarden.LoginWithApiKey(ctx, req.Email, cfg, vault)
} else if req.Passwordless { } else if req.Passwordless {
actionsLog.Info("Logging in with passwordless")
token, masterKey, masterpasswordHash, err = bitwarden.LoginWithDevice(ctx, req.Email, cfg, vault) token, masterKey, masterpasswordHash, err = bitwarden.LoginWithDevice(ctx, req.Email, cfg, vault)
} else { } else {
actionsLog.Info("Logging in with master password")
token, masterKey, masterpasswordHash, err = bitwarden.LoginWithMasterpassword(ctx, req.Email, cfg, vault) token, masterKey, masterpasswordHash, err = bitwarden.LoginWithMasterpassword(ctx, req.Email, cfg, vault)
} }
if err != nil { if err != nil {

View file

@ -165,6 +165,8 @@ func (c *Config) Purge() {
c.ConfigFile.EncryptedMasterPasswordHash = "" c.ConfigFile.EncryptedMasterPasswordHash = ""
c.ConfigFile.EncryptedToken = "" c.ConfigFile.EncryptedToken = ""
c.ConfigFile.EncryptedUserSymmetricKey = "" c.ConfigFile.EncryptedUserSymmetricKey = ""
c.ConfigFile.EncryptedClientID = ""
c.ConfigFile.EncryptedClientSecret = ""
c.ConfigFile.ConfigKeyHash = "" c.ConfigFile.ConfigKeyHash = ""
c.ConfigFile.EncryptedMasterKey = "" c.ConfigFile.EncryptedMasterKey = ""
key := NewBuffer(32, c.useMemguard) key := NewBuffer(32, c.useMemguard)
@ -189,6 +191,8 @@ func (c *Config) UpdatePin(password string, write bool) {
plaintextUserSymmetricKey, err3 := c.decryptString(c.ConfigFile.EncryptedUserSymmetricKey) plaintextUserSymmetricKey, err3 := c.decryptString(c.ConfigFile.EncryptedUserSymmetricKey)
plaintextEncryptedMasterPasswordHash, err4 := c.decryptString(c.ConfigFile.EncryptedMasterPasswordHash) plaintextEncryptedMasterPasswordHash, err4 := c.decryptString(c.ConfigFile.EncryptedMasterPasswordHash)
plaintextMasterKey, err5 := c.decryptString(c.ConfigFile.EncryptedMasterKey) plaintextMasterKey, err5 := c.decryptString(c.ConfigFile.EncryptedMasterKey)
plaintextClientID, err6 := c.decryptString(c.ConfigFile.EncryptedClientID)
plaintextClientSecret, err7 := c.decryptString(c.ConfigFile.EncryptedClientSecret)
key := NewBufferFromBytes(newKey, c.useMemguard) key := NewBufferFromBytes(newKey, c.useMemguard)
c.key = &key c.key = &key
@ -205,6 +209,12 @@ func (c *Config) UpdatePin(password string, write bool) {
if err5 == nil { if err5 == nil {
c.ConfigFile.EncryptedMasterKey, err5 = c.encryptString(plaintextMasterKey) c.ConfigFile.EncryptedMasterKey, err5 = c.encryptString(plaintextMasterKey)
} }
if err6 == nil {
c.ConfigFile.EncryptedClientID, err6 = c.encryptString(plaintextClientID)
}
if err7 == nil {
c.ConfigFile.EncryptedClientSecret, err7 = c.encryptString(plaintextClientSecret)
}
c.mu.Unlock() c.mu.Unlock()
if write { if write {

View file

@ -2,6 +2,7 @@ package cmd
import ( import (
"fmt" "fmt"
"strings"
"github.com/quexten/goldwarden/ipc/messages" "github.com/quexten/goldwarden/ipc/messages"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -116,6 +117,10 @@ var setApiClientIDCmd = &cobra.Command{
} }
id := args[0] id := args[0]
if len(id) >= 2 && strings.HasPrefix(id, "\"") && strings.HasSuffix(id, "\"") {
id = id[1 : len(id)-1]
}
id = strings.TrimSpace(id)
request := messages.SetClientIDRequest{} request := messages.SetClientIDRequest{}
request.Value = id request.Value = id
@ -149,6 +154,10 @@ var setApiSecretCmd = &cobra.Command{
} }
secret := args[0] secret := args[0]
if len(secret) >= 2 && strings.HasPrefix(secret, "\"") && strings.HasSuffix(secret, "\"") {
secret = secret[1 : len(secret)-1]
}
secret = strings.TrimSpace(secret)
request := messages.SetClientSecretRequest{} request := messages.SetClientSecretRequest{}
request.Value = secret request.Value = secret

View file

@ -28,13 +28,13 @@ def set_notification_url(url):
raise Exception("Failed to initialize repository, err", result.stderr) raise Exception("Failed to initialize repository, err", result.stderr)
def set_client_id(client_id): def set_client_id(client_id):
restic_cmd = f"{BINARY_PATH} config set-client-id {client_id}" restic_cmd = f"{BINARY_PATH} config set-client-id \"{client_id}\""
result = subprocess.run(restic_cmd.split(), capture_output=True, text=True) result = subprocess.run(restic_cmd.split(), capture_output=True, text=True)
if result.returncode != 0: if result.returncode != 0:
raise Exception("Failed err", result.stderr) raise Exception("Failed err", result.stderr)
def set_client_secret(client_secret): def set_client_secret(client_secret):
restic_cmd = f"{BINARY_PATH} config set-client-secret {client_secret}" restic_cmd = f"{BINARY_PATH} config set-client-secret \"{client_secret}\""
result = subprocess.run(restic_cmd.split(), capture_output=True, text=True) result = subprocess.run(restic_cmd.split(), capture_output=True, text=True)
if result.returncode != 0: if result.returncode != 0:
raise Exception("Failed err", result.stderr) raise Exception("Failed err", result.stderr)

View file

@ -304,10 +304,8 @@ def show_login():
def login(): def login():
res = goldwarden.login_with_password(email_entry.get_text(), "password") res = goldwarden.login_with_password(email_entry.get_text(), "password")
def handle_res(): def handle_res():
print("handle res", res)
if res == "ok": if res == "ok":
dialog.close() dialog.close()
print("ok")
elif res == "badpass": elif res == "badpass":
bad_pass_diag = Gtk.MessageDialog(transient_for=dialog, modal=True, message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, text="Bad password") bad_pass_diag = Gtk.MessageDialog(transient_for=dialog, modal=True, message_type=Gtk.MessageType.ERROR, buttons=Gtk.ButtonsType.OK, text="Bad password")
bad_pass_diag.connect("response", lambda dialog, response: bad_pass_diag.close()) bad_pass_diag.connect("response", lambda dialog, response: bad_pass_diag.close())