Refactor platform-dependent code.
This commit is contained in:
parent
12b57d263f
commit
443cfa9919
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
|||
cmd/passgo/passgo
|
||||
cmd/passgo-gui/passgo-gui
|
||||
nohup.out
|
||||
*.apk
|
||||
|
|
|
@ -13,76 +13,12 @@ import (
|
|||
"path"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/crypto/openpgp"
|
||||
|
||||
"github.com/fsnotify/fsnotify"
|
||||
"github.com/jcmdev0/gpgagent"
|
||||
)
|
||||
|
||||
func (s *Store) nativeDecrypt(name string) (string, error) {
|
||||
fmt.Println("calling gpg -d")
|
||||
file := path.Join(s.Dir, strings.Join([]string{name, ".gpg"}, ""))
|
||||
if _, err := os.Stat(file); os.IsNotExist(err) {
|
||||
return "", fmt.Errorf("Not in password store.")
|
||||
}
|
||||
output, err := exec.Command("gpg", "-d", file).Output()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("Error running gpg: %s", err)
|
||||
}
|
||||
return string(output[:len(output)-1]), nil
|
||||
}
|
||||
|
||||
func (s *Store) nativeEncrypt(pw string) ([]byte, error) {
|
||||
if s.Id == "" {
|
||||
return nil, fmt.Errorf("No ID")
|
||||
}
|
||||
fmt.Printf("Calling gpg -e -r %s\n", s.Id)
|
||||
cmd := exec.Command("gpg", "-e", "-r", s.Id)
|
||||
cmd.Stdin = strings.NewReader(pw + "\n")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
fmt.Printf("Error running GPG: %s\n", err)
|
||||
return nil, err
|
||||
}
|
||||
fmt.Println("success")
|
||||
return output, nil
|
||||
}
|
||||
|
||||
var (
|
||||
idMux sync.Mutex
|
||||
cachedIdentities []string
|
||||
)
|
||||
|
||||
func nativeIdentities() ([]string, error) {
|
||||
idMux.Lock()
|
||||
defer idMux.Unlock()
|
||||
if cachedIdentities != nil {
|
||||
ret := make([]string, len(cachedIdentities))
|
||||
copy(ret, cachedIdentities)
|
||||
return ret, nil
|
||||
}
|
||||
ret := make([]string, 0)
|
||||
fmt.Println("calling gpg")
|
||||
output, err := exec.Command("gpg", "--list-secret-keys", "--with-colons").Output()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error running gpg: %s", err)
|
||||
}
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(output))
|
||||
for scanner.Scan() {
|
||||
fs := strings.Split(scanner.Text(), ":")
|
||||
if fs[0] == "uid" {
|
||||
fmt.Printf("%s: %s\n", fs[0], fs[9])
|
||||
ret = append(ret, fs[9])
|
||||
}
|
||||
}
|
||||
if len(ret) > 0 {
|
||||
cachedIdentities = ret
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func setAgentInfo() {
|
||||
// get UID of current user
|
||||
usr, err := user.Current()
|
||||
|
@ -180,28 +116,6 @@ func GPGPrompt(keys []openpgp.Key, symmetric bool) ([]byte, error) {
|
|||
|
||||
func init() {
|
||||
setAgentInfo()
|
||||
go func() {
|
||||
watcher, err := fsnotify.NewWatcher()
|
||||
if err != nil {
|
||||
fmt.Printf("Cannot create filesystem watcher: %s\n", err)
|
||||
return
|
||||
}
|
||||
u, err := user.Current()
|
||||
if err != nil {
|
||||
fmt.Printf("Cannot get current user: %s\n", err)
|
||||
return
|
||||
}
|
||||
watcher.Add(path.Join(u.HomeDir, ".gnupg"))
|
||||
fmt.Println("Watching ", path.Join(u.HomeDir, ".gnupg"))
|
||||
for {
|
||||
select {
|
||||
case <-watcher.Events:
|
||||
idMux.Lock()
|
||||
cachedIdentities = nil
|
||||
idMux.Unlock()
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
//Clip copies a string to the clipboard
|
||||
|
|
16
impl_linux.go
Normal file
16
impl_linux.go
Normal file
|
@ -0,0 +1,16 @@
|
|||
//+build linux
|
||||
|
||||
package passgo
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
//Clip copies a string to the clipboard
|
||||
func Clip(x string) {
|
||||
b := bytes.NewBuffer([]byte(x))
|
||||
cmd := exec.Command("xclip")
|
||||
cmd.Stdin = b
|
||||
cmd.Run()
|
||||
}
|
76
impl_shared.go
Normal file
76
impl_shared.go
Normal file
|
@ -0,0 +1,76 @@
|
|||
//+build darwin linux
|
||||
|
||||
package passgo
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func (s *Store) nativeDecrypt(name string) (string, error) {
|
||||
fmt.Println("calling gpg -d")
|
||||
file := path.Join(s.Dir, strings.Join([]string{name, ".gpg"}, ""))
|
||||
if _, err := os.Stat(file); os.IsNotExist(err) {
|
||||
return "", fmt.Errorf("Not in password store.")
|
||||
}
|
||||
output, err := exec.Command("gpg", "-d", file).Output()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("Error running gpg: %s", err)
|
||||
}
|
||||
return string(output[:len(output)-1]), nil
|
||||
}
|
||||
|
||||
func (s *Store) nativeEncrypt(pw string) ([]byte, error) {
|
||||
if s.Id == "" {
|
||||
return nil, fmt.Errorf("No ID")
|
||||
}
|
||||
fmt.Printf("Calling gpg -e -r %s\n", s.Id)
|
||||
cmd := exec.Command("gpg", "-e", "-r", s.Id)
|
||||
cmd.Stdin = strings.NewReader(pw + "\n")
|
||||
output, err := cmd.Output()
|
||||
if err != nil {
|
||||
fmt.Printf("Error running GPG: %s\n", err)
|
||||
return nil, err
|
||||
}
|
||||
fmt.Println("success")
|
||||
return output, nil
|
||||
}
|
||||
|
||||
var (
|
||||
idMux sync.Mutex
|
||||
cachedIdentities []string
|
||||
)
|
||||
|
||||
func nativeIdentities() ([]string, error) {
|
||||
idMux.Lock()
|
||||
defer idMux.Unlock()
|
||||
if cachedIdentities != nil {
|
||||
ret := make([]string, len(cachedIdentities))
|
||||
copy(ret, cachedIdentities)
|
||||
return ret, nil
|
||||
}
|
||||
ret := make([]string, 0)
|
||||
fmt.Println("calling gpg")
|
||||
output, err := exec.Command("gpg", "--list-secret-keys", "--with-colons").Output()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Error running gpg: %s", err)
|
||||
}
|
||||
scanner := bufio.NewScanner(bytes.NewBuffer(output))
|
||||
for scanner.Scan() {
|
||||
fs := strings.Split(scanner.Text(), ":")
|
||||
if fs[0] == "uid" {
|
||||
fmt.Printf("%s: %s\n", fs[0], fs[9])
|
||||
ret = append(ret, fs[9])
|
||||
}
|
||||
}
|
||||
if len(ret) > 0 {
|
||||
cachedIdentities = ret
|
||||
}
|
||||
return ret, nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user