99import org .apache .lucene .util .automaton .Automaton ;
1010import org .apache .lucene .util .automaton .CharacterRunAutomaton ;
1111import org .apache .lucene .util .automaton .RegExp ;
12+ import org .elasticsearch .common .settings .Setting ;
13+ import org .elasticsearch .common .settings .Settings ;
1214
1315import java .util .ArrayList ;
1416import java .util .Arrays ;
2527
2628public final class Automatons {
2729
30+ public static final Setting <Integer > MAX_DETERMINIZED_STATES_SETTING =
31+ Setting .intSetting ("xpack.security.automata.max_determinized_states" , 100000 , DEFAULT_MAX_DETERMINIZED_STATES ,
32+ Setting .Property .NodeScope );
2833 public static final Automaton EMPTY = Automata .makeEmpty ();
2934 public static final Automaton MATCH_ALL = Automata .makeAnyString ();
3035
36+ // this value is not final since we allow it to be set at runtime
37+ private static int maxDeterminizedStates = 100000 ;
38+
3139 static final char WILDCARD_STRING = '*' ; // String equality with support for wildcards
3240 static final char WILDCARD_CHAR = '?' ; // Char equality with support for wildcards
3341 static final char WILDCARD_ESCAPE = '\\' ; // Escape character
@@ -49,13 +57,12 @@ public static Automaton patterns(Collection<String> patterns) {
4957 if (patterns .isEmpty ()) {
5058 return EMPTY ;
5159 }
52- Automaton automaton = null ;
60+ List < Automaton > automata = new ArrayList <>( patterns . size ()) ;
5361 for (String pattern : patterns ) {
54- final Automaton patternAutomaton = minimize ( pattern (pattern ), DEFAULT_MAX_DETERMINIZED_STATES );
55- automaton = automaton == null ? patternAutomaton : unionAndMinimize ( Arrays . asList ( automaton , patternAutomaton ) );
62+ final Automaton patternAutomaton = pattern (pattern );
63+ automata . add ( patternAutomaton );
5664 }
57- // the automaton is always minimized and deterministic
58- return automaton ;
65+ return unionAndMinimize (automata );
5966 }
6067
6168 /**
@@ -111,12 +118,12 @@ static Automaton wildcard(String text) {
111118
112119 public static Automaton unionAndMinimize (Collection <Automaton > automata ) {
113120 Automaton res = union (automata );
114- return minimize (res , DEFAULT_MAX_DETERMINIZED_STATES );
121+ return minimize (res , maxDeterminizedStates );
115122 }
116123
117124 public static Automaton minusAndMinimize (Automaton a1 , Automaton a2 ) {
118- Automaton res = minus (a1 , a2 , DEFAULT_MAX_DETERMINIZED_STATES );
119- return minimize (res , DEFAULT_MAX_DETERMINIZED_STATES );
125+ Automaton res = minus (a1 , a2 , maxDeterminizedStates );
126+ return minimize (res , maxDeterminizedStates );
120127 }
121128
122129 public static Predicate <String > predicate (String ... patterns ) {
@@ -131,8 +138,17 @@ public static Predicate<String> predicate(Automaton automaton) {
131138 return predicate (automaton , "Predicate for " + automaton );
132139 }
133140
141+ public static void updateMaxDeterminizedStates (Settings settings ) {
142+ maxDeterminizedStates = MAX_DETERMINIZED_STATES_SETTING .get (settings );
143+ }
144+
145+ // accessor for testing
146+ static int getMaxDeterminizedStates () {
147+ return maxDeterminizedStates ;
148+ }
149+
134150 private static Predicate <String > predicate (Automaton automaton , final String toString ) {
135- CharacterRunAutomaton runAutomaton = new CharacterRunAutomaton (automaton , DEFAULT_MAX_DETERMINIZED_STATES );
151+ CharacterRunAutomaton runAutomaton = new CharacterRunAutomaton (automaton , maxDeterminizedStates );
136152 return new Predicate <String >() {
137153 @ Override
138154 public boolean test (String s ) {
0 commit comments