diff --git a/client/pom.xml b/client/pom.xml index b2e551d5a..fce6b75ca 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -19,7 +19,7 @@ org.asynchttpclient async-http-client-project - 3.0.1 + 3.0.1.Apica.1 4.0.0 diff --git a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java index b30f6bbd9..07d2de710 100644 --- a/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java +++ b/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ProxyUnauthorized407Interceptor.java @@ -144,6 +144,7 @@ public boolean exitAfterHandling407(Channel channel, NettyResponseFuture futu try { kerberosProxyChallenge(proxyRealm, proxyServer, requestHeaders); } catch (SpnegoEngineException e) { + LOGGER.error("Kerberos/Spnego proxy auth failed", e); String ntlmHeader2 = getHeaderWithPrefix(proxyAuthHeaders, "NTLM"); if (ntlmHeader2 != null) { LOGGER.warn("Kerberos/Spnego proxy auth failed, proceeding with NTLM"); diff --git a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java index 67d9a67be..a3a1fa5a8 100755 --- a/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java +++ b/client/src/main/java/org/asynchttpclient/netty/request/NettyRequestFactory.java @@ -242,7 +242,10 @@ public NettyRequest newNettyRequest(Request request, boolean performConnectReque } // don't override authorization but append - addAuthorizationHeader(headers, perRequestAuthorizationHeader(request, realm)); + // set authorization header only for target requests + if (!connect) { + addAuthorizationHeader(headers, perRequestAuthorizationHeader(request, realm)); + } // only set proxy auth on request over plain HTTP, or when performing CONNECT if (!uri.isSecured() || connect) { setProxyAuthorizationHeader(headers, perRequestProxyAuthorizationHeader(request, proxyRealm)); diff --git a/client/src/main/java/org/asynchttpclient/spnego/SpnegoEngine.java b/client/src/main/java/org/asynchttpclient/spnego/SpnegoEngine.java index d67d923bb..8435109e1 100644 --- a/client/src/main/java/org/asynchttpclient/spnego/SpnegoEngine.java +++ b/client/src/main/java/org/asynchttpclient/spnego/SpnegoEngine.java @@ -156,10 +156,9 @@ public String generateToken(String host) throws SpnegoEngineException { // Try SPNEGO by default, fall back to Kerberos later if error negotiationOid = new Oid(SPNEGO_OID); - String spn = getCompleteServicePrincipalName(host); try { GSSManager manager = GSSManager.getInstance(); - GSSName serverName = manager.createName(spn, GSSName.NT_HOSTBASED_SERVICE); + GSSName serverName = getCompleteGSSName(host, manager); GSSCredential myCred = null; if (username != null || loginContextName != null || customLoginConfig != null && !customLoginConfig.isEmpty()) { String contextName = loginContextName; @@ -195,7 +194,7 @@ public String generateToken(String host) throws SpnegoEngineException { log.debug("Using Kerberos MECH {}", KERBEROS_OID); negotiationOid = new Oid(KERBEROS_OID); GSSManager manager = GSSManager.getInstance(); - GSSName serverName = manager.createName(spn, GSSName.NT_HOSTBASED_SERVICE); + GSSName serverName = getCompleteGSSName(host, manager); gssContext = manager.createContext(serverName.canonicalize(negotiationOid), negotiationOid, null, GSSContext.DEFAULT_LIFETIME); gssContext.requestMutualAuth(true); @@ -244,6 +243,16 @@ public String generateToken(String host) throws SpnegoEngineException { } } + GSSName getCompleteGSSName(String host, GSSManager manager) throws GSSException { + if (servicePrincipalName != null && servicePrincipalName.contains("@")) { + log.debug("Service Principal Name is {}", servicePrincipalName); + return manager.createName(servicePrincipalName, GSSName.NT_USER_NAME); + } + + String spn = getCompleteServicePrincipalName(host); + return manager.createName(spn, GSSName.NT_HOSTBASED_SERVICE); + } + String getCompleteServicePrincipalName(String host) { String name; if (servicePrincipalName == null) { diff --git a/client/src/test/java/org/asynchttpclient/DefaultAsyncHttpClientTest.java b/client/src/test/java/org/asynchttpclient/DefaultAsyncHttpClientTest.java index fc7a1c2db..c39888494 100644 --- a/client/src/test/java/org/asynchttpclient/DefaultAsyncHttpClientTest.java +++ b/client/src/test/java/org/asynchttpclient/DefaultAsyncHttpClientTest.java @@ -23,6 +23,7 @@ import org.asynchttpclient.cookie.CookieEvictionTask; import org.asynchttpclient.cookie.CookieStore; import org.asynchttpclient.cookie.ThreadSafeCookieStore; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -57,6 +58,7 @@ public void testNativeTransportWithEpollOnly() throws Exception { @RepeatedIfExceptionsTest(repeats = 5) @EnabledOnOs(OS.LINUX) + @Disabled // doesn't work on TeamCity Agent public void testNativeTransportWithoutEpollOnly() throws Exception { AsyncHttpClientConfig config = config().setUseNativeTransport(true).setUseOnlyEpollNativeTransport(false).build(); try (DefaultAsyncHttpClient client = (DefaultAsyncHttpClient) asyncHttpClient(config)) { diff --git a/pom.xml b/pom.xml index 9dfe832a7..a4385ea84 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ org.asynchttpclient async-http-client-project - 3.0.1 + 3.0.1.Apica.1 pom AHC/Project @@ -71,15 +71,24 @@ + + apica-artifacts + a0pbpgwdghsu9-artifactory-primary-0-releases + https://apica.jfrog.io/artifactory/backend-services-releases + - sonatype-nexus-staging - https://oss.sonatype.org/content/repositories/snapshots + snapshots + a0pbpgwdghsu9-artifactory-primary-0-snapshots + https://apica.jfrog.io/artifactory/backend-services-snapshots + + + - sonatype-nexus-staging - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + backend-services-releases + https://apica.jfrog.io/artifactory/backend-services-releases/ - + github @@ -391,7 +400,7 @@ - + + <!– Prevent gpg from using pinentry programs –> - --pinentry-mode + --pinentry-mode loopback + -->