You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ed...@apache.org on 2009/04/17 15:25:08 UTC
svn commit: r765990 - in
/mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http:
HttpAuthenticationMethods.java HttpSmartProxyHandler.java
Author: edeoliveira
Date: Fri Apr 17 13:25:08 2009
New Revision: 765990
URL: http://svn.apache.org/viewvc?rev=765990&view=rev
Log:
Added javadoc & fixed the prefered authentication mechanism feature
Modified:
mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpAuthenticationMethods.java
mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpSmartProxyHandler.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpAuthenticationMethods.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpAuthenticationMethods.java?rev=765990&r1=765989&r2=765990&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpAuthenticationMethods.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpAuthenticationMethods.java Fri Apr 17 13:25:08 2009
@@ -58,22 +58,33 @@
* @return a new logic handler
*/
public AbstractAuthLogicHandler getNewHandler(ProxyIoSession proxyIoSession)
- throws ProxyAuthException {
- switch (this) {
- case BASIC:
- return new HttpBasicAuthLogicHandler(proxyIoSession);
-
- case DIGEST:
- return new HttpDigestAuthLogicHandler(proxyIoSession);
-
- case NTLM:
- return new HttpNTLMAuthLogicHandler(proxyIoSession);
-
- case NO_AUTH:
- return new HttpNoAuthLogicHandler(proxyIoSession);
-
- default:
- return null;
- }
+ throws ProxyAuthException {
+ return getNewHandler(this.id, proxyIoSession);
}
+
+ /**
+ * Creates an {@link AbstractAuthLogicHandler} to handle the authentication mechanism.
+ *
+ * @param method the authentication mechanism to use
+ * @param proxyIoSession the proxy session object
+ * @return a new logic handler
+ */
+ public static AbstractAuthLogicHandler getNewHandler(
+ int method, ProxyIoSession proxyIoSession)
+ throws ProxyAuthException {
+
+ if (method == BASIC.id)
+ return new HttpBasicAuthLogicHandler(proxyIoSession);
+ else
+ if (method == DIGEST.id)
+ return new HttpDigestAuthLogicHandler(proxyIoSession);
+ else
+ if (method == NTLM.id)
+ return new HttpNTLMAuthLogicHandler(proxyIoSession);
+ else
+ if (method == NO_AUTH.id)
+ return new HttpNoAuthLogicHandler(proxyIoSession);
+ else
+ return null;
+ }
}
Modified: mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpSmartProxyHandler.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpSmartProxyHandler.java?rev=765990&r1=765989&r2=765990&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpSmartProxyHandler.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/proxy/handlers/http/HttpSmartProxyHandler.java Fri Apr 17 13:25:08 2009
@@ -31,7 +31,7 @@
import org.slf4j.LoggerFactory;
/**
- * HttpSmartProxyHandler.java - HTTP proxy handler that automatically handles forwarding request
+ * HttpSmartProxyHandler.java - HTTP proxy handler that automatically handles forwarding a request
* to the appropriate authentication mechanism logic handler.
*
* @author The Apache MINA Project (dev@mina.apache.org)
@@ -57,7 +57,9 @@
}
/**
- * Perform any handshaking processing.
+ * Performs the handshake processing.
+ *
+ * @param nextFilter the next filter
*/
public void doHandshake(final NextFilter nextFilter)
throws ProxyAuthException {
@@ -67,24 +69,23 @@
authHandler.doHandshake(nextFilter);
} else {
if (requestSent) {
+ // Safety check
throw new ProxyAuthException(
"Authentication request already sent");
}
logger.debug(" sending HTTP request");
- // Send request
+ // Compute request headers
HttpProxyRequest req = (HttpProxyRequest) getProxyIoSession()
.getRequest();
Map<String, List<String>> headers = req.getHeaders() != null ? req
.getHeaders() : new HashMap<String, List<String>>();
- StringUtilities.addValueToHeader(headers, "Keep-Alive",
- HttpProxyConstants.DEFAULT_KEEP_ALIVE_TIME, true);
- StringUtilities.addValueToHeader(headers, "Proxy-Connection",
- "keep-Alive", true);
+ AbstractAuthLogicHandler.addKeepAliveHeaders(headers);
req.setHeaders(headers);
+ // Write request to the proxy
writeRequest(nextFilter, req);
requestSent = true;
}
@@ -94,98 +95,105 @@
* Automatic selection of the authentication algorithm. If <code>preferedOrder</code> is set then
* algorithms are selected from the list order otherwise the algorithm tries to select the most
* secured algorithm available first.
+ *
+ * @param response the proxy response
*/
private void autoSelectAuthHandler(final HttpProxyResponse response)
- throws ProxyAuthException {
- // Get the Proxy-Authenticate header
- List<String> values = response.getHeaders().get("Proxy-Authenticate");
-
- if (values == null || values.size() == 0) {
- authHandler = HttpAuthenticationMethods.NO_AUTH
- .getNewHandler(getProxyIoSession());
-
- } else if (getProxyIoSession().getPreferedOrder() == null) {
- for (String proxyAuthHeader : values) {
- proxyAuthHeader = proxyAuthHeader.toLowerCase();
-
- try {
- // Test which auth mechanism to use. First found is the first used that's why we test
- // in a decreasing security quality order.
- if (proxyAuthHeader.contains("ntlm")) {
- authHandler = HttpAuthenticationMethods.NTLM
- .getNewHandler(getProxyIoSession());
- break;
- } else if (proxyAuthHeader.contains("digest")) {
- authHandler = HttpAuthenticationMethods.DIGEST
- .getNewHandler(getProxyIoSession());
- break;
- } else if (proxyAuthHeader.contains("basic")) {
- authHandler = HttpAuthenticationMethods.BASIC
- .getNewHandler(getProxyIoSession());
- break;
- }
- } catch (Exception ex) {
- logger.debug("Following exception occured:", ex);
- }
- }
-
- if (authHandler == null) {
- authHandler = HttpAuthenticationMethods.NO_AUTH
- .getNewHandler(getProxyIoSession());
- }
-
- } else {
- for (HttpAuthenticationMethods method : getProxyIoSession()
- .getPreferedOrder()) {
- if (authHandler != null) {
- break;
- }
-
- if (method == HttpAuthenticationMethods.NO_AUTH) {
- authHandler = HttpAuthenticationMethods.NO_AUTH
- .getNewHandler(getProxyIoSession());
- break;
- }
-
- for (String proxyAuthHeader : values) {
- proxyAuthHeader = proxyAuthHeader.toLowerCase();
-
- try {
- // test which auth mechanism to use
- if (proxyAuthHeader.contains("basic")
- && method == HttpAuthenticationMethods.BASIC) {
- authHandler = HttpAuthenticationMethods.BASIC
- .getNewHandler(getProxyIoSession());
- break;
- } else if (proxyAuthHeader.contains("digest")
- && method == HttpAuthenticationMethods.DIGEST) {
- authHandler = HttpAuthenticationMethods.DIGEST
- .getNewHandler(getProxyIoSession());
- break;
- } else if (proxyAuthHeader.contains("ntlm")
- && method == HttpAuthenticationMethods.NTLM) {
- authHandler = HttpAuthenticationMethods.NTLM
- .getNewHandler(getProxyIoSession());
- break;
- }
- } catch (Exception ex) {
- logger.debug("Following exception occured:", ex);
- }
- }
- }
-
- }
-
- if (authHandler == null) {
- throw new ProxyAuthException(
- "Unknown authentication mechanism(s): " + values);
- }
- }
+ throws ProxyAuthException {
+ // Get the Proxy-Authenticate header
+ List<String> values = response.getHeaders().get("Proxy-Authenticate");
+ ProxyIoSession proxyIoSession = getProxyIoSession();
+
+ if (values == null || values.size() == 0) {
+ authHandler = HttpAuthenticationMethods.NO_AUTH
+ .getNewHandler(proxyIoSession);
+
+ } else if (getProxyIoSession().getPreferedOrder() == null) {
+ // No preference order set for auth mechanisms
+ int method = -1;
+
+ // Test which auth mechanism to use. First found is the first used
+ // that's why we test in a decreasing security quality order.
+ for (String proxyAuthHeader : values) {
+ proxyAuthHeader = proxyAuthHeader.toLowerCase();
+
+ if (proxyAuthHeader.contains("ntlm")) {
+ method = HttpAuthenticationMethods.NTLM.getId();
+ break;
+ } else if (proxyAuthHeader.contains("digest")
+ && method != HttpAuthenticationMethods.NTLM.getId()) {
+ method = HttpAuthenticationMethods.DIGEST.getId();
+ } else if (proxyAuthHeader.contains("basic") && method == -1) {
+ method = HttpAuthenticationMethods.BASIC.getId();
+ }
+ }
+
+ if (method != -1) {
+ try {
+ authHandler = HttpAuthenticationMethods.getNewHandler(
+ method, proxyIoSession);
+ } catch (Exception ex) {
+ logger.debug("Following exception occured:", ex);
+ }
+ }
+
+ if (authHandler == null) {
+ authHandler = HttpAuthenticationMethods.NO_AUTH
+ .getNewHandler(proxyIoSession);
+ }
+
+ } else {
+ for (HttpAuthenticationMethods method : proxyIoSession
+ .getPreferedOrder()) {
+ if (authHandler != null) {
+ break;
+ }
+
+ if (method == HttpAuthenticationMethods.NO_AUTH) {
+ authHandler = HttpAuthenticationMethods.NO_AUTH
+ .getNewHandler(proxyIoSession);
+ break;
+ }
+
+ for (String proxyAuthHeader : values) {
+ proxyAuthHeader = proxyAuthHeader.toLowerCase();
+
+ try {
+ // test which auth mechanism to use
+ if (proxyAuthHeader.contains("basic")
+ && method == HttpAuthenticationMethods.BASIC) {
+ authHandler = HttpAuthenticationMethods.BASIC
+ .getNewHandler(proxyIoSession);
+ break;
+ } else if (proxyAuthHeader.contains("digest")
+ && method == HttpAuthenticationMethods.DIGEST) {
+ authHandler = HttpAuthenticationMethods.DIGEST
+ .getNewHandler(proxyIoSession);
+ break;
+ } else if (proxyAuthHeader.contains("ntlm")
+ && method == HttpAuthenticationMethods.NTLM) {
+ authHandler = HttpAuthenticationMethods.NTLM
+ .getNewHandler(proxyIoSession);
+ break;
+ }
+ } catch (Exception ex) {
+ logger.debug("Following exception occured:", ex);
+ }
+ }
+ }
+
+ }
+
+ if (authHandler == null) {
+ throw new ProxyAuthException(
+ "Unknown authentication mechanism(s): " + values);
+ }
+ }
/**
* Handle a HTTP response from the proxy server.
*
- * @param response The response.
+ * @param response The proxy response.
*/
@Override
public void handleResponse(final HttpProxyResponse response)
@@ -206,8 +214,8 @@
}
authHandler.handleResponse(response);
} else {
- throw new ProxyAuthException("Received error response code ("
- + response.getStatusLine() + ").");
+ throw new ProxyAuthException("Error: unexpected response code "
+ + response.getStatusLine() + " received from proxy.");
}
}
}
\ No newline at end of file