diff --git a/gopls/internal/server/vulncheck_prompt.go b/gopls/internal/server/vulncheck_prompt.go
index 177267c..32a5925 100644
--- a/gopls/internal/server/vulncheck_prompt.go
+++ b/gopls/internal/server/vulncheck_prompt.go
@@ -8,9 +8,11 @@
"context"
"crypto/sha256"
"encoding/hex"
+ "encoding/json"
"errors"
"fmt"
"os"
+ "path/filepath"
"reflect"
"time"
@@ -122,14 +124,28 @@
fileLink := fmt.Sprintf("[%s](%s)", change.URI.Path(), string(change.URI))
govulncheckLink := "[govulncheck](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck)"
message := fmt.Sprintf("Dependencies have changed in %s, would you like to run %s to check for vulnerabilities?", fileLink, govulncheckLink)
- action, err := showMessageRequest(ctx, s.client, protocol.Info, message, "Yes", "No", "Always", "Never")
+ preference, err := getVulncheckPreference()
+ if err != nil {
+ event.Error(ctx, "reading vulncheck preference", err)
+ }
+ if preference == "Always" || preference == "Never" {
+ // TODO: Update this so that we run vulncheck when Always is set.
+ return
+ }
+ action, err := showMessageRequest(ctx, s.client, protocol.Info, message, "Yes", "No", "Always", "Never")
if err != nil {
event.Error(ctx, "showing go.mod changed notification", err)
return
}
- // TODO: Implement persistent storage for "Always" and "Never" preferences.
+ if action == "Always" || action == "Never" {
+ if err := setVulncheckPreference(action); err != nil {
+ event.Error(ctx, "writing vulncheck preference", err)
+ showMessage(ctx, s.client, protocol.Error, fmt.Sprintf("Failed to save vulncheck preference: %v", err))
+ }
+ }
+
// TODO: Implement the logic to run govulncheck when action is "Yes" or "Always".
if action == "No" || action == "Never" || action == "" {
return // Skip the check and don't update the hash.
@@ -142,3 +158,46 @@
}
}()
}
+
+type vulncheckConfig struct {
+ Vulncheck string `json:"vulncheck"`
+}
+
+func getVulncheckPreference() (string, error) {
+ configDir, err := os.UserConfigDir()
+ if err != nil {
+ return "", err
+ }
+ path := filepath.Join(configDir, "gopls", "vulncheck", "settings.json")
+ content, err := os.ReadFile(path)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return "", nil
+ }
+ return "", err
+ }
+ var config vulncheckConfig
+ if err := json.Unmarshal(content, &config); err != nil {
+ return "", err
+ }
+ return config.Vulncheck, nil
+}
+
+func setVulncheckPreference(preference string) error {
+ configDir, err := os.UserConfigDir()
+ if err != nil {
+ return err
+ }
+ goplsDir := filepath.Join(configDir, "gopls", "vulncheck")
+ if err := os.MkdirAll(goplsDir, 0755); err != nil {
+ return err
+ }
+ path := filepath.Join(goplsDir, "settings.json")
+ fmt.Printf("Writing vulncheck preference to %s\n", path)
+ config := vulncheckConfig{Vulncheck: preference}
+ content, err := json.Marshal(config)
+ if err != nil {
+ return err
+ }
+ return os.WriteFile(path, content, 0644)
+}