aboutsummaryrefslogtreecommitdiffstats
path: root/storage.go
diff options
context:
space:
mode:
authorclsr <clsr@clsr.net>2016-06-17 18:18:12 +0200
committerclsr <clsr@clsr.net>2016-06-17 18:18:12 +0200
commit5a57899bb23302c0fc764f75306e09370803aee6 (patch)
treec9254ec2cd0a99a3fed32616c85b057c5182640d /storage.go
parent66767ded4f006ba7b4dde16fdaf204332b1d4490 (diff)
downloadgomf-5a57899bb23302c0fc764f75306e09370803aee6.tar.gz
gomf-5a57899bb23302c0fc764f75306e09370803aee6.zip
Add --whitelistv0.2.0
Diffstat (limited to 'storage.go')
-rw-r--r--storage.go51
1 files changed, 35 insertions, 16 deletions
diff --git a/storage.go b/storage.go
index 1954c1a..11265b3 100644
--- a/storage.go
+++ b/storage.go
@@ -26,12 +26,13 @@ const (
)
type Storage struct {
- Folder string
- IdCharset string
- IdLength int
- MaxSize int64
+ Folder string
+ IdCharset string
+ IdLength int
+ MaxSize int64
FilterMime []string
FilterExt []string
+ Whitelist bool
}
type ErrForbidden struct{ Type string }
@@ -201,27 +202,45 @@ func (s *Storage) getMimeExt(fpath string, name string) (mimetype, ext string, e
}
}
- // reject filtered MIME types and file extensions
- if mimetype != "application/octet-stream" {
- for _, e := range exts {
- for _, fe := range s.FilterExt {
- if e == fe {
- err = ErrForbidden{fe}
- return
+ filtered, ok := s.findFilter(exts, mimetype)
+ if !ok && s.Whitelist { // whitelist: reject if not on filters
+ err = ErrForbidden{mimetype}
+ } else if ok && !s.Whitelist { // blacklist: reject if filtered
+ forbid := true
+ // only block application/octet-stream if explicitly requested
+ if mimetype == "application/octet-stream" {
+ forbid = false
+ for _, fm := range s.FilterMime {
+ if mimetype == fm {
+ forbid = true
+ break
}
}
}
- for _, fm := range s.FilterMime {
- if mimetype == fm {
- err = ErrForbidden{fm}
- return
- }
+ if forbid {
+ err = ErrForbidden{filtered}
}
}
return
}
+func (s *Storage) findFilter(exts []string, mimetype string) (match string, ok bool) {
+ for _, fm := range s.FilterMime {
+ if mimetype == fm {
+ return mimetype, true
+ }
+ }
+ for _, ext := range exts {
+ for _, fe := range s.FilterExt {
+ if ext == "."+fe {
+ return ext, true
+ }
+ }
+ }
+ return "", false
+}
+
func (s *Storage) storeFile(file *os.File, hash, ext string) (id string, err error) {
hfolder := s.idToFolder("files", hash)
hpath := path.Join(hfolder, "file")