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

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

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

$ go version
go version go1.17.3 linux/amd64

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

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

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

go env 输出

$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/user/.cache/go-build"
GOENV="/home/user/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/user/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/user/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.3"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/user/gomodule/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3099453485=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

测试了go文件

package x

import (
	"fmt"
	"io/fs"
	"os"
	"path/filepath"
	"strings"
)

func fileExists(fileSystem fs.FS, fileName string) (bool, error) {
	_, err := fs.Stat(fileSystem, fileName)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, fmt.Errorf("File %q does not exist.", fileName)
	}
	return false, err // test case should return here
}

func FileValid(fileSystem fs.FS, fileName string) (string, error) {
	fileExists, err := fileExists(fileSystem, fileName)
	if !fileExists || err != nil {
		return "", err
	}

	return "success", nil
}

测试了测试go文件

package x

import (
	"io/fs"
	"testing"
	"testing/fstest"
)

var (
	fakeFS = fstest.MapFS{
		"secret-folder":          {Mode: 0000},
		"secret-folder/readme.md": {},
	}
)

func TestFileValidPermissionDenied(t *testing.T) {
	fileName := "readme.md"
	fsys, _ := fs.Sub(fakeFS, "secret-folder")
	wantOut := ""

	out, err := FileValid(fsys, fileName)
	if out != wantOut || err == nil {
		t.Errorf("want %q, nil got %q, %v", wantOut, out, err)
	}
}

你期望看到什么?

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

你实际上看到了什么?

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

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被标记为“需要调查”,所以我根据最初的错误报告编写了一个简单的可复现测试用例:

package x

import (
	"io/fs"
	"os"
	"testing"
	"testing/fstest"
)

func TestFileValidPermissionDenied(t *testing.T) {
	fakeFS := fstest.MapFS{
		"secret-folder":           {Mode: 0o200},
		"secret-folder/readme.md": {Data: []byte("this content should be unread"), Mode: 0o100},
	}

	out, err := fs.ReadFile(fakeFS, "secret-folder/readme.md")

	if !os.IsPermission(err) {
		t.Errorf("Expected a permission error but received %q", err)
	}

	if string(out) != "" {
		t.Errorf("want %q, got %q, %v", "", out, err)
	}
}

相关问题