<!DOCTYPE HTML>
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
</head>
<body>
<main role="main">
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span><a id="line.1">/*</a>
<span class="sourceLineNo">002</span><a id="line.2"> * Licensed to the Apache Software Foundation (ASF) under one</a>
<span class="sourceLineNo">003</span><a id="line.3"> * or more contributor license agreements.  See the NOTICE file</a>
<span class="sourceLineNo">004</span><a id="line.4"> * distributed with this work for additional information</a>
<span class="sourceLineNo">005</span><a id="line.5"> * regarding copyright ownership.  The ASF licenses this file</a>
<span class="sourceLineNo">006</span><a id="line.6"> * to you under the Apache License, Version 2.0 (the</a>
<span class="sourceLineNo">007</span><a id="line.7"> * "License"); you may not use this file except in compliance</a>
<span class="sourceLineNo">008</span><a id="line.8"> * with the License.  You may obtain a copy of the License at</a>
<span class="sourceLineNo">009</span><a id="line.9"> *</a>
<span class="sourceLineNo">010</span><a id="line.10"> *     http://www.apache.org/licenses/LICENSE-2.0</a>
<span class="sourceLineNo">011</span><a id="line.11"> *</a>
<span class="sourceLineNo">012</span><a id="line.12"> * Unless required by applicable law or agreed to in writing,</a>
<span class="sourceLineNo">013</span><a id="line.13"> * software distributed under the License is distributed on an</a>
<span class="sourceLineNo">014</span><a id="line.14"> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</a>
<span class="sourceLineNo">015</span><a id="line.15"> * KIND, either express or implied.  See the License for the</a>
<span class="sourceLineNo">016</span><a id="line.16"> * specific language governing permissions and limitations</a>
<span class="sourceLineNo">017</span><a id="line.17"> * under the License.</a>
<span class="sourceLineNo">018</span><a id="line.18"> */</a>
<span class="sourceLineNo">019</span><a id="line.19">package org.apache.shiro.web.filter.mgt;</a>
<span class="sourceLineNo">020</span><a id="line.20"></a>
<span class="sourceLineNo">021</span><a id="line.21">import org.apache.shiro.config.ConfigurationException;</a>
<span class="sourceLineNo">022</span><a id="line.22">import org.apache.shiro.util.CollectionUtils;</a>
<span class="sourceLineNo">023</span><a id="line.23">import org.apache.shiro.util.Nameable;</a>
<span class="sourceLineNo">024</span><a id="line.24">import org.apache.shiro.util.StringUtils;</a>
<span class="sourceLineNo">025</span><a id="line.25">import org.apache.shiro.web.filter.PathConfigProcessor;</a>
<span class="sourceLineNo">026</span><a id="line.26">import org.slf4j.Logger;</a>
<span class="sourceLineNo">027</span><a id="line.27">import org.slf4j.LoggerFactory;</a>
<span class="sourceLineNo">028</span><a id="line.28"></a>
<span class="sourceLineNo">029</span><a id="line.29">import javax.servlet.Filter;</a>
<span class="sourceLineNo">030</span><a id="line.30">import javax.servlet.FilterChain;</a>
<span class="sourceLineNo">031</span><a id="line.31">import javax.servlet.FilterConfig;</a>
<span class="sourceLineNo">032</span><a id="line.32">import javax.servlet.ServletException;</a>
<span class="sourceLineNo">033</span><a id="line.33">import java.util.ArrayList;</a>
<span class="sourceLineNo">034</span><a id="line.34">import java.util.Collections;</a>
<span class="sourceLineNo">035</span><a id="line.35">import java.util.LinkedHashMap;</a>
<span class="sourceLineNo">036</span><a id="line.36">import java.util.List;</a>
<span class="sourceLineNo">037</span><a id="line.37">import java.util.Map;</a>
<span class="sourceLineNo">038</span><a id="line.38">import java.util.Set;</a>
<span class="sourceLineNo">039</span><a id="line.39"></a>
<span class="sourceLineNo">040</span><a id="line.40">/**</a>
<span class="sourceLineNo">041</span><a id="line.41"> * Default {@link FilterChainManager} implementation maintaining a map of {@link Filter Filter} instances</a>
<span class="sourceLineNo">042</span><a id="line.42"> * (key: filter name, value: Filter) as well as a map of {@link NamedFilterList NamedFilterList}s created from these</a>
<span class="sourceLineNo">043</span><a id="line.43"> * {@code Filter}s (key: filter chain name, value: NamedFilterList).  The {@code NamedFilterList} is essentially a</a>
<span class="sourceLineNo">044</span><a id="line.44"> * {@link FilterChain} that also has a name property by which it can be looked up.</a>
<span class="sourceLineNo">045</span><a id="line.45"> *</a>
<span class="sourceLineNo">046</span><a id="line.46"> * @see NamedFilterList</a>
<span class="sourceLineNo">047</span><a id="line.47"> * @since 1.0</a>
<span class="sourceLineNo">048</span><a id="line.48"> */</a>
<span class="sourceLineNo">049</span><a id="line.49">public class DefaultFilterChainManager implements FilterChainManager {</a>
<span class="sourceLineNo">050</span><a id="line.50"></a>
<span class="sourceLineNo">051</span><a id="line.51">    private static transient final Logger log = LoggerFactory.getLogger(DefaultFilterChainManager.class);</a>
<span class="sourceLineNo">052</span><a id="line.52"></a>
<span class="sourceLineNo">053</span><a id="line.53">    private FilterConfig filterConfig;</a>
<span class="sourceLineNo">054</span><a id="line.54"></a>
<span class="sourceLineNo">055</span><a id="line.55">    private Map&lt;String, Filter&gt; filters; //pool of filters available for creating chains</a>
<span class="sourceLineNo">056</span><a id="line.56"></a>
<span class="sourceLineNo">057</span><a id="line.57">    private List&lt;String&gt; globalFilterNames; // list of filters to prepend to every chain</a>
<span class="sourceLineNo">058</span><a id="line.58"></a>
<span class="sourceLineNo">059</span><a id="line.59">    private Map&lt;String, NamedFilterList&gt; filterChains; //key: chain name, value: chain</a>
<span class="sourceLineNo">060</span><a id="line.60"></a>
<span class="sourceLineNo">061</span><a id="line.61">    public DefaultFilterChainManager() {</a>
<span class="sourceLineNo">062</span><a id="line.62">        this.filters = new LinkedHashMap&lt;String, Filter&gt;();</a>
<span class="sourceLineNo">063</span><a id="line.63">        this.filterChains = new LinkedHashMap&lt;String, NamedFilterList&gt;();</a>
<span class="sourceLineNo">064</span><a id="line.64">        this.globalFilterNames = new ArrayList&lt;&gt;();</a>
<span class="sourceLineNo">065</span><a id="line.65">        addDefaultFilters(false);</a>
<span class="sourceLineNo">066</span><a id="line.66">    }</a>
<span class="sourceLineNo">067</span><a id="line.67"></a>
<span class="sourceLineNo">068</span><a id="line.68">    public DefaultFilterChainManager(FilterConfig filterConfig) {</a>
<span class="sourceLineNo">069</span><a id="line.69">        this.filters = new LinkedHashMap&lt;String, Filter&gt;();</a>
<span class="sourceLineNo">070</span><a id="line.70">        this.filterChains = new LinkedHashMap&lt;String, NamedFilterList&gt;();</a>
<span class="sourceLineNo">071</span><a id="line.71">        this.globalFilterNames = new ArrayList&lt;&gt;();</a>
<span class="sourceLineNo">072</span><a id="line.72">        setFilterConfig(filterConfig);</a>
<span class="sourceLineNo">073</span><a id="line.73">        addDefaultFilters(true);</a>
<span class="sourceLineNo">074</span><a id="line.74">    }</a>
<span class="sourceLineNo">075</span><a id="line.75"></a>
<span class="sourceLineNo">076</span><a id="line.76">    /**</a>
<span class="sourceLineNo">077</span><a id="line.77">     * Returns the {@code FilterConfig} provided by the Servlet container at webapp startup.</a>
<span class="sourceLineNo">078</span><a id="line.78">     *</a>
<span class="sourceLineNo">079</span><a id="line.79">     * @return the {@code FilterConfig} provided by the Servlet container at webapp startup.</a>
<span class="sourceLineNo">080</span><a id="line.80">     */</a>
<span class="sourceLineNo">081</span><a id="line.81">    public FilterConfig getFilterConfig() {</a>
<span class="sourceLineNo">082</span><a id="line.82">        return filterConfig;</a>
<span class="sourceLineNo">083</span><a id="line.83">    }</a>
<span class="sourceLineNo">084</span><a id="line.84"></a>
<span class="sourceLineNo">085</span><a id="line.85">    /**</a>
<span class="sourceLineNo">086</span><a id="line.86">     * Sets the {@code FilterConfig} provided by the Servlet container at webapp startup.</a>
<span class="sourceLineNo">087</span><a id="line.87">     *</a>
<span class="sourceLineNo">088</span><a id="line.88">     * @param filterConfig the {@code FilterConfig} provided by the Servlet container at webapp startup.</a>
<span class="sourceLineNo">089</span><a id="line.89">     */</a>
<span class="sourceLineNo">090</span><a id="line.90">    public void setFilterConfig(FilterConfig filterConfig) {</a>
<span class="sourceLineNo">091</span><a id="line.91">        this.filterConfig = filterConfig;</a>
<span class="sourceLineNo">092</span><a id="line.92">    }</a>
<span class="sourceLineNo">093</span><a id="line.93"></a>
<span class="sourceLineNo">094</span><a id="line.94">    public Map&lt;String, Filter&gt; getFilters() {</a>
<span class="sourceLineNo">095</span><a id="line.95">        return filters;</a>
<span class="sourceLineNo">096</span><a id="line.96">    }</a>
<span class="sourceLineNo">097</span><a id="line.97"></a>
<span class="sourceLineNo">098</span><a id="line.98">    @SuppressWarnings({"UnusedDeclaration"})</a>
<span class="sourceLineNo">099</span><a id="line.99">    public void setFilters(Map&lt;String, Filter&gt; filters) {</a>
<span class="sourceLineNo">100</span><a id="line.100">        this.filters = filters;</a>
<span class="sourceLineNo">101</span><a id="line.101">    }</a>
<span class="sourceLineNo">102</span><a id="line.102"></a>
<span class="sourceLineNo">103</span><a id="line.103">    public Map&lt;String, NamedFilterList&gt; getFilterChains() {</a>
<span class="sourceLineNo">104</span><a id="line.104">        return filterChains;</a>
<span class="sourceLineNo">105</span><a id="line.105">    }</a>
<span class="sourceLineNo">106</span><a id="line.106"></a>
<span class="sourceLineNo">107</span><a id="line.107">    @SuppressWarnings({"UnusedDeclaration"})</a>
<span class="sourceLineNo">108</span><a id="line.108">    public void setFilterChains(Map&lt;String, NamedFilterList&gt; filterChains) {</a>
<span class="sourceLineNo">109</span><a id="line.109">        this.filterChains = filterChains;</a>
<span class="sourceLineNo">110</span><a id="line.110">    }</a>
<span class="sourceLineNo">111</span><a id="line.111"></a>
<span class="sourceLineNo">112</span><a id="line.112">    public Filter getFilter(String name) {</a>
<span class="sourceLineNo">113</span><a id="line.113">        return this.filters.get(name);</a>
<span class="sourceLineNo">114</span><a id="line.114">    }</a>
<span class="sourceLineNo">115</span><a id="line.115"></a>
<span class="sourceLineNo">116</span><a id="line.116">    public void addFilter(String name, Filter filter) {</a>
<span class="sourceLineNo">117</span><a id="line.117">        addFilter(name, filter, false);</a>
<span class="sourceLineNo">118</span><a id="line.118">    }</a>
<span class="sourceLineNo">119</span><a id="line.119"></a>
<span class="sourceLineNo">120</span><a id="line.120">    public void addFilter(String name, Filter filter, boolean init) {</a>
<span class="sourceLineNo">121</span><a id="line.121">        addFilter(name, filter, init, true);</a>
<span class="sourceLineNo">122</span><a id="line.122">    }</a>
<span class="sourceLineNo">123</span><a id="line.123"></a>
<span class="sourceLineNo">124</span><a id="line.124">    public void createDefaultChain(String chainName) {</a>
<span class="sourceLineNo">125</span><a id="line.125">        // only create the defaultChain if we don't have a chain with this name already</a>
<span class="sourceLineNo">126</span><a id="line.126">        // (the global filters will already be in that chain)</a>
<span class="sourceLineNo">127</span><a id="line.127">        if (!getChainNames().contains(chainName) &amp;&amp; !CollectionUtils.isEmpty(globalFilterNames)) {</a>
<span class="sourceLineNo">128</span><a id="line.128">            // add each of global filters</a>
<span class="sourceLineNo">129</span><a id="line.129">            globalFilterNames.stream().forEach(filterName -&gt; addToChain(chainName, filterName));</a>
<span class="sourceLineNo">130</span><a id="line.130">        }</a>
<span class="sourceLineNo">131</span><a id="line.131">    }</a>
<span class="sourceLineNo">132</span><a id="line.132"></a>
<span class="sourceLineNo">133</span><a id="line.133">    public void createChain(String chainName, String chainDefinition) {</a>
<span class="sourceLineNo">134</span><a id="line.134">        if (!StringUtils.hasText(chainName)) {</a>
<span class="sourceLineNo">135</span><a id="line.135">            throw new NullPointerException("chainName cannot be null or empty.");</a>
<span class="sourceLineNo">136</span><a id="line.136">        }</a>
<span class="sourceLineNo">137</span><a id="line.137">        if (!StringUtils.hasText(chainDefinition)) {</a>
<span class="sourceLineNo">138</span><a id="line.138">            throw new NullPointerException("chainDefinition cannot be null or empty.");</a>
<span class="sourceLineNo">139</span><a id="line.139">        }</a>
<span class="sourceLineNo">140</span><a id="line.140"></a>
<span class="sourceLineNo">141</span><a id="line.141">        if (log.isDebugEnabled()) {</a>
<span class="sourceLineNo">142</span><a id="line.142">            log.debug("Creating chain [" + chainName + "] with global filters " + globalFilterNames + " and from String definition [" + chainDefinition + "]");</a>
<span class="sourceLineNo">143</span><a id="line.143">        }</a>
<span class="sourceLineNo">144</span><a id="line.144"></a>
<span class="sourceLineNo">145</span><a id="line.145">        // first add each of global filters</a>
<span class="sourceLineNo">146</span><a id="line.146">        if (!CollectionUtils.isEmpty(globalFilterNames)) {</a>
<span class="sourceLineNo">147</span><a id="line.147">            globalFilterNames.stream().forEach(filterName -&gt; addToChain(chainName, filterName));</a>
<span class="sourceLineNo">148</span><a id="line.148">        }</a>
<span class="sourceLineNo">149</span><a id="line.149"></a>
<span class="sourceLineNo">150</span><a id="line.150">        //parse the value by tokenizing it to get the resulting filter-specific config entries</a>
<span class="sourceLineNo">151</span><a id="line.151">        //</a>
<span class="sourceLineNo">152</span><a id="line.152">        //e.g. for a value of</a>
<span class="sourceLineNo">153</span><a id="line.153">        //</a>
<span class="sourceLineNo">154</span><a id="line.154">        //     "authc, roles[admin,user], perms[file:edit]"</a>
<span class="sourceLineNo">155</span><a id="line.155">        //</a>
<span class="sourceLineNo">156</span><a id="line.156">        // the resulting token array would equal</a>
<span class="sourceLineNo">157</span><a id="line.157">        //</a>
<span class="sourceLineNo">158</span><a id="line.158">        //     { "authc", "roles[admin,user]", "perms[file:edit]" }</a>
<span class="sourceLineNo">159</span><a id="line.159">        //</a>
<span class="sourceLineNo">160</span><a id="line.160">        String[] filterTokens = splitChainDefinition(chainDefinition);</a>
<span class="sourceLineNo">161</span><a id="line.161"></a>
<span class="sourceLineNo">162</span><a id="line.162">        //each token is specific to each filter.</a>
<span class="sourceLineNo">163</span><a id="line.163">        //strip the name and extract any filter-specific config between brackets [ ]</a>
<span class="sourceLineNo">164</span><a id="line.164">        for (String token : filterTokens) {</a>
<span class="sourceLineNo">165</span><a id="line.165">            String[] nameConfigPair = toNameConfigPair(token);</a>
<span class="sourceLineNo">166</span><a id="line.166"></a>
<span class="sourceLineNo">167</span><a id="line.167">            //now we have the filter name, path and (possibly null) path-specific config.  Let's apply them:</a>
<span class="sourceLineNo">168</span><a id="line.168">            addToChain(chainName, nameConfigPair[0], nameConfigPair[1]);</a>
<span class="sourceLineNo">169</span><a id="line.169">        }</a>
<span class="sourceLineNo">170</span><a id="line.170">    }</a>
<span class="sourceLineNo">171</span><a id="line.171"></a>
<span class="sourceLineNo">172</span><a id="line.172">    /**</a>
<span class="sourceLineNo">173</span><a id="line.173">     * Splits the comma-delimited filter chain definition line into individual filter definition tokens.</a>
<span class="sourceLineNo">174</span><a id="line.174">     * &lt;p/&gt;</a>
<span class="sourceLineNo">175</span><a id="line.175">     * Example Input:</a>
<span class="sourceLineNo">176</span><a id="line.176">     * &lt;pre&gt;</a>
<span class="sourceLineNo">177</span><a id="line.177">     *     foo, bar[baz], blah[x, y]</a>
<span class="sourceLineNo">178</span><a id="line.178">     * &lt;/pre&gt;</a>
<span class="sourceLineNo">179</span><a id="line.179">     * Resulting Output:</a>
<span class="sourceLineNo">180</span><a id="line.180">     * &lt;pre&gt;</a>
<span class="sourceLineNo">181</span><a id="line.181">     *     output[0] == foo</a>
<span class="sourceLineNo">182</span><a id="line.182">     *     output[1] == bar[baz]</a>
<span class="sourceLineNo">183</span><a id="line.183">     *     output[2] == blah[x, y]</a>
<span class="sourceLineNo">184</span><a id="line.184">     * &lt;/pre&gt;</a>
<span class="sourceLineNo">185</span><a id="line.185">     * @param chainDefinition the comma-delimited filter chain definition.</a>
<span class="sourceLineNo">186</span><a id="line.186">     * @return an array of filter definition tokens</a>
<span class="sourceLineNo">187</span><a id="line.187">     * @since 1.2</a>
<span class="sourceLineNo">188</span><a id="line.188">     * @see &lt;a href="https://issues.apache.org/jira/browse/SHIRO-205"&gt;SHIRO-205&lt;/a&gt;</a>
<span class="sourceLineNo">189</span><a id="line.189">     */</a>
<span class="sourceLineNo">190</span><a id="line.190">    protected String[] splitChainDefinition(String chainDefinition) {</a>
<span class="sourceLineNo">191</span><a id="line.191">        return StringUtils.split(chainDefinition, StringUtils.DEFAULT_DELIMITER_CHAR, '[', ']', true, true);</a>
<span class="sourceLineNo">192</span><a id="line.192">    }</a>
<span class="sourceLineNo">193</span><a id="line.193"></a>
<span class="sourceLineNo">194</span><a id="line.194">    /**</a>
<span class="sourceLineNo">195</span><a id="line.195">     * Based on the given filter chain definition token (e.g. 'foo' or 'foo[bar, baz]'), this will return the token</a>
<span class="sourceLineNo">196</span><a id="line.196">     * as a name/value pair, removing any brackets as necessary.  Examples:</a>
<span class="sourceLineNo">197</span><a id="line.197">     * &lt;table&gt;</a>
<span class="sourceLineNo">198</span><a id="line.198">     *     &lt;tr&gt;</a>
<span class="sourceLineNo">199</span><a id="line.199">     *         &lt;th&gt;Input&lt;/th&gt;</a>
<span class="sourceLineNo">200</span><a id="line.200">     *         &lt;th&gt;Result&lt;/th&gt;</a>
<span class="sourceLineNo">201</span><a id="line.201">     *     &lt;/tr&gt;</a>
<span class="sourceLineNo">202</span><a id="line.202">     *     &lt;tr&gt;</a>
<span class="sourceLineNo">203</span><a id="line.203">     *         &lt;td&gt;{@code foo}&lt;/td&gt;</a>
<span class="sourceLineNo">204</span><a id="line.204">     *         &lt;td&gt;returned[0] == {@code foo}&lt;br/&gt;returned[1] == {@code null}&lt;/td&gt;</a>
<span class="sourceLineNo">205</span><a id="line.205">     *     &lt;/tr&gt;</a>
<span class="sourceLineNo">206</span><a id="line.206">     *     &lt;tr&gt;</a>
<span class="sourceLineNo">207</span><a id="line.207">     *         &lt;td&gt;{@code foo[bar, baz]}&lt;/td&gt;</a>
<span class="sourceLineNo">208</span><a id="line.208">     *         &lt;td&gt;returned[0] == {@code foo}&lt;br/&gt;returned[1] == {@code bar, baz}&lt;/td&gt;</a>
<span class="sourceLineNo">209</span><a id="line.209">     *     &lt;/tr&gt;</a>
<span class="sourceLineNo">210</span><a id="line.210">     * &lt;/table&gt;</a>
<span class="sourceLineNo">211</span><a id="line.211">     * @param token the filter chain definition token</a>
<span class="sourceLineNo">212</span><a id="line.212">     * @return A name/value pair representing the filter name and a (possibly null) config value.</a>
<span class="sourceLineNo">213</span><a id="line.213">     * @throws ConfigurationException if the token cannot be parsed</a>
<span class="sourceLineNo">214</span><a id="line.214">     * @since 1.2</a>
<span class="sourceLineNo">215</span><a id="line.215">     * @see &lt;a href="https://issues.apache.org/jira/browse/SHIRO-205"&gt;SHIRO-205&lt;/a&gt;</a>
<span class="sourceLineNo">216</span><a id="line.216">     */</a>
<span class="sourceLineNo">217</span><a id="line.217">    protected String[] toNameConfigPair(String token) throws ConfigurationException {</a>
<span class="sourceLineNo">218</span><a id="line.218"></a>
<span class="sourceLineNo">219</span><a id="line.219">        try {</a>
<span class="sourceLineNo">220</span><a id="line.220">            String[] pair = token.split("\\[", 2);</a>
<span class="sourceLineNo">221</span><a id="line.221">            String name = StringUtils.clean(pair[0]);</a>
<span class="sourceLineNo">222</span><a id="line.222"></a>
<span class="sourceLineNo">223</span><a id="line.223">            if (name == null) {</a>
<span class="sourceLineNo">224</span><a id="line.224">                throw new IllegalArgumentException("Filter name not found for filter chain definition token: " + token);</a>
<span class="sourceLineNo">225</span><a id="line.225">            }</a>
<span class="sourceLineNo">226</span><a id="line.226">            String config = null;</a>
<span class="sourceLineNo">227</span><a id="line.227"></a>
<span class="sourceLineNo">228</span><a id="line.228">            if (pair.length == 2) {</a>
<span class="sourceLineNo">229</span><a id="line.229">                config = StringUtils.clean(pair[1]);</a>
<span class="sourceLineNo">230</span><a id="line.230">                //if there was an open bracket, it assumed there is a closing bracket, so strip it too:</a>
<span class="sourceLineNo">231</span><a id="line.231">                config = config.substring(0, config.length() - 1);</a>
<span class="sourceLineNo">232</span><a id="line.232">                config = StringUtils.clean(config);</a>
<span class="sourceLineNo">233</span><a id="line.233"></a>
<span class="sourceLineNo">234</span><a id="line.234">                //backwards compatibility prior to implementing SHIRO-205:</a>
<span class="sourceLineNo">235</span><a id="line.235">                //prior to SHIRO-205 being implemented, it was common for end-users to quote the config inside brackets</a>
<span class="sourceLineNo">236</span><a id="line.236">                //if that config required commas.  We need to strip those quotes to get to the interior quoted definition</a>
<span class="sourceLineNo">237</span><a id="line.237">                //to ensure any existing quoted definitions still function for end users:</a>
<span class="sourceLineNo">238</span><a id="line.238">                if (config != null &amp;&amp; config.startsWith("\"") &amp;&amp; config.endsWith("\"")) {</a>
<span class="sourceLineNo">239</span><a id="line.239">                    String stripped = config.substring(1, config.length() - 1);</a>
<span class="sourceLineNo">240</span><a id="line.240">                    stripped = StringUtils.clean(stripped);</a>
<span class="sourceLineNo">241</span><a id="line.241"></a>
<span class="sourceLineNo">242</span><a id="line.242">                    //if the stripped value does not have any internal quotes, we can assume that the entire config was</a>
<span class="sourceLineNo">243</span><a id="line.243">                    //quoted and we can use the stripped value.</a>
<span class="sourceLineNo">244</span><a id="line.244">                    if (stripped != null &amp;&amp; stripped.indexOf('"') == -1) {</a>
<span class="sourceLineNo">245</span><a id="line.245">                        config = stripped;</a>
<span class="sourceLineNo">246</span><a id="line.246">                    }</a>
<span class="sourceLineNo">247</span><a id="line.247">                    //else:</a>
<span class="sourceLineNo">248</span><a id="line.248">                    //the remaining config does have internal quotes, so we need to assume that each comma delimited</a>
<span class="sourceLineNo">249</span><a id="line.249">                    //pair might be quoted, in which case we need the leading and trailing quotes that we stripped</a>
<span class="sourceLineNo">250</span><a id="line.250">                    //So we ignore the stripped value.</a>
<span class="sourceLineNo">251</span><a id="line.251">                }</a>
<span class="sourceLineNo">252</span><a id="line.252">            }</a>
<span class="sourceLineNo">253</span><a id="line.253">            </a>
<span class="sourceLineNo">254</span><a id="line.254">            return new String[]{name, config};</a>
<span class="sourceLineNo">255</span><a id="line.255"></a>
<span class="sourceLineNo">256</span><a id="line.256">        } catch (Exception e) {</a>
<span class="sourceLineNo">257</span><a id="line.257">            String msg = "Unable to parse filter chain definition token: " + token;</a>
<span class="sourceLineNo">258</span><a id="line.258">            throw new ConfigurationException(msg, e);</a>
<span class="sourceLineNo">259</span><a id="line.259">        }</a>
<span class="sourceLineNo">260</span><a id="line.260">    }</a>
<span class="sourceLineNo">261</span><a id="line.261"></a>
<span class="sourceLineNo">262</span><a id="line.262">    protected void addFilter(String name, Filter filter, boolean init, boolean overwrite) {</a>
<span class="sourceLineNo">263</span><a id="line.263">        Filter existing = getFilter(name);</a>
<span class="sourceLineNo">264</span><a id="line.264">        if (existing == null || overwrite) {</a>
<span class="sourceLineNo">265</span><a id="line.265">            if (filter instanceof Nameable) {</a>
<span class="sourceLineNo">266</span><a id="line.266">                ((Nameable) filter).setName(name);</a>
<span class="sourceLineNo">267</span><a id="line.267">            }</a>
<span class="sourceLineNo">268</span><a id="line.268">            if (init) {</a>
<span class="sourceLineNo">269</span><a id="line.269">                initFilter(filter);</a>
<span class="sourceLineNo">270</span><a id="line.270">            }</a>
<span class="sourceLineNo">271</span><a id="line.271">            this.filters.put(name, filter);</a>
<span class="sourceLineNo">272</span><a id="line.272">        }</a>
<span class="sourceLineNo">273</span><a id="line.273">    }</a>
<span class="sourceLineNo">274</span><a id="line.274"></a>
<span class="sourceLineNo">275</span><a id="line.275">    public void addToChain(String chainName, String filterName) {</a>
<span class="sourceLineNo">276</span><a id="line.276">        addToChain(chainName, filterName, null);</a>
<span class="sourceLineNo">277</span><a id="line.277">    }</a>
<span class="sourceLineNo">278</span><a id="line.278"></a>
<span class="sourceLineNo">279</span><a id="line.279">    public void addToChain(String chainName, String filterName, String chainSpecificFilterConfig) {</a>
<span class="sourceLineNo">280</span><a id="line.280">        if (!StringUtils.hasText(chainName)) {</a>
<span class="sourceLineNo">281</span><a id="line.281">            throw new IllegalArgumentException("chainName cannot be null or empty.");</a>
<span class="sourceLineNo">282</span><a id="line.282">        }</a>
<span class="sourceLineNo">283</span><a id="line.283">        Filter filter = getFilter(filterName);</a>
<span class="sourceLineNo">284</span><a id="line.284">        if (filter == null) {</a>
<span class="sourceLineNo">285</span><a id="line.285">            throw new IllegalArgumentException("There is no filter with name '" + filterName +</a>
<span class="sourceLineNo">286</span><a id="line.286">                    "' to apply to chain [" + chainName + "] in the pool of available Filters.  Ensure a " +</a>
<span class="sourceLineNo">287</span><a id="line.287">                    "filter with that name/path has first been registered with the addFilter method(s).");</a>
<span class="sourceLineNo">288</span><a id="line.288">        }</a>
<span class="sourceLineNo">289</span><a id="line.289"></a>
<span class="sourceLineNo">290</span><a id="line.290">        applyChainConfig(chainName, filter, chainSpecificFilterConfig);</a>
<span class="sourceLineNo">291</span><a id="line.291"></a>
<span class="sourceLineNo">292</span><a id="line.292">        NamedFilterList chain = ensureChain(chainName);</a>
<span class="sourceLineNo">293</span><a id="line.293">        chain.add(filter);</a>
<span class="sourceLineNo">294</span><a id="line.294">    }</a>
<span class="sourceLineNo">295</span><a id="line.295"></a>
<span class="sourceLineNo">296</span><a id="line.296">    public void setGlobalFilters(List&lt;String&gt; globalFilterNames) throws ConfigurationException {</a>
<span class="sourceLineNo">297</span><a id="line.297">        // validate each filter name</a>
<span class="sourceLineNo">298</span><a id="line.298">        if (!CollectionUtils.isEmpty(globalFilterNames)) {</a>
<span class="sourceLineNo">299</span><a id="line.299">            for (String filterName : globalFilterNames) {</a>
<span class="sourceLineNo">300</span><a id="line.300">                Filter filter = filters.get(filterName);</a>
<span class="sourceLineNo">301</span><a id="line.301">                if (filter == null) {</a>
<span class="sourceLineNo">302</span><a id="line.302">                    throw new ConfigurationException("There is no filter with name '" + filterName +</a>
<span class="sourceLineNo">303</span><a id="line.303">                                                     "' to apply to the global filters in the pool of available Filters.  Ensure a " +</a>
<span class="sourceLineNo">304</span><a id="line.304">                                                     "filter with that name/path has first been registered with the addFilter method(s).");</a>
<span class="sourceLineNo">305</span><a id="line.305">                }</a>
<span class="sourceLineNo">306</span><a id="line.306">                this.globalFilterNames.add(filterName);</a>
<span class="sourceLineNo">307</span><a id="line.307">            }</a>
<span class="sourceLineNo">308</span><a id="line.308">        }</a>
<span class="sourceLineNo">309</span><a id="line.309">    }</a>
<span class="sourceLineNo">310</span><a id="line.310"></a>
<span class="sourceLineNo">311</span><a id="line.311">    protected void applyChainConfig(String chainName, Filter filter, String chainSpecificFilterConfig) {</a>
<span class="sourceLineNo">312</span><a id="line.312">        if (log.isDebugEnabled()) {</a>
<span class="sourceLineNo">313</span><a id="line.313">            log.debug("Attempting to apply path [" + chainName + "] to filter [" + filter + "] " +</a>
<span class="sourceLineNo">314</span><a id="line.314">                    "with config [" + chainSpecificFilterConfig + "]");</a>
<span class="sourceLineNo">315</span><a id="line.315">        }</a>
<span class="sourceLineNo">316</span><a id="line.316">        if (filter instanceof PathConfigProcessor) {</a>
<span class="sourceLineNo">317</span><a id="line.317">            ((PathConfigProcessor) filter).processPathConfig(chainName, chainSpecificFilterConfig);</a>
<span class="sourceLineNo">318</span><a id="line.318">        } else {</a>
<span class="sourceLineNo">319</span><a id="line.319">            if (StringUtils.hasText(chainSpecificFilterConfig)) {</a>
<span class="sourceLineNo">320</span><a id="line.320">                //they specified a filter configuration, but the Filter doesn't implement PathConfigProcessor</a>
<span class="sourceLineNo">321</span><a id="line.321">                //this is an erroneous config:</a>
<span class="sourceLineNo">322</span><a id="line.322">                String msg = "chainSpecificFilterConfig was specified, but the underlying " +</a>
<span class="sourceLineNo">323</span><a id="line.323">                        "Filter instance is not an 'instanceof' " +</a>
<span class="sourceLineNo">324</span><a id="line.324">                        PathConfigProcessor.class.getName() + ".  This is required if the filter is to accept " +</a>
<span class="sourceLineNo">325</span><a id="line.325">                        "chain-specific configuration.";</a>
<span class="sourceLineNo">326</span><a id="line.326">                throw new ConfigurationException(msg);</a>
<span class="sourceLineNo">327</span><a id="line.327">            }</a>
<span class="sourceLineNo">328</span><a id="line.328">        }</a>
<span class="sourceLineNo">329</span><a id="line.329">    }</a>
<span class="sourceLineNo">330</span><a id="line.330"></a>
<span class="sourceLineNo">331</span><a id="line.331">    protected NamedFilterList ensureChain(String chainName) {</a>
<span class="sourceLineNo">332</span><a id="line.332">        NamedFilterList chain = getChain(chainName);</a>
<span class="sourceLineNo">333</span><a id="line.333">        if (chain == null) {</a>
<span class="sourceLineNo">334</span><a id="line.334">            chain = new SimpleNamedFilterList(chainName);</a>
<span class="sourceLineNo">335</span><a id="line.335">            this.filterChains.put(chainName, chain);</a>
<span class="sourceLineNo">336</span><a id="line.336">        }</a>
<span class="sourceLineNo">337</span><a id="line.337">        return chain;</a>
<span class="sourceLineNo">338</span><a id="line.338">    }</a>
<span class="sourceLineNo">339</span><a id="line.339"></a>
<span class="sourceLineNo">340</span><a id="line.340">    public NamedFilterList getChain(String chainName) {</a>
<span class="sourceLineNo">341</span><a id="line.341">        return this.filterChains.get(chainName);</a>
<span class="sourceLineNo">342</span><a id="line.342">    }</a>
<span class="sourceLineNo">343</span><a id="line.343"></a>
<span class="sourceLineNo">344</span><a id="line.344">    public boolean hasChains() {</a>
<span class="sourceLineNo">345</span><a id="line.345">        return !CollectionUtils.isEmpty(this.filterChains);</a>
<span class="sourceLineNo">346</span><a id="line.346">    }</a>
<span class="sourceLineNo">347</span><a id="line.347"></a>
<span class="sourceLineNo">348</span><a id="line.348">    public Set&lt;String&gt; getChainNames() {</a>
<span class="sourceLineNo">349</span><a id="line.349">        //noinspection unchecked</a>
<span class="sourceLineNo">350</span><a id="line.350">        return this.filterChains != null ? this.filterChains.keySet() : Collections.EMPTY_SET;</a>
<span class="sourceLineNo">351</span><a id="line.351">    }</a>
<span class="sourceLineNo">352</span><a id="line.352"></a>
<span class="sourceLineNo">353</span><a id="line.353">    public FilterChain proxy(FilterChain original, String chainName) {</a>
<span class="sourceLineNo">354</span><a id="line.354">        NamedFilterList configured = getChain(chainName);</a>
<span class="sourceLineNo">355</span><a id="line.355">        if (configured == null) {</a>
<span class="sourceLineNo">356</span><a id="line.356">            String msg = "There is no configured chain under the name/key [" + chainName + "].";</a>
<span class="sourceLineNo">357</span><a id="line.357">            throw new IllegalArgumentException(msg);</a>
<span class="sourceLineNo">358</span><a id="line.358">        }</a>
<span class="sourceLineNo">359</span><a id="line.359">        return configured.proxy(original);</a>
<span class="sourceLineNo">360</span><a id="line.360">    }</a>
<span class="sourceLineNo">361</span><a id="line.361"></a>
<span class="sourceLineNo">362</span><a id="line.362">    /**</a>
<span class="sourceLineNo">363</span><a id="line.363">     * Initializes the filter by calling &lt;code&gt;filter.init( {@link #getFilterConfig() getFilterConfig()} );&lt;/code&gt;.</a>
<span class="sourceLineNo">364</span><a id="line.364">     *</a>
<span class="sourceLineNo">365</span><a id="line.365">     * @param filter the filter to initialize with the {@code FilterConfig}.</a>
<span class="sourceLineNo">366</span><a id="line.366">     */</a>
<span class="sourceLineNo">367</span><a id="line.367">    protected void initFilter(Filter filter) {</a>
<span class="sourceLineNo">368</span><a id="line.368">        FilterConfig filterConfig = getFilterConfig();</a>
<span class="sourceLineNo">369</span><a id="line.369">        if (filterConfig == null) {</a>
<span class="sourceLineNo">370</span><a id="line.370">            throw new IllegalStateException("FilterConfig attribute has not been set.  This must occur before filter " +</a>
<span class="sourceLineNo">371</span><a id="line.371">                    "initialization can occur.");</a>
<span class="sourceLineNo">372</span><a id="line.372">        }</a>
<span class="sourceLineNo">373</span><a id="line.373">        try {</a>
<span class="sourceLineNo">374</span><a id="line.374">            filter.init(filterConfig);</a>
<span class="sourceLineNo">375</span><a id="line.375">        } catch (ServletException e) {</a>
<span class="sourceLineNo">376</span><a id="line.376">            throw new ConfigurationException(e);</a>
<span class="sourceLineNo">377</span><a id="line.377">        }</a>
<span class="sourceLineNo">378</span><a id="line.378">    }</a>
<span class="sourceLineNo">379</span><a id="line.379"></a>
<span class="sourceLineNo">380</span><a id="line.380">    protected void addDefaultFilters(boolean init) {</a>
<span class="sourceLineNo">381</span><a id="line.381">        for (DefaultFilter defaultFilter : DefaultFilter.values()) {</a>
<span class="sourceLineNo">382</span><a id="line.382">            addFilter(defaultFilter.name(), defaultFilter.newInstance(), init, false);</a>
<span class="sourceLineNo">383</span><a id="line.383">        }</a>
<span class="sourceLineNo">384</span><a id="line.384">    }</a>
<span class="sourceLineNo">385</span><a id="line.385">}</a>




























































</pre>
</div>
</main>
</body>
</html>
