From e44c1b2602f7e2113024099f646b575a486218a8 Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Mon, 24 Jul 2017 23:13:32 +0200 Subject: Add missing wrapping of security filters --- .../http/filter/FilterChainRepository.java | 33 ++++++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'container-core/src') diff --git a/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java b/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java index a736fd1372f..c888aa97ae9 100644 --- a/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java +++ b/container-core/src/main/java/com/yahoo/container/http/filter/FilterChainRepository.java @@ -21,10 +21,12 @@ import com.yahoo.jdisc.http.filter.chain.RequestFilterChain; import com.yahoo.jdisc.http.filter.chain.ResponseFilterChain; import com.yahoo.processing.execution.chain.ChainRegistry; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; +import static java.util.Collections.emptyList; import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; @@ -83,17 +85,36 @@ public class FilterChainRepository extends AbstractComponent { private static Object toJDiscChain(Chain chain) { checkFilterTypesCompatible(chain); List jdiscFilters = chain.components().stream() - .map(filterWrapper -> filterWrapper.filter) - .collect(toList()); - Object head = jdiscFilters.get(0); - if (jdiscFilters.size() == 1) return head; + .map(filterWrapper -> filterWrapper.filter) + .collect(toList()); + List wrappedFilters = wrapSecurityFilters(jdiscFilters); + Object head = wrappedFilters.get(0); + if (wrappedFilters.size() == 1) return head; else if (head instanceof RequestFilter) - return RequestFilterChain.newInstance((List) jdiscFilters); + return RequestFilterChain.newInstance((List) wrappedFilters); else if (head instanceof ResponseFilter) - return ResponseFilterChain.newInstance((List) jdiscFilters); + return ResponseFilterChain.newInstance((List) wrappedFilters); throw new IllegalStateException(); } + private static List wrapSecurityFilters(List filters) { + if (filters.isEmpty()) return emptyList(); + List aggregatedSecurityFilters = new ArrayList<>(); + List wrappedFilters = new ArrayList<>(); + for (Object filter : filters) { + if (isSecurityFilter(filter)) { + aggregatedSecurityFilters.add(filter); + } else { + if (!aggregatedSecurityFilters.isEmpty()) { + wrappedFilters.add(createSecurityChain(aggregatedSecurityFilters)); + aggregatedSecurityFilters.clear(); + } + wrappedFilters.add(filter); + } + } + return wrappedFilters; + } + private static void checkFilterTypesCompatible(Chain chain) { Set requestFilters = chain.components().stream() .filter(filter -> filter instanceof RequestFilter || filter instanceof SecurityRequestFilter) -- cgit v1.2.3