diff options
| author | 2022-05-26 05:44:04 +0200 | |
|---|---|---|
| committer | 2022-05-25 20:44:04 -0700 | |
| commit | 5a07fd8932b9c8573d3ef56cb84fc0a6479f6372 (patch) | |
| tree | 9fc49c6e73a874ec19b0bb84696ddf994579cdea | |
| parent | 9fa086e47175d5ed45c0c2b969ee2e47dd937510 (diff) | |
| download | v2-5a07fd8932b9c8573d3ef56cb84fc0a6479f6372.tar.gz v2-5a07fd8932b9c8573d3ef56cb84fc0a6479f6372.tar.zst v2-5a07fd8932b9c8573d3ef56cb84fc0a6479f6372.zip | |
Add new rewrite rule to decode base64 content
| -rw-r--r-- | reader/rewrite/rewrite_functions.go | 30 | ||||
| -rw-r--r-- | reader/rewrite/rewriter.go | 6 | ||||
| -rw-r--r-- | reader/rewrite/rewriter_test.go | 30 |
3 files changed, 66 insertions, 0 deletions
diff --git a/reader/rewrite/rewrite_functions.go b/reader/rewrite/rewrite_functions.go index b5b52409..20e2c5d9 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 @@ func addCastopodEpisode(entryURL, entryContent string) string { 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 feb0139e..b00ea1a1 100644 --- a/reader/rewrite/rewriter.go +++ b/reader/rewrite/rewriter.go @@ -102,6 +102,12 @@ func applyRule(entryURL, entryContent string, rule rule) string { } 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 f796da7d..fab7da26 100644 --- a/reader/rewrite/rewriter_test.go +++ b/reader/rewrite/rewriter_test.go @@ -295,3 +295,33 @@ func TestRewriteAddCastopodEpisode(t *testing.T) { 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) + } +} |
