ppl: support special characters in claim keys (#3640)

ppl: support special characters in claim keys (#3639)

* ppl: support special characters in claim keys

* fix test

Co-authored-by: Caleb Doxsey <cdoxsey@pomerium.com>
This commit is contained in:
backport-actions-token[bot] 2022-10-03 08:46:07 -06:00 committed by GitHub
parent 88abdf8d4d
commit db7509c808
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 0 deletions

View file

@ -751,6 +751,12 @@ else = [] {
} }
object_get(obj, key, def) = value { object_get(obj, key, def) = value {
undefined := "10a0fd35-0f1a-4e5b-97ce-631e89e1bafa"
value = object.get(obj, key, undefined)
value != undefined
}
else = value {
segments := split(replace(key, ".", "/"), "/") segments := split(replace(key, ".", "/"), "/")
count(segments) == 2 count(segments) == 2
o1 := object.get(obj, segments[0], {}) o1 := object.get(obj, segments[0], {})

View file

@ -86,4 +86,28 @@ allow:
require.Equal(t, A{true, A{ReasonClaimOK}, M{}}, res["allow"]) require.Equal(t, A{true, A{ReasonClaimOK}, M{}}, res["allow"])
require.Equal(t, A{false, A{}}, res["deny"]) require.Equal(t, A{false, A{}}, res["deny"])
}) })
t.Run("special keys", func(t *testing.T) {
res, err := evaluate(t, `
allow:
and:
- claim/example.com/key: value
`,
[]dataBrokerRecord{
&session.Session{
Id: "SESSION_ID",
UserId: "USER_ID",
Claims: map[string]*structpb.ListValue{
"example.com/key": {Values: []*structpb.Value{structpb.NewStringValue("value")}},
},
},
&user.User{
Id: "USER_ID",
Email: "test@example.com",
},
},
Input{Session: InputSession{ID: "SESSION_ID"}})
require.NoError(t, err)
require.Equal(t, A{true, A{ReasonClaimOK}, M{}}, res["allow"])
require.Equal(t, A{false, A{}}, res["deny"])
})
} }

View file

@ -176,7 +176,12 @@ func ObjectGet() *ast.Rule {
return ast.MustParseRule(` return ast.MustParseRule(`
# object_get is like object.get, but supports converting "/" in keys to separate lookups # object_get is like object.get, but supports converting "/" in keys to separate lookups
# rego doesn't support recursion, so we hard code a limited number of /'s # rego doesn't support recursion, so we hard code a limited number of /'s
object_get(obj, key, def) = value { object_get(obj, key, def) = value {
undefined := "10a0fd35-0f1a-4e5b-97ce-631e89e1bafa"
value = object.get(obj, key, undefined)
value != undefined
} else = value {
segments := split(replace(key, ".", "/"), "/") segments := split(replace(key, ".", "/"), "/")
count(segments) == 2 count(segments) == 2
o1 := object.get(obj, segments[0], {}) o1 := object.get(obj, segments[0], {})