aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Dave Z <dzaikos@users.noreply.github.com>2018-07-12 20:41:09 -0400
committerGravatar Frédéric Guillot <fred@miniflux.net>2018-07-12 17:41:09 -0700
commitc926498d3d12f4e59c5fe0cd40a77c42d15c30b9 (patch)
tree2bf52c7baa69ff8a7f1223826405147fbe615f94
parent6fd6f79daf8a55eb97345f377d136cc320637580 (diff)
Make image proxy configurable
Adds IMAGE_PROXY configuration setting to change image proxy filter behaviour: - none = No proxy - http-only = Proxy only non-HTTPS images (default) - all = Proxy everything
-rw-r--r--config/config.go6
-rw-r--r--filter/image_proxy_filter.go12
-rw-r--r--filter/image_proxy_filter_test.go121
-rw-r--r--template/functions.go10
4 files changed, 138 insertions, 11 deletions
diff --git a/config/config.go b/config/config.go
index 3cb2ef2..4cba789 100644
--- a/config/config.go
+++ b/config/config.go
@@ -26,6 +26,7 @@ const (
defaultCertDomain = ""
defaultCertCache = "/tmp/cert_cache"
defaultCleanupFrequency = 24
+ defaultProxyImages = "http-only"
)
// Config manages configuration parameters.
@@ -217,6 +218,11 @@ func (c *Config) PocketConsumerKey(defaultValue string) string {
return c.get("POCKET_CONSUMER_KEY", defaultValue)
}
+// ProxyImages returns "none" to never proxy, "http-only" to proxy non-HTTPS, "all" to always proxy.
+func (c *Config) ProxyImages() string {
+ return c.get("PROXY_IMAGES", defaultProxyImages)
+}
+
// NewConfig returns a new Config.
func NewConfig() *Config {
cfg := &Config{
diff --git a/filter/image_proxy_filter.go b/filter/image_proxy_filter.go
index ef6d397..99884e3 100644
--- a/filter/image_proxy_filter.go
+++ b/filter/image_proxy_filter.go
@@ -8,6 +8,7 @@ import (
"encoding/base64"
"strings"
+ "github.com/miniflux/miniflux/config"
"github.com/miniflux/miniflux/http/route"
"github.com/miniflux/miniflux/url"
@@ -15,8 +16,13 @@ import (
"github.com/gorilla/mux"
)
-// ImageProxyFilter rewrites image tag URLs without HTTPS to local proxy URL
-func ImageProxyFilter(router *mux.Router, data string) string {
+// ImageProxyFilter rewrites image tag URLs to local proxy URL (by default only non-HTTPS URLs)
+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
@@ -24,7 +30,7 @@ func ImageProxyFilter(router *mux.Router, data string) string {
doc.Find("img").Each(func(i int, img *goquery.Selection) {
if srcAttr, ok := img.Attr("src"); ok {
- if !url.IsHTTPS(srcAttr) {
+ if proxyImages == "all" || !url.IsHTTPS(srcAttr) {
img.SetAttr("src", Proxify(router, srcAttr))
}
}
diff --git a/filter/image_proxy_filter_test.go b/filter/image_proxy_filter_test.go
index 992516e..7c1376e 100644
--- a/filter/image_proxy_filter_test.go
+++ b/filter/image_proxy_filter_test.go
@@ -6,17 +6,126 @@ package filter
import (
"net/http"
+ "os"
"testing"
+ "github.com/miniflux/miniflux/config"
+
"github.com/gorilla/mux"
)
-func TestProxyFilterWithHttp(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, input)
+ output := ImageProxyFilter(r, c, input)
expected := `<p><img src="/proxy/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
if expected != output {
@@ -24,12 +133,16 @@ func TestProxyFilterWithHttp(t *testing.T) {
}
}
-func TestProxyFilterWithHttps(t *testing.T) {
+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, input)
+ output := ImageProxyFilter(r, c, input)
expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
if expected != output {
diff --git a/template/functions.go b/template/functions.go
index e80a4a5..f68d6fb 100644
--- a/template/functions.go
+++ b/template/functions.go
@@ -46,14 +46,16 @@ func (f *funcMap) Map() template.FuncMap {
return template.HTML(str)
},
"proxyFilter": func(data string) string {
- return filter.ImageProxyFilter(f.router, data)
+ return filter.ImageProxyFilter(f.router, f.cfg, data)
},
"proxyURL": func(link string) string {
- if url.IsHTTPS(link) {
- return link
+ proxyImages := f.cfg.ProxyImages()
+
+ if proxyImages == "all" || (proxyImages != "none" && !url.IsHTTPS(link)) {
+ return filter.Proxify(f.router, link)
}
- return filter.Proxify(f.router, link)
+ return link
},
"domain": func(websiteURL string) string {
return url.Domain(websiteURL)