Add new rewrite rule to decode base64 content
This commit is contained in:
parent
9fa086e471
commit
5a07fd8932
3 changed files with 66 additions and 0 deletions
|
@ -5,6 +5,7 @@
|
||||||
package rewrite // import "miniflux.app/reader/rewrite"
|
package rewrite // import "miniflux.app/reader/rewrite"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html"
|
"html"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
@ -288,3 +289,32 @@ func addCastopodEpisode(entryURL, entryContent string) string {
|
||||||
|
|
||||||
return player + `<br>` + entryContent
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -102,6 +102,12 @@ func applyRule(entryURL, entryContent string, rule rule) string {
|
||||||
}
|
}
|
||||||
case "add_castopod_episode":
|
case "add_castopod_episode":
|
||||||
entryContent = addCastopodEpisode(entryURL, entryContent)
|
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
|
return entryContent
|
||||||
|
|
|
@ -295,3 +295,33 @@ func TestRewriteAddCastopodEpisode(t *testing.T) {
|
||||||
t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue