package permmatch import ( "strings" ) // MethodAllowed reports whether method is covered by a pipe-separated methods string. func MethodAllowed(methods, method string) bool { method = strings.ToUpper(strings.TrimSpace(method)) if method == "" { return false } for _, item := range strings.Split(methods, "|") { if strings.ToUpper(strings.TrimSpace(item)) == method { return true } } return false } // PathAllowed reports whether requestPath matches pattern (exact or trailing * wildcard). func PathAllowed(pattern, requestPath string) bool { pattern = strings.TrimSpace(pattern) requestPath = strings.TrimSpace(requestPath) if pattern == "" || requestPath == "" { return false } if pattern == requestPath { return true } if strings.HasSuffix(pattern, "*") { prefix := strings.TrimRight(strings.TrimSuffix(pattern, "*"), "/") if requestPath == prefix { return true } return strings.HasPrefix(requestPath, prefix+"/") } return false } // RequestAllowed checks member permission map against an HTTP request. func RequestAllowed(permissions map[string]string, method, requestPath string) bool { if len(permissions) == 0 { return false } for pattern, methods := range permissions { if PathAllowed(pattern, requestPath) && MethodAllowed(methods, method) { return true } } return false }