Skip to content

Commit 3fd63d0

Browse files
author
Stephane Landelle
committed
Fix Netty provider NTLM type 2 message handling, close #339
1 parent 8c07dc9 commit 3fd63d0

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

providers/netty/src/main/java/org/asynchttpclient/providers/netty/NettyAsyncHttpProvider.java

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,10 @@ public boolean remove(Object o) {
181181
private final Protocol httpProtocol = new HttpProtocol();
182182
private final Protocol webSocketProtocol = new WebSocketProtocol();
183183

184+
private static boolean isNTLM(List<String> auth) {
185+
return isNonEmpty(auth) && auth.get(0).startsWith("NTLM");
186+
}
187+
184188
public NettyAsyncHttpProvider(AsyncHttpClientConfig config) {
185189

186190
if (config.getAsyncHttpProviderConfig() != null && NettyAsyncHttpProviderConfig.class.isAssignableFrom(config.getAsyncHttpProviderConfig().getClass())) {
@@ -632,7 +636,7 @@ else if (uri.getRawQuery() != null)
632636
}
633637
} else {
634638
List<String> auth = request.getHeaders().get(HttpHeaders.Names.PROXY_AUTHORIZATION);
635-
if (isNonEmpty(auth) && auth.get(0).startsWith("NTLM")) {
639+
if (isNTLM(auth)) {
636640
nettyRequest.addHeader(HttpHeaders.Names.PROXY_AUTHORIZATION, auth.get(0));
637641
}
638642
}
@@ -706,7 +710,7 @@ else if (uri.getRawQuery() != null)
706710
if (isNonEmpty(proxyServer.getNtlmDomain())) {
707711

708712
List<String> auth = request.getHeaders().get(HttpHeaders.Names.PROXY_AUTHORIZATION);
709-
if (!(isNonEmpty(auth) && auth.get(0).startsWith("NTLM"))) {
713+
if (!isNTLM(auth)) {
710714
try {
711715
String msg = ntlmEngine.generateType1Msg(proxyServer.getNtlmDomain(), proxyServer.getHost());
712716
nettyRequest.setHeader(HttpHeaders.Names.PROXY_AUTHORIZATION, "NTLM " + msg);
@@ -1133,14 +1137,26 @@ private Realm kerberosChallenge(List<String> proxyAuth, Request request, ProxySe
11331137
}
11341138
return realmBuilder.setUri(uri.getRawPath()).setMethodName(request.getMethod()).setScheme(Realm.AuthScheme.KERBEROS).build();
11351139
} catch (Throwable throwable) {
1136-
if (proxyAuth.contains("NTLM")) {
1140+
if (isNTLM(proxyAuth)) {
11371141
return ntlmChallenge(proxyAuth, request, proxyServer, headers, realm, future);
11381142
}
11391143
abort(future, throwable);
11401144
return null;
11411145
}
11421146
}
11431147

1148+
private void addType3NTLMAuthorizationHeader(List<String> auth, FluentCaseInsensitiveStringsMap headers, String username, String password, String domain, String workstation)
1149+
throws NTLMEngineException {
1150+
headers.remove(HttpHeaders.Names.AUTHORIZATION);
1151+
1152+
if (isNTLM(auth)) {
1153+
String serverChallenge = auth.get(0).trim().substring("NTLM ".length());
1154+
String challengeHeader = ntlmEngine.generateType3Msg(username, password, domain, workstation, serverChallenge);
1155+
1156+
headers.add(HttpHeaders.Names.AUTHORIZATION, "NTLM " + challengeHeader);
1157+
}
1158+
}
1159+
11441160
private Realm ntlmChallenge(List<String> wwwAuth, Request request, ProxyServer proxyServer, FluentCaseInsensitiveStringsMap headers, Realm realm, NettyResponseFuture<?> future) throws NTLMEngineException {
11451161

11461162
boolean useRealm = (proxyServer == null && realm != null);
@@ -1159,14 +1175,7 @@ private Realm ntlmChallenge(List<String> wwwAuth, Request request, ProxyServer p
11591175
newRealm = new Realm.RealmBuilder().clone(realm).setScheme(realm.getAuthScheme()).setUri(uri.getRawPath()).setMethodName(request.getMethod()).setNtlmMessageType2Received(true).build();
11601176
future.getAndSetAuth(false);
11611177
} else {
1162-
headers.remove(HttpHeaders.Names.AUTHORIZATION);
1163-
1164-
if (wwwAuth.get(0).startsWith("NTLM ")) {
1165-
String serverChallenge = wwwAuth.get(0).trim().substring("NTLM ".length());
1166-
String challengeHeader = ntlmEngine.generateType3Msg(principal, password, ntlmDomain, ntlmHost, serverChallenge);
1167-
1168-
headers.add(HttpHeaders.Names.AUTHORIZATION, "NTLM " + challengeHeader);
1169-
}
1178+
addType3NTLMAuthorizationHeader(wwwAuth, headers, principal, password, ntlmDomain, ntlmHost);
11701179

11711180
Realm.RealmBuilder realmBuilder;
11721181
Realm.AuthScheme authScheme;
@@ -1187,11 +1196,8 @@ private Realm ntlmProxyChallenge(List<String> wwwAuth, Request request, ProxySer
11871196
future.getAndSetAuth(false);
11881197
headers.remove(HttpHeaders.Names.PROXY_AUTHORIZATION);
11891198

1190-
if (wwwAuth.get(0).startsWith("NTLM ")) {
1191-
String serverChallenge = wwwAuth.get(0).trim().substring("NTLM ".length());
1192-
String challengeHeader = ntlmEngine.generateType3Msg(proxyServer.getPrincipal(), proxyServer.getPassword(), proxyServer.getNtlmDomain(), proxyServer.getHost(), serverChallenge);
1193-
headers.add(HttpHeaders.Names.PROXY_AUTHORIZATION, "NTLM " + challengeHeader);
1194-
}
1199+
addType3NTLMAuthorizationHeader(wwwAuth, headers, proxyServer.getPrincipal(), proxyServer.getPassword(), proxyServer.getNtlmDomain(), proxyServer.getHost());
1200+
11951201
Realm newRealm;
11961202
Realm.RealmBuilder realmBuilder;
11971203
if (realm != null) {
@@ -2052,7 +2058,7 @@ public void handle(final ChannelHandlerContext ctx, final MessageEvent e) throws
20522058

20532059
future.setState(NettyResponseFuture.STATE.NEW);
20542060
// NTLM
2055-
if (!wwwAuth.contains("Kerberos") && (wwwAuth.contains("NTLM") || (wwwAuth.contains("Negotiate")))) {
2061+
if (!wwwAuth.contains("Kerberos") && (isNTLM(wwwAuth) || (wwwAuth.contains("Negotiate")))) {
20562062
newRealm = ntlmChallenge(wwwAuth, request, proxyServer, headers, realm, future);
20572063
// SPNEGO KERBEROS
20582064
} else if (wwwAuth.contains("Negotiate")) {
@@ -2097,7 +2103,7 @@ public Object call() throws Exception {
20972103

20982104
future.setState(NettyResponseFuture.STATE.NEW);
20992105

2100-
if (!proxyAuth.contains("Kerberos") && (proxyAuth.get(0).contains("NTLM") || (proxyAuth.contains("Negotiate")))) {
2106+
if (!proxyAuth.contains("Kerberos") && (isNTLM(proxyAuth) || (proxyAuth.contains("Negotiate")))) {
21012107
newRealm = ntlmProxyChallenge(proxyAuth, request, proxyServer, headers, realm, future);
21022108
// SPNEGO KERBEROS
21032109
} else if (proxyAuth.contains("Negotiate")) {

0 commit comments

Comments
 (0)