package Encryption import ( "bytes" "crypto/aes" "errors" "os" "os/exec" "io/ioutil" "io" ) func EditEncryptedFile(password string, FilePath string) (error) { var ( editor string tmpFilePath string ciphertext []byte plaintext []byte tmpFile *os.File encryptedFile *os.File cmd *exec.Cmd e error ) editor = os.Getenv("EDITOR") if editor == "" { return errors.New("EDITOR variable cannot be blank") } tmpFilePath = os.Getenv("TMPDIR") if tmpFilePath == "" { tmpFilePath = "/tmp" } ciphertext, e = ioutil.ReadFile(FilePath) if e != nil { return e } if len(ciphertext) < aes.BlockSize { return errors.New("ciphertext too short") } plaintext, e = DecryptData(password, ciphertext) if e != nil { return e } tmpFile, e = ioutil.TempFile(tmpFilePath, "") if e != nil { return e } _, e = io.Copy(tmpFile, bytes.NewReader(plaintext)) if e != nil { return e } e = tmpFile.Close() if e != nil { return e } cmd = exec.Command(editor, tmpFile.Name()) cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin cmd.Stderr = os.Stderr e = cmd.Run() if (e != nil) { return e } plaintext, e = ioutil.ReadFile(tmpFile.Name()) if e != nil { return e } ciphertext, e = EncryptData(password, plaintext) if e != nil { return e } // open output file encryptedFile, e = os.OpenFile(FilePath, os.O_RDWR, 0666) if e != nil { return e } defer func() { encryptedFile.Close() SecureDelete(tmpFile.Name()) }() _, e = io.Copy(encryptedFile, bytes.NewReader(ciphertext)) if e != nil { return e } return nil }