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) } }