Add B64decode expr helper (#2183)

This commit is contained in:
blotus 2023-05-04 14:15:20 +02:00 committed by GitHub
parent 8f71edaadd
commit a753ea6981
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 72 additions and 1 deletions

View file

@ -384,6 +384,13 @@ var exprFuncs = []exprCustomFunc{
new(func(string, ...interface{}) bool),
},
},
{
name: "B64Decode",
function: B64Decode,
signature: []interface{}{
new(func(string) string),
},
},
}
//go 1.20 "CutPrefix": strings.CutPrefix,

View file

@ -1304,5 +1304,59 @@ func TestToString(t *testing.T) {
require.Equal(t, tc.expected, output)
})
}
}
func TestB64Decode(t *testing.T) {
err := Init(nil)
require.NoError(t, err)
tests := []struct {
name string
value interface{}
expected string
expr string
expectedBuildErr bool
expectedRuntimeErr bool
}{
{
name: "B64Decode() test: valid string",
value: "Zm9v",
expected: "foo",
expr: `B64Decode(value)`,
expectedBuildErr: false,
},
{
name: "B64Decode() test: invalid string",
value: "foo",
expected: "",
expr: `B64Decode(value)`,
expectedBuildErr: false,
expectedRuntimeErr: true,
},
{
name: "B64Decode() test: invalid type",
value: 1,
expected: "",
expr: `B64Decode(value)`,
expectedBuildErr: true,
},
}
for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
vm, err := expr.Compile(tc.expr, GetExprOptions(map[string]interface{}{"value": tc.value})...)
if tc.expectedBuildErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
output, err := expr.Run(vm, map[string]interface{}{"value": tc.value})
if tc.expectedRuntimeErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
require.Equal(t, tc.expected, output)
})
}
}

View file

@ -2,6 +2,7 @@ package exprhelpers
import (
"bufio"
"encoding/base64"
"fmt"
"net"
"net/url"
@ -585,3 +586,12 @@ func Match(params ...any) (any, error) {
}
return matched, nil
}
func B64Decode(params ...any) (any, error) {
encoded := params[0].(string)
decoded, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
return "", err
}
return string(decoded), nil
}