From 8118d9265a5d35c84dcf00a454ecf0209a0351ef Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Fri, 8 Nov 2024 01:49:37 +0200 Subject: [PATCH] fix: homedir is now recognized --- internal/client/ui/auth/auth.go | 46 +++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/internal/client/ui/auth/auth.go b/internal/client/ui/auth/auth.go index a2faf93..fa37d4e 100644 --- a/internal/client/ui/auth/auth.go +++ b/internal/client/ui/auth/auth.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "os" + "path/filepath" "strings" "github.com/charmbracelet/bubbles/viewport" @@ -366,27 +367,38 @@ func (m *Model) ButtonPressed(msg tea.Msg) tea.Cmd { } func (m *Model) Signup() tea.Cmd { - // So if signup is on and private key file exists suggest to either: - // 1. Overwrite it 2. Switch to sign-in 3. Cancel - privateKeyFilepath := m.fields[privateKeyField].Input.Value() - _, err := os.ReadFile(privateKeyFilepath) - if errors.Is(err, os.ErrNotExist) { - return tea.Quit + privateKeyFilepath := expandPath(m.fields[privateKeyField].Input.Value()) + err := os.MkdirAll(filepath.Dir(privateKeyFilepath), 0o755) + if err != nil { + m.fields[privateKeyField].Input.Err = errors.Unwrap(err) + assert.NotNil(errors.Unwrap(err), "there should always be an error to unwrap", "err", err) + return nil + } + file, err := os.OpenFile(privateKeyFilepath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o644) + if errors.Is(err, os.ErrExist) { + info, e := os.Stat(privateKeyFilepath) + assert.NoError(e, "if file exists it should be fine to stat it") + if info.IsDir() { + m.fields[privateKeyField].Input.Err = errors.New("directory exists") + return nil + } + content := fmt.Sprintf("File '%s' exists.\nDo you want to overwrite or sign-in instead?", privateKeyFilepath) + m.popup = createPopup(content, []string{"sign-in", "overwrite"}, []string{"cancel"}) + return nil } - if err != nil { m.fields[privateKeyField].Input.Err = errors.Unwrap(err) assert.NotNil(errors.Unwrap(err), "there should always be an error to unwrap", "err", err) return nil } - content := fmt.Sprintf("File '%s' exist.\nDo you want to overwrite or sign-in instead?", privateKeyFilepath) - m.popup = createPopup(content, []string{"sign-in", "overwrite"}, []string{"cancel"}) - return nil + file.Close() + os.Remove(privateKeyFilepath) + return tea.Quit } func (m *Model) signin() tea.Cmd { - privateKeyFilepath := m.fields[privateKeyField].Input.Value() + privateKeyFilepath := expandPath(m.fields[privateKeyField].Input.Value()) _, err := os.ReadFile(privateKeyFilepath) if errors.Is(err, os.ErrNotExist) { content := fmt.Sprintf("File '%s' doesn't exist.\nDo you want to sign-up instead?", privateKeyFilepath) @@ -419,6 +431,18 @@ func createPopup(content string, leftChoices, rightChoices []string) *choicepopu return &popup } +func expandPath(path string) string { + if strings.HasPrefix(path, "~") { + home, err := os.UserHomeDir() + assert.NoError(err, "home directory should always be defined") + if !strings.HasPrefix(path, "~/") { + return home + } + return filepath.Join(home, path[2:]) + } + return path +} + func test() { // pubKey, privKey, err := ed25519.GenerateKey(nil) // sshPrivKey, err := ssh.NewSignerFromSigner(privKey)