mirror of
https://github.com/gogrlx/bitcask.git
synced 2026-04-02 02:58:59 -07:00
Add configuration options for FileMode (#183)
* Add configuration options for FileMode Add two additional configuration values, and their corresponding default values: * DirFileModeBeforeUmask - Dir FileMode is used on all directories created. DefaultDirFileModeBeforeUmask is 0700. * FileFileModeBeforeUmask - File FileMode is used on all files created, except for the "lock" file (managed by the Flock library). DefaultFileFileModeBeforeUmask is 0600. When using these bits of configuration, keep in mind these FileMode values are set BEFORE any umask rules are applied. For example, if the user's umask is 022, setting DirFileFileModeBeforeUmask to 777 will result in directories with FileMode set to 755 (this umask prevents the write bit from being applied to group and world permissions). * moving defer statements after checking for errors use os.ModePerm const instead of os.FileMode(777) * fix spelling/grammar * skip these tests for Windows as they appear to break - Windows is less POSIX-y than it claims * ignore "lock" file for default case too -- this was incorrectly passing before including this, as my local dev station has umask 022
This commit is contained in:
160
bitcask_test.go
160
bitcask_test.go
@@ -723,6 +723,166 @@ func TestStatsError(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestDirFileModeBeforeUmask(t *testing.T) {
|
||||
skipIfWindows(t)
|
||||
|
||||
assert := assert.New(t)
|
||||
|
||||
t.Run("Setup", func(t *testing.T) {
|
||||
t.Run("Default DirFileModeBeforeUmask is 0700", func(t *testing.T) {
|
||||
testdir, err := ioutil.TempDir("", "bitcask")
|
||||
embeddedDir := filepath.Join(testdir, "cache")
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(testdir)
|
||||
|
||||
defaultTestMode := os.FileMode(0700)
|
||||
|
||||
db, err := Open(embeddedDir)
|
||||
assert.NoError(err)
|
||||
defer db.Close()
|
||||
err = filepath.Walk(testdir, func(path string, info os.FileInfo, err error) error {
|
||||
// skip the root directory
|
||||
if path == testdir {
|
||||
return nil
|
||||
}
|
||||
if info.IsDir() {
|
||||
// perms for directory on disk are filtered through defaultTestMode, AND umask of user running test.
|
||||
// this means the mkdir calls can only FURTHER restrict permissions, not grant more (preventing escalatation).
|
||||
// to make this test OS agnostic, we'll skip using golang.org/x/sys/unix, inferring umask via XOR and AND NOT.
|
||||
|
||||
// create anotherDir with allPerms - to infer umask
|
||||
anotherDir := filepath.Join(testdir, "temp")
|
||||
err := os.Mkdir(anotherDir, os.ModePerm)
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(anotherDir)
|
||||
|
||||
anotherStat, err := os.Stat(anotherDir)
|
||||
assert.NoError(err)
|
||||
|
||||
// infer umask from anotherDir
|
||||
umask := os.ModePerm ^ (anotherStat.Mode() & os.ModePerm)
|
||||
|
||||
assert.Equal(info.Mode()&os.ModePerm, defaultTestMode&^umask)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
assert.NoError(err)
|
||||
})
|
||||
|
||||
t.Run("Dir FileModeBeforeUmask is set via options for all subdirectories", func(t *testing.T) {
|
||||
testdir, err := ioutil.TempDir("", "bitcask")
|
||||
embeddedDir := filepath.Join(testdir, "cache")
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(testdir)
|
||||
|
||||
testMode := os.FileMode(0713)
|
||||
|
||||
db, err := Open(embeddedDir, WithDirFileModeBeforeUmask(testMode))
|
||||
assert.NoError(err)
|
||||
defer db.Close()
|
||||
err = filepath.Walk(testdir, func(path string, info os.FileInfo, err error) error {
|
||||
// skip the root directory
|
||||
if path == testdir {
|
||||
return nil
|
||||
}
|
||||
if info.IsDir() {
|
||||
// create anotherDir with allPerms - to infer umask
|
||||
anotherDir := filepath.Join(testdir, "temp")
|
||||
err := os.Mkdir(anotherDir, os.ModePerm)
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(anotherDir)
|
||||
|
||||
anotherStat, _ := os.Stat(anotherDir)
|
||||
|
||||
// infer umask from anotherDir
|
||||
umask := os.ModePerm ^ (anotherStat.Mode() & os.ModePerm)
|
||||
|
||||
assert.Equal(info.Mode()&os.ModePerm, testMode&^umask)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
assert.NoError(err)
|
||||
})
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
func TestFileFileModeBeforeUmask(t *testing.T) {
|
||||
skipIfWindows(t)
|
||||
|
||||
assert := assert.New(t)
|
||||
|
||||
t.Run("Setup", func(t *testing.T) {
|
||||
t.Run("Default File FileModeBeforeUmask is 0600", func(t *testing.T) {
|
||||
testdir, err := ioutil.TempDir("", "bitcask")
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(testdir)
|
||||
|
||||
defaultTestMode := os.FileMode(0600)
|
||||
|
||||
db, err := Open(testdir)
|
||||
assert.NoError(err)
|
||||
defer db.Close()
|
||||
err = filepath.Walk(testdir, func(path string, info os.FileInfo, err error) error {
|
||||
if !info.IsDir() {
|
||||
// the lock file is set within Flock, so ignore it
|
||||
if filepath.Base(path) == "lock" {
|
||||
return nil
|
||||
}
|
||||
// create aFile with allPerms - to infer umask
|
||||
aFilePath := filepath.Join(testdir, "temp")
|
||||
_, err := os.OpenFile(aFilePath, os.O_CREATE, os.ModePerm)
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(aFilePath)
|
||||
|
||||
fileStat, _ := os.Stat(aFilePath)
|
||||
|
||||
// infer umask from anotherDir
|
||||
umask := os.ModePerm ^ (fileStat.Mode() & os.ModePerm)
|
||||
|
||||
assert.Equal(info.Mode()&os.ModePerm, defaultTestMode&^umask)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
assert.NoError(err)
|
||||
})
|
||||
|
||||
t.Run("File FileModeBeforeUmask is set via options for all files", func(t *testing.T) {
|
||||
testdir, err := ioutil.TempDir("", "bitcask")
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(testdir)
|
||||
|
||||
testMode := os.FileMode(0673)
|
||||
|
||||
db, err := Open(testdir, WithFileFileModeBeforeUmask(testMode))
|
||||
assert.NoError(err)
|
||||
defer db.Close()
|
||||
err = filepath.Walk(testdir, func(path string, info os.FileInfo, err error) error {
|
||||
if !info.IsDir() {
|
||||
// the lock file is set within Flock, so ignore it
|
||||
if filepath.Base(path) == "lock" {
|
||||
return nil
|
||||
}
|
||||
// create aFile with allPerms - to infer umask
|
||||
aFilePath := filepath.Join(testdir, "temp")
|
||||
_, err := os.OpenFile(aFilePath, os.O_CREATE, os.ModePerm)
|
||||
assert.NoError(err)
|
||||
defer os.RemoveAll(aFilePath)
|
||||
|
||||
fileStat, _ := os.Stat(aFilePath)
|
||||
|
||||
// infer umask from anotherDir
|
||||
umask := os.ModePerm ^ (fileStat.Mode() & os.ModePerm)
|
||||
|
||||
assert.Equal(info.Mode()&os.ModePerm, testMode&^umask)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
assert.NoError(err)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestMaxDatafileSize(t *testing.T) {
|
||||
var (
|
||||
db *Bitcask
|
||||
|
||||
Reference in New Issue
Block a user