diff --git a/capability/policy/ipld.go b/capability/policy/ipld.go index 36f1519..2aea8d8 100644 --- a/capability/policy/ipld.go +++ b/capability/policy/ipld.go @@ -232,7 +232,7 @@ func statementToIPLD(statement Statement) (datamodel.Node, error) { if err != nil { return nil, err } - err = listBuilder.AssembleValue().AssignString(statement.pattern) + err = listBuilder.AssembleValue().AssignString(string(statement.pattern)) if err != nil { return nil, err } diff --git a/capability/policy/match.go b/capability/policy/match.go index 0564113..ee65967 100644 --- a/capability/policy/match.go +++ b/capability/policy/match.go @@ -112,7 +112,7 @@ func matchStatement(statement Statement, node ipld.Node) bool { if err != nil { return false } - return globMatch(s.pattern, v) + return s.pattern.match(v) } case KindAll: if s, ok := statement.(quantifier); ok { diff --git a/capability/policy/policy.go b/capability/policy/policy.go index 55072b6..157be8f 100644 --- a/capability/policy/policy.go +++ b/capability/policy/policy.go @@ -3,6 +3,8 @@ package policy // https://github.com/ucan-wg/delegation/blob/4094d5878b58f5d35055a3b93fccda0b8329ebae/README.md#policy import ( + "errors" + "github.com/ipld/go-ipld-prime" "github.com/ucan-wg/go-ucan/capability/policy/selector" @@ -87,9 +89,23 @@ func Or(stmts ...Statement) Statement { return connective{kind: KindOr, statements: stmts} } +type wildcardPattern string + +func parseWildcardPattern(pattern string) (wildcardPattern, error) { + if !validateGlobPattern(pattern) { + return "", errors.New("invalid wildcard pattern") + } + + return wildcardPattern(pattern), nil +} + +func (wp wildcardPattern) match(str string) bool { + return globMatch(string(wp), str) +} + type wildcard struct { selector selector.Selector - pattern string + pattern wildcardPattern } func (n wildcard) Kind() string { @@ -97,7 +113,12 @@ func (n wildcard) Kind() string { } func Like(selector selector.Selector, pattern string) (Statement, error) { - return wildcard{selector: selector, pattern: pattern}, nil + parsedPattern, err := parseWildcardPattern(pattern) + if err != nil { + return nil, err + } + + return wildcard{selector: selector, pattern: parsedPattern}, nil } type quantifier struct {