Author: Adam <git@apiote.tk>
get master password from agent
agent/client.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ config/init.go | 12 ++++++------ eeze.go | 32 +++++++++++++++++---------------
diff --git a/agent/client.go b/agent/client.go new file mode 100644 index 0000000000000000000000000000000000000000..c315523de3ddbc91ee3020a94340a3b3d04115fa --- /dev/null +++ b/agent/client.go @@ -0,0 +1,51 @@ +package agent + +import ( + "log" + "net" + "os" + "os/user" + + "git.sr.ht/~sircmpwn/go-bare" +) + +func GetMasterPassword() (string, error) { + // todo memguard + var masterPassword = "" + user, err := user.Current() + if err != nil { + log.Println("Error getting user ", err) + return "", err + } + fileInfo, err := os.Stat("/tmp/eeze-agent-" + user.Username) + if err == nil && fileInfo.Mode()&os.ModeSocket != 0 { + conn, err := net.Dial("unix", "/tmp/eeze-agent-"+user.Username) + if err != nil { + log.Println("Warning, cannot connect to agent", err) + return "", err + } + defer conn.Close() + + _, err = conn.Write([]byte{1}) + if err != nil { + log.Println("Warning, cannot write to agent", err) + return "", err + } + r := bare.NewReader(conn) + masterPassword, err = r.ReadString() + if err != nil { + log.Println("Warning, cannot read from agent", err) + return "", err + } + } + return masterPassword, nil +} + +// todo memguard +func GiveMasterPassword(masterPassword string) { + // todo implement GiveMasterPassword +} + +func StartAgent() { + // todo implement StartAgent +} diff --git a/config/init.go b/config/init.go index f58c90ad09bad90fe19e18a9f6c4a6db6306b8b6..09a531b3e9e55f70d56b01fc836aad2e7aa96aa5 100644 --- a/config/init.go +++ b/config/init.go @@ -26,7 +26,7 @@ fs.SaveCredentials(credentials, masterPassword) } -func Reëncrypt(masterPassword string) error { +func Reëncrypt(masterPassword string) (string, error) { fmt.Print("New master password: ") // todo memguard p_b, _ := terminal.ReadPassword(int(os.Stdin.Fd())) @@ -35,21 +35,21 @@ fmt.Print("\n") // todo memguard credentials, err := fs.ReadCredentials(masterPassword) if err != nil { - return err + return "", err } err = fs.SaveCredentials(credentials, newMasterPassword) if err != nil { - return err + return "", err } // todo memguard passwords, err := fs.Read(masterPassword) if err != nil { - return err + return "", err } err = fs.SaveBare(passwords, newMasterPassword) if err != nil { - return err + return "", err } - return nil + return newMasterPassword, nil } diff --git a/eeze.go b/eeze.go index 4a07d356cb29ab7cd15616d376be3ca3e75b7e56..1986f222aca699476ca755f00bb99c36514f65ad 100644 --- a/eeze.go +++ b/eeze.go @@ -1,6 +1,7 @@ package main import ( + "notabug.org/apiote/next-eeze/agent" "notabug.org/apiote/next-eeze/config" "notabug.org/apiote/next-eeze/operation" "notabug.org/apiote/next-eeze/server" @@ -33,21 +34,16 @@ r := getopt.Bool("r", false, "in Config: reëncrypt (change master password)") err := getopt.Parse() if err != nil { - log.Fatal("Error parsing opts. ", err) + log.Println("Error parsing opts. ", err) return } - masterPassword := "" + masterPassword, err := agent.GetMasterPassword() + if err != nil { + log.Println("Error getting from agent", err) + agent.StartAgent() + } - /* - todo - if exists /tmp/eeze-agent-$username - then - ask agent for masterPassword - else - start agent - fi - */ if masterPassword == "" || (*C && (*i || *r)) { fmt.Print("Master password: ") // todo memguard @@ -55,15 +51,21 @@ masterPass_b, _ := terminal.ReadPassword(int(os.Stdin.Fd())) // todo memguard masterPassword = string(masterPass_b) fmt.Print("\n") - - // todo give masterPassword to agent + agent.GiveMasterPassword(masterPassword) } if *C { if *i { config.Init(masterPassword) } else if *r { - config.Reëncrypt(masterPassword) + // todo memguard + newMasterPassword, err := config.Reëncrypt(masterPassword) + if err != nil { + log.Println("Error reëncrypting. ", err) + return + } else { + agent.GiveMasterPassword(newMasterPassword) + } } } else if *S { err = server.Sync(masterPassword) @@ -79,7 +81,7 @@ } else { getopt.Usage() } if err != nil { - log.Fatal("Error. ", err) + log.Println("Error. ", err) return } }