1
0
Fork 0

Compare commits

..

3 commits

Author SHA1 Message Date
6e9e272fd2 bug fix 2019-09-02 09:58:18 +02:00
0c7423d604 bug fix 2019-09-02 09:48:18 +02:00
a4c746c7e9 added custom filter options 2019-09-02 09:42:41 +02:00
4 changed files with 76 additions and 3 deletions

View file

@ -16,12 +16,13 @@ const writeFlag = os.O_RDWR | os.O_CREATE | os.O_TRUNC
// WriteOnlyOnceFileSystem is a file write only wrapper for a webdav.FileSystem
type WriteOnlyOnceFileSystem struct {
fs webdav.FileSystem
Filters []Filter
fs webdav.FileSystem
}
// NewWriteOnlyOnceFileSystem returns a new WriteOnlyOnceFileSystem wrapping a webdav.FileSystem
func NewWriteOnlyOnceFileSystem(fs webdav.FileSystem) *WriteOnlyOnceFileSystem {
return &WriteOnlyOnceFileSystem{fs}
return &WriteOnlyOnceFileSystem{fs: fs}
}
// Mkdir is not permitted
@ -38,6 +39,12 @@ func (fs *WriteOnlyOnceFileSystem) OpenFile(ctx context.Context, name string, fl
return nil, ErrWonly
}
}
for _, filter := range fs.Filters {
err = filter.Filter(name)
if err != nil {
return nil, err
}
}
f, err := fs.fs.OpenFile(ctx, name, flag, perm)
if err != nil {
return nil, err
@ -45,8 +52,15 @@ func (fs *WriteOnlyOnceFileSystem) OpenFile(ctx context.Context, name string, fl
return &File{f}, nil
}
// RemoveAll is not permitted
// RemoveAll only permits deleting empty files
func (fs *WriteOnlyOnceFileSystem) RemoveAll(ctx context.Context, name string) error {
fi, err := fs.fs.Stat(ctx, name)
if err != nil {
return err
}
if fi.Mode().IsRegular() && fi.Size() == 0 {
return fs.fs.RemoveAll(ctx, name)
}
return ErrWonly
}

50
filter.go Normal file
View file

@ -0,0 +1,50 @@
// Copyright (C) 2019 Marius Schellenberger
package authdav
import (
"errors"
"path/filepath"
"strings"
)
// Matcher is the matcher function type
type Matcher func(path string) bool
// Filter defines an interface to filter paths or files
type Filter interface {
Filter(path string) error
}
// ErrMacOSFilter error returned by the MacOSFilter
var ErrMacOSFilter = errors.New("authdav: MacOS filter: access denied")
// MacOSFilter implements a filter for MacOS specific files
type MacOSFilter struct {
match []Matcher
}
// NewMacOSFilter returns a new MacOSFilter
func NewMacOSFilter() *MacOSFilter {
return &MacOSFilter{
match: []Matcher{
func(p string) bool {
return p == ".DS_Store"
},
func(p string) bool {
return strings.HasPrefix(p, "._")
},
},
}
}
// Filter implements the Filter interface
func (f *MacOSFilter) Filter(path string) error {
_, file := filepath.Split(path)
for _, m := range f.match {
if m(file) {
return ErrMacOSFilter
}
}
return nil
}

4
go.mod
View file

@ -1 +1,5 @@
module git.giftfish.de/ston1th/authdav
go 1.12
require golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297

5
go.sum Normal file
View file

@ -0,0 +1,5 @@
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=