Skip to content

Commit 0680a7d

Browse files
committed
fix(sudo): check sudo command availabilty before processing
1 parent 018776a commit 0680a7d

File tree

3 files changed

+19
-20
lines changed

3 files changed

+19
-20
lines changed

internal/app/app.go

+10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package app
33
import (
44
"fmt"
55
"os"
6+
"os/exec"
67
"path/filepath"
78
)
89

@@ -33,6 +34,15 @@ func NewInstaller(downloadOnly, forceInstall bool, configureSettings bool) *Inst
3334
}
3435
}
3536

37+
func (i *Installer) CheckSudoAccess() error {
38+
cmd := exec.Command("sudo", "-n", "true")
39+
cmd.Stderr = os.Stderr
40+
if err := cmd.Run(); err != nil {
41+
return fmt.Errorf("this installer requires sudo privileges. Please ensure you have sudo access and try again")
42+
}
43+
return nil
44+
}
45+
3646
func (i *Installer) CheckInstallation() *InstallationStatus {
3747
metadata, err := i.readMetadata()
3848
if err != nil {

internal/app/metadata.go

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

41-
cmd := exec.Command("sudo", "-S", "cp", metadataPath, tmpPath)
41+
cmd := exec.Command("sudo", "-S", "sh", "-c", fmt.Sprintf("cp %s %s && chmod 644 %s", metadataPath, tmpPath, tmpPath))
4242
cmd.Stdin = os.Stdin
4343
cmd.Stdout = os.Stdout
4444
cmd.Stderr = os.Stderr
4545
if err := cmd.Run(); err != nil {
46-
return nil, fmt.Errorf("failed to copy metadata file (sudo error): %v", err)
47-
}
48-
49-
cmd = exec.Command("sudo", "-S", "chmod", "644", tmpPath)
50-
cmd.Stdin = os.Stdin
51-
cmd.Stdout = os.Stdout
52-
cmd.Stderr = os.Stderr
53-
if err := cmd.Run(); err != nil {
54-
return nil, fmt.Errorf("failed to set permissions on temporary file (sudo error): %v", err)
46+
return nil, fmt.Errorf("failed to copy and set permissions on metadata file (sudo error): %v", err)
5547
}
5648

5749
data, err := os.ReadFile(tmpPath)
@@ -85,20 +77,12 @@ func (i *Installer) writeMetadata(metadata *CursorMetadata) error {
8577
}
8678
tmpFile.Close()
8779

88-
cmd := exec.Command("sudo", "-S", "mv", tmpPath, metadataPath)
89-
cmd.Stdin = os.Stdin
90-
cmd.Stdout = os.Stdout
91-
cmd.Stderr = os.Stderr
92-
if err := cmd.Run(); err != nil {
93-
return fmt.Errorf("failed to install metadata file (sudo error): %v", err)
94-
}
95-
96-
cmd = exec.Command("sudo", "-S", "chmod", "644", metadataPath)
80+
cmd := exec.Command("sudo", "-S", "sh", "-c", fmt.Sprintf("mv %s %s && chmod 644 %s", tmpPath, metadataPath, metadataPath))
9781
cmd.Stdin = os.Stdin
9882
cmd.Stdout = os.Stdout
9983
cmd.Stderr = os.Stderr
10084
if err := cmd.Run(); err != nil {
101-
return fmt.Errorf("failed to set metadata file permissions (sudo error): %v", err)
85+
return fmt.Errorf("failed to install and set permissions on metadata file (sudo error): %v", err)
10286
}
10387

10488
return nil

internal/ui/model.go

+5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ func NewModel(downloadOnly, forceInstall bool, configureSettings bool) model {
4848
}
4949

5050
steps := []InstallationStep{
51+
{
52+
name: "Check Permissions",
53+
message: "Checking sudo access...",
54+
run: installer.CheckSudoAccess,
55+
},
5156
{
5257
name: "Check Installation",
5358
message: checkMessage,

0 commit comments

Comments
 (0)