You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

96 lines
1.6 KiB

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
}