package com.demandware.studio.webdav;
import com.demandware.studio.settings.DWSettingsProvider;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import javax.net.ssl.SSLContext;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.util.ArrayList;
public class DWServerConnection {
private final DWSettingsProvider settingsProvider;
private final CloseableHttpClient client;
private final HttpClientContext context;
public DWServerConnection(DWSettingsProvider settingsProvider) throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
this.settingsProvider = settingsProvider;
// SSLContextFactory to allow all hosts. Without this an SSLException is thrown with self signed certs
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (arg0, arg1) -> true).build();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register("https", socketFactory).build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(20);
client = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
context = new HttpClientContext();
context.setCredentialsProvider(getCredientials());
}
public String getBaseServerPath() {
return String.format("https://%s/on/demandware.servlet/webdav/Sites/Cartridges/%s", settingsProvider.getHostname(), settingsProvider.getVersion());
}
public String getCartridgeName(String rootPath) {
return Paths.get(rootPath).getFileName().toString();
}
public String getRemoteFilePath(String rootPath, String filePath) {
String relPath = filePath.substring(rootPath.length(), filePath.length());
String cartridgeName = getCartridgeName(rootPath);
return getBaseServerPath() + "/" + cartridgeName + relPath;
}
public ArrayList<String> getRemoteDirPaths(String rootPath, String filePath) {
ArrayList<String> serverPaths = new ArrayList<String>();
Path relPath = Paths.get(rootPath).relativize(Paths.get(filePath)).getParent();
String cartridgeName = getCartridgeName(rootPath);
String dirPath = "";
for (Path subPath : relPath) {
dirPath = dirPath + "/" + subPath.getFileName();
serverPaths.add(getBaseServerPath() + "/" + cartridgeName + dirPath);
}
return serverPaths;
}
public CloseableHttpClient getClient() {
return client;
}
public HttpClientContext getContext() {
return context;
}
public CredentialsProvider getCredientials() {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope(settingsProvider.getHostname(), AuthScope.ANY_PORT),
new UsernamePasswordCredentials(settingsProvider.getUsername(), settingsProvider.getPassword()));
return credentialsProvider;
}
}