From ad7942f434fea567f24458e67a0919291b5ec8dd Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 7 May 2017 21:01:39 +0200 Subject: fusefrontend: implement path decryption via ctlsock Closes https://github.com/rfjakob/gocryptfs/issues/84 . --- internal/fusefrontend/ctlsock_interface.go | 35 ++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'internal') diff --git a/internal/fusefrontend/ctlsock_interface.go b/internal/fusefrontend/ctlsock_interface.go index 8d8b096..964775b 100644 --- a/internal/fusefrontend/ctlsock_interface.go +++ b/internal/fusefrontend/ctlsock_interface.go @@ -1,9 +1,12 @@ package fusefrontend import ( - "errors" + "fmt" + "path" + "strings" "github.com/rfjakob/gocryptfs/internal/ctlsock" + "github.com/rfjakob/gocryptfs/internal/nametransform" ) var _ ctlsock.Interface = &FS{} // Verify that interface is implemented. @@ -15,5 +18,33 @@ func (fs *FS) EncryptPath(plainPath string) (string, error) { // DecryptPath implements ctlsock.Backend func (fs *FS) DecryptPath(cipherPath string) (string, error) { - return "", errors.New("Forward mode does not have path decryption implemented") + if fs.args.PlaintextNames || cipherPath == "" { + return cipherPath, nil + } + plainPath := "" + parts := strings.Split(cipherPath, "/") + wd := fs.args.Cipherdir + for _, part := range parts { + dirIV, err := nametransform.ReadDirIV(wd) + if err != nil { + fmt.Printf("ReadDirIV: %v\n", err) + return "", err + } + longPart := part + if nametransform.IsLongContent(part) { + longPart, err = nametransform.ReadLongName(wd + "/" + part) + if err != nil { + fmt.Printf("ReadLongName: %v\n", err) + return "", err + } + } + name, err := fs.nameTransform.DecryptName(longPart, dirIV) + if err != nil { + fmt.Printf("DecryptName: %v\n", err) + return "", err + } + plainPath = path.Join(plainPath, name) + wd = path.Join(wd, part) + } + return plainPath, nil } -- cgit v1.2.3