Skip to content

Commit

Permalink
Add support for decoding base64 strings without padding (#1604)
Browse files Browse the repository at this point in the history
  • Loading branch information
teejaded authored Mar 18, 2023
1 parent 99b2ab6 commit 69d3e3f
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
25 changes: 24 additions & 1 deletion pkg/yqlib/decoder_base64.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,33 @@ import (
"bytes"
"encoding/base64"
"io"
"strings"

yaml "gopkg.in/yaml.v3"
)

type base64Padder struct {
count uint64
io.Reader
}

func (c *base64Padder) pad(buf []byte) (int, error) {
pad := strings.Repeat("=", int(4-c.count%4))
n, err := strings.NewReader(pad).Read(buf)
c.count += uint64(n)
return n, err
}

func (c *base64Padder) Read(buf []byte) (int, error) {
n, err := c.Reader.Read(buf)
c.count += uint64(n)

if err == io.EOF && c.count%4 != 0 {
return c.pad(buf)
}
return n, err
}

type base64Decoder struct {
reader io.Reader
finished bool
Expand All @@ -20,7 +43,7 @@ func NewBase64Decoder() Decoder {
}

func (dec *base64Decoder) Init(reader io.Reader) error {
dec.reader = reader
dec.reader = &base64Padder{Reader: reader}
dec.readAnything = false
dec.finished = false
return nil
Expand Down
8 changes: 8 additions & 0 deletions pkg/yqlib/operator_encoder_decoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,14 @@ var encoderDecoderOperatorScenarios = []expressionScenario{
"D0, P[], (!!str)::\n",
},
},
{
description: "base64 missing padding test",
skipDoc: true,
expression: `"Y2F0cw" | @base64d`,
expected: []string{
"D0, P[], (!!str)::cats\n",
},
},
{
requiresFormat: "xml",
description: "empty xml decode",
Expand Down

0 comments on commit 69d3e3f

Please sign in to comment.