aboutsummaryrefslogtreecommitdiffhomepage
path: root/template
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2018-12-02 21:09:53 -0800
committerGravatar Frédéric Guillot <fred@miniflux.net>2018-12-02 21:09:53 -0800
commit1bc8535dbb2974be04d7e9b1dd9045a8322d3595 (patch)
treecb724d055166adabb7f5791dcf72b5e093dc61c1 /template
parent6f5d93cbbee0bbbd0bbb23e0116b023025da7576 (diff)
Move image proxy filter to template functions
Diffstat (limited to 'template')
-rw-r--r--template/functions.go38
-rw-r--r--template/functions_test.go141
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)
+ }
+}