blob: 792ca73671f54c9ad7936915c9e3f146597e7680 [file] [log] [blame]
/****************************************************************************
* Copyright (c) 2019 Yatta Solutions and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Yatta Solutions - initial API and implementation
*
* SPDX-License-Identifier: EPL-2.0
*****************************************************************************/
package org.eclipse.ecf.internal.provider.filetransfer.httpclient45.win32;
import java.util.Map;
import org.apache.http.auth.AuthSchemeProvider;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Lookup;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.impl.auth.BasicSchemeFactory;
import org.apache.http.impl.auth.DigestSchemeFactory;
import org.apache.http.impl.auth.KerberosSchemeFactory;
import org.apache.http.impl.auth.win.WindowsCredentialsProvider;
import org.apache.http.impl.auth.win.WindowsNTLMSchemeFactory;
import org.apache.http.impl.auth.win.WindowsNegotiateSchemeFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.eclipse.ecf.internal.provider.filetransfer.httpclient45.HttpClientModifierAdapter;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
@Component
public class Win32HttpClientConfigurationModifier extends HttpClientModifierAdapter {
public static final String ID = "org.eclipse.ecf.provider.filetransfer.httpclient45.win32"; //$NON-NLS-1$
public static final String SERVICE_PRINCIPAL_NAME_ATTRIBUTE = "servicePrincipal"; //$NON-NLS-1$
public static final String SERVICE_PRINCIPAL_NAME_PROPERTY = ID + "." + SERVICE_PRINCIPAL_NAME_ATTRIBUTE; //$NON-NLS-1$
private String servicePrincipalName;
@Override
public HttpClientBuilder modifyClient(HttpClientBuilder builder) {
HttpClientBuilder winBuilder = builder == null ? HttpClientBuilder.create() : builder;
Lookup<AuthSchemeProvider> authSchemeRegistry = createAuthSchemeRegistry();
return winBuilder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
}
@Override
@SuppressWarnings("restriction")
public CredentialsProvider modifyCredentialsProvider(CredentialsProvider credentialsProvider) {
if (credentialsProvider == null || credentialsProvider instanceof WindowsCredentialsProvider) {
return credentialsProvider;
}
CredentialsProvider winCredentialsProvider = new WindowsCredentialsProvider(credentialsProvider);
return winCredentialsProvider;
}
@Override
public HttpClientContext modifyContext(HttpClientContext context) {
Lookup<AuthSchemeProvider> authSchemeRegistry = context.getAuthSchemeRegistry();
if (authSchemeRegistry == null) {
authSchemeRegistry = createAuthSchemeRegistry();
} else {
authSchemeRegistry = modifyAuthSchemeRegistry(authSchemeRegistry);
}
context.setAuthSchemeRegistry(authSchemeRegistry);
return context;
}
public void setServicePrincipalName(String servicePrincipalName) {
this.servicePrincipalName = servicePrincipalName;
}
public String getServicePrincipalName() {
return servicePrincipalName;
}
private Lookup<AuthSchemeProvider> createAuthSchemeRegistry() {
Registry<AuthSchemeProvider> authSchemeRegistry = setWinAuthSchemes(RegistryBuilder.<AuthSchemeProvider> create().register(AuthSchemes.BASIC, new BasicSchemeFactory()).register(AuthSchemes.DIGEST, new DigestSchemeFactory()).register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())).build();
return authSchemeRegistry;
}
private Lookup<AuthSchemeProvider> modifyAuthSchemeRegistry(Lookup<AuthSchemeProvider> authSchemeRegistry) {
RegistryBuilder<AuthSchemeProvider> builder = RegistryBuilder.create();
for (String scheme : new String[] {AuthSchemes.BASIC, AuthSchemes.DIGEST, AuthSchemes.KERBEROS}) {
AuthSchemeProvider provider = authSchemeRegistry.lookup(scheme);
if (provider != null) {
builder.register(scheme, provider);
}
}
if (authSchemeRegistry.lookup(AuthSchemes.KERBEROS) == null) {
builder.register(AuthSchemes.KERBEROS, new KerberosSchemeFactory());
}
setWinAuthSchemes(builder);
return builder.build();
}
@SuppressWarnings("restriction")
private RegistryBuilder<AuthSchemeProvider> setWinAuthSchemes(RegistryBuilder<AuthSchemeProvider> builder) {
return builder.register(AuthSchemes.NTLM, new WindowsNTLMSchemeFactory(servicePrincipalName)).register(AuthSchemes.SPNEGO, new WindowsNegotiateSchemeFactory(servicePrincipalName));
}
@Activate
public synchronized void activate(BundleContext context, Map<?, ?> properties) {
this.servicePrincipalName = getServicePrincipalName(properties);
}
private String getServicePrincipalName(Map<?, ?> properties) {
Object servicePrincipalValue = properties.get(SERVICE_PRINCIPAL_NAME_ATTRIBUTE);
if (servicePrincipalValue != null) {
return servicePrincipalValue.toString();
}
Bundle bundle = FrameworkUtil.getBundle(this.getClass());
if (bundle != null) {
return bundle.getBundleContext().getProperty(SERVICE_PRINCIPAL_NAME_PROPERTY);
}
return System.getProperty(SERVICE_PRINCIPAL_NAME_PROPERTY);
}
@Override
public Builder modifyRequestConfig(Builder config, HttpClientContext context, Map<?, ?> options) {
// TODO Auto-generated method stub
return null;
}
}