Skip to content

Commit 018776a

Browse files
committed
fix(sudo): add -S flag to ensure we're capturing the correct stdin
1 parent 9ead788 commit 018776a

File tree

3 files changed

+70
-28
lines changed

3 files changed

+70
-28
lines changed

internal/app/desktop.go

+25-10
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,20 @@ func (i *Installer) ExtractIcon() error {
3535
}
3636

3737
targetPath := filepath.Join(installDir, "cursor.png")
38-
cmd = exec.Command("sudo", "cp", iconPath, targetPath)
38+
cmd = exec.Command("sudo", "-S", "cp", iconPath, targetPath)
39+
cmd.Stdin = os.Stdin
40+
cmd.Stdout = os.Stdout
41+
cmd.Stderr = os.Stderr
3942
if err := cmd.Run(); err != nil {
40-
return fmt.Errorf("failed to copy icon: %v", err)
43+
return fmt.Errorf("failed to copy icon (sudo error): %v", err)
4144
}
4245

43-
cmd = exec.Command("sudo", "chmod", "644", targetPath)
46+
cmd = exec.Command("sudo", "-S", "chmod", "644", targetPath)
47+
cmd.Stdin = os.Stdin
48+
cmd.Stdout = os.Stdout
49+
cmd.Stderr = os.Stderr
4450
if err := cmd.Run(); err != nil {
45-
return fmt.Errorf("failed to set icon permissions: %v", err)
51+
return fmt.Errorf("failed to set icon permissions (sudo error): %v", err)
4652
}
4753

4854
return nil
@@ -68,23 +74,32 @@ Categories=Development;
6874
}
6975
tmpFile.Close()
7076

71-
cmd := exec.Command("sudo", "mv", tmpFile.Name(), "/usr/share/applications/cursor.desktop")
77+
cmd := exec.Command("sudo", "-S", "mv", tmpFile.Name(), "/usr/share/applications/cursor.desktop")
78+
cmd.Stdin = os.Stdin
79+
cmd.Stdout = os.Stdout
80+
cmd.Stderr = os.Stderr
7281
if err := cmd.Run(); err != nil {
73-
return fmt.Errorf("failed to install desktop entry: %v", err)
82+
return fmt.Errorf("failed to install desktop entry (sudo error): %v", err)
7483
}
7584

76-
cmd = exec.Command("sudo", "chmod", "644", "/usr/share/applications/cursor.desktop")
85+
cmd = exec.Command("sudo", "-S", "chmod", "644", "/usr/share/applications/cursor.desktop")
86+
cmd.Stdin = os.Stdin
87+
cmd.Stdout = os.Stdout
88+
cmd.Stderr = os.Stderr
7789
if err := cmd.Run(); err != nil {
78-
return fmt.Errorf("failed to set desktop entry permissions: %v", err)
90+
return fmt.Errorf("failed to set desktop entry permissions (sudo error): %v", err)
7991
}
8092

8193
return nil
8294
}
8395

8496
func (i *Installer) CreateSymlink() error {
85-
cmd := exec.Command("sudo", "ln", "-sf", filepath.Join(installDir, appImage), "/usr/local/bin/cursor")
97+
cmd := exec.Command("sudo", "-S", "ln", "-sf", filepath.Join(installDir, appImage), "/usr/local/bin/cursor")
98+
cmd.Stdin = os.Stdin
99+
cmd.Stdout = os.Stdout
100+
cmd.Stderr = os.Stderr
86101
if err := cmd.Run(); err != nil {
87-
return fmt.Errorf("failed to create symlink: %v", err)
102+
return fmt.Errorf("failed to create symlink (sudo error): %v", err)
88103
}
89104
return nil
90105
}

internal/app/files.go

+25-10
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,20 @@ import (
1212
)
1313

