| // Copyright Istio Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package trustdomain |
| |
| import ( |
| "strings" |
| ) |
| |
| // stringMatch checks if a string is in a list, it supports four types of string matches: |
| // 1. Exact match. |
| // 2. Wild character match. "*" matches any string. |
| // 3. Prefix match. For example, "book*" matches "bookstore", "bookshop", etc. |
| // 4. Suffix match. For example, "*/review" matches "/bookstore/review", "/products/review", etc. |
| // This is an extensive version of model.stringMatch(). The pattern can be in the string or the list. |
| func stringMatch(a string, list []string) bool { |
| for _, s := range list { |
| if a == s || s == "*" || prefixMatch(a, s) || prefixMatch(s, a) || suffixMatch(a, s) || suffixMatch(s, a) { |
| return true |
| } |
| } |
| return false |
| } |
| |
| // prefixMatch checks if pattern is a prefix match and if string a has the given prefix. |
| func prefixMatch(a string, pattern string) bool { |
| if !strings.HasSuffix(pattern, "*") { |
| return false |
| } |
| pattern = strings.TrimSuffix(pattern, "*") |
| return strings.HasPrefix(a, pattern) |
| } |
| |
| // suffixMatch checks if pattern is a suffix match and if string a has the given suffix. |
| func suffixMatch(a string, pattern string) bool { |
| if !strings.HasPrefix(pattern, "*") { |
| return false |
| } |
| pattern = strings.TrimPrefix(pattern, "*") |
| return strings.HasSuffix(a, pattern) |
| } |
| |
| // isKeyInList it's fine to use this naive implementation for searching in a very short list. |
| func isKeyInList(key string, list []string) bool { |
| for _, l := range list { |
| if key == l { |
| return true |
| } |
| } |
| return false |
| } |