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 }
// create a new MsgDB and KeyDB. func (ce *CtrlEngine) dbCreate( w, statusfp io.Writer, homedir string, c *cli.Context, ) error { msgdbname := filepath.Join(c.GlobalString("homedir"), "msgs") // read passphrase fmt.Fprintf(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 ( scanner *bufio.Scanner passphrase []byte passphrase2 []byte err error ) defer bzero.Bytes(passphrase) defer bzero.Bytes(passphrase2) isTerminal := terminal.IsTerminal(int(ce.fileTable.PassphraseFD)) if isTerminal { passphrase, err = terminal.ReadPassword(int(ce.fileTable.PassphraseFD)) if err != nil { return log.Error(err) } } else { scanner = bufio.NewScanner(ce.fileTable.PassphraseFP) if scanner.Scan() { passphrase = scanner.Bytes() } else if err := scanner.Err(); err != nil { return log.Error(err) } } log.Info("done") // read passphrase again fmt.Fprintf(statusfp, "read passphrase from fd %d again (not echoed)\n", ce.fileTable.PassphraseFD) log.Infof("read passphrase from fd %d again (not echoed)", ce.fileTable.PassphraseFD) if isTerminal { passphrase2, err = terminal.ReadPassword(int(ce.fileTable.PassphraseFD)) if err != nil { return log.Error(err) } } else { if scanner.Scan() { passphrase2 = scanner.Bytes() } else if err := scanner.Err(); err != nil { return log.Error(err) } } log.Info("done") // compare passphrases if !bytes.Equal(passphrase, passphrase2) { return log.Error(ErrPassphrasesDiffer) } // create msgDB log.Infof("create msgDB '%s'", msgdbname) if err := msgdb.Create(msgdbname, passphrase, c.Int("iterations")); err != nil { return err } // open msgDB msgDB, err := msgdb.Open(msgdbname, passphrase) if err != nil { return err } defer msgDB.Close() // configure to make sure mutecrypt has config file err = ce.upkeepFetchconf(msgDB, homedir, false, nil, statusfp) if err != nil { return err } // create keyDB log.Info("create keyDB") if err := createKeyDB(c, w, ce.fileTable.OutputFD, passphrase); err != nil { return err } // status fmt.Fprintf(statusfp, "database files created\n") log.Info("database files created") // determine private walletKey walletKey := c.String("walletkey") if walletKey == "" { // generate wallet key _, privateKey, err := ed25519.GenerateKey(cipher.RandReader) if err != nil { return err } walletKey = base64.Encode(privateKey[:]) } // store wallet key if err := msgDB.AddValue(msgdb.WalletKey, walletKey); err != nil { return err } // print wallet key if err := printWalletKey(w, walletKey); err != nil { return err } return nil }