penguin/kstore-cred

helper to access windows credential store

commit 203d4e89a1a00215a3cb3552df2aac0e14dd9b95

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-06-27T09:11:15Z
subjectaccept input from stdin
commit 203d4e89a1a00215a3cb3552df2aac0e14dd9b95
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-06-27T09:11:15Z

    accept input from stdin
---
 main.go | 181 +++++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 98 insertions(+), 83 deletions(-)

diff --git a/main.go b/main.go
index e85329f..0e7d8a7 100644
--- a/main.go
+++ b/main.go
@@ -1,83 +1,98 @@
-package main
-
-import (
-	"errors"
-	"fmt"
-	"os"
-	"path/filepath"
-	"strings"
-
-	"github.com/danieljoos/wincred"
-)
-
-const (
-	CRED_NAME   = "RBASH-KSTORE"
-	SECRET_NAME = "_AUTH_SECRET"
-)
-
-func usage(stdfd *os.File) {
-	_name := filepath.Base(os.Args[0])
-	_space := strings.Repeat(" ", len(_name))
-	fmt.Fprintf(stdfd, "Usage: %s get\n", _name)
-	fmt.Fprintf(stdfd, "       %s set passphrase\n", _space)
-	fmt.Fprintf(stdfd, "       %s del\n", _space)
-	fmt.Fprintf(stdfd, "       %s help\n", _space)
-}
-
-func getAuthSecret() (*wincred.GenericCredential, error) {
-	cred, err := wincred.GetGenericCredential(CRED_NAME)
-	return cred, err
-}
-
-func delAuthSecret() error {
-	cred, _ := getAuthSecret()
-	if cred == nil {
-		return nil
-	}
-	return cred.Delete()
-}
-
-func setAuthSecret(newSecret string) error {
-	cred, _ := getAuthSecret()
-	if cred == nil {
-		cred = wincred.NewGenericCredential(CRED_NAME)
-	}
-
-	cred.CredentialBlob = []byte(newSecret)
-	return cred.Write()
-}
-
-func main() {
-	if len(os.Args) < 2 {
-		usage(os.Stderr)
-		os.Exit(1)
-	}
-
-	var err error
-	switch os.Args[1] {
-	case "get":
-		cred, _err := getAuthSecret()
-		if _err == nil {
-			fmt.Print(string(cred.CredentialBlob))
-			os.Exit(0)
-		}
-		err = _err
-	case "set":
-		if len(os.Args[2:]) < 1 {
-			err = errors.New("passphrase is required")
-		} else {
-			err = setAuthSecret(os.Args[2])
-		}
-	case "del":
-		err = delAuthSecret()
-	case "help":
-		usage(os.Stdout)
-	}
-
-	if err == nil {
-		os.Exit(0)
-	}
-
-	fmt.Fprintln(os.Stderr, err)
-	os.Exit(1)
-}
+package main
+
+import (
+	"errors"
+	"fmt"
+	"io"
+	"os"
+	"path/filepath"
+	"strings"
+
+	"github.com/danieljoos/wincred"
+)
+
+const (
+	CRED_NAME = "RBASH-KSTORE"
+)
+
+func usage(stdfd *os.File) {
+	name := filepath.Base(os.Args[0])
+	space := strings.Repeat(" ", len(name))
+
+	fmt.Fprintf(stdfd, "Usage: %s get\n", name)
+	fmt.Fprintf(stdfd, "       %s set < secret\n", space)
+	fmt.Fprintf(stdfd, "       %s del\n", space)
+	fmt.Fprintf(stdfd, "       %s help\n", space)
+}
+
+func getAuthSecret() (*wincred.GenericCredential, error) {
+	return wincred.GetGenericCredential(CRED_NAME)
+}
+
+func delAuthSecret() error {
+	cred, _ := getAuthSecret()
+	if cred == nil {
+		return nil
+	}
+	return cred.Delete()
+}
+
+func setAuthSecret(newSecret []byte) error {
+	newSecret = []byte(strings.TrimRight(string(newSecret), "\r\n"))
+	if len(newSecret) == 0 {
+		return errors.New("empty passphrase")
+	}
+
+	cred, _ := getAuthSecret()
+	if cred == nil {
+		cred = wincred.NewGenericCredential(CRED_NAME)
+	}
+
+	cred.CredentialBlob = newSecret
+	return cred.Write()
+}
+
+func main() {
+	if len(os.Args) < 2 {
+		usage(os.Stderr)
+		os.Exit(1)
+	}
+
+	var err error
+
+	switch os.Args[1] {
+	case "get":
+		var cred *wincred.GenericCredential
+		cred, err = getAuthSecret()
+		if err == nil {
+			fmt.Print(string(cred.CredentialBlob))
+		}
+
+	case "set":
+		if len(os.Args) > 2 {
+			err = errors.New("do not pass passphrase as an argument; pipe it on stdin")
+			break
+		}
+
+		var b []byte
+		b, err = io.ReadAll(os.Stdin)
+		if err == nil {
+			err = setAuthSecret(b)
+		}
+
+	case "del":
+		err = delAuthSecret()
+
+	case "help", "-h", "--help":
+		usage(os.Stdout)
+
+	default:
+		usage(os.Stderr)
+		err = fmt.Errorf("unknown command: %s", os.Args[1])
+	}
+
+	if err != nil {
+		fmt.Fprintln(os.Stderr, err)
+		os.Exit(1)
+	}
+}