diff --git a/build.gradle b/build.gradle
index d1d5150c5..ea0acae06 100644
--- a/build.gradle
+++ b/build.gradle
@@ -272,8 +272,8 @@ class PreDist extends DefaultTask {
String pluginLibraries = ''
project.fileTree(dir: "build/generated-dist/plugins/${groupName}", include: '**/*.jar').each { file ->
- pluginLibraries += '\t\t' + System.lineSeparator()
- }
+ pluginLibraries += '\t\t' + System.lineSeparator()
+ }
project.copy {
from 'src/main/dist/template/plugins/${group}/plugin.xml'
filter { String line -> line.replace('', '' + System.lineSeparator() + System.lineSeparator() + pluginLibraries) }
@@ -284,7 +284,7 @@ class PreDist extends DefaultTask {
String descriptorFiles = ''
project.fileTree(dir: 'build/generated-dist').each { file ->
- String relativePath = file.absolutePath.replaceAll(/.*build\/generated-dist\//, '')
+ String relativePath = file.absolutePath.replaceAll('\\\\', '/').replaceAll(/.*build\/generated-dist\//, '')
descriptorFiles += '\t\t' + System.lineSeparator()
}
project.copy {
diff --git a/credchange.txt b/credchange.txt
new file mode 100644
index 000000000..03f7f48fa
--- /dev/null
+++ b/credchange.txt
@@ -0,0 +1,170 @@
+diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java
+index d5be33fb..ed390d6d 100644
+--- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java
++++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java
+@@ -35,17 +35,26 @@ import org.apache.http.HttpEntityEnclosingRequest;
+ import org.apache.http.client.entity.EntityBuilder;
+ import org.apache.http.client.methods.*;
+ import org.apache.http.client.utils.URIBuilder;
++import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+ import org.apache.http.entity.ContentType;
+ import org.apache.http.entity.FileEntity;
+ import org.apache.http.entity.StringEntity;
+ import org.apache.http.impl.client.CloseableHttpClient;
+ import org.apache.http.impl.client.HttpClients;
++import org.apache.http.ssl.SSLContexts;
+
++import javax.net.ssl.SSLContext;
+ import javax.swing.*;
+ import java.io.*;
+ import java.net.HttpURLConnection;
+ import java.net.URI;
+ import java.net.URISyntaxException;
++import java.security.KeyManagementException;
++import java.security.KeyStore;
++import java.security.KeyStoreException;
++import java.security.NoSuchAlgorithmException;
++import java.security.UnrecoverableKeyException;
++import java.security.cert.CertificateException;
+ import java.util.ArrayList;
+ import java.util.Collection;
+ import java.util.Iterator;
+@@ -58,10 +67,11 @@ import java.util.concurrent.atomic.AtomicReference;
+
+ public class MMSUtils {
+
++ public static String serverTrustMethod = "DEFAULT"; //DEFAULT or WINDOWS
+ private static final int CHECK_CANCEL_DELAY = 100;
+ private static final AtomicReference LAST_EXCEPTION = new AtomicReference<>();
+ private static final Cache PROFILE_SERVER_CACHE = CacheBuilder.newBuilder().weakKeys().maximumSize(100).expireAfterAccess(10, TimeUnit.MINUTES).build();
+-
++
+ public enum HttpRequestType {
+ GET, POST, PUT, DELETE
+ }
+@@ -350,6 +360,23 @@ public class MMSUtils {
+
+ return requestFile;
+ }
++
++ public static CloseableHttpClient createWindowsHttpClient() throws NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, UnrecoverableKeyException, KeyStoreException {
++ KeyStore keystoreWinRoot = KeyStore.getInstance("Windows-ROOT");
++ KeyStore keystoreWinMy = KeyStore.getInstance("Windows-MY");
++ keystoreWinRoot.load(null,null);
++ keystoreWinMy.load(null,null);
++ SSLContext sslcontext = SSLContexts.custom()
++ .loadKeyMaterial(keystoreWinMy,null)
++ .loadTrustMaterial(keystoreWinRoot,null)
++ .build();
++ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
++ CloseableHttpClient httpclient = HttpClients.custom()
++ .setSSLSocketFactory(sslsf)
++ .build();
++ return httpclient;
++ }
++
+
+ /**
+ * General purpose method for sending a constructed http request via http client. For streaming reasons, defaults to writing to a file.
+@@ -376,19 +403,39 @@ public class MMSUtils {
+ // create client, execute request, parse response, store in thread safe buffer to return as string later
+ // client, response, and reader are all auto closed after block
+ if (progressStatus == null) {
+- try (CloseableHttpClient httpclient = HttpClients.createDefault();
+- CloseableHttpResponse response = httpclient.execute(request);
+- InputStream inputStream = response.getEntity().getContent()) {
+- responseCode.set(response.getStatusLine().getStatusCode());
+- String responseSummary = "[INFO] MMS Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
+- System.out.println(responseSummary);
+- if (MDUtils.isDeveloperMode()) {
+- Application.getInstance().getGUILog().log(responseSummary);
+- }
+- if (inputStream != null) {
+- responseBody.set(generateMmsOutput(inputStream, responseFile));
+- }
+- }
++ if(serverTrustMethod.equals("WINDOWS")) {
++ try (CloseableHttpClient httpclient = createWindowsHttpClient();
++ CloseableHttpResponse response = httpclient.execute(request);
++ InputStream inputStream = response.getEntity().getContent()) {
++ responseCode.set(response.getStatusLine().getStatusCode());
++ String responseSummary = "[INFO] MMS Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
++ System.out.println(responseSummary);
++ if (MDUtils.isDeveloperMode()) {
++ Application.getInstance().getGUILog().log(responseSummary);
++ }
++ if (inputStream != null) {
++ responseBody.set(generateMmsOutput(inputStream, responseFile));
++ }
++ } catch (KeyManagementException | UnrecoverableKeyException | NoSuchAlgorithmException
++ | CertificateException | KeyStoreException e) {
++ e.printStackTrace();
++ }
++ }
++ else {
++ try (CloseableHttpClient httpclient = HttpClients.createDefault();
++ CloseableHttpResponse response = httpclient.execute(request);
++ InputStream inputStream = response.getEntity().getContent()) {
++ responseCode.set(response.getStatusLine().getStatusCode());
++ String responseSummary = "[INFO] MMS Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
++ System.out.println(responseSummary);
++ if (MDUtils.isDeveloperMode()) {
++ Application.getInstance().getGUILog().log(responseSummary);
++ }
++ if (inputStream != null) {
++ responseBody.set(generateMmsOutput(inputStream, responseFile));
++ }
++ }
++ }
+ }
+ else {
+ LAST_EXCEPTION.set(null);
+diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java b/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java
+index da58dadb..70a0925d 100644
+--- a/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java
++++ b/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java
+@@ -108,19 +108,30 @@ public class TicketUtils {
+ */
+ private static String getUserCredentialsDialog() {
+ JPanel userPanel = new JPanel();
+- userPanel.setLayout(new GridLayout(2, 2));
++ userPanel.setLayout(new GridLayout(3, 2));
+
+ JLabel usernameLbl = new JLabel("Username:");
+ JLabel passwordLbl = new JLabel("Password:");
+
+ JTextField usernameFld = new JTextField();
+ JPasswordField passwordFld = new JPasswordField();
++
++ JRadioButton useDefault = new JRadioButton("Use Default Apache HttpClient Configuration");
++ JRadioButton useWindowsCredentials = new JRadioButton("Use Windows Credentials");
++ //TODO might want to add an option for the JRadio group to create a folder for the certificates
++
++ ButtonGroup credGroup = new ButtonGroup();
++ credGroup.add(useDefault);
++ credGroup.add(useWindowsCredentials);
+
+ userPanel.add(usernameLbl);
+ userPanel.add(usernameFld);
+ userPanel.add(passwordLbl);
+ userPanel.add(passwordFld);
+
++ userPanel.add(useDefault);
++ userPanel.add(useWindowsCredentials);
++
+ if (username != null) {
+ usernameFld.setText(username);
+ usernameFld.requestFocus();
+@@ -132,6 +143,12 @@ public class TicketUtils {
+ "MMS Credentials", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
+ // isDisplayed = false;
+ if (response == JOptionPane.OK_OPTION) {
++ if(useWindowsCredentials.isSelected()) {
++ MMSUtils.serverTrustMethod = "WINDOWS";
++ }
++ else {
++ MMSUtils.serverTrustMethod = "DEFAULT";
++ }
+ username = usernameFld.getText();
+ String pass = new String(passwordFld.getPassword());
+ return pass;
diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java
index d5be33fbf..1ee999771 100644
--- a/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java
+++ b/src/main/java/gov/nasa/jpl/mbee/mdk/mms/MMSUtils.java
@@ -32,20 +32,33 @@
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
+import org.apache.http.client.config.CookieSpecs;
+import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.*;
import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.FileEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.ssl.TrustStrategy;
+import javax.net.ssl.SSLContext;
import javax.swing.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -58,10 +71,11 @@
public class MMSUtils {
+ public static String serverTrustMethod = "DEFAULT"; //DEFAULT or WINDOWS
private static final int CHECK_CANCEL_DELAY = 100;
private static final AtomicReference LAST_EXCEPTION = new AtomicReference<>();
private static final Cache PROFILE_SERVER_CACHE = CacheBuilder.newBuilder().weakKeys().maximumSize(100).expireAfterAccess(10, TimeUnit.MINUTES).build();
-
+
public enum HttpRequestType {
GET, POST, PUT, DELETE
}
@@ -350,6 +364,43 @@ else if (node instanceof String && jsonBlobType == JsonBlobType.ELEMENT_ID || js
return requestFile;
}
+
+
+
+ public static CloseableHttpClient createTrustAllHttpClient() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
+ SSLContext sslcontext = SSLContexts.custom()
+ .loadTrustMaterial(null,new TrustStrategy() {
+ @Override
+ public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ return true;
+ }
+ })
+ .build();
+ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
+ CloseableHttpClient httpclient = HttpClients.custom()
+ .setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())
+ .setSSLSocketFactory(sslsf)
+ .build();
+ return httpclient;
+ }
+
+ public static CloseableHttpClient createWindowsHttpClient() throws NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, UnrecoverableKeyException, KeyStoreException {
+ KeyStore keystoreWinRoot = KeyStore.getInstance("Windows-ROOT");
+ KeyStore keystoreWinMy = KeyStore.getInstance("Windows-MY");
+ keystoreWinRoot.load(null,null);
+ keystoreWinMy.load(null,null);
+ SSLContext sslcontext = SSLContexts.custom()
+ .loadKeyMaterial(keystoreWinMy,null)
+ .loadTrustMaterial(keystoreWinRoot,null)
+ .build();
+ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
+ CloseableHttpClient httpclient = HttpClients.custom()
+ .setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())
+ .setSSLSocketFactory(sslsf)
+ .build();
+ return httpclient;
+ }
+
/**
* General purpose method for sending a constructed http request via http client. For streaming reasons, defaults to writing to a file.
@@ -367,7 +418,7 @@ public static File sendMMSRequest(Project project, HttpRequestBase request, Prog
final AtomicReference responseBody = new AtomicReference<>();
final AtomicReference responseCode = new AtomicReference<>();
- String requestSummary = "[INFO] MMS Request [" + request.getMethod() + "] " + request.getURI().toString();
+ String requestSummary = "[INFO] MMS Request [" + request.getMethod() + ":" +serverTrustMethod + "] " + request.getURI().toString();
System.out.println(requestSummary);
if (MDUtils.isDeveloperMode()) {
Application.getInstance().getGUILog().log(requestSummary);
@@ -376,38 +427,109 @@ public static File sendMMSRequest(Project project, HttpRequestBase request, Prog
// create client, execute request, parse response, store in thread safe buffer to return as string later
// client, response, and reader are all auto closed after block
if (progressStatus == null) {
- try (CloseableHttpClient httpclient = HttpClients.createDefault();
- CloseableHttpResponse response = httpclient.execute(request);
- InputStream inputStream = response.getEntity().getContent()) {
- responseCode.set(response.getStatusLine().getStatusCode());
- String responseSummary = "[INFO] MMS Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
- System.out.println(responseSummary);
- if (MDUtils.isDeveloperMode()) {
- Application.getInstance().getGUILog().log(responseSummary);
- }
- if (inputStream != null) {
- responseBody.set(generateMmsOutput(inputStream, responseFile));
- }
- }
+ if(serverTrustMethod.equals("WINDOWS")) {
+ try (CloseableHttpClient httpclient = createWindowsHttpClient();
+ CloseableHttpResponse response = httpclient.execute(request);
+ InputStream inputStream = response.getEntity().getContent()) {
+ responseCode.set(response.getStatusLine().getStatusCode());
+ String responseSummary = "[INFO] MMS Windows Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
+ System.out.println(responseSummary);
+ if (MDUtils.isDeveloperMode()) {
+ Application.getInstance().getGUILog().log(responseSummary);
+ }
+ if (inputStream != null) {
+ responseBody.set(generateMmsOutput(inputStream, responseFile));
+ }
+ } catch (KeyManagementException | UnrecoverableKeyException | NoSuchAlgorithmException
+ | CertificateException | KeyStoreException e) {
+ e.printStackTrace();
+ }
+ }
+ else if(serverTrustMethod.equals("TRUSTALL")) {
+ try (CloseableHttpClient httpclient = createTrustAllHttpClient();
+ CloseableHttpResponse response = httpclient.execute(request);
+ InputStream inputStream = response.getEntity().getContent()) {
+ responseCode.set(response.getStatusLine().getStatusCode());
+ String responseSummary = "[INFO] MMS Windows Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
+ System.out.println(responseSummary);
+ if (MDUtils.isDeveloperMode()) {
+ Application.getInstance().getGUILog().log(responseSummary);
+ }
+ if (inputStream != null) {
+ responseBody.set(generateMmsOutput(inputStream, responseFile));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ else {
+ try (CloseableHttpClient httpclient = HttpClients.createDefault();
+ CloseableHttpResponse response = httpclient.execute(request);
+ InputStream inputStream = response.getEntity().getContent()) {
+ responseCode.set(response.getStatusLine().getStatusCode());
+ String responseSummary = "[INFO] MMS Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString();
+ System.out.println(responseSummary);
+ if (MDUtils.isDeveloperMode()) {
+ Application.getInstance().getGUILog().log(responseSummary);
+ }
+ if (inputStream != null) {
+ responseBody.set(generateMmsOutput(inputStream, responseFile));
+ }
+ }
+ }
}
else {
LAST_EXCEPTION.set(null);
progressStatus.setIndeterminate(true);
Future> future = TaskRunner.runWithProgressStatus(() -> {
- try (CloseableHttpClient httpclient = HttpClients.createDefault();
- CloseableHttpResponse response = httpclient.execute(request);
- InputStream inputStream = response.getEntity().getContent()) {
- responseCode.set(response.getStatusLine().getStatusCode());
- if (MDKOptionsGroup.getMDKOptions().isLogJson()) {
- System.out.println("[INFO] MMS Response [" + request.getMethod() + "]: " + responseCode.get() + " " + request.getURI().toString());
- }
- if (inputStream != null) {
- responseBody.set(generateMmsOutput(inputStream, responseFile));
- }
- } catch (Exception e) {
- LAST_EXCEPTION.set(e);
- e.printStackTrace();
- }
+ if(serverTrustMethod.equals("WINDOWS")) {
+ try (CloseableHttpClient httpclient = createWindowsHttpClient();
+ CloseableHttpResponse response = httpclient.execute(request);
+ InputStream inputStream = response.getEntity().getContent()) {
+ responseCode.set(response.getStatusLine().getStatusCode());
+ if (MDKOptionsGroup.getMDKOptions().isLogJson()) {
+ System.out.println("[INFO] MMS Response [" + request.getMethod() + ":" +serverTrustMethod+"]: " + responseCode.get() + " " + request.getURI().toString());
+ }
+ if (inputStream != null) {
+ responseBody.set(generateMmsOutput(inputStream, responseFile));
+ }
+ } catch (Exception e) {
+ LAST_EXCEPTION.set(e);
+ e.printStackTrace();
+ }
+ }
+ else if(serverTrustMethod.equals("TRUSTALL")) {
+ try (CloseableHttpClient httpclient = createTrustAllHttpClient();
+ CloseableHttpResponse response = httpclient.execute(request);
+ InputStream inputStream = response.getEntity().getContent()) {
+ responseCode.set(response.getStatusLine().getStatusCode());
+ if (MDKOptionsGroup.getMDKOptions().isLogJson()) {
+ System.out.println("[INFO] MMS Response [" + request.getMethod() + ":" +serverTrustMethod+"]: " + responseCode.get() + " " + request.getURI().toString());
+ }
+ if (inputStream != null) {
+ responseBody.set(generateMmsOutput(inputStream, responseFile));
+ }
+ } catch (Exception e) {
+ LAST_EXCEPTION.set(e);
+ e.printStackTrace();
+ }
+ }
+ else {
+ try (CloseableHttpClient httpclient = HttpClients.createDefault();
+ CloseableHttpResponse response = httpclient.execute(request);
+ InputStream inputStream = response.getEntity().getContent()) {
+ responseCode.set(response.getStatusLine().getStatusCode());
+ if (MDKOptionsGroup.getMDKOptions().isLogJson()) {
+ System.out.println("[INFO] MMS Response [" + request.getMethod() + ":" +serverTrustMethod+"]: " + responseCode.get() + " " + request.getURI().toString());
+ }
+ if (inputStream != null) {
+ responseBody.set(generateMmsOutput(inputStream, responseFile));
+ }
+ } catch (Exception e) {
+ LAST_EXCEPTION.set(e);
+ e.printStackTrace();
+ }
+ }
}, null, TaskRunner.ThreadExecutionStrategy.NONE, true);
try {
while (!future.isDone() && !future.isCancelled()) {
@@ -454,7 +576,7 @@ public static File sendMMSRequest(Project project, HttpRequestBase request, Prog
return responseFile;
}
- public static File sendMMSRequest(Project project, HttpRequestBase request) throws IOException, ServerException, URISyntaxException {
+ public static File sendMMSRequest(Project project, HttpRequestBase request) throws IOException, ServerException, URISyntaxException {
return sendMMSRequest(project, request, null, null);
}
diff --git a/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java b/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java
index da58dadb7..9528ed388 100644
--- a/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java
+++ b/src/main/java/gov/nasa/jpl/mbee/mdk/util/TicketUtils.java
@@ -108,19 +108,33 @@ else if (!Utils.isPopupsDisabled()) {
*/
private static String getUserCredentialsDialog() {
JPanel userPanel = new JPanel();
- userPanel.setLayout(new GridLayout(2, 2));
+ userPanel.setLayout(new GridLayout(4, 2));
JLabel usernameLbl = new JLabel("Username:");
JLabel passwordLbl = new JLabel("Password:");
JTextField usernameFld = new JTextField();
JPasswordField passwordFld = new JPasswordField();
+
+ JRadioButton useDefault = new JRadioButton("Use Default Apache HttpClient Configuration");
+ JRadioButton useWindowsCredentials = new JRadioButton("Use Windows Credentials");
+ JRadioButton useTrustAll = new JRadioButton("Use TRUSTALL (Development Purposes only)");
+ //TODO might want to add an option for the JRadio group to create a folder for the certificates
+
+ ButtonGroup credGroup = new ButtonGroup();
+ credGroup.add(useDefault);
+ credGroup.add(useWindowsCredentials);
+ credGroup.add(useTrustAll);
userPanel.add(usernameLbl);
userPanel.add(usernameFld);
userPanel.add(passwordLbl);
userPanel.add(passwordFld);
+ userPanel.add(useDefault);
+ userPanel.add(useWindowsCredentials);
+ userPanel.add(useTrustAll);
+
if (username != null) {
usernameFld.setText(username);
usernameFld.requestFocus();
@@ -132,6 +146,15 @@ private static String getUserCredentialsDialog() {
"MMS Credentials", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
// isDisplayed = false;
if (response == JOptionPane.OK_OPTION) {
+ if(useWindowsCredentials.isSelected()) {
+ MMSUtils.serverTrustMethod = "WINDOWS";
+ }
+ else if(useTrustAll.isSelected()) {
+ MMSUtils.serverTrustMethod = "TRUSTALL";
+ }
+ else {
+ MMSUtils.serverTrustMethod = "DEFAULT";
+ }
username = usernameFld.getText();
String pass = new String(passwordFld.getPassword());
return pass;