diff options
author | Frédéric Guillot <fred@miniflux.net> | 2018-12-02 21:09:53 -0800 |
---|---|---|
committer | Frédéric Guillot <fred@miniflux.net> | 2018-12-02 21:09:53 -0800 |
commit | 1bc8535dbb2974be04d7e9b1dd9045a8322d3595 (patch) | |
tree | cb724d055166adabb7f5791dcf72b5e093dc61c1 /template | |
parent | 6f5d93cbbee0bbbd0bbb23e0116b023025da7576 (diff) |
Move image proxy filter to template functions
Diffstat (limited to 'template')
-rw-r--r-- | template/functions.go | 38 | ||||
-rw-r--r-- | template/functions_test.go | 141 |
2 files changed, 175 insertions, 4 deletions
diff --git a/template/functions.go b/template/functions.go index 84a02f4..d99f237 100644 --- a/template/functions.go +++ b/template/functions.go @@ -5,6 +5,7 @@ package template // import "miniflux.app/template" import ( + "encoding/base64" "fmt" "math" "html/template" @@ -12,14 +13,15 @@ import ( "strings" "time" - "github.com/gorilla/mux" "miniflux.app/config" - "miniflux.app/filter" "miniflux.app/http/route" "miniflux.app/locale" "miniflux.app/model" "miniflux.app/timezone" "miniflux.app/url" + + "github.com/gorilla/mux" + "github.com/PuerkitoBio/goquery" ) type funcMap struct { @@ -50,13 +52,13 @@ func (f *funcMap) Map() template.FuncMap { return template.HTML(str) }, "proxyFilter": func(data string) string { - return filter.ImageProxyFilter(f.router, f.cfg, data) + return imageProxyFilter(f.router, f.cfg, data) }, "proxyURL": func(link string) string { proxyImages := f.cfg.ProxyImages() if proxyImages == "all" || (proxyImages != "none" && !url.IsHTTPS(link)) { - return filter.Proxify(f.router, link) + return proxify(f.router, link) } return link @@ -175,3 +177,31 @@ func elapsedTime(printer *locale.Printer, tz string, t time.Time) string { return printer.Plural("time_elapsed.years", years, years) } } + +func imageProxyFilter(router *mux.Router, cfg *config.Config, data string) string { + proxyImages := cfg.ProxyImages() + if proxyImages == "none" { + return data + } + + doc, err := goquery.NewDocumentFromReader(strings.NewReader(data)) + if err != nil { + return data + } + + doc.Find("img").Each(func(i int, img *goquery.Selection) { + if srcAttr, ok := img.Attr("src"); ok { + if proxyImages == "all" || !url.IsHTTPS(srcAttr) { + img.SetAttr("src", proxify(router, srcAttr)) + } + } + }) + + output, _ := doc.Find("body").First().Html() + return output +} + +func proxify(router *mux.Router, link string) string { + // We use base64 url encoding to avoid slash in the URL. + return route.Path(router, "proxy", "encodedURL", base64.URLEncoding.EncodeToString([]byte(link))) +} diff --git a/template/functions_test.go b/template/functions_test.go index 1bfb919..a816eb7 100644 --- a/template/functions_test.go +++ b/template/functions_test.go @@ -5,10 +5,15 @@ package template // import "miniflux.app/template" import ( + "net/http" + "os" "testing" "time" + "miniflux.app/config" "miniflux.app/locale" + + "github.com/gorilla/mux" ) func TestDict(t *testing.T) { @@ -125,3 +130,139 @@ func TestElapsedTime(t *testing.T) { } } } + +func TestProxyFilterWithHttpDefault(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "http-only") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := `<p><img src="/proxy/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpsDefault(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "http-only") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpNever(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "none") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := input + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpsNever(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "none") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := input + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpAlways(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "all") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := `<p><img src="/proxy/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpsAlways(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "all") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := `<p><img src="/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpInvalid(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "invalid") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := `<p><img src="/proxy/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} + +func TestProxyFilterWithHttpsInvalid(t *testing.T) { + os.Clearenv() + os.Setenv("PROXY_IMAGES", "invalid") + c := config.NewConfig() + + r := mux.NewRouter() + r.HandleFunc("/proxy/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy") + + input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>` + output := imageProxyFilter(r, c, input) + expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>` + + if expected != output { + t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected) + } +} |