summaryrefslogtreecommitdiff
path: root/internal/fusefrontend_reverse/rfs.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2016-09-25 18:01:24 +0200
committerJakob Unterwurzacher2016-09-25 18:01:24 +0200
commitb883dd10a62eb8d7ddf589e2878d8e0f65a90e83 (patch)
treebd500c18f8c7bd8095617011eb0ea3dace11ac5c /internal/fusefrontend_reverse/rfs.go
parent12808138ef105824de97924a585ad66bacb3a18b (diff)
reverse: add symlink encryption and Readlink support
Diffstat (limited to 'internal/fusefrontend_reverse/rfs.go')
-rw-r--r--internal/fusefrontend_reverse/rfs.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/internal/fusefrontend_reverse/rfs.go b/internal/fusefrontend_reverse/rfs.go
index 6089d41..cfe23b6 100644
--- a/internal/fusefrontend_reverse/rfs.go
+++ b/internal/fusefrontend_reverse/rfs.go
@@ -1,6 +1,7 @@
package fusefrontend_reverse
import (
+ "encoding/base64"
"fmt"
"os"
"path/filepath"
@@ -275,3 +276,23 @@ func (rfs *reverseFS) OpenDir(cipherPath string, context *fuse.Context) ([]fuse.
func (rfs *reverseFS) StatFs(name string) *fuse.StatfsOut {
return rfs.loopbackfs.StatFs(name)
}
+
+// Readlink - FUSE call
+func (rfs *reverseFS) Readlink(cipherPath string, context *fuse.Context) (string, fuse.Status) {
+ absPath, err := rfs.abs(rfs.decryptPath(cipherPath))
+ if err != nil {
+ return "", fuse.ToStatus(err)
+ }
+ plainTarget, err := os.Readlink(absPath)
+ if err != nil {
+ return "", fuse.ToStatus(err)
+ }
+ if rfs.args.PlaintextNames {
+ return plainTarget, fuse.OK
+ }
+ nonce := derivePathIV(cipherPath)
+ // Symlinks are encrypted like file contents and base64-encoded
+ cBinTarget := rfs.contentEnc.EncryptBlock([]byte(plainTarget), 0, nil, contentenc.ExternalNonce, nonce)
+ cTarget := base64.URLEncoding.EncodeToString(cBinTarget)
+ return cTarget, fuse.OK
+}