浏览代码

Add B64decode expr helper (#2183)

blotus 2 年之前
父节点
当前提交
a753ea6981
共有 3 个文件被更改,包括 71 次插入0 次删除
  1. 7 0
      pkg/exprhelpers/expr_lib.go
  2. 54 0
      pkg/exprhelpers/exprlib_test.go
  3. 10 0
      pkg/exprhelpers/helpers.go

+ 7 - 0
pkg/exprhelpers/expr_lib.go

@@ -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,

+ 54 - 0
pkg/exprhelpers/exprlib_test.go

@@ -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)
+		})
+	}
 }

+ 10 - 0
pkg/exprhelpers/helpers.go

@@ -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
+}