2016-10-16 13:39:25 +02:00
|
|
|
package cli
|
2015-11-15 13:38:19 +01:00
|
|
|
|
|
|
|
// Test CLI operations like "-init", "-password" etc
|
|
|
|
|
|
|
|
import (
|
2016-10-06 22:41:13 +02:00
|
|
|
"io/ioutil"
|
2015-11-15 13:38:19 +01:00
|
|
|
"os"
|
|
|
|
"os/exec"
|
2016-10-16 19:13:00 +02:00
|
|
|
"syscall"
|
2015-11-15 13:38:19 +01:00
|
|
|
"testing"
|
|
|
|
|
2016-02-06 19:20:54 +01:00
|
|
|
"github.com/rfjakob/gocryptfs/internal/configfile"
|
2016-06-06 23:57:42 +02:00
|
|
|
|
|
|
|
"github.com/rfjakob/gocryptfs/tests/test_helpers"
|
2015-11-15 13:38:19 +01:00
|
|
|
)
|
|
|
|
|
2016-06-30 00:57:14 +02:00
|
|
|
func TestMain(m *testing.M) {
|
|
|
|
test_helpers.ResetTmpDir(false)
|
|
|
|
r := m.Run()
|
|
|
|
os.Exit(r)
|
|
|
|
}
|
|
|
|
|
2015-11-15 13:48:30 +01:00
|
|
|
// Test -init flag
|
2015-11-15 13:38:19 +01:00
|
|
|
func TestInit(t *testing.T) {
|
2016-06-16 21:06:03 +02:00
|
|
|
dir := test_helpers.InitFS(t)
|
2016-09-25 15:05:09 +02:00
|
|
|
_, c, err := configfile.LoadConfFile(dir+"/"+configfile.ConfDefaultName, "test")
|
2015-11-15 13:48:30 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2016-09-26 23:25:13 +02:00
|
|
|
if c.IsFeatureFlagSet(configfile.FlagAESSIV) {
|
|
|
|
t.Error("AESSIV flag should not be set")
|
2016-09-25 15:05:09 +02:00
|
|
|
}
|
2016-06-14 23:11:54 +02:00
|
|
|
}
|
2015-11-15 13:48:30 +01:00
|
|
|
|
2016-09-26 23:25:13 +02:00
|
|
|
// Test -init with -aessiv
|
|
|
|
func TestInitAessiv(t *testing.T) {
|
|
|
|
dir := test_helpers.InitFS(t, "-aessiv")
|
2016-09-25 15:05:09 +02:00
|
|
|
_, c, err := configfile.LoadConfFile(dir+"/"+configfile.ConfDefaultName, "test")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2016-09-26 23:25:13 +02:00
|
|
|
if !c.IsFeatureFlagSet(configfile.FlagAESSIV) {
|
|
|
|
t.Error("AESSIV flag should be set but is not")
|
2016-09-25 15:05:09 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test -init with -reverse
|
|
|
|
func TestInitReverse(t *testing.T) {
|
|
|
|
dir := test_helpers.InitFS(t, "-reverse")
|
|
|
|
_, c, err := configfile.LoadConfFile(dir+"/"+configfile.ConfReverseName, "test")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2016-09-26 23:25:13 +02:00
|
|
|
if !c.IsFeatureFlagSet(configfile.FlagAESSIV) {
|
|
|
|
t.Error("AESSIV flag should be set but is not")
|
2016-09-25 15:05:09 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testPasswd(t *testing.T, dir string, extraArgs ...string) {
|
2016-06-14 23:11:54 +02:00
|
|
|
// Change password using "-extpass"
|
2016-09-25 15:05:09 +02:00
|
|
|
args := []string{"-q", "-passwd", "-extpass", "echo test"}
|
|
|
|
args = append(args, extraArgs...)
|
|
|
|
args = append(args, dir)
|
|
|
|
cmd := exec.Command(test_helpers.GocryptfsBinary, args...)
|
2016-06-15 22:43:31 +02:00
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
2016-06-16 21:06:03 +02:00
|
|
|
err := cmd.Run()
|
2016-06-15 22:43:31 +02:00
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
// Change password using stdin
|
2016-10-16 18:12:37 +02:00
|
|
|
args = []string{"-q", "-passwd"}
|
2016-09-25 15:05:09 +02:00
|
|
|
args = append(args, extraArgs...)
|
|
|
|
args = append(args, dir)
|
|
|
|
cmd = exec.Command(test_helpers.GocryptfsBinary, args...)
|
2016-06-15 22:43:31 +02:00
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
p, err := cmd.StdinPipe()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
err = cmd.Start()
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
// Old password
|
|
|
|
p.Write([]byte("test\n"))
|
|
|
|
// New password
|
|
|
|
p.Write([]byte("newpasswd\n"))
|
|
|
|
p.Close()
|
|
|
|
err = cmd.Wait()
|
2015-11-15 13:38:19 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-25 15:05:09 +02:00
|
|
|
// Test -passwd flag
|
|
|
|
func TestPasswd(t *testing.T) {
|
|
|
|
// Create FS
|
|
|
|
dir := test_helpers.InitFS(t)
|
2016-10-16 19:13:00 +02:00
|
|
|
mnt := dir + ".mnt"
|
|
|
|
// Add content
|
|
|
|
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
|
|
|
|
file1 := mnt + "/file1"
|
|
|
|
err := ioutil.WriteFile(file1, []byte("somecontent"), 0600)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
err = test_helpers.UnmountErr(mnt)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
// Change password to "newpasswd"
|
2016-09-25 15:05:09 +02:00
|
|
|
testPasswd(t, dir)
|
2016-10-16 19:13:00 +02:00
|
|
|
// Mount and verify
|
|
|
|
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo newpasswd")
|
|
|
|
content, err := ioutil.ReadFile(file1)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
} else if string(content) != "somecontent" {
|
|
|
|
t.Errorf("wrong content: %q", string(content))
|
|
|
|
}
|
|
|
|
err = test_helpers.UnmountErr(mnt)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test -passwd with -masterkey
|
|
|
|
func TestPasswdMasterkey(t *testing.T) {
|
|
|
|
// Create FS
|
|
|
|
dir := test_helpers.InitFS(t)
|
|
|
|
// Overwrite with config with known master key
|
|
|
|
conf, err := ioutil.ReadFile("gocryptfs.conf.b9e5ba23")
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
syscall.Unlink(dir + "/gocryptfs.conf")
|
|
|
|
err = ioutil.WriteFile(dir+"/gocryptfs.conf", conf, 0600)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
// Add content
|
|
|
|
mnt := dir + ".mnt"
|
|
|
|
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo test")
|
|
|
|
file1 := mnt + "/file1"
|
|
|
|
err = ioutil.WriteFile(file1, []byte("somecontent"), 0600)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
test_helpers.UnmountPanic(mnt)
|
|
|
|
// Change password using stdin
|
|
|
|
args := []string{"-q", "-passwd", "-masterkey",
|
|
|
|
"b9e5ba23-981a22b8-c8d790d8-627add29-f680513f-b7b7035f-d203fb83-21d82205"}
|
|
|
|
args = append(args, dir)
|
|
|
|
cmd := exec.Command(test_helpers.GocryptfsBinary, args...)
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
p, err := cmd.StdinPipe()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
err = cmd.Start()
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
// New password
|
|
|
|
p.Write([]byte("newpasswd\n"))
|
|
|
|
p.Close()
|
|
|
|
err = cmd.Wait()
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
// Mount and verify
|
|
|
|
test_helpers.MountOrFatal(t, dir, mnt, "-extpass", "echo newpasswd")
|
|
|
|
content, err := ioutil.ReadFile(file1)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
} else if string(content) != "somecontent" {
|
|
|
|
t.Errorf("wrong content: %q", string(content))
|
|
|
|
}
|
|
|
|
test_helpers.UnmountPanic(mnt)
|
2016-09-25 15:05:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Test -passwd with -reverse
|
|
|
|
func TestPasswdReverse(t *testing.T) {
|
|
|
|
// Create FS
|
|
|
|
dir := test_helpers.InitFS(t, "-reverse")
|
|
|
|
testPasswd(t, dir, "-reverse")
|
|
|
|
}
|
|
|
|
|
2015-11-15 13:48:30 +01:00
|
|
|
// Test -init & -config flag
|
|
|
|
func TestInitConfig(t *testing.T) {
|
2016-06-30 00:57:14 +02:00
|
|
|
config := test_helpers.TmpDir + "/TestInitConfig.conf"
|
2016-06-16 21:06:03 +02:00
|
|
|
dir := test_helpers.InitFS(t, "-config="+config)
|
|
|
|
|
|
|
|
_, err := os.Stat(config)
|
2015-11-15 13:48:30 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test -passwd & -config
|
2016-06-14 23:11:54 +02:00
|
|
|
cmd2 := exec.Command(test_helpers.GocryptfsBinary, "-q", "-passwd", "-extpass", "echo test",
|
2015-11-15 13:48:30 +01:00
|
|
|
"-config", config, dir)
|
2016-06-14 23:11:54 +02:00
|
|
|
cmd2.Stdout = os.Stdout
|
|
|
|
cmd2.Stderr = os.Stderr
|
2015-11-15 13:48:30 +01:00
|
|
|
err = cmd2.Run()
|
2015-11-15 13:38:19 +01:00
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
}
|
2015-12-11 22:21:00 +01:00
|
|
|
|
2016-06-16 21:29:22 +02:00
|
|
|
// Test -ro
|
|
|
|
func TestRo(t *testing.T) {
|
|
|
|
dir := test_helpers.InitFS(t)
|
|
|
|
mnt := dir + ".mnt"
|
|
|
|
test_helpers.MountOrFatal(t, dir, mnt, "-ro", "-extpass=echo test")
|
2016-07-11 20:31:36 +02:00
|
|
|
defer test_helpers.UnmountPanic(mnt)
|
2016-06-16 21:29:22 +02:00
|
|
|
|
|
|
|
file := mnt + "/file"
|
|
|
|
err := os.Mkdir(file, 0777)
|
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Mkdir should have failed")
|
|
|
|
}
|
|
|
|
_, err = os.Create(file)
|
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Create should have failed")
|
|
|
|
}
|
|
|
|
}
|
2016-10-06 22:41:13 +02:00
|
|
|
|
|
|
|
// Test "-nonempty"
|
|
|
|
func TestNonempty(t *testing.T) {
|
|
|
|
dir := test_helpers.InitFS(t)
|
|
|
|
mnt := dir + ".mnt"
|
|
|
|
err := os.Mkdir(mnt, 0700)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
err = ioutil.WriteFile(mnt+"/somefile", []byte("xyz"), 0600)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
err = test_helpers.Mount(dir, mnt, false, "-extpass=echo test")
|
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Mounting over a file should fail per default")
|
|
|
|
}
|
|
|
|
// Should work with "-nonempty"
|
|
|
|
test_helpers.MountOrFatal(t, dir, mnt, "-nonempty", "-extpass=echo test")
|
|
|
|
test_helpers.UnmountPanic(mnt)
|
|
|
|
}
|
2016-10-09 00:03:39 +02:00
|
|
|
|
|
|
|
// Test "mountpoint shadows cipherdir" handling
|
|
|
|
func TestShadows(t *testing.T) {
|
|
|
|
mnt := test_helpers.InitFS(t)
|
|
|
|
cipher := mnt + ".cipher"
|
|
|
|
err := os.Rename(mnt, cipher)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
// This should work
|
2016-10-10 20:21:52 +02:00
|
|
|
// (note that MountOrFatal creates "mnt" again)
|
2016-10-09 00:03:39 +02:00
|
|
|
test_helpers.MountOrFatal(t, cipher, mnt, "-extpass=echo test")
|
|
|
|
test_helpers.UnmountPanic(mnt)
|
|
|
|
cipher2 := mnt + "/cipher"
|
|
|
|
err = os.Rename(cipher, cipher2)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
// This should fail
|
|
|
|
err = test_helpers.Mount(cipher2, mnt, false, "-extpass=echo test")
|
|
|
|
if err == nil {
|
|
|
|
t.Errorf("Should have failed")
|
|
|
|
}
|
|
|
|
}
|