51 lines
1.5 KiB
Go
51 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
policy := "/osb/v2/service_instances/{instance_id}/service_bindings/{binding_id}/last_operation"
|
|
pathGood := "/osb/v2/service_instances/foo/service_bindings/bar/last_operation"
|
|
pathBad := "/osb/v2/service_instances/foo/evil_path/service_bindings/bar/last_operation"
|
|
pathShort := "/osb/v2/service_instances/foo_bar/"
|
|
|
|
fmt.Printf("Valid Path: %s\n", strconv.FormatBool(checkPolicyMatch(policy, pathGood)))
|
|
fmt.Printf("Valid Path: %s\n", strconv.FormatBool(checkPolicyMatch(policy, pathBad)))
|
|
fmt.Printf("Valid Path: %s\n", strconv.FormatBool(checkPolicyMatch(policy, pathShort)))
|
|
}
|
|
|
|
func checkPolicyMatch(policy, path string) bool {
|
|
// split the path elements by "/"
|
|
policyElements := strings.Split(policy, "/")
|
|
pathElements := strings.Split(path, "/")
|
|
|
|
// check to see if the number of elements are present in the path to prevent index out of range error
|
|
if len(policyElements) > len(pathElements) {
|
|
return false
|
|
}
|
|
|
|
// check each path element
|
|
for i := 0; i < len(policyElements); i++ {
|
|
switch {
|
|
// policy matching wildcard **
|
|
case regexp.MustCompile(`^\*\*$`).MatchString(policyElements[i]):
|
|
continue
|
|
// policy matching wildcard {foo}
|
|
case regexp.MustCompile(`^\{.+\}$`).MatchString(policyElements[i]):
|
|
continue
|
|
// path matches exactly, should we ignore case with EqualFold()
|
|
case policyElements[i] == pathElements[i]:
|
|
continue
|
|
// default deny
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|