go 无法测试文件夹没有权限

l0oc07j2  于 9个月前  发布在  Go
关注(0)|答案(6)|浏览(218)

你使用的Go版本是什么( go version )?

  1. $ go version
  2. go version go1.17.3 linux/amd64

这个问题在最新版本中是否会重现?

是的。不太确定它是否与#46776有关

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

  1. $ go env
  2. GO111MODULE=""
  3. GOARCH="amd64"
  4. GOBIN=""
  5. GOCACHE="/home/user/.cache/go-build"
  6. GOENV="/home/user/.config/go/env"
  7. GOEXE=""
  8. GOEXPERIMENT=""
  9. GOFLAGS=""
  10. GOHOSTARCH="amd64"
  11. GOHOSTOS="linux"
  12. GOINSECURE=""
  13. GOMODCACHE="/home/user/go/pkg/mod"
  14. GONOPROXY=""
  15. GONOSUMDB=""
  16. GOOS="linux"
  17. GOPATH="/home/user/go"
  18. GOPRIVATE=""
  19. GOPROXY="https://proxy.golang.org,direct"
  20. GOROOT="/usr/local/go"
  21. GOSUMDB="sum.golang.org"
  22. GOTMPDIR=""
  23. GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
  24. GOVCS=""
  25. GOVERSION="go1.17.3"
  26. GCCGO="gccgo"
  27. AR="ar"
  28. CC="gcc"
  29. CXX="g++"
  30. CGO_ENABLED="1"
  31. GOMOD="/home/user/gomodule/go.mod"
  32. CGO_CFLAGS="-g -O2"
  33. CGO_CPPFLAGS=""
  34. CGO_CXXFLAGS="-g -O2"
  35. CGO_FFLAGS="-g -O2"
  36. CGO_LDFLAGS="-g -O2"
  37. PKG_CONFIG="pkg-config"
  38. GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3099453485=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

测试了go文件

  1. package x
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. )
  9. func fileExists(fileSystem fs.FS, fileName string) (bool, error) {
  10. _, err := fs.Stat(fileSystem, fileName)
  11. if err == nil {
  12. return true, nil
  13. }
  14. if os.IsNotExist(err) {
  15. return false, fmt.Errorf("File %q does not exist.", fileName)
  16. }
  17. return false, err // test case should return here
  18. }
  19. func FileValid(fileSystem fs.FS, fileName string) (string, error) {
  20. fileExists, err := fileExists(fileSystem, fileName)
  21. if !fileExists || err != nil {
  22. return "", err
  23. }
  24. return "success", nil
  25. }

测试了测试go文件

  1. package x
  2. import (
  3. "io/fs"
  4. "testing"
  5. "testing/fstest"
  6. )
  7. var (
  8. fakeFS = fstest.MapFS{
  9. "secret-folder": {Mode: 0000},
  10. "secret-folder/readme.md": {},
  11. }
  12. )
  13. func TestFileValidPermissionDenied(t *testing.T) {
  14. fileName := "readme.md"
  15. fsys, _ := fs.Sub(fakeFS, "secret-folder")
  16. wantOut := ""
  17. out, err := FileValid(fsys, fileName)
  18. if out != wantOut || err == nil {
  19. t.Errorf("want %q, nil got %q, %v", wantOut, out, err)
  20. }
  21. }

你期望看到什么?

这个测试应该通过,返回空字符串,并报错权限被拒绝。

你实际上看到了什么?

即使没有文件夹的权限,它仍然可以访问该文件。

z5btuh9x

z5btuh9x1#

注意 0000 == 0 == 未设置

gr8qqesn

gr8qqesn2#

在文档中没有找到这个。但我找到了一个Go教程,解释0000表示没有权限 https://schadokar.dev/to-the-point/how-to-read-and-write-a-file-in-golang/
这有意义吗?如何给等同于chmod 0000或000的权限?

628mspwn

628mspwn3#

我认为是CC @bcmills?

fhg3lkii

fhg3lkii4#

(这确实不是我的领域,但我今天一直在查看 io/fs 。)
看起来文件的快速路径在这里:
https://cs.opensource.google/go/go/+/refs/tags/go1.17.6:src/testing/fstest/mapfs.go;l=51-55;drc=d6aa162f30d63f21f5f4db75e302dbb90595bbe2
它的确完全不检查父权限,不过请注意,fs.FS.Open 方法也没有为 ModePerm 位指定详细语义。

uqdfh47h

uqdfh47h5#

我可以帮你做其他事情吗?我刚接触Golang,如果需要的话,可能需要一些指导来修复PR。

ogq8wdun

ogq8wdun6#

我在野外遇到了同样的问题。这个GitHub issue被标记为“需要调查”,所以我根据最初的错误报告编写了一个简单的可复现测试用例:

  1. package x
  2. import (
  3. "io/fs"
  4. "os"
  5. "testing"
  6. "testing/fstest"
  7. )
  8. func TestFileValidPermissionDenied(t *testing.T) {
  9. fakeFS := fstest.MapFS{
  10. "secret-folder": {Mode: 0o200},
  11. "secret-folder/readme.md": {Data: []byte("this content should be unread"), Mode: 0o100},
  12. }
  13. out, err := fs.ReadFile(fakeFS, "secret-folder/readme.md")
  14. if !os.IsPermission(err) {
  15. t.Errorf("Expected a permission error but received %q", err)
  16. }
  17. if string(out) != "" {
  18. t.Errorf("want %q, got %q, %v", "", out, err)
  19. }
  20. }
展开查看全部

相关问题