diff options
Diffstat (limited to 'internal/fusefrontend/ctlsock_interface.go')
-rw-r--r-- | internal/fusefrontend/ctlsock_interface.go | 35 |
1 files changed, 33 insertions, 2 deletions
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 } |