package plg_security_svg

import (
	. "github.com/mickael-kerjean/filestash/server/common"
	"io"
	"net/http"
	"regexp"
)

var (
	disable_svg func() bool
)

func init() {
	disable_svg = func() bool {
		return Config.Get("features.protection.disable_svg").Schema(func(f *FormElement) *FormElement {
			if f == nil {
				f = &FormElement{}
			}
			f.Default = true
			f.Name = "disable_svg"
			f.Type = "boolean"
			f.Target = []string{}
			f.Description = "Disable the display of SVG documents"
			f.Placeholder = "Default: true"
			return f
		}).Bool()
	}
	Hooks.Register.Onload(func() {
		if disable_svg() == false {
			return
		}
		Hooks.Register.ProcessFileContentBeforeSend(func(reader io.ReadCloser, ctx *App, res *http.ResponseWriter, req *http.Request) (io.ReadCloser, error) {
			if GetMimeType(req.URL.Query().Get("path")) != "image/svg+xml" {
				return reader, nil
			} else if disable_svg() == false {
				return reader, nil
			}

			// XSS
			(*res).Header().Set("Content-Security-Policy", "script-src 'none'; default-src 'none'; img-src 'self'")
			(*res).Header().Set("Content-Type", "text/plain")
			// XML bomb
			txt, _ := io.ReadAll(reader)
			if regexp.MustCompile("(?is)entity").Match(txt) {
				txt = []byte("")
			}
			return NewReadCloserFromBytes(txt), nil
		})
	})
}
