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 . --- tests/defaults/ctlsock_test.go | 98 ++++++++++++++++++++++++++++++++++++++++++ tests/defaults/main_test.go | 32 -------------- 2 files changed, 98 insertions(+), 32 deletions(-) create mode 100644 tests/defaults/ctlsock_test.go (limited to 'tests/defaults') diff --git a/tests/defaults/ctlsock_test.go b/tests/defaults/ctlsock_test.go new file mode 100644 index 0000000..13e6912 --- /dev/null +++ b/tests/defaults/ctlsock_test.go @@ -0,0 +1,98 @@ +package defaults + +import ( + "os" + "syscall" + "testing" + + "github.com/rfjakob/gocryptfs/internal/ctlsock" + "github.com/rfjakob/gocryptfs/tests/test_helpers" +) + +func TestCtlSock(t *testing.T) { + cDir := test_helpers.InitFS(t) + pDir := cDir + ".mnt" + sock := cDir + ".sock" + test_helpers.MountOrFatal(t, cDir, pDir, "-ctlsock="+sock, "-extpass", "echo test") + defer test_helpers.UnmountPanic(pDir) + req := ctlsock.RequestStruct{ + EncryptPath: "foobar", + } + response := test_helpers.QueryCtlSock(t, sock, req) + if response.Result == "" || response.ErrNo != 0 { + t.Errorf("got an error reply: %+v", response) + } + req.EncryptPath = "not-existing-dir/xyz" + response = test_helpers.QueryCtlSock(t, sock, req) + if response.ErrNo != int32(syscall.ENOENT) || response.Result != "" { + t.Errorf("incorrect error handling: %+v", response) + } + // Strange paths should not cause a crash + crashers := []string{"/foo", "foo/", "/foo/", ".", "/////", "/../../."} + for _, c := range crashers { + req.EncryptPath = c + // QueryCtlSock calls t.Fatal if it gets EOF when gocryptfs panics + response = test_helpers.QueryCtlSock(t, sock, req) + if response.WarnText == "" { + t.Errorf("We should get a warning about non-canonical paths here") + } + } +} + +func TestCtlSockDecrypt(t *testing.T) { + cDir := test_helpers.InitFS(t) + pDir := cDir + ".mnt" + sock := cDir + ".sock" + test_helpers.MountOrFatal(t, cDir, pDir, "-ctlsock="+sock, "-extpass", "echo test") + defer test_helpers.UnmountPanic(pDir) + + paths := []string{ + "xxxxxxx123456789", + "foo/bar/baz", + test_helpers.X255, + "123/" + test_helpers.X255, + "123/" + test_helpers.X255 + "/456", + } + + for _, p := range paths { + // Create path + err := os.MkdirAll(pDir+"/"+p, 0700) + if err != nil { + t.Fatal(err) + } + // Encrypt the path through the ctlsock + req := ctlsock.RequestStruct{ + EncryptPath: p, + } + response := test_helpers.QueryCtlSock(t, sock, req) + if response.Result == "" || response.ErrNo != 0 { + t.Fatalf("got an error reply: %+v", response) + } + // Check if the encrypted path actually exists + cPath := response.Result + _, err = os.Stat(cDir + "/" + cPath) + if err != nil { + t.Fatal(err) + } + // Decrypt the path through the ctlsock and see if we get the original path + req = ctlsock.RequestStruct{ + DecryptPath: cPath, + } + response = test_helpers.QueryCtlSock(t, sock, req) + if response.Result == "" || response.ErrNo != 0 { + t.Errorf("query=%+v, response=%+v", req, response) + continue + } + if response.Result != p { + t.Errorf("want=%q got=%q", p, response.Result) + } + } +} + +func TestCtlSockDecryptCrash(t *testing.T) { + cDir := test_helpers.InitFS(t) + pDir := cDir + ".mnt" + sock := cDir + ".sock" + test_helpers.MountOrFatal(t, cDir, pDir, "-ctlsock="+sock, "-extpass", "echo test") + defer test_helpers.UnmountPanic(pDir) +} diff --git a/tests/defaults/main_test.go b/tests/defaults/main_test.go index 2ea9e12..ca11b43 100644 --- a/tests/defaults/main_test.go +++ b/tests/defaults/main_test.go @@ -8,10 +8,8 @@ import ( "os/exec" "runtime" "sync" - "syscall" "testing" - "github.com/rfjakob/gocryptfs/internal/ctlsock" "github.com/rfjakob/gocryptfs/tests/test_helpers" ) @@ -42,36 +40,6 @@ func Test1980Tar(t *testing.T) { } } -func TestCtlSock(t *testing.T) { - cDir := test_helpers.InitFS(t) - pDir := cDir + ".mnt" - sock := cDir + ".sock" - test_helpers.MountOrFatal(t, cDir, pDir, "-ctlsock="+sock, "-extpass", "echo test") - defer test_helpers.UnmountPanic(pDir) - req := ctlsock.RequestStruct{ - EncryptPath: "foobar", - } - response := test_helpers.QueryCtlSock(t, sock, req) - if response.Result == "" || response.ErrNo != 0 { - t.Errorf("got an error reply: %+v", response) - } - req.EncryptPath = "not-existing-dir/xyz" - response = test_helpers.QueryCtlSock(t, sock, req) - if response.ErrNo != int32(syscall.ENOENT) || response.Result != "" { - t.Errorf("incorrect error handling: %+v", response) - } - // Strange paths should not cause a crash - crashers := []string{"/foo", "foo/", "/foo/", ".", "/////", "/../../."} - for _, c := range crashers { - req.EncryptPath = c - // QueryCtlSock calls t.Fatal if it gets EOF when gocryptfs panics - response = test_helpers.QueryCtlSock(t, sock, req) - if response.WarnText == "" { - t.Errorf("We should get a warning about non-canonical paths here") - } - } -} - // In gocryptfs before v1.2, the file header was only read once for each // open. But truncating a file to zero will generate a new random file ID. // The sequence below caused an I/O error to be returned. -- cgit v1.2.3