diff --git a/src/main/java/bubble/abp/BlockTarget.java b/src/main/java/bubble/abp/BlockTarget.java index b1b8fb5..1ef506a 100644 --- a/src/main/java/bubble/abp/BlockTarget.java +++ b/src/main/java/bubble/abp/BlockTarget.java @@ -37,6 +37,14 @@ public class BlockTarget { public boolean hasRegex() { return !empty(regex); } @JsonIgnore @Getter(lazy=true) private final Pattern regexPattern = hasRegex() ? Pattern.compile(getRegex()) : null; + @SuppressWarnings("ResultOfMethodCallIgnored") + public BlockTarget validatePatterns() { + // force lazy-init patterns to initialize, validates regex patterns + if (hasRegex()) getRegexPattern(); + if (hasDomainRegex()) getDomainPattern(); + return this; + } + @Getter @Setter private BubbleBlockCondition[] conditions; public boolean hasConditions () { return !empty(conditions); } @@ -144,7 +152,8 @@ public class BlockTarget { return new BlockTarget() .setDomainRegex(domainRegex) .setRegex(regex) - .setFullDomainBlock(regex == null ? fullBlock : null); + .setFullDomainBlock(regex == null ? fullBlock : null) + .validatePatterns(); } private static String parseWildcardMatch(String data) { diff --git a/src/main/java/bubble/abp/BubbleBlockConditionOperation.java b/src/main/java/bubble/abp/BubbleBlockConditionOperation.java index bc34c1e..5ecb225 100644 --- a/src/main/java/bubble/abp/BubbleBlockConditionOperation.java +++ b/src/main/java/bubble/abp/BubbleBlockConditionOperation.java @@ -5,11 +5,10 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.cobbzilla.util.collection.ExpirationEvictionPolicy; import org.cobbzilla.util.collection.ExpirationMap; +import org.cobbzilla.util.string.ValidationRegexes; import java.util.regex.Pattern; -import static java.util.regex.Pattern.CASE_INSENSITIVE; - @AllArgsConstructor @Slf4j public enum BubbleBlockConditionOperation { @@ -20,8 +19,9 @@ public enum BubbleBlockConditionOperation { contains ((input, value) -> value.contains(input)); private static final ExpirationMap PATTERN_CACHE = new ExpirationMap<>(ExpirationEvictionPolicy.atime); + private static Pattern pattern(String value) { - return PATTERN_CACHE.computeIfAbsent(value, k -> Pattern.compile(k, CASE_INSENSITIVE)); + return PATTERN_CACHE.computeIfAbsent(value, ValidationRegexes::safePattern); } private interface BubbleBlockConditionComparison { boolean matches(String input, String value); }