30
30
import org .asynchttpclient .FluentCaseInsensitiveStringsMap ;
31
31
import org .asynchttpclient .ProxyServer ;
32
32
import org .asynchttpclient .Realm ;
33
+ import org .asynchttpclient .Realm .AuthScheme ;
33
34
import org .asynchttpclient .Request ;
34
35
import org .asynchttpclient .RequestBuilder ;
35
36
import org .asynchttpclient .ntlm .NTLMEngine ;
@@ -63,28 +64,51 @@ public HttpProtocol(ChannelManager channelManager, AsyncHttpClientConfig config,
63
64
connectionStrategy = nettyConfig .getConnectionStrategy ();
64
65
}
65
66
66
- private Realm .RealmBuilder newRealmBuilder (Realm realm ) {
67
- return realm != null ? new Realm .RealmBuilder ().clone (realm ) : new Realm .RealmBuilder ();
67
+ private Realm kerberosChallenge (Channel channel ,//
68
+ List <String > authHeaders ,//
69
+ Request request ,//
70
+ FluentCaseInsensitiveStringsMap headers ,//
71
+ Realm realm ,//
72
+ NettyResponseFuture <?> future ) throws NTLMEngineException {
73
+
74
+ Uri uri = request .getUri ();
75
+ String host = request .getVirtualHost () == null ? uri .getHost () : request .getVirtualHost ();
76
+ try {
77
+ String challengeHeader = SpnegoEngine .instance ().generateToken (host );
78
+ headers .remove (HttpHeaders .Names .AUTHORIZATION );
79
+ headers .add (HttpHeaders .Names .AUTHORIZATION , "Negotiate " + challengeHeader );
80
+
81
+ return new Realm .RealmBuilder ().clone (realm )//
82
+ .setUri (uri )//
83
+ .setMethodName (request .getMethod ())//
84
+ .setScheme (Realm .AuthScheme .KERBEROS )//
85
+ .build ();
86
+
87
+
88
+ } catch (Throwable throwable ) {
89
+ String ntlmAuthenticate = getNTLM (authHeaders );
90
+ if (ntlmAuthenticate != null ) {
91
+ return ntlmChallenge (ntlmAuthenticate , request , headers , realm , future );
92
+ }
93
+ requestSender .abort (channel , future , throwable );
94
+ return null ;
95
+ }
68
96
}
69
97
70
- private Realm kerberosChallenge (Channel channel ,//
98
+ private Realm kerberosProxyChallenge (Channel channel ,//
71
99
List <String > proxyAuth ,//
72
100
Request request ,//
73
101
ProxyServer proxyServer ,//
74
102
FluentCaseInsensitiveStringsMap headers ,//
75
- Realm realm ,//
76
- NettyResponseFuture <?> future ,//
77
- boolean proxyInd ) throws NTLMEngineException {
103
+ NettyResponseFuture <?> future ) throws NTLMEngineException {
78
104
79
105
Uri uri = request .getUri ();
80
- String host = request .getVirtualHost () == null ? uri .getHost () : request .getVirtualHost ();
81
- String server = proxyServer == null ? host : proxyServer .getHost ();
82
106
try {
83
- String challengeHeader = SpnegoEngine .instance ().generateToken (server );
107
+ String challengeHeader = SpnegoEngine .instance ().generateToken (proxyServer . getHost () );
84
108
headers .remove (HttpHeaders .Names .AUTHORIZATION );
85
109
headers .add (HttpHeaders .Names .AUTHORIZATION , "Negotiate " + challengeHeader );
86
110
87
- return newRealmBuilder ( realm )//
111
+ return proxyServer . realmBuilder ( )//
88
112
.setUri (uri )//
89
113
.setMethodName (request .getMethod ())//
90
114
.setScheme (Realm .AuthScheme .KERBEROS )//
@@ -93,13 +117,13 @@ private Realm kerberosChallenge(Channel channel,//
93
117
} catch (Throwable throwable ) {
94
118
String ntlmAuthenticate = getNTLM (proxyAuth );
95
119
if (ntlmAuthenticate != null ) {
96
- return ntlmChallenge (ntlmAuthenticate , request , proxyServer , headers , realm , future , proxyInd );
120
+ return ntlmProxyChallenge (ntlmAuthenticate , request , proxyServer , headers , future );
97
121
}
98
122
requestSender .abort (channel , future , throwable );
99
123
return null ;
100
124
}
101
125
}
102
-
126
+
103
127
private String authorizationHeaderName (boolean proxyInd ) {
104
128
return proxyInd ? HttpHeaders .Names .PROXY_AUTHORIZATION : HttpHeaders .Names .AUTHORIZATION ;
105
129
}
@@ -110,71 +134,55 @@ private void addNTLMAuthorizationHeader(FluentCaseInsensitiveStringsMap headers,
110
134
111
135
private Realm ntlmChallenge (String authenticateHeader ,//
112
136
Request request ,//
113
- ProxyServer proxyServer ,//
114
137
FluentCaseInsensitiveStringsMap headers ,//
115
138
Realm realm ,//
116
- NettyResponseFuture <?> future ,//
117
- boolean proxyInd ) throws NTLMEngineException {
118
-
119
- boolean useRealm = proxyServer == null && realm != null ;
139
+ NettyResponseFuture <?> future ) throws NTLMEngineException {
120
140
121
- String ntlmDomain = useRealm ? realm .getNtlmDomain () : proxyServer .getNtlmDomain ();
122
- String ntlmHost = useRealm ? realm .getNtlmHost () : proxyServer .getHost ();
123
- String principal = useRealm ? realm .getPrincipal () : proxyServer .getPrincipal ();
124
- String password = useRealm ? realm .getPassword () : proxyServer .getPassword ();
125
141
Uri uri = request .getUri ();
126
142
127
143
if (authenticateHeader .equals ("NTLM" )) {
128
144
// server replied bare NTLM => we didn't preemptively sent Type1Msg
129
145
String challengeHeader = NTLMEngine .INSTANCE .generateType1Msg ();
130
146
131
- addNTLMAuthorizationHeader (headers , challengeHeader , proxyInd );
147
+ addNTLMAuthorizationHeader (headers , challengeHeader , false );
132
148
future .getAndSetAuth (false );
133
- return newRealmBuilder (realm )//
134
- .setScheme (realm .getAuthScheme ())//
135
- .setUri (uri )//
136
- .setMethodName (request .getMethod ())//
137
- .build ();
138
149
139
150
} else {
140
151
// probably receiving Type2Msg, so we issue Type3Msg
141
- addType3NTLMAuthorizationHeader (authenticateHeader , headers , principal , password , ntlmDomain , ntlmHost , proxyInd );
142
- Realm .AuthScheme authScheme = realm != null ? realm .getAuthScheme () : Realm .AuthScheme .NTLM ;
143
- return newRealmBuilder (realm )//
144
- .setScheme (authScheme )//
145
- .setUri (uri )//
146
- .setMethodName (request .getMethod ())//
147
- .build ();
152
+ addType3NTLMAuthorizationHeader (authenticateHeader , headers , realm , false );
148
153
}
154
+
155
+ return new Realm .RealmBuilder ().clone (realm )//
156
+ .setUri (uri )//
157
+ .setMethodName (request .getMethod ())//
158
+ .build ();
149
159
}
150
160
151
161
private Realm ntlmProxyChallenge (String authenticateHeader ,//
152
162
Request request ,//
153
163
ProxyServer proxyServer ,//
154
164
FluentCaseInsensitiveStringsMap headers ,//
155
- Realm realm ,//
156
- NettyResponseFuture <?> future ,//
157
- boolean proxyInd ) throws NTLMEngineException {
165
+ NettyResponseFuture <?> future ) throws NTLMEngineException {
158
166
159
167
future .getAndSetAuth (false );
160
168
headers .remove (HttpHeaders .Names .PROXY_AUTHORIZATION );
161
169
162
- addType3NTLMAuthorizationHeader (authenticateHeader , headers , proxyServer .getPrincipal (), proxyServer .getPassword (),
163
- proxyServer .getNtlmDomain (), proxyServer .getHost (), proxyInd );
164
-
165
- return newRealmBuilder (realm )//
166
- // .setScheme(realm.getAuthScheme())
170
+ Realm realm = proxyServer .realmBuilder ()//
171
+ .setScheme (AuthScheme .NTLM )//
167
172
.setUri (request .getUri ())//
168
173
.setMethodName (request .getMethod ()).build ();
174
+
175
+ addType3NTLMAuthorizationHeader (authenticateHeader , headers , realm , true );
176
+
177
+ return realm ;
169
178
}
170
179
171
- private void addType3NTLMAuthorizationHeader (String auth , FluentCaseInsensitiveStringsMap headers , String username ,
172
- String password , String domain , String workstation , boolean proxyInd ) throws NTLMEngineException {
180
+ private void addType3NTLMAuthorizationHeader (String auth , FluentCaseInsensitiveStringsMap headers , Realm realm , boolean proxyInd ) throws NTLMEngineException {
173
181
headers .remove (authorizationHeaderName (proxyInd ));
174
182
175
183
if (isNonEmpty (auth ) && auth .startsWith ("NTLM " )) {
176
184
String serverChallenge = auth .substring ("NTLM " .length ()).trim ();
177
- String challengeHeader = NTLMEngine .INSTANCE .generateType3Msg (username , password , domain , workstation , serverChallenge );
185
+ String challengeHeader = NTLMEngine .INSTANCE .generateType3Msg (realm . getPrincipal (), realm . getPassword (), realm . getNtlmDomain (), realm . getNtlmHost () , serverChallenge );
178
186
addNTLMAuthorizationHeader (headers , challengeHeader , proxyInd );
179
187
}
180
188
}
@@ -233,18 +241,17 @@ private boolean exitAfterHandling401(//
233
241
String ntlmAuthenticate = getNTLM (wwwAuthHeaders );
234
242
if (!wwwAuthHeaders .contains ("Kerberos" ) && ntlmAuthenticate != null ) {
235
243
// NTLM
236
- newRealm = ntlmChallenge (ntlmAuthenticate , request , proxyServer , request .getHeaders (), realm , future , false );
244
+ newRealm = ntlmChallenge (ntlmAuthenticate , request , request .getHeaders (), realm , future );
237
245
238
246
} else if (negociate ) {
239
247
// SPNEGO KERBEROS
240
- newRealm = kerberosChallenge (channel , wwwAuthHeaders , request , proxyServer , request .getHeaders (), realm , future , false );
248
+ newRealm = kerberosChallenge (channel , wwwAuthHeaders , request , request .getHeaders (), realm , future );
241
249
if (newRealm == null )
242
250
return true ;
243
251
244
252
} else {
245
253
newRealm = new Realm .RealmBuilder ()//
246
254
.clone (realm )//
247
- .setScheme (realm .getAuthScheme ())//
248
255
.setUri (request .getUri ())//
249
256
.setMethodName (request .getMethod ())//
250
257
.setUsePreemptiveAuth (true )//
@@ -304,17 +311,16 @@ private boolean exitAfterHandling407(//
304
311
boolean negociate = proxyAuthHeaders .contains ("Negotiate" );
305
312
String ntlmAuthenticate = getNTLM (proxyAuthHeaders );
306
313
if (!proxyAuthHeaders .contains ("Kerberos" ) && ntlmAuthenticate != null ) {
307
- newRealm = ntlmProxyChallenge (ntlmAuthenticate , request , proxyServer , requestHeaders , realm , future , true );
314
+ newRealm = ntlmProxyChallenge (ntlmAuthenticate , request , proxyServer , requestHeaders , future );
308
315
// SPNEGO KERBEROS
309
316
310
317
} else if (negociate ) {
311
- newRealm = kerberosChallenge (channel , proxyAuthHeaders , request , proxyServer , requestHeaders , realm , future , true );
318
+ newRealm = kerberosProxyChallenge (channel , proxyAuthHeaders , request , proxyServer , requestHeaders , future );
312
319
if (newRealm == null )
313
320
return true ;
314
321
315
322
} else {
316
323
newRealm = new Realm .RealmBuilder ().clone (realm )//
317
- .setScheme (realm .getAuthScheme ())//
318
324
.setUri (request .getUri ())//
319
325
.setOmitQuery (true )//
320
326
.setMethodName (HttpMethod .CONNECT .getName ())//
0 commit comments