diff --git a/policy/builtins.go b/policy/builtins.go index 37475fdb9..0abc090be 100644 --- a/policy/builtins.go +++ b/policy/builtins.go @@ -55,6 +55,7 @@ func builtins() []*ast.Builtin { // Arrays ast.ArrayConcat, + ast.ArrayFlatten, ast.ArraySlice, ast.ArrayReverse, @@ -196,6 +197,9 @@ func builtins() []*ast.Builtin { // Printing ast.Print, ast.InternalPrint, + + // Internal implementation for template strings. + ast.InternalTemplateString, } return b } diff --git a/policy/validate_test.go b/policy/validate_test.go index 73e8a5664..b9e2ea66e 100644 --- a/policy/validate_test.go +++ b/policy/validate_test.go @@ -917,6 +917,35 @@ decision := { }, caps) } +func TestPolicyOPA114Builtins(t *testing.T) { + p := NewPolicy(Opt{ + Files: []File{{ + Filename: "policy.rego", + Data: []byte(` +package docker + +segments := array.flatten([["exec"], ["proxy"]]) + +decision := { + "allow": true, + "caps": { + "exec.proxy": true, + }, +} if { + msg := $"execute {segments[0]}.{segments[1]}" + msg == "execute exec.proxy" +} +`), + }}, + }) + + caps, err := p.CheckCaps(context.Background()) + require.NoError(t, err) + require.Equal(t, Caps{ + CapExecProxy: true, + }, caps) +} + func TestCheckCapsMalformedCaps(t *testing.T) { p := NewPolicy(Opt{ Files: []File{{