1
0
mirror of https://github.com/ssh-vault/ssh-vault.git synced 2025-07-31 05:24:22 +03:00

fixed edit

This commit is contained in:
nbari
2016-10-07 19:54:19 +02:00
parent c30c9662b5
commit 51f796b218
4 changed files with 87 additions and 26 deletions

View File

@ -105,11 +105,27 @@ func main() {
exit1(err)
}
case "edit":
fmt.Println("edit")
case "view":
err := vault.View()
data, err := vault.View()
if err != nil {
exit1(err)
}
out, err := vault.Edit(data)
if err != nil {
exit1(err)
}
out, err = vault.Encrypt(out)
if err != nil {
exit1(err)
}
err = vault.Close(out)
if err != nil {
exit1(err)
}
case "view":
out, err := vault.View()
if err != nil {
exit1(err)
}
fmt.Printf("\n%s", out)
}
}

36
edit.go Normal file
View File

@ -0,0 +1,36 @@
package sshvault
import (
"io/ioutil"
"os"
"os/exec"
)
// Edit opens $EDITOR default to vi
func (v *vault) Edit(data []byte) ([]byte, error) {
tmpfile, err := ioutil.TempFile("", v.Fingerprint)
if err != nil {
return nil, err
}
defer os.Remove(tmpfile.Name())
err = ioutil.WriteFile(tmpfile.Name(), data, 0600)
if err != nil {
return nil, err
}
editor := os.Getenv("EDITOR")
if editor == "" {
editor = "vi"
}
cmd := exec.Command(editor, tmpfile.Name())
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
err = cmd.Run()
if err != nil {
return nil, err
}
b, err := ioutil.ReadFile(tmpfile.Name())
if err != nil {
return nil, err
}
return b, nil
}

3
sopas Normal file
View File

@ -0,0 +1,3 @@
$SSH-VAULT;AES256;fd:c9:a5:ab:67:c2:6a:3b:6b:c9:72:d6:32:f8:a8:09
43fd4bf54db6c83baa44a18ad1e0070ceee2258ac87751709dff570bf0ecc54c9f3d781de889ea926d5849162a6482d21f1af3499328999b6e619823107215d2605842b09b7240ac228cb7034bd5a3e57d30ce20a2b86b275d480e6d7264520b70b20616c7f86514b710f5c44456ceff8c4013a12c0c9e3a99c128eb013c0b88b25276056be23804ceb12cec4fa8058931c9da55aad682f70603ac089b0a2edb15791a6296cba1095d44e3906dc4d421712927090cd3e5fe8eca3db78ffcb0c229e7b7a85aac0d14db4f5ce973f4d5cf98412b6a4d16c7ff65954482f6786c06ac9031197ced692d203610c4186b5490308b7840e210fc3d7448b4715782b433d90dd883146d28aa066d4f8d6b05457b53bc88f43c426bb10ff2a29ccbce8c5ca5560ba6ca5e9bde2f296f6cf0ebb506dd9b42d2991f01415d8f7ccc55ded53b3ef102c497f5d0432df45890280ec2a771bb1f302420d861884c8d0f3b8c9409c046b12cd1c4739d228840a5f1f7d804046f87144068f70cde65e12f078298625c4b0c04dfa275bf72ea84ee914d67981126d41a2ecad8aad72a636df9fc2639546b91dc0850a4d1f7c043e7d92ffdc6a8e77a8354dc4da513df2c8616d7f479bf5418852ee3ef29b35ef49513ed6099381db5bd9d46e3a888492d2a65e8920c8bf2dca419c883fbbd5908337ba56b62b50e40059ec817becfb369204202f804
51a3315d00f1c1ec1616c90d1b58cb0d6f870fe6a42eeca3a98181661bf72a29f4af09976e828d00a79aa242416bb2a41e79015a7320726e67b3b6921982ebe70af7700a3fc38cb64cffb4

52
view.go
View File

@ -10,69 +10,75 @@ import (
"encoding/pem"
"fmt"
"io/ioutil"
"log"
"strings"
"syscall"
"golang.org/x/crypto/ssh/terminal"
)
// View decrypts data and print it to stdout
func (v *vault) View() error {
func (v *vault) View() ([]byte, error) {
vault, err := ioutil.ReadFile(v.vault)
if err != nil {
return err
return nil, err
}
// head, pass, body
// head, password, body
parts := bytes.Split(vault, []byte("\n"))
// get pem
pemData, err := ioutil.ReadFile(v.key)
// use private key only
if strings.HasSuffix(v.key, ".pub") {
v.key = strings.Trim(v.key, ".pub")
}
keyFile, err := ioutil.ReadFile(v.key)
if err != nil {
log.Fatalf("Error reading pem file: %s", err)
return nil, fmt.Errorf("Error reading private key: %s", err)
}
block, _ := pem.Decode(pemData)
block, _ := pem.Decode(keyFile)
if block == nil || block.Type != "RSA PRIVATE KEY" {
return fmt.Errorf("No valid PEM (private key) data found")
return nil, fmt.Errorf("No valid PEM (private key) data found")
}
var pemOut []byte
if x509.IsEncryptedPEMBlock(block) {
fmt.Print("Enter key password: ")
keyPassword, err := terminal.ReadPassword(int(syscall.Stdin))
if err != nil {
return err
return nil, err
}
pemOut, err = x509.DecryptPEMBlock(block, keyPassword)
fmt.Println()
block.Bytes, err = x509.DecryptPEMBlock(block, keyPassword)
if err != nil {
return err
return nil, err
}
} else {
pemOut = block.Bytes
}
privateKey, err := x509.ParsePKCS1PrivateKey(pemOut)
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return err
return nil, err
}
ciphertext := make([]byte, hex.DecodedLen(len(parts[1])))
_, err = hex.Decode(ciphertext, parts[1])
if err != nil {
return err
return nil, err
}
v.password, err = rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, []byte(""))
if err != nil {
return err
return nil, err
}
ciphertext = make([]byte, hex.DecodedLen(len(parts[2])))
_, err = hex.Decode(ciphertext, parts[2])
if err != nil {
return err
return nil, err
}
data, err := v.Decrypt(ciphertext)
if err != nil {
return err
return nil, err
}
fmt.Printf("\n%s", data)
return nil
return data, nil
}