next-eeze.git

commit b8662330e5a2aed7af1568e6cddb044597857f5c

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