<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> *  Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> *  or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> *  distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> *  regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> *  to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> *  "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> *  with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *    http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> *  Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<span class="sourceLineNo">013</span> *  software distributed under the License is distributed on an<a name="line.13"></a>
<span class="sourceLineNo">014</span> *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<span class="sourceLineNo">015</span> *  KIND, either express or implied.  See the License for the<a name="line.15"></a>
<span class="sourceLineNo">016</span> *  specific language governing permissions and limitations<a name="line.16"></a>
<span class="sourceLineNo">017</span> *  under the License.<a name="line.17"></a>
<span class="sourceLineNo">018</span> *<a name="line.18"></a>
<span class="sourceLineNo">019</span> */<a name="line.19"></a>
<span class="sourceLineNo">020</span>package org.apache.mina.proxy.handlers.http.digest;<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.io.UnsupportedEncodingException;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.security.NoSuchAlgorithmException;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.security.SecureRandom;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.Arrays;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.Map;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.StringTokenizer;<a name="line.29"></a>
<span class="sourceLineNo">030</span><a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.mina.core.filterchain.IoFilter.NextFilter;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.mina.proxy.ProxyAuthException;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.mina.proxy.handlers.http.AbstractAuthLogicHandler;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.apache.mina.proxy.handlers.http.HttpProxyConstants;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.mina.proxy.handlers.http.HttpProxyRequest;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.apache.mina.proxy.handlers.http.HttpProxyResponse;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import org.apache.mina.proxy.session.ProxyIoSession;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import org.apache.mina.proxy.utils.StringUtilities;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import org.apache.mina.util.Base64;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import org.slf4j.Logger;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import org.slf4j.LoggerFactory;<a name="line.41"></a>
<span class="sourceLineNo">042</span><a name="line.42"></a>
<span class="sourceLineNo">043</span>/**<a name="line.43"></a>
<span class="sourceLineNo">044</span> * HttpDigestAuthLogicHandler.java - HTTP Digest authentication mechanism logic handler. <a name="line.44"></a>
<span class="sourceLineNo">045</span> * <a name="line.45"></a>
<span class="sourceLineNo">046</span> * @author &lt;a href="http://mina.apache.org"&gt;Apache MINA Project&lt;/a&gt;<a name="line.46"></a>
<span class="sourceLineNo">047</span> * @since MINA 2.0.0-M3<a name="line.47"></a>
<span class="sourceLineNo">048</span> */<a name="line.48"></a>
<span class="sourceLineNo">049</span>public class HttpDigestAuthLogicHandler extends AbstractAuthLogicHandler {<a name="line.49"></a>
<span class="sourceLineNo">050</span><a name="line.50"></a>
<span class="sourceLineNo">051</span>    private final static Logger logger = LoggerFactory.getLogger(HttpDigestAuthLogicHandler.class);<a name="line.51"></a>
<span class="sourceLineNo">052</span><a name="line.52"></a>
<span class="sourceLineNo">053</span>    /**<a name="line.53"></a>
<span class="sourceLineNo">054</span>     * The challenge directives provided by the server.<a name="line.54"></a>
<span class="sourceLineNo">055</span>     */<a name="line.55"></a>
<span class="sourceLineNo">056</span>    private HashMap&lt;String, String&gt; directives = null;<a name="line.56"></a>
<span class="sourceLineNo">057</span><a name="line.57"></a>
<span class="sourceLineNo">058</span>    /**<a name="line.58"></a>
<span class="sourceLineNo">059</span>     * The response received to the last request.<a name="line.59"></a>
<span class="sourceLineNo">060</span>     */<a name="line.60"></a>
<span class="sourceLineNo">061</span>    private HttpProxyResponse response;<a name="line.61"></a>
<span class="sourceLineNo">062</span><a name="line.62"></a>
<span class="sourceLineNo">063</span>    private static SecureRandom rnd;<a name="line.63"></a>
<span class="sourceLineNo">064</span><a name="line.64"></a>
<span class="sourceLineNo">065</span>    static {<a name="line.65"></a>
<span class="sourceLineNo">066</span>        // Initialize secure random generator <a name="line.66"></a>
<span class="sourceLineNo">067</span>        try {<a name="line.67"></a>
<span class="sourceLineNo">068</span>            rnd = SecureRandom.getInstance("SHA1PRNG");<a name="line.68"></a>
<span class="sourceLineNo">069</span>        } catch (NoSuchAlgorithmException e) {<a name="line.69"></a>
<span class="sourceLineNo">070</span>            throw new RuntimeException(e);<a name="line.70"></a>
<span class="sourceLineNo">071</span>        }<a name="line.71"></a>
<span class="sourceLineNo">072</span>    }<a name="line.72"></a>
<span class="sourceLineNo">073</span><a name="line.73"></a>
<span class="sourceLineNo">074</span>    public HttpDigestAuthLogicHandler(final ProxyIoSession proxyIoSession) throws ProxyAuthException {<a name="line.74"></a>
<span class="sourceLineNo">075</span>        super(proxyIoSession);<a name="line.75"></a>
<span class="sourceLineNo">076</span><a name="line.76"></a>
<span class="sourceLineNo">077</span>        ((HttpProxyRequest) request).checkRequiredProperties(HttpProxyConstants.USER_PROPERTY,<a name="line.77"></a>
<span class="sourceLineNo">078</span>                HttpProxyConstants.PWD_PROPERTY);<a name="line.78"></a>
<span class="sourceLineNo">079</span>    }<a name="line.79"></a>
<span class="sourceLineNo">080</span><a name="line.80"></a>
<span class="sourceLineNo">081</span>    @Override<a name="line.81"></a>
<span class="sourceLineNo">082</span>    public void doHandshake(NextFilter nextFilter) throws ProxyAuthException {<a name="line.82"></a>
<span class="sourceLineNo">083</span>        logger.debug(" doHandshake()");<a name="line.83"></a>
<span class="sourceLineNo">084</span><a name="line.84"></a>
<span class="sourceLineNo">085</span>        if (step &gt; 0 &amp;&amp; directives == null) {<a name="line.85"></a>
<span class="sourceLineNo">086</span>            throw new ProxyAuthException("Authentication challenge not received");<a name="line.86"></a>
<span class="sourceLineNo">087</span>        }<a name="line.87"></a>
<span class="sourceLineNo">088</span><a name="line.88"></a>
<span class="sourceLineNo">089</span>        HttpProxyRequest req = (HttpProxyRequest) request;<a name="line.89"></a>
<span class="sourceLineNo">090</span>        Map&lt;String, List&lt;String&gt;&gt; headers = req.getHeaders() != null ? req.getHeaders()<a name="line.90"></a>
<span class="sourceLineNo">091</span>                : new HashMap&lt;String, List&lt;String&gt;&gt;();<a name="line.91"></a>
<span class="sourceLineNo">092</span><a name="line.92"></a>
<span class="sourceLineNo">093</span>        if (step &gt; 0) {<a name="line.93"></a>
<span class="sourceLineNo">094</span>            logger.debug("  sending DIGEST challenge response");<a name="line.94"></a>
<span class="sourceLineNo">095</span><a name="line.95"></a>
<span class="sourceLineNo">096</span>            // Build a challenge response<a name="line.96"></a>
<span class="sourceLineNo">097</span>            HashMap&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<a name="line.97"></a>
<span class="sourceLineNo">098</span>            map.put("username", req.getProperties().get(HttpProxyConstants.USER_PROPERTY));<a name="line.98"></a>
<span class="sourceLineNo">099</span>            StringUtilities.copyDirective(directives, map, "realm");<a name="line.99"></a>
<span class="sourceLineNo">100</span>            StringUtilities.copyDirective(directives, map, "uri");<a name="line.100"></a>
<span class="sourceLineNo">101</span>            StringUtilities.copyDirective(directives, map, "opaque");<a name="line.101"></a>
<span class="sourceLineNo">102</span>            StringUtilities.copyDirective(directives, map, "nonce");<a name="line.102"></a>
<span class="sourceLineNo">103</span>            String algorithm = StringUtilities.copyDirective(directives, map, "algorithm");<a name="line.103"></a>
<span class="sourceLineNo">104</span><a name="line.104"></a>
<span class="sourceLineNo">105</span>            // Check for a supported algorithm<a name="line.105"></a>
<span class="sourceLineNo">106</span>            if (algorithm != null &amp;&amp; !"md5".equalsIgnoreCase(algorithm) &amp;&amp; !"md5-sess".equalsIgnoreCase(algorithm)) {<a name="line.106"></a>
<span class="sourceLineNo">107</span>                throw new ProxyAuthException("Unknown algorithm required by server");<a name="line.107"></a>
<span class="sourceLineNo">108</span>            }<a name="line.108"></a>
<span class="sourceLineNo">109</span><a name="line.109"></a>
<span class="sourceLineNo">110</span>            // Check for a supported qop<a name="line.110"></a>
<span class="sourceLineNo">111</span>            String qop = directives.get("qop");<a name="line.111"></a>
<span class="sourceLineNo">112</span>            if (qop != null) {<a name="line.112"></a>
<span class="sourceLineNo">113</span>                StringTokenizer st = new StringTokenizer(qop, ",");<a name="line.113"></a>
<span class="sourceLineNo">114</span>                String token = null;<a name="line.114"></a>
<span class="sourceLineNo">115</span><a name="line.115"></a>
<span class="sourceLineNo">116</span>                while (st.hasMoreTokens()) {<a name="line.116"></a>
<span class="sourceLineNo">117</span>                    String tk = st.nextToken();<a name="line.117"></a>
<span class="sourceLineNo">118</span>                    if ("auth".equalsIgnoreCase(token)) {<a name="line.118"></a>
<span class="sourceLineNo">119</span>                        break;<a name="line.119"></a>
<span class="sourceLineNo">120</span>                    }<a name="line.120"></a>
<span class="sourceLineNo">121</span><a name="line.121"></a>
<span class="sourceLineNo">122</span>                    int pos = Arrays.binarySearch(DigestUtilities.SUPPORTED_QOPS, tk);<a name="line.122"></a>
<span class="sourceLineNo">123</span>                    if (pos &gt; -1) {<a name="line.123"></a>
<span class="sourceLineNo">124</span>                        token = tk;<a name="line.124"></a>
<span class="sourceLineNo">125</span>                    }<a name="line.125"></a>
<span class="sourceLineNo">126</span>                }<a name="line.126"></a>
<span class="sourceLineNo">127</span><a name="line.127"></a>
<span class="sourceLineNo">128</span>                if (token != null) {<a name="line.128"></a>
<span class="sourceLineNo">129</span>                    map.put("qop", token);<a name="line.129"></a>
<span class="sourceLineNo">130</span><a name="line.130"></a>
<span class="sourceLineNo">131</span>                    byte[] nonce = new byte[8];<a name="line.131"></a>
<span class="sourceLineNo">132</span>                    rnd.nextBytes(nonce);<a name="line.132"></a>
<span class="sourceLineNo">133</span><a name="line.133"></a>
<span class="sourceLineNo">134</span>                    try {<a name="line.134"></a>
<span class="sourceLineNo">135</span>                        String cnonce = new String(Base64.encodeBase64(nonce), proxyIoSession.getCharsetName());<a name="line.135"></a>
<span class="sourceLineNo">136</span>                        map.put("cnonce", cnonce);<a name="line.136"></a>
<span class="sourceLineNo">137</span>                    } catch (UnsupportedEncodingException e) {<a name="line.137"></a>
<span class="sourceLineNo">138</span>                        throw new ProxyAuthException("Unable to encode cnonce", e);<a name="line.138"></a>
<span class="sourceLineNo">139</span>                    }<a name="line.139"></a>
<span class="sourceLineNo">140</span>                } else {<a name="line.140"></a>
<span class="sourceLineNo">141</span>                    throw new ProxyAuthException("No supported qop option available");<a name="line.141"></a>
<span class="sourceLineNo">142</span>                }<a name="line.142"></a>
<span class="sourceLineNo">143</span>            }<a name="line.143"></a>
<span class="sourceLineNo">144</span><a name="line.144"></a>
<span class="sourceLineNo">145</span>            map.put("nc", "00000001");<a name="line.145"></a>
<span class="sourceLineNo">146</span>            map.put("uri", req.getHttpURI());<a name="line.146"></a>
<span class="sourceLineNo">147</span><a name="line.147"></a>
<span class="sourceLineNo">148</span>            // Compute the response<a name="line.148"></a>
<span class="sourceLineNo">149</span>            try {<a name="line.149"></a>
<span class="sourceLineNo">150</span>                map.put("response", DigestUtilities.computeResponseValue(proxyIoSession.getSession(), map, req<a name="line.150"></a>
<span class="sourceLineNo">151</span>                        .getHttpVerb().toUpperCase(), req.getProperties().get(HttpProxyConstants.PWD_PROPERTY),<a name="line.151"></a>
<span class="sourceLineNo">152</span>                        proxyIoSession.getCharsetName(), response.getBody()));<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>            } catch (Exception e) {<a name="line.154"></a>
<span class="sourceLineNo">155</span>                throw new ProxyAuthException("Digest response computing failed", e);<a name="line.155"></a>
<span class="sourceLineNo">156</span>            }<a name="line.156"></a>
<span class="sourceLineNo">157</span><a name="line.157"></a>
<span class="sourceLineNo">158</span>            // Prepare the challenge response header and add it to the <a name="line.158"></a>
<span class="sourceLineNo">159</span>            // request we will send<a name="line.159"></a>
<span class="sourceLineNo">160</span>            StringBuilder sb = new StringBuilder("Digest ");<a name="line.160"></a>
<span class="sourceLineNo">161</span>            boolean addSeparator = false;<a name="line.161"></a>
<span class="sourceLineNo">162</span><a name="line.162"></a>
<span class="sourceLineNo">163</span>            for ( Map.Entry&lt;String, String&gt; entry : map.entrySet()) {<a name="line.163"></a>
<span class="sourceLineNo">164</span>                String key = entry.getKey();<a name="line.164"></a>
<span class="sourceLineNo">165</span><a name="line.165"></a>
<span class="sourceLineNo">166</span>                if (addSeparator) {<a name="line.166"></a>
<span class="sourceLineNo">167</span>                    sb.append(", ");<a name="line.167"></a>
<span class="sourceLineNo">168</span>                } else {<a name="line.168"></a>
<span class="sourceLineNo">169</span>                    addSeparator = true;<a name="line.169"></a>
<span class="sourceLineNo">170</span>                }<a name="line.170"></a>
<span class="sourceLineNo">171</span><a name="line.171"></a>
<span class="sourceLineNo">172</span>                boolean quotedValue = !"qop".equals(key) &amp;&amp; !"nc".equals(key);<a name="line.172"></a>
<span class="sourceLineNo">173</span>                sb.append(key);<a name="line.173"></a>
<span class="sourceLineNo">174</span>                <a name="line.174"></a>
<span class="sourceLineNo">175</span>                if (quotedValue) {<a name="line.175"></a>
<span class="sourceLineNo">176</span>                    sb.append("=\"").append(entry.getValue()).append('\"');<a name="line.176"></a>
<span class="sourceLineNo">177</span>                } else {<a name="line.177"></a>
<span class="sourceLineNo">178</span>                    sb.append('=').append(entry.getValue());<a name="line.178"></a>
<span class="sourceLineNo">179</span>                }<a name="line.179"></a>
<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
<span class="sourceLineNo">181</span><a name="line.181"></a>
<span class="sourceLineNo">182</span>            StringUtilities.addValueToHeader(headers, "Proxy-Authorization", sb.toString(), true);<a name="line.182"></a>
<span class="sourceLineNo">183</span>        }<a name="line.183"></a>
<span class="sourceLineNo">184</span><a name="line.184"></a>
<span class="sourceLineNo">185</span>        addKeepAliveHeaders(headers);<a name="line.185"></a>
<span class="sourceLineNo">186</span>        req.setHeaders(headers);<a name="line.186"></a>
<span class="sourceLineNo">187</span><a name="line.187"></a>
<span class="sourceLineNo">188</span>        writeRequest(nextFilter, req);<a name="line.188"></a>
<span class="sourceLineNo">189</span>        step++;<a name="line.189"></a>
<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
<span class="sourceLineNo">191</span><a name="line.191"></a>
<span class="sourceLineNo">192</span>    @Override<a name="line.192"></a>
<span class="sourceLineNo">193</span>    public void handleResponse(final HttpProxyResponse response) throws ProxyAuthException {<a name="line.193"></a>
<span class="sourceLineNo">194</span>        this.response = response;<a name="line.194"></a>
<span class="sourceLineNo">195</span><a name="line.195"></a>
<span class="sourceLineNo">196</span>        if (step == 0) {<a name="line.196"></a>
<span class="sourceLineNo">197</span>            if (response.getStatusCode() != 401 &amp;&amp; response.getStatusCode() != 407) {<a name="line.197"></a>
<span class="sourceLineNo">198</span>                throw new ProxyAuthException("Received unexpected response code (" + response.getStatusLine() + ").");<a name="line.198"></a>
<span class="sourceLineNo">199</span>            }<a name="line.199"></a>
<span class="sourceLineNo">200</span><a name="line.200"></a>
<span class="sourceLineNo">201</span>            // Header should look like this<a name="line.201"></a>
<span class="sourceLineNo">202</span>            // Proxy-Authenticate: Digest still_some_more_stuff<a name="line.202"></a>
<span class="sourceLineNo">203</span>            List&lt;String&gt; values = response.getHeaders().get("Proxy-Authenticate");<a name="line.203"></a>
<span class="sourceLineNo">204</span>            String challengeResponse = null;<a name="line.204"></a>
<span class="sourceLineNo">205</span><a name="line.205"></a>
<span class="sourceLineNo">206</span>            for (String s : values) {<a name="line.206"></a>
<span class="sourceLineNo">207</span>                if (s.startsWith("Digest")) {<a name="line.207"></a>
<span class="sourceLineNo">208</span>                    challengeResponse = s;<a name="line.208"></a>
<span class="sourceLineNo">209</span>                    break;<a name="line.209"></a>
<span class="sourceLineNo">210</span>                }<a name="line.210"></a>
<span class="sourceLineNo">211</span>            }<a name="line.211"></a>
<span class="sourceLineNo">212</span><a name="line.212"></a>
<span class="sourceLineNo">213</span>            if (challengeResponse == null) {<a name="line.213"></a>
<span class="sourceLineNo">214</span>                throw new ProxyAuthException("Server doesn't support digest authentication method !");<a name="line.214"></a>
<span class="sourceLineNo">215</span>            }<a name="line.215"></a>
<span class="sourceLineNo">216</span><a name="line.216"></a>
<span class="sourceLineNo">217</span>            try {<a name="line.217"></a>
<span class="sourceLineNo">218</span>                directives = StringUtilities.parseDirectives(challengeResponse.substring(7).getBytes(<a name="line.218"></a>
<span class="sourceLineNo">219</span>                        proxyIoSession.getCharsetName()));<a name="line.219"></a>
<span class="sourceLineNo">220</span>            } catch (Exception e) {<a name="line.220"></a>
<span class="sourceLineNo">221</span>                throw new ProxyAuthException("Parsing of server digest directives failed", e);<a name="line.221"></a>
<span class="sourceLineNo">222</span>            }<a name="line.222"></a>
<span class="sourceLineNo">223</span>            step = 1;<a name="line.223"></a>
<span class="sourceLineNo">224</span>        } else {<a name="line.224"></a>
<span class="sourceLineNo">225</span>            throw new ProxyAuthException("Received unexpected response code (" + response.getStatusLine() + ").");<a name="line.225"></a>
<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
<span class="sourceLineNo">228</span>}<a name="line.228"></a>




























































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