You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ol...@apache.org on 2005/04/08 01:03:44 UTC
svn commit: r160490 - in jakarta/commons/proper/httpclient/trunk/src:
java/org/apache/commons/httpclient/HttpMethodDirector.java
java/org/apache/commons/httpclient/auth/AuthState.java
test/org/apache/commons/httpclient/auth/TestNTLMAuth.java
Author: olegk
Date: Thu Apr 7 16:03:43 2005
New Revision: 160490
URL: http://svn.apache.org/viewcvs?view=rev&rev=160490
Log:
PR #34255 (Preemptive authentication causes NTLM auth scheme to fail)
Contributed by Michael Becke & Oleg Kalnichevski
Reviewed by Ortwin Glück
Modified:
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java
jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestNTLMAuth.java
Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java?view=diff&r1=160489&r2=160490
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/HttpMethodDirector.java Thu Apr 7 16:03:43 2005
@@ -665,6 +665,7 @@
AuthState authstate = method.getHostAuthState();
if (authstate.isPreemptive()) {
authstate.invalidate();
+ authstate.setAuthRequested(true);
}
Map challenges = AuthChallengeParser.parseChallenges(
method.getResponseHeaders(WWW_AUTH_CHALLENGE));
@@ -732,6 +733,7 @@
AuthState authstate = method.getProxyAuthState();
if (authstate.isPreemptive()) {
authstate.invalidate();
+ authstate.setAuthRequested(true);
}
Map proxyChallenges = AuthChallengeParser.parseChallenges(
method.getResponseHeaders(PROXY_AUTH_CHALLENGE));
Modified: jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java?view=diff&r1=160489&r2=160490
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/java/org/apache/commons/httpclient/auth/AuthState.java Thu Apr 7 16:03:43 2005
@@ -160,4 +160,22 @@
return null;
}
}
+
+ public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("Auth state: auth requested [");
+ buffer.append(this.authRequested);
+ buffer.append("]; auth attempted [");
+ buffer.append(this.authAttempted);
+ if (this.authScheme != null) {
+ buffer.append("]; auth scheme [");
+ buffer.append(this.authScheme.getSchemeName());
+ buffer.append("]; realm [");
+ buffer.append(this.authScheme.getRealm());
+ }
+ buffer.append("] preemptive [");
+ buffer.append(this.preemptive);
+ buffer.append("]");
+ return buffer.toString();
+ }
}
Modified: jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestNTLMAuth.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestNTLMAuth.java?view=diff&r1=160489&r2=160490
==============================================================================
--- jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestNTLMAuth.java (original)
+++ jakarta/commons/proper/httpclient/trunk/src/test/org/apache/commons/httpclient/auth/TestNTLMAuth.java Thu Apr 7 16:03:43 2005
@@ -31,19 +31,19 @@
import java.io.IOException;
import junit.framework.Test;
-import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.commons.httpclient.FakeHttpMethod;
import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpClientTestBase;
+import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.HttpVersion;
import org.apache.commons.httpclient.NTCredentials;
+import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.server.HttpService;
import org.apache.commons.httpclient.server.RequestLine;
-import org.apache.commons.httpclient.server.SimpleHttpServer;
import org.apache.commons.httpclient.server.SimpleRequest;
import org.apache.commons.httpclient.server.SimpleResponse;
@@ -54,10 +54,10 @@
* @author <a href="mailto:jsdever@apache.org">Jeff Dever</a>
* @version $Id$
*/
-public class TestNTLMAuth extends TestCase {
+public class TestNTLMAuth extends HttpClientTestBase {
// ------------------------------------------------------------ Constructor
- public TestNTLMAuth(String testName) {
+ public TestNTLMAuth(String testName) throws IOException {
super(testName);
}
@@ -150,18 +150,15 @@
public void testNTLMAuthenticationRetry() throws Exception {
- // configure the server
- SimpleHttpServer server = new SimpleHttpServer(); // use arbitrary port
- server.setTestname(getName());
- server.setHttpService(new NTLMAuthService());
+
+ this.server.setHttpService(new NTLMAuthService());
// configure the client
- HttpClient client = new HttpClient();
- client.getHostConfiguration().setHost(
+ this.client.getHostConfiguration().setHost(
server.getLocalAddress(), server.getLocalPort(),
Protocol.getProtocol("http"));
- client.getState().setCredentials(AuthScope.ANY,
+ this.client.getState().setCredentials(AuthScope.ANY,
new NTCredentials("username", "password", "host", "domain"));
FakeHttpMethod httpget = new FakeHttpMethod("/");
@@ -172,7 +169,70 @@
}
assertNull(httpget.getResponseHeader("WWW-Authenticate"));
assertEquals(200, httpget.getStatusCode());
- server.destroy();
}
+
+ private class PreemptiveNTLMAuthService implements HttpService {
+
+ public PreemptiveNTLMAuthService() {
+ super();
+ }
+
+ public boolean process(final SimpleRequest request, final SimpleResponse response)
+ throws IOException
+ {
+ RequestLine requestLine = request.getRequestLine();
+ HttpVersion ver = requestLine.getHttpVersion();
+ Header auth = request.getFirstHeader("Authorization");
+ if (auth == null) {
+ response.setStatusLine(ver, HttpStatus.SC_BAD_REQUEST);
+ response.setBodyString("Authorization header missing");
+ return true;
+ } else {
+ String authstr = auth.getValue();
+
+ if (authstr.indexOf("NTLM") != -1) {
+ response.setStatusLine(ver, HttpStatus.SC_OK);
+ return true;
+ } else if (authstr.indexOf("Basic") != -1) {
+ response.setStatusLine(ver, HttpStatus.SC_UNAUTHORIZED);
+ response.addHeader(new Header("WWW-Authenticate", "Negotiate"));
+ response.addHeader(new Header("WWW-Authenticate", "NTLM"));
+ response.setBodyString("Authorization required");
+ return true;
+ } else {
+ response.setStatusLine(ver, HttpStatus.SC_BAD_REQUEST);
+ response.setBodyString("Unknown auth type: " + authstr);
+ return true;
+ }
+ }
+ }
+ }
+
+ /**
+ * Make sure preemptive authorization works when the server requires NLM.
+ * @throws Exception
+ */
+ public void testPreemptiveAuthorization() throws Exception {
+
+ NTCredentials creds =
+ new NTCredentials("testuser", "testpass", "host", "domain");
+
+ HttpState state = new HttpState();
+ state.setCredentials(AuthScope.ANY, creds);
+ this.client.setState(state);
+ this.client.getParams().setAuthenticationPreemptive(true);
+
+ this.server.setHttpService(new PreemptiveNTLMAuthService());
+
+ GetMethod httpget = new GetMethod("/test/");
+ try {
+ this.client.executeMethod(httpget);
+ } finally {
+ httpget.releaseConnection();
+ }
+ assertNotNull(httpget.getStatusLine());
+ assertEquals(HttpStatus.SC_OK, httpget.getStatusLine().getStatusCode());
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org