diff --git a/cmd/stfs/cmd/serve_ftp.go b/cmd/stfs/cmd/serve_ftp.go index de668ce..50ba1c9 100644 --- a/cmd/stfs/cmd/serve_ftp.go +++ b/cmd/stfs/cmd/serve_ftp.go @@ -192,7 +192,6 @@ var serveFTPCmd = &cobra.Command{ viper.GetString(cacheWriteFlag), ) }, - true, // FTP needs read permission for `STOR` command even if O_WRONLY is set viper.GetBool(readOnlyFlag), func(hdr *config.Header) { diff --git a/cmd/stfs/cmd/serve_http.go b/cmd/stfs/cmd/serve_http.go index ac43362..ae96b2d 100644 --- a/cmd/stfs/cmd/serve_http.go +++ b/cmd/stfs/cmd/serve_http.go @@ -128,10 +128,9 @@ var serveHTTPCmd = &cobra.Command{ Metadata: metadataPersister, }, - "", // We never write - nil, // We never write - false, // We never write - true, // We never write + "", // We never write + nil, // We never write + true, // We never write func(hdr *config.Header) { jsonLogger.Trace("Header transform", hdr) diff --git a/examples/full/main.go b/examples/full/main.go index 6345bfa..e372356 100644 --- a/examples/full/main.go +++ b/examples/full/main.go @@ -171,7 +171,6 @@ func createFs( writeCache, ) }, - false, readOnly, func(hdr *config.Header) { diff --git a/examples/simple/main.go b/examples/simple/main.go index 59a57e5..427dea8 100644 --- a/examples/simple/main.go +++ b/examples/simple/main.go @@ -99,7 +99,6 @@ func main() { ) }, false, - false, func(hdr *config.Header) { l.Trace("Header transform", hdr) diff --git a/pkg/fs/filesystem.go b/pkg/fs/filesystem.go index 408bf10..67afea3 100644 --- a/pkg/fs/filesystem.go +++ b/pkg/fs/filesystem.go @@ -31,10 +31,9 @@ type STFS struct { metadata config.MetadataConfig - compressionLevel string - getFileBuffer func() (cache.WriteCache, func() error, error) - ignoreReadWritePermissions bool - readOnly bool + compressionLevel string + getFileBuffer func() (cache.WriteCache, func() error, error) + readOnly bool ioLock sync.Mutex @@ -50,7 +49,6 @@ func NewSTFS( compressionLevel string, getFileBuffer func() (cache.WriteCache, func() error, error), - ignorePermissionFlags bool, readOnly bool, onHeader func(hdr *config.Header), @@ -62,10 +60,9 @@ func NewSTFS( metadata: metadata, - compressionLevel: compressionLevel, - getFileBuffer: getFileBuffer, - ignoreReadWritePermissions: ignorePermissionFlags, - readOnly: readOnly, + compressionLevel: compressionLevel, + getFileBuffer: getFileBuffer, + readOnly: readOnly, onHeader: onHeader, log: log, @@ -302,7 +299,7 @@ func (f *STFS) Open(name string) (afero.File, error) { "name": name, }) - return f.OpenFile(name, os.O_RDWR, os.ModePerm) + return f.OpenFile(name, os.O_RDONLY, 0) } func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, error) { @@ -317,24 +314,15 @@ func (f *STFS) OpenFile(name string, flag int, perm os.FileMode) (afero.File, er flags := &ifs.FileFlags{} if f.readOnly { - if flag&os.O_RDONLY != 0 || flag&os.O_RDWR != 0 || f.ignoreReadWritePermissions { + if (flag&O_ACCMODE) == os.O_RDONLY || (flag&O_ACCMODE) == os.O_RDWR { flags.Read = true } } else { - if flag&os.O_RDONLY != 0 { + if (flag & O_ACCMODE) == os.O_RDONLY { flags.Read = true - } - - if flag&os.O_WRONLY != 0 { + } else if (flag & O_ACCMODE) == os.O_WRONLY { flags.Write = true - } - - if flag&os.O_RDWR != 0 { - flags.Read = true - flags.Write = true - } - - if f.ignoreReadWritePermissions { + } else if (flag & O_ACCMODE) == os.O_RDWR { flags.Read = true flags.Write = true } diff --git a/pkg/fs/filesystem_non_unix.go b/pkg/fs/filesystem_non_unix.go new file mode 100644 index 0000000..b5cddc0 --- /dev/null +++ b/pkg/fs/filesystem_non_unix.go @@ -0,0 +1,7 @@ +//go:build windows + +package fs + +const ( + O_ACCMODE = 0x3 // It is safe to hard-code this bit as the bits are not being set from the OS +) diff --git a/pkg/fs/filesystem_test.go b/pkg/fs/filesystem_test.go index b72a5ff..1b531c1 100644 --- a/pkg/fs/filesystem_test.go +++ b/pkg/fs/filesystem_test.go @@ -403,7 +403,6 @@ func createSTFS( writeCache, ) }, - false, readOnly, func(hdr *config.Header) { diff --git a/pkg/fs/filesystem_unix.go b/pkg/fs/filesystem_unix.go new file mode 100644 index 0000000..bb49db9 --- /dev/null +++ b/pkg/fs/filesystem_unix.go @@ -0,0 +1,9 @@ +//go:build !windows + +package fs + +import "syscall" + +const ( + O_ACCMODE = syscall.O_ACCMODE +)