Liu Song’s Projects


~/Projects/miniflux

git clone https://code.lsong.org/miniflux

Commit

Commit
5a07fd8932b9c8573d3ef56cb84fc0a6479f6372
Author
nemunaire <[email protected]>
Date
2022-05-26 05:44:04 +0200 +0200
Diffstat
 reader/rewrite/rewrite_functions.go | 30 ++++++++++++++++++++++++++++++
 reader/rewrite/rewriter.go | 6 ++++++
 reader/rewrite/rewriter_test.go | 30 ++++++++++++++++++++++++++++++

Add new rewrite rule to decode base64 content


diff --git a/reader/rewrite/rewrite_functions.go b/reader/rewrite/rewrite_functions.go
index b5b5240972feb522fb027bf2fdb3b14046ad7b58..20e2c5d93a0e8e658241106911bc7376cd7d6389 100644
--- a/reader/rewrite/rewrite_functions.go
+++ b/reader/rewrite/rewrite_functions.go
@@ -5,6 +5,7 @@
 package rewrite // import "miniflux.app/reader/rewrite"
 
 import (
+	"encoding/base64"
 	"fmt"
 	"html"
 	"net/url"
@@ -288,3 +289,32 @@ 	player := ``
 
 	return player + `<br>` + entryContent
 }
+
+func applyFuncOnTextContent(entryContent string, selector string, repl func(string) string) string {
+	var treatChildren func(i int, s *goquery.Selection)
+	treatChildren = func(i int, s *goquery.Selection) {
+		if s.Nodes[0].Type == 1 {
+			s.ReplaceWithHtml(repl(s.Nodes[0].Data))
+		} else {
+			s.Contents().Each(treatChildren)
+		}
+	}
+
+	doc, err := goquery.NewDocumentFromReader(strings.NewReader(entryContent))
+	if err != nil {
+		return entryContent
+	}
+
+	doc.Find(selector).Each(treatChildren)
+
+	output, _ := doc.Find("body").First().Html()
+	return output
+}
+
+func decodeBase64Content(entryContent string) string {
+	if ret, err := base64.StdEncoding.DecodeString(strings.TrimSpace(entryContent)); err != nil {
+		return entryContent
+	} else {
+		return html.EscapeString(string(ret))
+	}
+}




diff --git a/reader/rewrite/rewriter.go b/reader/rewrite/rewriter.go
index feb0139ee0692b5ca9cdbb93db58f6f5a08945f9..b00ea1a1b353ebf12ca0514058bb3055561f0a66 100644
--- a/reader/rewrite/rewriter.go
+++ b/reader/rewrite/rewriter.go
@@ -102,6 +102,12 @@ 			logger.Debug("[Rewrite] Cannot find selector for remove rule %s", rule)
 		}
 	case "add_castopod_episode":
 		entryContent = addCastopodEpisode(entryURL, entryContent)
+	case "base64_decode":
+		if len(rule.args) >= 1 {
+			entryContent = applyFuncOnTextContent(entryContent, rule.args[0], decodeBase64Content)
+		} else {
+			entryContent = applyFuncOnTextContent(entryContent, "body", decodeBase64Content)
+		}
 	}
 
 	return entryContent




diff --git a/reader/rewrite/rewriter_test.go b/reader/rewrite/rewriter_test.go
index f796da7d2895d40199973a5e1ed8e8f02b88bb5f..fab7da261ef1d5eabfc978c29a93c64fa23ae2ba 100644
--- a/reader/rewrite/rewriter_test.go
+++ b/reader/rewrite/rewriter_test.go
@@ -295,3 +295,33 @@ 	if expected != output {
 		t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
 	}
 }
+
+func TestRewriteBase64Decode(t *testing.T) {
+	content := `VGhpcyBpcyBzb21lIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQ=`
+	expected := `This is some base64 encoded content`
+	output := Rewriter("https://example.org/article", content, `base64_decode`)
+
+	if expected != output {
+		t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
+	}
+}
+
+func TestRewriteBase64DecodeInHTML(t *testing.T) {
+	content := `<div>Lorem Ipsum not valid base64<span class="base64">VGhpcyBpcyBzb21lIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQ=</span></div>`
+	expected := `<div>Lorem Ipsum not valid base64<span class="base64">This is some base64 encoded content</span></div>`
+	output := Rewriter("https://example.org/article", content, `base64_decode`)
+
+	if expected != output {
+		t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
+	}
+}
+
+func TestRewriteBase64DecodeArgs(t *testing.T) {
+	content := `<div>Lorem Ipsum<span class="base64">VGhpcyBpcyBzb21lIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQ=</span></div>`
+	expected := `<div>Lorem Ipsum<span class="base64">This is some base64 encoded content</span></div>`
+	output := Rewriter("https://example.org/article", content, `base64_decode(".base64")`)
+
+	if expected != output {
+		t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
+	}
+}