Skip to content

Commit ed1312a

Browse files
committed
FIX messages_url for correlation_count - #56
1 parent 29075af commit ed1312a

File tree

1 file changed

+69
-16
lines changed

1 file changed

+69
-16
lines changed

src/main/java/com/airbus_cyber_security/graylog/events/notifications/types/MessagesURLBuilder.java

Lines changed: 69 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.joda.time.format.DateTimeFormat;
2626
import org.joda.time.format.DateTimeFormatter;
2727

28+
import java.lang.reflect.Method;
2829
import java.util.ArrayList;
2930
import java.util.List;
3031
import java.util.Map;
@@ -60,33 +61,85 @@ private String buildSearchQuery(Optional<EventDefinitionDto> eventDefinitionOpt,
6061
if (eventDefinitionOpt.isPresent()) {
6162
EventDefinitionDto eventDefinition = eventDefinitionOpt.get();
6263
EventProcessorConfig config = eventDefinition.config();
64+
String configType = getEventProcessorConfigType(config);
6365

64-
if (config instanceof AggregationEventProcessorConfig) {
65-
AggregationEventProcessorConfig aggregationConfig = (AggregationEventProcessorConfig) config;
66-
List<String> filters = new ArrayList<>();
66+
List<String> filters = new ArrayList<>();
6767

68-
String searchQuery = aggregationConfig.query();
69-
if (searchQuery != null && !searchQuery.isEmpty() && !searchQuery.equals("*")) {
70-
filters.add(searchQuery);
71-
}
68+
if (configType.equals(AggregationEventProcessorConfig.TYPE_NAME)) {
69+
filters.addAll(getFiltersFromAggregation((AggregationEventProcessorConfig) config));
70+
} else if (configType.equals("correlation-count")) {
71+
filters.addAll(getFiltersFromCorrelationCount(config));
72+
}
7273

73-
// Add groupByFields in filters (separate empty value)
74-
groupByFields.entrySet().stream().filter(MessagesURLBuilder::emptyValue)
75-
.map(entry -> "NOT _exists_: " + entry.getKey()).forEach(filters::add);
76-
groupByFields.entrySet().stream().filter(MessagesURLBuilder::notEmptyValue)
77-
.map( entry -> entry.getKey() + ": " + entry.getValue()).forEach(filters::add);
74+
// Add groupByFields in filters (separate empty value)
75+
groupByFields.entrySet().stream().filter(MessagesURLBuilder::emptyValue)
76+
.map(entry -> "NOT _exists_: " + entry.getKey()).forEach(filters::add);
77+
groupByFields.entrySet().stream().filter(MessagesURLBuilder::notEmptyValue)
78+
.map( entry -> entry.getKey() + ": " + entry.getValue()).forEach(filters::add);
7879

79-
Optional<String> filterResult = filters.stream().reduce((x, y) -> "(" + x + ") AND (" + y + ")");
80+
// Build query
81+
Optional<String> filterResult = filters.stream().reduce((x, y) -> "(" + x + ") AND (" + y + ")");
8082

81-
if (filterResult.isPresent()) {
82-
return MSGS_URL_QUERY + filterResult.get();
83-
}
83+
if (filterResult.isPresent()) {
84+
return MSGS_URL_QUERY + filterResult.get();
8485
}
8586
}
8687

8788
return "";
8889
}
8990

91+
/**
92+
* Get type and avoid Exception for FallbackConfig
93+
*/
94+
private String getEventProcessorConfigType(EventProcessorConfig config) {
95+
try {
96+
return config.type();
97+
} catch (UnsupportedOperationException e) {
98+
return "";
99+
}
100+
}
101+
102+
private List<String> getFiltersFromAggregation(AggregationEventProcessorConfig aggregationConfig) {
103+
List<String> filters = new ArrayList<>();
104+
105+
String searchQuery = aggregationConfig.query();
106+
if (isValidSearchQuery(searchQuery)) {
107+
filters.add(searchQuery);
108+
}
109+
110+
return filters;
111+
}
112+
113+
/**
114+
* Use Reflexion for CorrelationCountProcessorConfig to avoid dependency with graylog-plugin-correlation-count
115+
*/
116+
private List<String> getFiltersFromCorrelationCount(EventProcessorConfig config) {
117+
try {
118+
List<String> filters = new ArrayList<>();
119+
Class<?> correlationCountClass = config.getClass().getSuperclass();
120+
Method methodSearchQuery = correlationCountClass.getMethod("searchQuery");
121+
String searchQuery = (String) methodSearchQuery.invoke(config);
122+
if (isValidSearchQuery(searchQuery)) {
123+
filters.add(searchQuery);
124+
}
125+
126+
Method additionalSearchQueryMethod = correlationCountClass.getMethod("additionalSearchQuery");
127+
String additionalSearchQuery = (String) additionalSearchQueryMethod.invoke(config);
128+
if (isValidSearchQuery(additionalSearchQuery)) {
129+
filters.add(additionalSearchQuery);
130+
}
131+
132+
return filters;
133+
} catch (Exception e) {
134+
// Keep Exception to be noticed if class signature changed
135+
throw new RuntimeException(e);
136+
}
137+
}
138+
139+
private boolean isValidSearchQuery(String searchQuery) {
140+
return searchQuery != null && !searchQuery.isEmpty() && !searchQuery.equals("*");
141+
}
142+
90143
private static boolean emptyValue(Map.Entry<String, String> entry) {
91144
return EMPTY_VALUE.equals(entry.getValue());
92145
}

0 commit comments

Comments
 (0)