| /**************************************************************************** |
| * 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; |
| } |
| |
| } |