diff --git a/common/platform/filesystem/file.go b/common/platform/filesystem/file.go index 3d03e4b04..443235975 100644 --- a/common/platform/filesystem/file.go +++ b/common/platform/filesystem/file.go @@ -27,14 +27,6 @@ func ReadFile(path string) ([]byte, error) { return buf.ReadAllToBytes(reader) } -func ReadAsset(file string) ([]byte, error) { - path, _, err := getAssetFileLocation(file) - if err != nil { - return nil, err - } - return ReadFile(path) -} - func OpenAsset(file string) (io.ReadCloser, int64, error) { path, info, err := getAssetFileLocation(file) if err != nil { @@ -44,11 +36,6 @@ func OpenAsset(file string) (io.ReadCloser, int64, error) { return r, info.Size(), err } -func StatAsset(file string) (os.FileInfo, error) { - _, info, err := getAssetFileLocation(file) - return info, err -} - func ResolveAsset(file string) (string, error) { path, _, err := getAssetFileLocation(file) return path, err @@ -72,21 +59,6 @@ func ReadCert(file string) ([]byte, error) { return ReadFile(platform.GetCertLocation(file)) } -func CopyFile(dst string, src string) error { - bytes, err := ReadFile(src) - if err != nil { - return err - } - f, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - - _, err = f.Write(bytes) - return err -} - // ResolveLuaFile finds a local .lua script and returns its resolved absolute path. // Relative paths: XRAY_LOCATION_CONFDIR > XRAY_LOCATION_CONFIG > working dir > executable dir. func ResolveLuaFile(path string) (resolved string, err error) { @@ -116,26 +88,20 @@ func ResolveLuaFile(path string) (resolved string, err error) { } // ResolveRegularFile returns an absolute path and metadata of a regular file. -// File symlinks are resolved when possible; otherwise the original path is kept. +// Symlinks are resolved when possible; otherwise the original path is kept. func ResolveRegularFile(path string) (string, os.FileInfo, error) { path, err := filepath.Abs(path) if err != nil { return "", nil, fmt.Errorf("failed to resolve file path: %w", err) } - info, err := os.Lstat(path) + // Best effort: EvalSymlinks may fail when Windows junctions are involved. + if resolved, err := filepath.EvalSymlinks(path); err == nil { + path = resolved + } + info, err := os.Stat(path) if err != nil { return "", nil, fmt.Errorf("failed to inspect file %q: %w", path, err) } - if info.Mode()&os.ModeSymlink != 0 { - // Best effort: EvalSymlinks may fail when junctions are involved. - if resolved, err := filepath.EvalSymlinks(path); err == nil { - path = resolved - } - info, err = os.Stat(path) - if err != nil { - return "", nil, fmt.Errorf("failed to inspect file %q: %w", path, err) - } - } if !info.Mode().IsRegular() { return "", nil, fmt.Errorf("file is not a regular file: %s", path) } diff --git a/common/platform/filesystem/file_test.go b/common/platform/filesystem/file_test.go index 2b8bfbe7f..280b8c793 100644 --- a/common/platform/filesystem/file_test.go +++ b/common/platform/filesystem/file_test.go @@ -13,7 +13,7 @@ import ( . "github.com/xtls/xray-core/common/platform/filesystem" ) -func TestStatAssetRejectsInvalidPath(t *testing.T) { +func TestResolveAssetRejectsInvalidPath(t *testing.T) { for _, file := range []string{ "", ".", @@ -31,7 +31,7 @@ func TestStatAssetRejectsInvalidPath(t *testing.T) { `nested\..\geoip.dat`, filepath.Join(t.TempDir(), "geoip.dat"), } { - if _, err := StatAsset(file); err == nil { + if _, err := ResolveAsset(file); err == nil { t.Fatalf("expected error for %q", file) } } diff --git a/infra/conf/geodata.go b/infra/conf/geodata.go index 3e80967ac..13e01a072 100644 --- a/infra/conf/geodata.go +++ b/infra/conf/geodata.go @@ -19,7 +19,7 @@ func (c *GeodataAssetConfig) Build() (*geodata.Asset, error) { if err := validateHTTPS(c.URL); err != nil { return nil, errors.New("invalid geodata asset url: ", c.URL).Base(err) } - if _, err := filesystem.StatAsset(c.File); err != nil { + if _, err := filesystem.ResolveAsset(c.File); err != nil { return nil, errors.New("invalid geodata asset file: ", c.File).Base(err) } return &geodata.Asset{