1414
func (i *Installer) ensureInstallDir() error {
15-
cmd := exec.Command("sudo", "mkdir", "-p", installDir)
15+
cmd := exec.Command("sudo", "-S", "mkdir", "-p", installDir)
16+
cmd.Stdin = os.Stdin
17+
cmd.Stdout = os.Stdout
18+
cmd.Stderr = os.Stderr
1619
if err := cmd.Run(); err != nil {
17-
return fmt.Errorf("failed to create install directory: %v", err)
20+
return fmt.Errorf("failed to create install directory (sudo error): %v", err)
1821
}
1922

20-
cmd = exec.Command("sudo", "chmod", "755", installDir)
23+
cmd = exec.Command("sudo", "-S", "chmod", "755", installDir)
24+
cmd.Stdin = os.Stdin
25+
cmd.Stdout = os.Stdout
26+
cmd.Stderr = os.Stderr
2127
if err := cmd.Run(); err != nil {
22-
return fmt.Errorf("failed to set permissions on install directory: %v", err)
28+
return fmt.Errorf("failed to set permissions on install directory (sudo error): %v", err)
2329
}
2430

2531
return nil
@@ -61,9 +67,12 @@ func (i *Installer) DownloadCursor() error {
6167
}
6268

6369
func (i *Installer) MakeExecutable() error {
64-
cmd := exec.Command("sudo", "chmod", "+x", appImage)
70+
cmd := exec.Command("sudo", "-S", "chmod", "+x", appImage)
71+
cmd.Stdin = os.Stdin
72+
cmd.Stdout = os.Stdout
73+
cmd.Stderr = os.Stderr
6574
if err := cmd.Run(); err != nil {
66-
return fmt.Errorf("failed to make file executable: %v", err)
75+
return fmt.Errorf("failed to make file executable (sudo error): %v", err)
6776
}
6877
return nil
6978
}
@@ -74,14 +83,20 @@ func (i *Installer) MoveToOpt() error {
7483
}
7584

7685
targetPath := filepath.Join(installDir, appImage)
77-
cmd := exec.Command("sudo", "mv", appImage, targetPath)
86+
cmd := exec.Command("sudo", "-S", "mv", appImage, targetPath)
87+
cmd.Stdin = os.Stdin
88+
cmd.Stdout = os.Stdout
89+
cmd.Stderr = os.Stderr
7890
if err := cmd.Run(); err != nil {
79-
return fmt.Errorf("failed to move file to %s: %v", installDir, err)
91+
return fmt.Errorf("failed to move file to %s (sudo error): %v", installDir, err)
8092
}
8193

82-
cmd = exec.Command("sudo", "chmod", "755", targetPath)
94+
cmd = exec.Command("sudo", "-S", "chmod", "755", targetPath)
95+
cmd.Stdin = os.Stdin
96+
cmd.Stdout = os.Stdout
97+
cmd.Stderr = os.Stderr
8398
if err := cmd.Run(); err != nil {
84-
return fmt.Errorf("failed to set permissions: %v", err)
99+
return fmt.Errorf("failed to set permissions (sudo error): %v", err)
85100
}
86101

87102
return nil

internal/app/metadata.go

+20-8
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,20 @@ func (i *Installer) readMetadata() (*CursorMetadata, error) {
3838
tmpFile.Close()
3939
defer os.Remove(tmpPath)
4040

41-
cmd := exec.Command("sudo", "cp", metadataPath, tmpPath)
41+
cmd := exec.Command("sudo", "-S", "cp", metadataPath, tmpPath)
42+
cmd.Stdin = os.Stdin
43+
cmd.Stdout = os.Stdout
44+
cmd.Stderr = os.Stderr
4245
if err := cmd.Run(); err != nil {
43-
return nil, fmt.Errorf("failed to copy metadata file: %v", err)
46+
return nil, fmt.Errorf("failed to copy metadata file (sudo error): %v", err)
4447
}
4548

46-
cmd = exec.Command("sudo", "chmod", "644", tmpPath)
49+
cmd = exec.Command("sudo", "-S", "chmod", "644", tmpPath)
50+
cmd.Stdin = os.Stdin
51+
cmd.Stdout = os.Stdout
52+
cmd.Stderr = os.Stderr
4753
if err := cmd.Run(); err != nil {
48-
return nil, fmt.Errorf("failed to set permissions on temporary file: %v", err)
54+
return nil, fmt.Errorf("failed to set permissions on temporary file (sudo error): %v", err)
4955
}
5056

5157
data, err := os.ReadFile(tmpPath)
@@ -79,14 +85,20 @@ func (i *Installer) writeMetadata(metadata *CursorMetadata) error {
7985
}
8086
tmpFile.Close()
8187

82-
cmd := exec.Command("sudo", "mv", tmpPath, metadataPath)
88+
cmd := exec.Command("sudo", "-S", "mv", tmpPath, metadataPath)
89+
cmd.Stdin = os.Stdin
90+
cmd.Stdout = os.Stdout
91+
cmd.Stderr = os.Stderr
8392
if err := cmd.Run(); err != nil {
84-
return fmt.Errorf("failed to install metadata file: %v", err)
93+
return fmt.Errorf("failed to install metadata file (sudo error): %v", err)
8594
}
8695

87-
cmd = exec.Command("sudo", "chmod", "644", metadataPath)
96+
cmd = exec.Command("sudo", "-S", "chmod", "644", metadataPath)
97+
cmd.Stdin = os.Stdin
98+
cmd.Stdout = os.Stdout
99+
cmd.Stderr = os.Stderr
88100
if err := cmd.Run(); err != nil {
89-
return fmt.Errorf("failed to set metadata file permissions: %v", err)
101+
return fmt.Errorf("failed to set metadata file permissions (sudo error): %v", err)
90102
}
91103

92104
return nil

0 commit comments

Comments
 (0)