penguin/kstore-cred

helper to access windows credential store

main.go

raw ยท 1569 bytes

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