http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/TrustedCertsTableModel.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/TrustedCertsTableModel.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/TrustedCertsTableModel.java new file mode 100644 index 0000000..489d7b2 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/TrustedCertsTableModel.java @@ -0,0 +1,215 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager; + +import static javax.swing.JOptionPane.ERROR_MESSAGE; +import static javax.swing.JOptionPane.showMessageDialog; +import static org.apache.taverna.security.credentialmanager.CredentialManager.KeystoreType.TRUSTSTORE; +import static org.apache.taverna.workbench.ui.credentialmanager.CMStrings.ERROR_TITLE; +import static org.apache.taverna.workbench.ui.credentialmanager.CredentialManagerUI.TRUST_CERT_ENTRY_TYPE; + +import java.util.Set; +import java.util.TreeSet; + +import javax.swing.JFrame; +import javax.swing.table.AbstractTableModel; + +import org.apache.taverna.lang.observer.Observable; +import org.apache.taverna.lang.observer.Observer; +import org.apache.taverna.security.credentialmanager.CMException; +import org.apache.taverna.security.credentialmanager.CredentialManager; +import org.apache.taverna.security.credentialmanager.KeystoreChangedEvent; + +import org.apache.log4j.Logger; + +/** + * The table model used to display the Keystore's trusted certificate entries. + * + * @author Alex Nenadic + */ +@SuppressWarnings("serial") +public class TrustedCertsTableModel extends AbstractTableModel implements + Observer<KeystoreChangedEvent> { + private static final Logger logger = Logger + .getLogger(TrustedCertsTableModel.class); + + // Column names + private String[] columnNames; + // Table data + private Object[][] data; + private CredentialManager credManager; + + public TrustedCertsTableModel(CredentialManager credentialManager) { + credManager = credentialManager; + if (credentialManager == null) { + // Failed to instantiate Credential Manager - warn the user and exit + String sMessage = "Failed to instantiate Credential Manager. "; + logger.error("CM GUI: "+ sMessage); + showMessageDialog(new JFrame(), sMessage, ERROR_TITLE, + ERROR_MESSAGE); + return; + } + + data = new Object[0][0]; + columnNames = new String[] { + "Entry Type", // type of the Keystore entry + "Owner", // owner's common name + "Issuer", // issuer's common name + "Serial Number", // public key certificate's serial number + "Last Modified", // last modified date of the entry + "Alias" // the invisible column holding the actual alias in the Keystore + }; + + try { + load(); + } catch (CMException cme) { + String sMessage = "Failed to load trusted certificates"; + logger.error(sMessage); + showMessageDialog(new JFrame(), sMessage, ERROR_TITLE, + ERROR_MESSAGE); + return; + } + + // Start observing changes to the Keystore + credManager.addObserver(this); + } + + /** + * Load the TrustCertsTableModel with trusted certificate entries from the Keystore. + */ + public void load() throws CMException { + /* + * Place trusted certificate entries' aliases in a tree map to sort them + */ + Set<String> aliases = new TreeSet<>(); + for (String alias : credManager.getAliases(TRUSTSTORE)) + /* + * We are only interested in trusted certificate entries here. Alias + * for such entries is constructed as + * "trustedcert#<CERT_SERIAL_NUMBER>#<CERT_COMMON_NAME>" + */ + if (alias.startsWith("trustedcert#")) + aliases.add(alias); + + /* + * Create one table row for each trusted certificate entry Each row has + * 4 fields - type, owner name, last modified data and the invisible + * alias + */ + data = new Object[aliases.size()][6]; + + /* + * Iterate through the sorted aliases, retrieving the trusted + * certificate entries and populating the table model + */ + int i = 0; + for (String alias : aliases) { + /* + * Populate the type column - it is set with an integer but a custom + * cell renderer will cause a suitable icon to be displayed + */ + data[i][0] = TRUST_CERT_ENTRY_TYPE; + + /* + * Split the alias string to extract owner, issuer and serial number + * alias = + * "trustedcert#<CERT_SUBJECT_COMMON_NAME>"#"<CERT_ISSUER_COMMON_NAME>" + * #"<CERT_SERIAL_NUMBER> + */ + String[] aliasComponents = alias.split("#"); + + // Populate the owner column extracted from the alias + data[i][1] = aliasComponents[1]; + + // Populate the issuer column extracted from the alias + data[i][2] = aliasComponents[2]; + + // Populate the serial number column extracted from the alias + data[i][3] = aliasComponents[3]; + + // Populate the modified date column + //data[iCnt][4] = credManager.getEntryCreationDate(CredentialManager.TRUSTSTORE, alias); + + // Populate the invisible alias column + data[i][5] = alias; + + i++; + } + + fireTableDataChanged(); + } + + /** + * Get the number of columns in the table. + */ + @Override + public int getColumnCount() { + return columnNames.length; + } + + /** + * Get the number of rows in the table. + */ + @Override + public int getRowCount() { + return data.length; + } + + /** + * Get the name of the column at the given position. + */ + @Override + public String getColumnName(int iCol) { + return columnNames[iCol]; + } + + /** + * Get the cell value at the given row and column position. + */ + @Override + public Object getValueAt(int iRow, int iCol) { + return data[iRow][iCol]; + } + + /** + * Get the class at of the cells at the given column position. + */ + @Override + public Class<? extends Object> getColumnClass(int iCol) { + return getValueAt(0, iCol).getClass(); + } + + /** + * Is the cell at the given row and column position editable? + */ + @Override + public boolean isCellEditable(int iRow, int iCol) { + // The table is always read-only + return false; + } + + @Override + public void notify(Observable<KeystoreChangedEvent> sender, + KeystoreChangedEvent message) throws Exception { + // reload the table + if (message.keystoreType.equals(TRUSTSTORE)) + load(); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewCertDetailsDialog.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewCertDetailsDialog.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewCertDetailsDialog.java new file mode 100644 index 0000000..ee6f1a7 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewCertDetailsDialog.java @@ -0,0 +1,508 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager; + +import static java.awt.BorderLayout.CENTER; +import static java.awt.BorderLayout.NORTH; +import static java.awt.BorderLayout.SOUTH; +import static java.awt.Font.BOLD; +import static java.awt.Font.PLAIN; +import static java.awt.GridBagConstraints.LINE_START; +import static javax.security.auth.x500.X500Principal.RFC2253; +import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED; +import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED; +import static javax.swing.SwingUtilities.invokeLater; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.math.BigInteger; +import java.security.cert.CertificateEncodingException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; + +import javax.swing.DefaultListModel; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.EtchedBorder; + +import org.apache.taverna.security.credentialmanager.CMException; +import org.apache.taverna.security.credentialmanager.DistinguishedNameParser; +import org.apache.taverna.security.credentialmanager.ParsedDistinguishedName; +import org.apache.taverna.workbench.helper.NonBlockedHelpEnabledDialog; + +/** + * Displays the details of a X.509 certificate. + * + * Inspired by the Portlecle tool (http://portecle.sourceforge.net/). and the + * view certificate dialog from Firefox's Certificate Manager. + */ +@SuppressWarnings("serial") +public class ViewCertDetailsDialog extends NonBlockedHelpEnabledDialog { + // Logger + //private static Logger logger = Logger.getLogger(ViewCertDetailsDialog.class); + + /** Stores certificate to display*/ + private X509Certificate cert; + /** Stores list of serviceURLs to display*/ + private ArrayList<String> serviceURLs; + private final DistinguishedNameParser dnParser; + + /** + * Creates new ViewCertDetailsDialog dialog where the parent is a frame. + */ + public ViewCertDetailsDialog(JFrame parent, String title, boolean modal, + X509Certificate crt, ArrayList<String> serviceURLs, + DistinguishedNameParser dnParser) throws CMException { + super(parent, title, modal); + this.cert = crt; + this.serviceURLs = serviceURLs; + this.dnParser = dnParser; + initComponents(); + } + + /** + * Creates new ViewCertDetailsDialog dialog where the parent is a dialog. + */ + public ViewCertDetailsDialog(JDialog parent, String title, boolean modal, + X509Certificate crt, ArrayList<String> urlList, + DistinguishedNameParser dnParser) throws CMException { + super(parent, title, modal); + cert = crt; + serviceURLs = urlList; + this.dnParser = dnParser; + initComponents(); + } + + /** + * Initialise the dialog's GUI components. + * + * @throws CMException + * A problem was encountered getting the certificates' details + */ + private void initComponents() throws CMException { + // Certificate details: + + // Grid Bag Constraints templates for labels (column 1) and + // values (column 2) of certificate details + GridBagConstraints gbcLabel = new GridBagConstraints(); + gbcLabel.gridx = 0; + gbcLabel.ipadx = 20; + gbcLabel.gridwidth = 1; + gbcLabel.gridheight = 1; + gbcLabel.insets = new Insets(2, 15, 2, 2); + gbcLabel.anchor = LINE_START; + + GridBagConstraints gbcValue = new GridBagConstraints(); + gbcValue.gridx = 1; + gbcValue.gridwidth = 1; + gbcValue.gridheight = 1; + gbcValue.insets = new Insets(2, 5, 2, 2); + gbcValue.anchor = LINE_START; + + /* + * Netscape Certificate Type non-critical extension (if any) defines the + * intended uses of the certificate - to make it look like firefox's + * view certificate dialog. From openssl's documentation: "The [above] + * extension is non standard, Netscape specific and largely obsolete. + * Their use in new applications is discouraged." + * + * TODO replace with "basicConstraints, keyUsage and extended key usage + * extensions which are now used instead." + */ +// byte[] intendedUses = cert.getExtensionValue("2.16.840.1.113730.1.1"); //Netscape Certificate Type OID/* +// JLabel jlIntendedUses = null; +// JTextField jtfIntendedUsesValue = null; +// JPanel jpUses = null; +// GridBagConstraints gbc_jpUses = null; +// if (intendedUses != null) +// { +// jlIntendedUses = new JLabel("This certificate has been approved for the following uses:"); +// jlIntendedUses.setFont(new Font(null, Font.BOLD, 11)); +// jlIntendedUses.setBorder(new EmptyBorder(5,5,5,5)); +// +// jtfIntendedUsesValue = new JTextField(45); +// jtfIntendedUsesValue.setText(CMUtils.getIntendedCertificateUses(intendedUses)); +// jtfIntendedUsesValue.setEditable(false); +// jtfIntendedUsesValue.setFont(new Font(null, Font.PLAIN, 11)); +// +// jpUses = new JPanel(new BorderLayout()); +// jpUses.add(jlIntendedUses, BorderLayout.NORTH); +// jpUses.add(jtfIntendedUsesValue, BorderLayout.CENTER); +// JSeparator jsp = new JSeparator(JSeparator.HORIZONTAL); +// jpUses.add(jsp, BorderLayout.SOUTH); +// +// gbc_jpUses = (GridBagConstraints) gbcLabel.clone(); +// gbc_jpUses.gridy = 0; +// gbc_jpUses.gridwidth = 2; //takes two columns +// gbc_jpUses.insets = new Insets(5, 5, 5, 5);//has slightly bigger insets +// +// } + + //Issued To + JLabel jlIssuedTo = new JLabel("Issued To"); + jlIssuedTo.setFont(new Font(null, Font.BOLD, 11)); + GridBagConstraints gbc_jlIssuedTo = (GridBagConstraints) gbcLabel.clone(); + gbc_jlIssuedTo.gridy = 1; + gbc_jlIssuedTo.gridwidth = 2; //takes two columns + gbc_jlIssuedTo.insets = new Insets(5, 5, 5, 5);//has slightly bigger insets + + // Distinguished Name (DN) + String sDN = cert.getSubjectX500Principal().getName(RFC2253); + ParsedDistinguishedName parsedDN = dnParser.parseDN(sDN); + // Extract the CN, O, OU and EMAILADDRESS fields + String sCN = parsedDN.getCN(); + String sOrg = parsedDN.getO(); + String sOU = parsedDN.getOU(); + //String sEMAILADDRESS = CMX509Util.getEmilAddress(); + + // Common Name (CN) + JLabel jlCN = new JLabel("Common Name (CN)"); + jlCN.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlCN = (GridBagConstraints) gbcLabel.clone(); + gbc_jlCN.gridy = 2; + JLabel jlCNValue = new JLabel(sCN); + jlCNValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlCNValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlCNValue.gridy = 2; + + // Organisation (O) + JLabel jlOrg = new JLabel("Organisation (O)"); + jlOrg.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlOrg = (GridBagConstraints) gbcLabel.clone(); + gbc_jlOrg.gridy = 3; + JLabel jlOrgValue = new JLabel(sOrg); + jlOrgValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlOrgValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlOrgValue.gridy = 3; + + // Organisation Unit (OU) + JLabel jlOU = new JLabel("Organisation Unit (OU)"); + jlOU.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlOU = (GridBagConstraints) gbcLabel.clone(); + gbc_jlOU.gridy = 4; + JLabel jlOUValue = new JLabel(sOU); + jlOUValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlOUValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlOUValue.gridy = 4; + + // E-mail Address + //JLabel jlEmail = new JLabel("E-mail Address"); + //jlEmail.setFont(new Font(null, PLAIN, 11)); + //GridBagConstraints gbc_jlEmail = (GridBagConstraints) gbcLabel.clone(); + //gbc_jlEmail.gridy = 5; + //JLabel jlEmailValue = new JLabel(sEMAILADDRESS); + //jlEmailValue.setFont(new Font(null, PLAIN, 11)); + //GridBagConstraints gbc_jlEmailValue = (GridBagConstraints) gbcValue.clone(); + //gbc_jlEmailValue.gridy = 5; + + // Serial Number + JLabel jlSN = new JLabel("Serial Number"); + jlSN.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlSN = (GridBagConstraints) gbcLabel.clone(); + gbc_jlSN.gridy = 6; + JLabel jlSNValue = new JLabel(); + // Get the hexadecimal serial number + StringBuilder strBuff = new StringBuilder(new BigInteger(1, + cert.getSerialNumber().toByteArray()).toString(16).toUpperCase()); + // Place colons at every two hexadecimal characters + if (strBuff.length() > 2) + for (int iCnt = 2; iCnt < strBuff.length(); iCnt += 3) + strBuff.insert(iCnt, ':'); + jlSNValue.setText(strBuff.toString()); + jlSNValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlSNValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlSNValue.gridy = 6; + + // Version + JLabel jlVersion = new JLabel("Version"); + jlVersion.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlVersion = (GridBagConstraints) gbcLabel.clone(); + gbc_jlVersion.gridy = 7; + JLabel jlVersionValue = new JLabel(Integer.toString(cert.getVersion())); + jlVersionValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlVersionValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlVersionValue.gridy = 7; + + // Issued By + JLabel jlIssuedBy = new JLabel("Issued By"); + jlIssuedBy.setFont(new Font(null, BOLD, 11)); + GridBagConstraints gbc_jlIssuedBy = (GridBagConstraints) gbcLabel.clone(); + gbc_jlIssuedBy.gridy = 8; + gbc_jlIssuedBy.gridwidth = 2; //takes two columns + gbc_jlIssuedBy.insets = new Insets(5, 5, 5, 5);//has slightly bigger insets + + // Distinguished Name (DN) + String iDN = cert.getIssuerX500Principal().getName(RFC2253); + parsedDN = dnParser.parseDN(iDN); + // Extract the CN, O and OU fields + String iCN = parsedDN.getCN(); + String iOrg = parsedDN.getO(); + String iOU = parsedDN.getOU(); + + // Common Name (CN) + JLabel jlICN = new JLabel("Common Name (CN)"); + jlICN.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlICN = (GridBagConstraints) gbcLabel.clone(); + gbc_jlICN.gridy = 9; + JLabel jlICNValue = new JLabel(iCN); + jlICNValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlICNValue = (GridBagConstraints) gbcValue + .clone(); + gbc_jlICNValue.gridy = 9; + + // Organisation (O) + JLabel jlIOrg = new JLabel("Organisation (O)"); + jlIOrg.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlIOrg = (GridBagConstraints) gbcLabel.clone(); + gbc_jlIOrg.gridy = 10; + JLabel jlIOrgValue = new JLabel(iOrg); + jlIOrgValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlIOrgValue = (GridBagConstraints) gbcValue + .clone(); + gbc_jlIOrgValue.gridy = 10; + + // Organisation Unit (OU) + JLabel jlIOU = new JLabel("Organisation Unit (OU)"); + jlIOU.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlIOU = (GridBagConstraints) gbcLabel.clone(); + gbc_jlIOU.gridy = 11; + JLabel jlIOUValue = new JLabel(iOU); + jlIOUValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlIOUValue = (GridBagConstraints) gbcValue + .clone(); + gbc_jlIOUValue.gridy = 11; + + // Validity + JLabel jlValidity = new JLabel("Validity"); + jlValidity.setFont(new Font(null, BOLD, 11)); + GridBagConstraints gbc_jlValidity = (GridBagConstraints) gbcLabel + .clone(); + gbc_jlValidity.gridy = 12; + gbc_jlValidity.gridwidth = 2; // takes two columns + gbc_jlValidity.insets = new Insets(5, 5, 5, 5);// has slightly bigger insets + + // Issued On + JLabel jlIssuedOn = new JLabel("Issued On"); + jlIssuedOn.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlIssuedOn = (GridBagConstraints) gbcLabel + .clone(); + gbc_jlIssuedOn.gridy = 13; + JLabel jlIssuedOnValue = new JLabel(cert.getNotBefore().toString()); + jlIssuedOnValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlIssuedOnValue = (GridBagConstraints) gbcValue + .clone(); + gbc_jlIssuedOnValue.gridy = 13; + + // Expires On + JLabel jlExpiresOn = new JLabel("Expires On"); + jlExpiresOn.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlExpiresOn = (GridBagConstraints) gbcLabel + .clone(); + gbc_jlExpiresOn.gridy = 14; + JLabel jlExpiresOnValue = new JLabel(cert.getNotAfter().toString()); + jlExpiresOnValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlExpiresOnValue = (GridBagConstraints) gbcValue + .clone(); + gbc_jlExpiresOnValue.gridy = 14; + + // Fingerprints + byte[] certBinaryEncoding; + try { + certBinaryEncoding = cert.getEncoded(); + } catch (CertificateEncodingException ex) { + throw new CMException( + "Could not get the encoded form of the certificate.", ex); + } + JLabel jlFingerprints = new JLabel("Fingerprints"); + jlFingerprints.setFont(new Font(null, BOLD, 11)); + GridBagConstraints gbc_jlFingerprints = (GridBagConstraints) gbcLabel.clone(); + gbc_jlFingerprints.gridy = 15; + gbc_jlFingerprints.gridwidth = 2; //takes two columns + gbc_jlFingerprints.insets = new Insets(5, 5, 5, 5);//has slightly bigger insets + + // SHA-1 Fingerprint + JLabel jlSHA1Fingerprint = new JLabel("SHA1 Fingerprint"); + jlSHA1Fingerprint.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlSHA1Fingerprint = (GridBagConstraints) gbcLabel.clone(); + gbc_jlSHA1Fingerprint.gridy = 16; + JLabel jlSHA1FingerprintValue = new JLabel(dnParser.getMessageDigestAsFormattedString(certBinaryEncoding, "SHA1")); + jlSHA1FingerprintValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlSHA1FingerprintValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlSHA1FingerprintValue.gridy = 16; + + // MD5 Fingerprint + JLabel jlMD5Fingerprint = new JLabel("MD5 Fingerprint"); + jlMD5Fingerprint.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlMD5Fingerprint = (GridBagConstraints) gbcLabel.clone(); + gbc_jlMD5Fingerprint.gridy = 17; + JLabel jlMD5FingerprintValue = new JLabel(dnParser.getMessageDigestAsFormattedString(certBinaryEncoding, "MD5")); + jlMD5FingerprintValue.setFont(new Font(null, PLAIN, 11)); + GridBagConstraints gbc_jlMD5FingerprintValue = (GridBagConstraints) gbcValue.clone(); + gbc_jlMD5FingerprintValue.gridy = 17; + + /* + * Empty label to add a bit space at the bottom of the panel to make it + * look like firefox's view certificate dialog + */ + JLabel jlEmpty = new JLabel(""); + GridBagConstraints gbc_jlEmpty = (GridBagConstraints) gbcLabel.clone(); + gbc_jlEmpty.gridy = 18; + gbc_jlEmpty.gridwidth = 2; // takes two columns + gbc_jlEmpty.ipady = 40; + + JPanel jpCertificate = new JPanel(new GridBagLayout()); + jpCertificate.setBorder(new CompoundBorder(new EmptyBorder(15, 15, 15, + 15), new EtchedBorder())); + +// if (intendedUses != null){ +// jpCertificate.add(jpUses, gbc_jpUses); +// } + jpCertificate.add(jlIssuedTo, gbc_jlIssuedTo); // Issued To + jpCertificate.add(jlCN, gbc_jlCN); + jpCertificate.add(jlCNValue, gbc_jlCNValue); + jpCertificate.add(jlOrg, gbc_jlOrg); + jpCertificate.add(jlOrgValue, gbc_jlOrgValue); + jpCertificate.add(jlOU, gbc_jlOU); + jpCertificate.add(jlOUValue, gbc_jlOUValue); + //jpCertificate.add(jlEmail, gbc_jlEmail); + //jpCertificate.add(jlEmailValue, gbc_jlEmailValue); + jpCertificate.add(jlSN, gbc_jlSN); + jpCertificate.add(jlSNValue, gbc_jlSNValue); + jpCertificate.add(jlVersion, gbc_jlVersion); + jpCertificate.add(jlVersionValue, gbc_jlVersionValue); + jpCertificate.add(jlIssuedBy, gbc_jlIssuedBy); //Issued By + jpCertificate.add(jlICN, gbc_jlICN); + jpCertificate.add(jlICNValue, gbc_jlICNValue); + jpCertificate.add(jlIOrg, gbc_jlIOrg); + jpCertificate.add(jlIOrgValue, gbc_jlIOrgValue); + jpCertificate.add(jlIOU, gbc_jlIOU); + jpCertificate.add(jlIOUValue, gbc_jlIOUValue); + jpCertificate.add(jlValidity, gbc_jlValidity); //Validity + jpCertificate.add(jlIssuedOn, gbc_jlIssuedOn); + jpCertificate.add(jlIssuedOnValue, gbc_jlIssuedOnValue); + jpCertificate.add(jlExpiresOn, gbc_jlExpiresOn); + jpCertificate.add(jlExpiresOnValue, gbc_jlExpiresOnValue); + jpCertificate.add(jlFingerprints, gbc_jlFingerprints); //Fingerprints + jpCertificate.add(jlSHA1Fingerprint, gbc_jlSHA1Fingerprint); + jpCertificate.add(jlSHA1FingerprintValue, gbc_jlSHA1FingerprintValue); + jpCertificate.add(jlMD5Fingerprint, gbc_jlMD5Fingerprint); + jpCertificate.add(jlMD5FingerprintValue, gbc_jlMD5FingerprintValue); + jpCertificate.add(jlEmpty, gbc_jlEmpty); //Empty label to get some vertical space on the frame + + // List of serviceURLs + JPanel jpURLs = null; // Panel to hold the URL list + if (serviceURLs != null) { //if service serviceURLs are not null (even if empty - show empty list) + + jpURLs = new JPanel(new BorderLayout()); + jpURLs.setBorder(new CompoundBorder( + new EmptyBorder(0, 15, 0, 15), new EtchedBorder())); + // Label + JLabel jlServiceURLs = new JLabel ("Service URLs this key pair will be used for:"); + jlServiceURLs.setFont(new Font(null, Font.BOLD, 11)); + jlServiceURLs.setBorder(new EmptyBorder(5,5,5,5)); + + // New empty service serviceURLs list + DefaultListModel<String> jltModel = new DefaultListModel<>(); + JList<String> jltServiceURLs = new JList<>(jltModel); + for (String url : serviceURLs) + jltModel.addElement(url); + // don't show more than 5 otherwise the window is too big + jltServiceURLs.setVisibleRowCount(5); + + // Scroll pane for service serviceURLs + JScrollPane jspServiceURLs = new JScrollPane(jltServiceURLs, + VERTICAL_SCROLLBAR_AS_NEEDED, + HORIZONTAL_SCROLLBAR_AS_NEEDED); + jspServiceURLs.getViewport().setBackground( + jltServiceURLs.getBackground()); + + jpURLs.add(jlServiceURLs, NORTH); + jpURLs.add(jspServiceURLs, CENTER); + + // Put it on the main content pane + getContentPane().add(jpURLs, CENTER); + } + + // OK button + JPanel jpOK = new JPanel(new FlowLayout(FlowLayout.CENTER)); + + final JButton jbOK = new JButton("OK"); + jbOK.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + okPressed(); + } + }); + + jpOK.add(jbOK); + + /* + * Put it all together (panel with URL list is already added, if it was + * not null) + */ + getContentPane().add(jpCertificate, NORTH); + getContentPane().add(jpOK, SOUTH); + + // Resizing wreaks havoc + setResizable(false); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent evt) { + closeDialog(); + } + }); + + getRootPane().setDefaultButton(jbOK); + + pack(); + + invokeLater(new Runnable() { + @Override + public void run() { + jbOK.requestFocus(); + } + }); + } + + private void okPressed() { + closeDialog(); + } + + private void closeDialog() { + setVisible(false); + dispose(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewUsernamePasswordEntryDialog.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewUsernamePasswordEntryDialog.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewUsernamePasswordEntryDialog.java new file mode 100644 index 0000000..a9f1847 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/ViewUsernamePasswordEntryDialog.java @@ -0,0 +1,198 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager; + +import static java.awt.BorderLayout.CENTER; +import static java.awt.BorderLayout.SOUTH; +import static java.awt.GridBagConstraints.HORIZONTAL; +import static java.awt.GridBagConstraints.NONE; +import static java.awt.GridBagConstraints.WEST; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.EtchedBorder; + +import org.apache.taverna.workbench.helper.NonBlockedHelpEnabledDialog; + +/** + * Dialog used for viewing service URL, username and password. + * + * @author Alex Nenadic + */ +@SuppressWarnings("serial") +public class ViewUsernamePasswordEntryDialog extends + NonBlockedHelpEnabledDialog { + /** Service URL field */ + private JTextField serviceURLField; + /** Username field */ + private JTextField usernameField; + /** Password field */ + private JTextField passwordField; + /** Service URL value */ + private String serviceURL; + /** Service username value */ + private String username; + /** Service password value */ + private String password; + + public ViewUsernamePasswordEntryDialog(JFrame parent, String currentURL, + String currentUsername, String currentPassword) { + super(parent, "View username and password for a service", true); + serviceURL = currentURL; + username = currentUsername; + password = currentPassword; + initComponents(); + } + + public ViewUsernamePasswordEntryDialog(JDialog parent, String currentURL, + String currentUsername, String currentPassword) { + super(parent, "View username and password for a service", true); + serviceURL = currentURL; + username = currentUsername; + password = currentPassword; + initComponents(); + } + + private void initComponents() { + getContentPane().setLayout(new BorderLayout()); + + JLabel serviceURLLabel = new JLabel("Service URL"); + serviceURLLabel.setBorder(new EmptyBorder(0, 5, 0, 0)); + JLabel usernameLabel = new JLabel("Username"); + usernameLabel.setBorder(new EmptyBorder(0, 5, 0, 0)); + JLabel passwordLabel = new JLabel("Password"); + passwordLabel.setBorder(new EmptyBorder(0, 5, 0, 0)); + + // Populate the fields with values and disable user input + serviceURLField = new JTextField(); + serviceURLField.setText(serviceURL); + serviceURLField.setEditable(false); + + usernameField = new JTextField(15); + usernameField.setText(username); + usernameField.setEditable(false); + + passwordField = new JTextField(15); + passwordField.setText(password); + passwordField.setEditable(false); + + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + closeDialog(); + } + }); + + JPanel fieldsPanel = new JPanel(new GridBagLayout()); + + GridBagConstraints gbc = new GridBagConstraints(); + gbc.weighty = 0.0; + + gbc.weightx = 0.0; + gbc.gridx = 0; + gbc.gridy = 0; + gbc.fill = NONE; + gbc.anchor = WEST; + gbc.insets = new Insets(5, 10, 0, 0); + fieldsPanel.add(serviceURLLabel, gbc); + + gbc.weightx = 1.0; + gbc.gridx = 1; + gbc.gridy = 0; + gbc.fill = HORIZONTAL; + gbc.anchor = WEST; + gbc.insets = new Insets(5, 10, 0, 5); + fieldsPanel.add(serviceURLField, gbc); + + gbc.weightx = 0.0; + gbc.gridx = 0; + gbc.gridy = 1; + gbc.fill = NONE; + gbc.anchor = WEST; + gbc.insets = new Insets(5, 10, 0, 0); + fieldsPanel.add(usernameLabel, gbc); + + gbc.weightx = 1.0; + gbc.gridx = 1; + gbc.gridy = 1; + gbc.fill = HORIZONTAL; + gbc.anchor = WEST; + gbc.insets = new Insets(5, 10, 0, 5); + fieldsPanel.add(usernameField, gbc); + + gbc.weightx = 0.0; + gbc.gridx = 0; + gbc.gridy = 2; + gbc.fill = NONE; + gbc.anchor = WEST; + gbc.insets = new Insets(5, 10, 0, 0); + fieldsPanel.add(passwordLabel, gbc); + + gbc.weightx = 1.0; + gbc.gridx = 1; + gbc.gridy = 2; + gbc.fill = HORIZONTAL; + gbc.anchor = WEST; + gbc.insets = new Insets(5, 10, 0, 5); + fieldsPanel.add(passwordField, gbc); + + fieldsPanel.setBorder(new CompoundBorder( + new EmptyBorder(10, 10, 10, 10), new EtchedBorder())); + + JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); + buttonsPanel.add(okButton); + + getContentPane().add(fieldsPanel, CENTER); + getContentPane().add(buttonsPanel, SOUTH); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent evt) { + closeDialog(); + } + }); + + // setResizable(false); + getRootPane().setDefaultButton(okButton); + pack(); + } + + private void closeDialog() { + setVisible(false); + dispose(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/WarnUserAboutJCEPolicyDialog.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/WarnUserAboutJCEPolicyDialog.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/WarnUserAboutJCEPolicyDialog.java new file mode 100644 index 0000000..1bdf288 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/WarnUserAboutJCEPolicyDialog.java @@ -0,0 +1,222 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager; + +import static java.awt.BorderLayout.CENTER; +import static java.awt.BorderLayout.SOUTH; +import static java.awt.Desktop.getDesktop; +import static javax.swing.border.EtchedBorder.LOWERED; +import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED; +import static org.apache.commons.io.FileUtils.touch; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Frame; +import java.awt.GraphicsEnvironment; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.EtchedBorder; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.text.Document; +import javax.swing.text.html.HTMLEditorKit; +import javax.swing.text.html.StyleSheet; + +import org.apache.taverna.security.credentialmanager.DistinguishedNameParser; +import org.apache.taverna.workbench.helper.NonBlockedHelpEnabledDialog; + +import org.apache.log4j.Logger; + +import uk.org.taverna.configuration.app.ApplicationConfiguration; + +/** + * Dialog that warns user that they need to install unlimited cryptography + * strength policy for Java. + * + * @author Alex Nenadic + */ +@SuppressWarnings("serial") +public class WarnUserAboutJCEPolicyDialog extends NonBlockedHelpEnabledDialog { + private static final Logger logger = Logger + .getLogger(WarnUserAboutJCEPolicyDialog.class); + + private JCheckBox doNotWarnMeAgainCheckBox; + private final ApplicationConfiguration applicationConfiguration; + private final DistinguishedNameParser dnParser; + + public WarnUserAboutJCEPolicyDialog( + ApplicationConfiguration applicationConfiguration, + DistinguishedNameParser dnParser) { + super((Frame) null, + "Java Unlimited Strength Cryptography Policy Warning", true); + this.applicationConfiguration = applicationConfiguration; + this.dnParser = dnParser; + initComponents(); + } + + // For testing + public static void main(String[] args) { + WarnUserAboutJCEPolicyDialog dialog = new WarnUserAboutJCEPolicyDialog( + null, null); + dialog.setVisible(true); + } + + private void initComponents() { + // Base font for all components on the form + Font baseFont = new JLabel("base font").getFont().deriveFont(11f); + + // Message saying that updates are available + JPanel messagePanel = new JPanel(new BorderLayout()); + messagePanel.setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, + 10), new EtchedBorder(LOWERED))); + + JEditorPane message = new JEditorPane(); + message.setEditable(false); + message.setBackground(this.getBackground()); + message.setFocusable(false); + HTMLEditorKit kit = new HTMLEditorKit(); + message.setEditorKit(kit); + StyleSheet styleSheet = kit.getStyleSheet(); + //styleSheet.addRule("body {font-family:"+baseFont.getFamily()+"; font-size:"+baseFont.getSize()+";}"); // base font looks bigger when rendered as HTML + styleSheet.addRule("body {font-family:" + baseFont.getFamily() + + "; font-size:10px;}"); + Document doc = kit.createDefaultDocument(); + message.setDocument(doc); + message.setText("<html><body>In order for Taverna's security features to function properly - you need to install<br>" + + "'Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy'. <br><br>" + + "If you do not already have it, for <b>Java 6</b> you can get it from:<br>" + + "<a href=\"http://www.oracle.com/technetwork/java/javase/downloads/index.html\">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a><br<br>" + + "Installation instructions are contained in the bundle you download." + + "</body><html>"); + message.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent he) { + HyperlinkEvent.EventType type = he.getEventType(); + if (type == ACTIVATED) + // Open a Web browser + try { + getDesktop().browse(he.getURL().toURI()); +// BrowserLauncher launcher = new BrowserLauncher(); +// launcher.openURLinBrowser(he.getURL().toString()); + } catch (Exception ex) { + logger.error("Failed to launch browser to fetch JCE " + + he.getURL()); + } + } + }); + message.setBorder(new EmptyBorder(5, 5, 5, 5)); + messagePanel.add(message, CENTER); + + doNotWarnMeAgainCheckBox = new JCheckBox("Do not warn me again"); + doNotWarnMeAgainCheckBox.setFont(baseFont.deriveFont(12f)); + messagePanel.add(doNotWarnMeAgainCheckBox, SOUTH); + + // Buttons + JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); + JButton okButton = new JButton("OK"); + okButton.setFont(baseFont); + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + okPressed(); + } + }); + + buttonsPanel.add(okButton); + + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(messagePanel, CENTER); + getContentPane().add(buttonsPanel, SOUTH); + + pack(); + setResizable(false); + // Center the dialog on the screen (we do not have the parent) + Dimension dimension = getToolkit().getScreenSize(); + Rectangle abounds = getBounds(); + setLocation((dimension.width - abounds.width) / 2, + (dimension.height - abounds.height) / 2); + setSize(getPreferredSize()); + } + + private static final String DO_NOT_WARN_ABOUT_JCE_POLICY = "do_not_warn_about_JCE_policy"; + public static boolean warnedUser = false; // have we already warned user for + // this run + + /** + * Warn user that they need to install Java Cryptography Extension (JCE) + * Unlimited Strength Jurisdiction Policy if they want Credential Manager to + * function properly. + */ + public static void warnUserAboutJCEPolicy( + ApplicationConfiguration applicationConfiguration, + DistinguishedNameParser dnParser) { + /* + * Do not pop up a dialog if we are running headlessly. If we have + * warned the user and they do not want us to remind them again - exit. + */ + if (warnedUser || GraphicsEnvironment.isHeadless() + || doNotWarnFile(applicationConfiguration, dnParser).exists()) + return; + + WarnUserAboutJCEPolicyDialog warnDialog = new WarnUserAboutJCEPolicyDialog( + applicationConfiguration, dnParser); + warnDialog.setVisible(true); + warnedUser = true; + } + + private static File doNotWarnFile( + ApplicationConfiguration applicationConfiguration, + DistinguishedNameParser dnParser) { + return new File( + dnParser.getCredentialManagerDefaultDirectory(applicationConfiguration), + DO_NOT_WARN_ABOUT_JCE_POLICY); + } + + protected void okPressed() { + try { + if (doNotWarnMeAgainCheckBox.isSelected()) + touch(doNotWarnFile(applicationConfiguration, dnParser)); + } catch (IOException e) { + logger.error( + "Failed to touch the 'Do not want me about JCE unilimited security policy' file.", + e); + } + closeDialog(); + } + + private void closeDialog() { + setVisible(false); + dispose(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/action/CredentialManagerAction.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/action/CredentialManagerAction.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/action/CredentialManagerAction.java new file mode 100644 index 0000000..038f69a --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/action/CredentialManagerAction.java @@ -0,0 +1,67 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.action; + +import static javax.swing.SwingUtilities.invokeLater; + +import java.awt.event.ActionEvent; + +import javax.swing.AbstractAction; +import javax.swing.ImageIcon; + +import org.apache.taverna.security.credentialmanager.CredentialManager; +import org.apache.taverna.security.credentialmanager.DistinguishedNameParser; +import org.apache.taverna.workbench.ui.credentialmanager.CredentialManagerUI; + +//import javax.swing.SwingUtilities; + +@SuppressWarnings("serial") +public class CredentialManagerAction extends AbstractAction { + private static ImageIcon ICON = new ImageIcon( + CredentialManagerAction.class + .getResource("/images/cred_manager16x16.png")); + + private CredentialManagerUI cmUI; + private final CredentialManager credentialManager; + private final DistinguishedNameParser dnParser; + + public CredentialManagerAction(CredentialManager credentialManager, + DistinguishedNameParser dnParser) { + super("Credential Manager", ICON); + this.credentialManager = credentialManager; + this.dnParser = dnParser; + } + + @Override + public void actionPerformed(ActionEvent e) { + if (cmUI != null) { + cmUI.setVisible(true); + return; + } + + invokeLater(new Runnable() { + @Override + public void run() { + cmUI = new CredentialManagerUI(credentialManager, dnParser); + cmUI.setVisible(true); + } + }); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/menu/CredentialManagerMenu.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/menu/CredentialManagerMenu.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/menu/CredentialManagerMenu.java new file mode 100644 index 0000000..eb6cd88 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/menu/CredentialManagerMenu.java @@ -0,0 +1,69 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.menu; + +import java.net.URI; + +import javax.swing.Action; + +//import org.apache.log4j.Logger; + +import org.apache.taverna.security.credentialmanager.CredentialManager; +import org.apache.taverna.security.credentialmanager.DistinguishedNameParser; +import org.apache.taverna.ui.menu.AbstractMenuAction; +import org.apache.taverna.workbench.ui.credentialmanager.action.CredentialManagerAction; + +public class CredentialManagerMenu extends AbstractMenuAction { + private static final String MENU_URI = "http://taverna.sf.net/2008/t2workbench/menu#advanced"; + + private CredentialManager credentialManager; + private DistinguishedNameParser dnParser; + + // private static Logger logger = Logger.getLogger(CredentialManagerMenu.class); + + public CredentialManagerMenu() { + super(URI.create(MENU_URI), 60); + /* This is now done in the initialise SSL startup hook - no need to do it here. + // Force initialisation at startup + try { + CredentialManager.getInstance(); + } catch (CMException e) { + logger.error("Could not initialise SSL properties for SSL connections from Taverna.", e); + } + */ + } + + @Override + protected Action createAction() { + return new CredentialManagerAction(credentialManager, dnParser); + } + + public void setCredentialManager(CredentialManager credentialManager) { + this.credentialManager = credentialManager; + } + + /** + * @param dnParser + * the dnParser to set + */ + public void setDistinguishedNameParser(DistinguishedNameParser dnParser) { + this.dnParser = dnParser; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserJavaTruststorePasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserJavaTruststorePasswordProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserJavaTruststorePasswordProvider.java new file mode 100644 index 0000000..4d0cc03 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserJavaTruststorePasswordProvider.java @@ -0,0 +1,45 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import org.apache.taverna.security.credentialmanager.JavaTruststorePasswordProvider; + +/** + * An implementation of the {@link JavaTruststorePasswordProvider} that pops up a + * dialog and asks the user to provide the password. + * + * @author Alex Nenadic + * + */ +public class AskUserJavaTruststorePasswordProvider implements JavaTruststorePasswordProvider{ + + @Override + public String getJavaTruststorePassword() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setJavaTruststorePassword(String password) { + // TODO Auto-generated method stub + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserMasterPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserMasterPasswordProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserMasterPasswordProvider.java new file mode 100644 index 0000000..fc62f51 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserMasterPasswordProvider.java @@ -0,0 +1,54 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import org.apache.taverna.security.credentialmanager.MasterPasswordProvider; + +public class AskUserMasterPasswordProvider implements MasterPasswordProvider{ + +// @Override +// public boolean canProvideMasterPassword() { +// // TODO Auto-generated method stub +// return false; +// } + private int priority = 100; + + @Override + public String getMasterPassword(boolean firstTime) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getProviderPriority() { + return priority; + } + + @Override + public void setMasterPassword(String password) { + // TODO Auto-generated method stub + } + +// @Override +// public void setProviderPriority(int priority) { +// this.priority = priority; +// } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserServiceUsernameAndPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserServiceUsernameAndPasswordProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserServiceUsernameAndPasswordProvider.java new file mode 100644 index 0000000..4c6f046 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserServiceUsernameAndPasswordProvider.java @@ -0,0 +1,42 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import java.net.URI; + +import org.apache.taverna.security.credentialmanager.ServiceUsernameAndPasswordProvider; +import org.apache.taverna.security.credentialmanager.UsernamePassword; + +public class AskUserServiceUsernameAndPasswordProvider implements ServiceUsernameAndPasswordProvider{ + + @Override + public UsernamePassword getServiceUsernameAndPassword(URI serviceURI, String requestMessage) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setServiceUsernameAndPassword(URI serviceURI, + UsernamePassword usernamePassword) { + // TODO Auto-generated method stub + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserTrustConfirmationProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserTrustConfirmationProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserTrustConfirmationProvider.java new file mode 100644 index 0000000..8523207 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/AskUserTrustConfirmationProvider.java @@ -0,0 +1,34 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import java.security.cert.X509Certificate; + +import org.apache.taverna.security.credentialmanager.TrustConfirmationProvider; + +public class AskUserTrustConfirmationProvider implements TrustConfirmationProvider { + + @Override + public Boolean shouldTrustCertificate(X509Certificate[] chain) { + // TODO Auto-generated method stub + return null; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/GetPasswordDialog.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/GetPasswordDialog.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/GetPasswordDialog.java new file mode 100644 index 0000000..74b1446 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/GetPasswordDialog.java @@ -0,0 +1,227 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import static java.awt.BorderLayout.CENTER; +import static java.awt.BorderLayout.NORTH; +import static java.awt.BorderLayout.SOUTH; +import static java.awt.FlowLayout.LEFT; +import static java.awt.FlowLayout.RIGHT; +import static javax.swing.JOptionPane.WARNING_MESSAGE; +import static javax.swing.JOptionPane.showMessageDialog; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Frame; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.EtchedBorder; + +import org.apache.taverna.workbench.helper.NonBlockedHelpEnabledDialog; + +/** + * Dialog for entering user's username and password. + * + * @author Alex Nenadic + */ +@SuppressWarnings("serial") +public class GetPasswordDialog extends NonBlockedHelpEnabledDialog { + /** + * Whether we should ask user to save their username and password using + * Credential Manager + */ + private boolean shouldAskUserToSave; + /** Username field */ + private JTextField usernameField; + /** Password field */ + private JPasswordField passwordField; + /** + * Whether user wished to save the username and password using Credential + * Manager + */ + private JCheckBox saveCheckBox; + /** The entered username */ + private String username; + /** The entered password */ + private String password; + /** Instructions to the user */ + private String instructions; + + public GetPasswordDialog(String instructions, boolean shouldAskUserToSave) { + super((Frame) null, "Enter username and password", true); + this.instructions = instructions; + this.shouldAskUserToSave = shouldAskUserToSave; + initComponents(); + } + + private void initComponents() { + getContentPane().setLayout(new BorderLayout()); + + JLabel instructionsLabel = new JLabel(instructions); + instructionsLabel.setBorder(new EmptyBorder(5, 5, 5, 5)); + JPanel jpInstructions = new JPanel(new FlowLayout(LEFT)); + jpInstructions.add(instructionsLabel); + + JLabel usernameLabel = new JLabel("Username"); + usernameLabel.setBorder(new EmptyBorder(5, 5, 5, 5)); + JLabel passwordLabel = new JLabel("Password"); + passwordLabel.setBorder(new EmptyBorder(5, 5, 5, 5)); + + usernameField = new JTextField(15); + passwordField = new JPasswordField(15); + + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + okPressed(); + } + }); + + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + cancelPressed(); + } + }); + + // Central panel with username/password fields and a "Do you want to Save?" checkbox + JPanel mainPanel = new JPanel(new BorderLayout()); + + JPanel passwordPanel = new JPanel(new GridLayout(2, 2, 5, 5)); + passwordPanel.add(usernameLabel); + passwordPanel.add(usernameField); + passwordPanel.add(passwordLabel); + passwordPanel.add(passwordField); + mainPanel.add(passwordPanel, CENTER); + + // If user wants to save this username and password + saveCheckBox = new JCheckBox(); + saveCheckBox.setBorder(new EmptyBorder(5, 5, 5, 5)); + saveCheckBox.setSelected(true); + saveCheckBox + .setText("Use Credential Manager to save this username and password"); + if (shouldAskUserToSave) { + JPanel jpSaveCheckBox = new JPanel(new FlowLayout(LEFT)); + jpSaveCheckBox.add(saveCheckBox); + mainPanel.add(jpSaveCheckBox, SOUTH); + } + + passwordPanel.setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, + 10), new EtchedBorder())); + + JPanel buttonsPanel = new JPanel(new FlowLayout(RIGHT)); + buttonsPanel.add(okButton); + buttonsPanel.add(cancelButton); + + passwordPanel.setMinimumSize(new Dimension(300, 100)); + + getContentPane().add(jpInstructions, NORTH); + getContentPane().add(mainPanel, CENTER); + getContentPane().add(buttonsPanel, SOUTH); + + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent evt) { + closeDialog(); + } + }); + + setResizable(false); + getRootPane().setDefaultButton(okButton); + pack(); + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } + + /** + * Check if user wishes to save username and pasword using the Credential + * Manager. + */ + public boolean shouldSaveUsernameAndPassword() { + return saveCheckBox.isSelected(); + } + + private boolean checkControls() { + username = usernameField.getText(); + if (username.length() == 0) { + showMessageDialog(this, "Username cannot be empty", "Warning", + WARNING_MESSAGE); + return false; + } + + password = new String(passwordField.getPassword()); + if (password.length() == 0) { // password empty + showMessageDialog(this, "Password cannot be empty", "Warning", + WARNING_MESSAGE); + + return false; + } + + return true; + } + + private void okPressed() { + if (checkControls()) + closeDialog(); + } + + private void cancelPressed() { + // Set all fields to null to indicate that cancel button was pressed + username = null; + password = null; + closeDialog(); + } + + private void closeDialog() { + setVisible(false); + dispose(); + } + + public void setUsername(String username) { + this.username = username; + usernameField.setText(username); + } + + public void setPassword(String password) { + this.password = password; + passwordField.setText(password); + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/SimpleMasterPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/SimpleMasterPasswordProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/SimpleMasterPasswordProvider.java new file mode 100644 index 0000000..0b04984 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/SimpleMasterPasswordProvider.java @@ -0,0 +1,53 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import org.apache.taverna.security.credentialmanager.MasterPasswordProvider; + +/** + * A simple implementation of {@link MasterPasswordProvider} that just provides + * a master password that can be obtained and set from outside the provider. + * + * @author Alex Nenadic + */ +public class SimpleMasterPasswordProvider implements MasterPasswordProvider { + private String masterPassword; + private int priority = 200; + + @Override + public String getMasterPassword(boolean firstTime) { + return masterPassword; + } + + @Override + public void setMasterPassword(String masterPassword){ + this.masterPassword = masterPassword; + } + + @Override + public int getProviderPriority() { + return priority; + } + +// @Override +// public void setProviderPriority(int priority) { +// this.priority = priority; +// } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIMasterPasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIMasterPasswordProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIMasterPasswordProvider.java new file mode 100644 index 0000000..8f76a37 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIMasterPasswordProvider.java @@ -0,0 +1,125 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import java.awt.GraphicsEnvironment; + +import javax.swing.JFrame; +import org.apache.taverna.security.credentialmanager.DistinguishedNameParser; + +import uk.org.taverna.configuration.app.ApplicationConfiguration; + +import org.apache.taverna.security.credentialmanager.JavaTruststorePasswordProvider; +import org.apache.taverna.security.credentialmanager.MasterPasswordProvider; +import org.apache.taverna.workbench.ui.credentialmanager.GetMasterPasswordDialog; +import org.apache.taverna.workbench.ui.credentialmanager.SetMasterPasswordDialog; +import org.apache.taverna.workbench.ui.credentialmanager.WarnUserAboutJCEPolicyDialog; + +/** + * A UI pop-up that asks user for a master password for Credential Manager. + * + * @author Alex Nenadic + * @author Stian Soiland-Reyes + * + */ +public class UIMasterPasswordProvider implements MasterPasswordProvider, JavaTruststorePasswordProvider { + + private ApplicationConfiguration applicationConfiguration; + + private DistinguishedNameParser dnParser; + + @Override + public String getJavaTruststorePassword() { + if (GraphicsEnvironment.isHeadless()) { + return null; + } + + GetMasterPasswordDialog getPasswordDialog = new GetMasterPasswordDialog( + "Credential Manager needs to copy certificates from Java truststore. " + + "Please enter your password."); + getPasswordDialog.setLocationRelativeTo(null); + getPasswordDialog.setVisible(true); + String javaTruststorePassword = getPasswordDialog.getPassword(); + return javaTruststorePassword; + } + + @Override + public void setJavaTruststorePassword(String password) { + } + + @Override + public String getMasterPassword(boolean firstTime) { + + // Check if this Taverna run is headless (i.e. Taverna Server or Taverna + // from command line) - do not do anything here if it is as we do not + // want + // any windows popping up even if they could + if (GraphicsEnvironment.isHeadless()) { + return null; + } + + // Pop up a warning about Java Cryptography Extension (JCE) + // Unlimited Strength Jurisdiction Policy + WarnUserAboutJCEPolicyDialog.warnUserAboutJCEPolicy(applicationConfiguration, dnParser); + + if (firstTime) { + // Ask user to set the master password for Credential Manager (only + // the first time) + SetMasterPasswordDialog setPasswordDialog = new SetMasterPasswordDialog( + (JFrame) null, "Set master password", true, + "Set master password for Credential Manager"); + setPasswordDialog.setLocationRelativeTo(null); + setPasswordDialog.setVisible(true); + return setPasswordDialog.getPassword(); + } else { + // Ask user to provide a master password for Credential Manager + GetMasterPasswordDialog getPasswordDialog = new GetMasterPasswordDialog( + "Enter master password for Credential Manager"); + getPasswordDialog.setLocationRelativeTo(null); + getPasswordDialog.setVisible(true); + return getPasswordDialog.getPassword(); + } + } + + @Override + public void setMasterPassword(String password) { + } + + @Override + public int getProviderPriority() { + return 100; + } + + /** + * Sets the applicationConfiguration. + * + * @param applicationConfiguration the new value of applicationConfiguration + */ + public void setApplicationConfiguration(ApplicationConfiguration applicationConfiguration) { + this.applicationConfiguration = applicationConfiguration; + } + + /** + * @param dnParser the dnParser to set + */ + public void setDistinguishedNameParser(DistinguishedNameParser dnParser) { + this.dnParser = dnParser; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIUsernamePasswordProvider.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIUsernamePasswordProvider.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIUsernamePasswordProvider.java new file mode 100644 index 0000000..c92535c --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/password/UIUsernamePasswordProvider.java @@ -0,0 +1,111 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.password; + +import static java.awt.GraphicsEnvironment.isHeadless; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.taverna.security.credentialmanager.DistinguishedNameParser; +import org.apache.taverna.security.credentialmanager.ServiceUsernameAndPasswordProvider; +import org.apache.taverna.security.credentialmanager.UsernamePassword; + +import org.apache.log4j.Logger; + +public class UIUsernamePasswordProvider implements + ServiceUsernameAndPasswordProvider { + private static final Logger logger = Logger + .getLogger(UIUsernamePasswordProvider.class); + + private DistinguishedNameParser dnParser; + + public boolean canProvideUsernamePassword(URI serviceURI) { + return !isHeadless(); + } + + @Override + public UsernamePassword getServiceUsernameAndPassword(URI serviceURI, + String requestingPrompt) { + URI displayURI = serviceURI; + + try { + displayURI = dnParser.setFragmentForURI(displayURI, null); + displayURI = dnParser.setUserInfoForURI(displayURI, null); + } catch (URISyntaxException e) { + logger.warn("Could not strip fragment/userinfo from " + serviceURI, + e); + } + + StringBuilder message = new StringBuilder(); + message.append("<html><body>The Taverna Credential Manager could not find a "); + message.append("username and password for the service at:"); + message.append("<br><br><code>"); + message.append(displayURI); + message.append("</code>"); + if (requestingPrompt != null && !requestingPrompt.isEmpty()) { + message.append("<p><i>"); + message.append(requestingPrompt); + message.append("</i>"); + } + message.append("<br><br>Please provide the username and password.</body></html>"); + + GetPasswordDialog getPasswordDialog = new GetPasswordDialog( + message.toString(), true); + getPasswordDialog.setLocationRelativeTo(null); + if (serviceURI.getRawUserInfo() != null + && serviceURI.getRawUserInfo().length() > 1) { + String userInfo = serviceURI.getRawUserInfo(); + String[] userPassword = userInfo.split(":", 2); + if (userPassword.length == 2) { + getPasswordDialog.setUsername(userPassword[0]); + getPasswordDialog.setPassword(userPassword[1]); + } + } + getPasswordDialog.setVisible(true); + + String username = getPasswordDialog.getUsername(); // get username + String password = getPasswordDialog.getPassword(); // get password + boolean shouldSaveUsernameAndPassword = getPasswordDialog + .shouldSaveUsernameAndPassword(); + if (username == null || password == null) + // user cancelled - any of the above two variables is null + return null; + + UsernamePassword credential = new UsernamePassword(); + credential.setUsername(username); + credential.setPassword(password.toCharArray()); + credential.setShouldSave(shouldSaveUsernameAndPassword); + return credential; + } + + @Override + public void setServiceUsernameAndPassword(URI serviceURI, + UsernamePassword usernamePassword) { + } + + /** + * @param dnParser + * the dnParser to set + */ + public void setDistinguishedNameParser(DistinguishedNameParser dnParser) { + this.dnParser = dnParser; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/InitialiseSSLStartupHook.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/InitialiseSSLStartupHook.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/InitialiseSSLStartupHook.java new file mode 100644 index 0000000..6453556 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/InitialiseSSLStartupHook.java @@ -0,0 +1,63 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.startup; + +import org.apache.log4j.Logger; + +import org.apache.taverna.security.credentialmanager.CMException; +import org.apache.taverna.security.credentialmanager.CredentialManager; +import org.apache.taverna.workbench.StartupSPI; + +/** + * + * Startup hook to initialise SSL socket factory used by Taverna for creating + * HTTPS connections. + * + * @author Alex Nenadic + * @author Stian Soiland-Reyes + */ +public class InitialiseSSLStartupHook implements StartupSPI { + private static final Logger logger = Logger + .getLogger(InitialiseSSLStartupHook.class); + + private CredentialManager credManager; + + @Override + public int positionHint() { + return 25; + } + + @Override + public boolean startup() { + logger.info("Initialising SSL socket factory for SSL connections from Taverna."); + try { + credManager.initializeSSL(); + } catch (CMException e) { + logger.error( + "Could not initialise the SSL socket factory (for creating SSL connections)" + + " using Taverna's keystores.", e); + } + return true; + } + + public void setCredentialManager(CredentialManager credManager) { + this.credManager = credManager; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/SetCredManAuthenticatorStartupHook.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/SetCredManAuthenticatorStartupHook.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/SetCredManAuthenticatorStartupHook.java new file mode 100644 index 0000000..23f006e --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/startup/SetCredManAuthenticatorStartupHook.java @@ -0,0 +1,43 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.startup; + +import java.net.Authenticator; +import org.apache.taverna.security.credentialmanager.CredentialManager; +import org.apache.taverna.workbench.StartupSPI; + +public class SetCredManAuthenticatorStartupHook implements StartupSPI { + private CredentialManager credManager; + + @Override + public int positionHint() { + return 50; + } + + @Override + public boolean startup() { + Authenticator.setDefault(credManager.getAuthenticator()); + return true; + } + + public void setCredentialManager(CredentialManager credManager) { + this.credManager = credManager; + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/toolbar/CredentialManagerToolbarAction.java ---------------------------------------------------------------------- diff --git a/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/toolbar/CredentialManagerToolbarAction.java b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/toolbar/CredentialManagerToolbarAction.java new file mode 100644 index 0000000..ca83468 --- /dev/null +++ b/taverna-credential-manager-ui/src/main/java/org/apache/taverna/workbench/ui/credentialmanager/toolbar/CredentialManagerToolbarAction.java @@ -0,0 +1,43 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.apache.taverna.workbench.ui.credentialmanager.toolbar; + +import static org.apache.taverna.workbench.ui.credentialmanager.toolbar.CredentialManagerToolbarSection.CREDENTIAL_MANAGER_TOOLBAR_SECTION; + +import java.net.URI; + +import javax.swing.Action; + +import org.apache.taverna.ui.menu.AbstractMenuAction; +import org.apache.taverna.workbench.ui.credentialmanager.action.CredentialManagerAction; + +public class CredentialManagerToolbarAction extends AbstractMenuAction { + private static final String ENTRY_URI = "http://taverna.sf.net/2008/t2workbench/toolbar#credentialManagerAction"; + + public CredentialManagerToolbarAction() { + super(CREDENTIAL_MANAGER_TOOLBAR_SECTION, 100, URI.create(ENTRY_URI)); + } + + @Override + protected Action createAction() { + // need to add CredentialManager if toolbar is ever used + return new CredentialManagerAction(null, null); + } +}
