func (ce *CtrlEngine) openMsgDB( homedir string, ) error { // read passphrase, if necessary if ce.passphrase == nil { fmt.Fprintf(ce.fileTable.StatusFP, "read passphrase from fd %d (not echoed)\n", ce.fileTable.PassphraseFD) log.Infof("read passphrase from fd %d (not echoed)", ce.fileTable.PassphraseFD) var err error ce.passphrase, err = util.Readline(ce.fileTable.PassphraseFP) if err != nil { return err } log.Info("done") } // open msgDB msgdbname := filepath.Join(homedir, "msgs") log.Infof("open msgDB %s", msgdbname) var err error ce.msgDB, err = msgdb.Open(msgdbname, ce.passphrase) if err != nil { return err } return nil }
func (ce *CryptEngine) openKeyDB() error { // read passphrase log.Infof("read passphrase from fd %d", ce.fileTable.PassphraseFD) passphrase, err := util.Readline(ce.fileTable.PassphraseFP) if err != nil { return err } defer bzero.Bytes(passphrase) log.Info("done") // open keyDB keydbname := filepath.Join(ce.homedir, "keys") log.Infof("open keyDB %s", keydbname) ce.keyDB, err = keydb.Open(keydbname, passphrase) if err != nil { return err } return nil }
func (pe *ProtoEngine) fetch( output io.Writer, status io.Writer, server string, lastMessageTime int64, command io.Reader, ) error { // read passphrase log.Infof("read private key from fd %d", pe.fileTable.PassphraseFD) pks, err := util.Readline(pe.fileTable.PassphraseFP) if err != nil { return err } log.Info("done") pk, err := base64.Decode(string(pks)) if err != nil { return log.Error(err) } var privkey [ed25519.PrivateKeySize]byte copy(privkey[:], pk) log.Debugf("lastMessageTime=%d", lastMessageTime) messages, err := client.ListMessages(&privkey, lastMessageTime, server, def.CACert) if err != nil { // TODO: handle this better if err.Error() == "accountdb: Nothing found" { // no messages found log.Info("write: NONE") fmt.Fprintln(status, "NONE") return nil } return log.Error(err) } /* for _, message := range messages { messageID := base64.Encode(message.MessageID) log.Debugf("messageID=%s, ReceiveTime=%d, ReadTime=%d", messageID, message.ReceiveTime, message.ReadTime) } */ scanner := bufio.NewScanner(command) for _, message := range messages { msg, err := client.FetchMessage(&privkey, message.MessageID, server, def.CACert) if err != nil { return log.Error(err) } messageID := base64.Encode(message.MessageID) log.Debugf("write: MESSAGEID:\t%s", messageID) fmt.Fprintf(status, "MESSAGEID:\t%s\n", messageID) var command string if scanner.Scan() { command = scanner.Text() } else { return log.Error("protoengine: expecting command input") } if err := scanner.Err(); err != nil { fmt.Fprintln(os.Stderr, "reading standard input:", err) } if command == "NEXT" { log.Debug("read: NEXT") enc := base64.Encode(msg) if _, err := io.WriteString(output, enc); err != nil { return log.Error(err) } log.Debugf("write: LENGTH:\t%d", len(enc)) fmt.Fprintf(status, "LENGTH:\t%d\n", len(enc)) log.Debugf("write: RECEIVETIME:\t%d", message.ReceiveTime) fmt.Fprintf(status, "RECEIVETIME:\t%d\n", message.ReceiveTime) } else if command == "QUIT" { log.Debug("read: QUIT") return nil } else { return log.Errorf("protoengine: unknown command '%s'", command) } } // no more messages log.Info("write: NONE") fmt.Fprintln(status, "NONE") return nil }