diff --git a/cmd/root.go b/cmd/root.go index a8a484f0..75506f78 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -66,6 +66,7 @@ func addServerFlags(flags *pflag.FlagSet) { flags.Bool("disable-thumbnails", false, "disable image thumbnails") flags.Bool("disable-preview-resize", false, "disable resize of image previews") flags.Bool("disable-exec", false, "disables Command Runner feature") + flags.Bool("disable-type-detection-by-header", false, "disables type detection by reading file headers") } var rootCmd = &cobra.Command{ @@ -243,6 +244,9 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server { _, disablePreviewResize := getParamB(flags, "disable-preview-resize") server.ResizePreview = !disablePreviewResize + _, disableTypeDetectionByHeader := getParamB(flags, "disable-type-detection-by-header") + server.TypeDetectionByHeader = !disableTypeDetectionByHeader + _, disableExec := getParamB(flags, "disable-exec") server.EnableExec = !disableExec diff --git a/files/file.go b/files/file.go index 88d44536..83c23ad3 100644 --- a/files/file.go +++ b/files/file.go @@ -81,7 +81,7 @@ func NewFileInfo(opts FileOptions) (*FileInfo, error) { return file, nil } - err = file.detectType(opts.Modify, true) + err = file.detectType(opts.Modify, true, true) if err != nil { return nil, err } @@ -134,7 +134,7 @@ func (i *FileInfo) Checksum(algo string) error { //nolint:goconst //TODO: use constants -func (i *FileInfo) detectType(modify, saveContent bool) error { +func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error { if IsNamedPipe(i.Mode) { i.Type = "blob" return nil @@ -143,6 +143,51 @@ func (i *FileInfo) detectType(modify, saveContent bool) error { // imagine the situation where a file in a dir with thousands // of files couldn't be opened: we'd have immediately // a 500 even though it doesn't matter. So we just log it. + + var buffer []byte + + mimetype := mime.TypeByExtension(i.Extension) + if mimetype == "" && readHeader { + buffer = i.readFirstBytes() + mimetype = http.DetectContentType(buffer) + } + + switch { + case strings.HasPrefix(mimetype, "video"): + i.Type = "video" + i.detectSubtitles() + return nil + case strings.HasPrefix(mimetype, "audio"): + i.Type = "audio" + return nil + case strings.HasPrefix(mimetype, "image"): + i.Type = "image" + return nil + case (strings.HasPrefix(mimetype, "text") || (len(buffer) > 0 && !isBinary(buffer))) && i.Size <= 10*1024*1024: // 10 MB + i.Type = "text" + + if !modify { + i.Type = "textImmutable" + } + + if saveContent { + afs := &afero.Afero{Fs: i.Fs} + content, err := afs.ReadFile(i.Path) + if err != nil { + return err + } + + i.Content = string(content) + } + return nil + default: + i.Type = "blob" + } + + return nil +} + +func (i *FileInfo) readFirstBytes() []byte { reader, err := i.Fs.Open(i.Path) if err != nil { log.Print(err) @@ -159,44 +204,7 @@ func (i *FileInfo) detectType(modify, saveContent bool) error { return nil } - mimetype := mime.TypeByExtension(i.Extension) - if mimetype == "" { - mimetype = http.DetectContentType(buffer[:n]) - } - - switch { - case strings.HasPrefix(mimetype, "video"): - i.Type = "video" - i.detectSubtitles() - return nil - case strings.HasPrefix(mimetype, "audio"): - i.Type = "audio" - return nil - case strings.HasPrefix(mimetype, "image"): - i.Type = "image" - return nil - case isBinary(buffer[:n], n) || i.Size > 10*1024*1024: // 10 MB - i.Type = "blob" - return nil - default: - i.Type = "text" - - if !modify { - i.Type = "textImmutable" - } - - if saveContent { - afs := &afero.Afero{Fs: i.Fs} - content, err := afs.ReadFile(i.Path) - if err != nil { - return err - } - - i.Content = string(content) - } - } - - return nil + return buffer[:n] } func (i *FileInfo) detectSubtitles() { @@ -228,7 +236,6 @@ func (i *FileInfo) readListing(checker rules.Checker) error { NumFiles: 0, } - detectDisabled := checker.IsTypeDetectDisabled(i.Path) for _, f := range dir { name := f.Name() fPath := path.Join(i.Path, name) @@ -262,13 +269,9 @@ func (i *FileInfo) readListing(checker rules.Checker) error { } else { listing.NumFiles++ - if detectDisabled { - file.Type = "blob" - } else { - err := file.detectType(true, false) - if err != nil { - return err - } + err := file.detectType(true, false, checker.ReadHeader()) + if err != nil { + return err } } diff --git a/frontend/src/components/settings/DisableTypeDetections.vue b/frontend/src/components/settings/DisableTypeDetections.vue deleted file mode 100644 index c3bda8e2..00000000 --- a/frontend/src/components/settings/DisableTypeDetections.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/frontend/src/components/settings/UserForm.vue b/frontend/src/components/settings/UserForm.vue index 473f7be8..d56f1f77 100644 --- a/frontend/src/components/settings/UserForm.vue +++ b/frontend/src/components/settings/UserForm.vue @@ -36,19 +36,12 @@

{{ $t('settings.rulesHelp') }}

- -
-

{{ $t('settings.disableTypeDetections') }}

-

{{ $t('settings.disableTypeDetectionsHelp') }}

- -