Browse Source

safer handling of invalid regex patterns

master
Jonathan Cobb 4 years ago
parent
commit
7b622d95ee
2 changed files with 13 additions and 4 deletions
  1. +10
    -1
      src/main/java/bubble/abp/BlockTarget.java
  2. +3
    -3
      src/main/java/bubble/abp/BubbleBlockConditionOperation.java

+ 10
- 1
src/main/java/bubble/abp/BlockTarget.java View File

@@ -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) {


+ 3
- 3
src/main/java/bubble/abp/BubbleBlockConditionOperation.java View File

@@ -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<String, Pattern> 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); }


Loading…
Cancel
Save