go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/connection/local/statutil/stat_test.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package statutil 5 6 import ( 7 "io/fs" 8 "os" 9 "path/filepath" 10 "testing" 11 "time" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 "go.mondoo.com/cnquery/providers/os/connection/mock" 16 "go.mondoo.com/cnquery/providers/os/connection/shared" 17 ) 18 19 func TestLinuxStatCmd(t *testing.T) { 20 filepath, _ := filepath.Abs("./testdata/linux.toml") 21 p, err := mock.New(filepath, nil) 22 require.NoError(t, err) 23 24 statHelper := New(p) 25 26 // get file stats 27 fi, err := statHelper.Stat("/etc/ssh/sshd_config") 28 require.NoError(t, err) 29 30 assert.Equal(t, int64(4317), fi.Size()) 31 assert.Equal(t, false, fi.IsDir()) 32 assert.Equal(t, os.FileMode(0x180), fi.Mode()) 33 assert.Equal(t, time.Unix(1590420240, 0), fi.ModTime()) 34 require.NoError(t, err) 35 mode := fi.Mode() 36 assert.Zero(t, mode&fs.ModeSetuid) 37 assert.Equal(t, "sshd_config", fi.Name()) 38 39 fi, err = statHelper.Stat("/usr/bin/su") 40 require.NoError(t, err) 41 mode = fi.Mode() 42 assert.NotZero(t, mode&fs.ModeSetuid) 43 assert.Zero(t, mode&fs.ModeSetgid) 44 } 45 46 func TestOpenbsdStatCmd(t *testing.T) { 47 filepath, _ := filepath.Abs("./testdata/openbsd.toml") 48 p, err := mock.New(filepath, nil) 49 require.NoError(t, err) 50 51 statHelper := New(p) 52 53 // get file stats 54 fi, err := statHelper.Stat("/etc/ssh/sshd_config") 55 require.NoError(t, err) 56 57 assert.Equal(t, int64(2259), fi.Size()) 58 assert.Equal(t, false, fi.IsDir()) 59 assert.Equal(t, "-rw-r--r--", fi.Mode().String()) 60 assert.Equal(t, time.Unix(1592996018, 0), fi.ModTime()) 61 assert.Equal(t, int64(0), fi.Sys().(*shared.FileInfo).Uid) 62 assert.Equal(t, int64(0), fi.Sys().(*shared.FileInfo).Gid) 63 assert.Equal(t, "sshd_config", fi.Name()) 64 } 65 66 func TestToFileMode(t *testing.T) { 67 t.Run("directory and setgid", func(t *testing.T) { 68 m := toFileMode(0o040000 | 0o002000 | 0o755) 69 assert.True(t, m.IsDir()) 70 assert.True(t, (m&fs.ModeSetgid) > 0) 71 assert.False(t, (m&fs.ModeSetuid) > 0) 72 assert.False(t, (m&fs.ModeSticky) > 0) 73 assert.Equal(t, fs.FileMode(0o755), (m & 0o777)) 74 }) 75 76 t.Run("directory and setuid", func(t *testing.T) { 77 m := toFileMode(0o040000 | 0o004000 | 0o755) 78 assert.True(t, m.IsDir()) 79 assert.False(t, (m&fs.ModeSetgid) > 0) 80 assert.True(t, (m&fs.ModeSetuid) > 0) 81 assert.False(t, (m&fs.ModeSticky) > 0) 82 assert.Equal(t, fs.FileMode(0o755), (m & 0o777)) 83 }) 84 85 t.Run("directory and setuid and sticky", func(t *testing.T) { 86 m := toFileMode(0o040000 | 0o004000 | 0o001000 | 0o755) 87 assert.True(t, m.IsDir()) 88 assert.False(t, (m&fs.ModeSetgid) > 0) 89 assert.True(t, (m&fs.ModeSetuid) > 0) 90 assert.True(t, (m&fs.ModeSticky) > 0) 91 assert.Equal(t, fs.FileMode(0o755), (m & 0o777)) 92 }) 93 94 t.Run("file and setuid", func(t *testing.T) { 95 m := toFileMode(0o170000 | 0o100000 | 0o004000 | 0o755) 96 assert.False(t, m.IsDir()) 97 assert.False(t, (m&fs.ModeSetgid) > 0) 98 assert.True(t, (m&fs.ModeSetuid) > 0) 99 assert.False(t, (m&fs.ModeSticky) > 0) 100 assert.Equal(t, fs.FileMode(0o755), (m & 0o777)) 101 }) 102 103 t.Run("file and setuid and setgid", func(t *testing.T) { 104 m := toFileMode(0o170000 | 0o100000 | 0o004000 | 0o002000 | 0o755) 105 assert.False(t, m.IsDir()) 106 assert.True(t, (m&fs.ModeSetgid) > 0) 107 assert.True(t, (m&fs.ModeSetuid) > 0) 108 assert.False(t, (m&fs.ModeSticky) > 0) 109 assert.Equal(t, fs.FileMode(0o755), (m & 0o777)) 110 }) 111 }