/* * Copyright (c) 2001-2005 Sun Microsystems, Inc. All rights reserved. * * The Sun Project JXTA(TM) Software License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by Sun Microsystems, Inc. for JXTA(TM) technology." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this software * without prior written permission. For written permission, please contact * Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", nor may * "JXTA" appear in their name, without prior written permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN * MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * JXTA is a registered trademark of Sun Microsystems, Inc. in the United * States and other countries. * * Please see the license information page at : * <http://www.jxta.org/project/www/license.html> for instructions on use of * the license in source files. * * ==================================================================== * * This software consists of voluntary contributions made by many individuals * on behalf of Project JXTA. For more information on Project JXTA, please see * http://www.jxta.org. * * This license is based on the BSD license adopted by the Apache Foundation. */ package tutorial.psesample; import net.jxta.credential.AuthenticationCredential; import net.jxta.document.MimeMediaType; import net.jxta.document.StructuredDocumentFactory; import net.jxta.document.XMLDocument; import net.jxta.exception.PeerGroupException; import net.jxta.exception.ProtocolNotSupportedException; import net.jxta.id.ID; import net.jxta.id.IDFactory; import net.jxta.impl.membership.pse.PSECredential; import net.jxta.impl.membership.pse.PSEMembershipService; import net.jxta.impl.membership.pse.PSEUtils; import net.jxta.impl.membership.pse.StringAuthenticator; import net.jxta.impl.protocol.Certificate; import net.jxta.peergroup.PeerGroup; import net.jxta.protocol.ModuleImplAdvertisement; import net.jxta.protocol.PeerGroupAdvertisement; import org.bouncycastle.asn1.DERSet; import org.bouncycastle.jce.PKCS10CertificationRequest; import org.bouncycastle.jce.X509Principal; import org.bouncycastle.jce.X509V3CertificateGenerator; import javax.crypto.EncryptedPrivateKeyInfo; import javax.swing.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.ByteArrayInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.UndeclaredThrowableException; import java.math.BigInteger; import java.security.*; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import java.util.*; /** * Main User Interface for the PSE Sample Peer Group application. * <p/> * <p/>Provides access to a wide variety of fun and interesting PSE operations. * <p/> * <p/>This user interface is appropriate for this sample application but is * not appropriate for real applications. The major difference is the strategy * used for dynamically updating buttons and panels. After some experimentation * and feedback it was decided that this application would not dynamically * enable and disable most buttons. By leaving all buttons enabled, but * including status messages when unavailable options are attempted developers * can better experiment and understand why the application behaves as it does. * <p/> * <p/>Real applications should not present users with unavailable options. */ public class SwingUI extends javax.swing.JFrame { /** * The peer group which is the parent for our PSE peer group. Normally this * will be the Net Peer Group, but it is a bad idea to assume that it * always will be the Net Peer Group. * <p/> * <p/>The PSE peer group is instantiated into the parent peer group. The * parent peer group is also used for publishing our peer group * advertisement and the module implementation advertisement for the PSE * peer group. */ final PeerGroup parentgroup; /** * Our peer group object, the PSE Peer Group. */ final PeerGroup group; /** * The Membership service of the PSE Peer Group. */ final PSEMembershipService membership; /** * Credential which is created when the user successfully authenticates * for the invitation certificate. This requires that they know the * password used to encrypt the private key. */ PSECredential invitationCredential = null; /** * Authenticator which is used for generating the invitation credential. */ StringAuthenticator invitationAuthenticator = null; /** * Credential which is created when the user successfully authenticates * for the member certificate. This requires that they know the password * used to encrypt the private key. */ PSECredential memberCredential = null; /** * Authenticator which is used for generating the invitation credential. */ StringAuthenticator memberAuthenticator = null; /** * Credential which is created when the user successfully authenticates * for the owner certificate. This requires that they know the password * used to encrypt the private key. */ PSECredential ownerCredential = null; /** * Authenticator which is used for generating the invitation credential. */ StringAuthenticator ownerAuthenticator = null; /** * Creates new form SwingUI */ public SwingUI(PeerGroup parent, PeerGroupAdvertisement pse_pga) { parentgroup = parent; try { group = parentgroup.newGroup(pse_pga); } catch (PeerGroupException failed) { JOptionPane.showMessageDialog(null, failed.getMessage(), "Couldn't create PSE Peer Group", JOptionPane.ERROR_MESSAGE); throw new IllegalStateException("Can't continue without being able to create a peergroup."); } membership = (PSEMembershipService) group.getMembershipService(); initComponents(); membership.addPropertyChangeListener("defaultCredential", new PropertyChangeListener() { public void propertyChange(final PropertyChangeEvent evt) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() {// FIXME 20050624 bondolo how do I tell the swing UI???? } }); } }); } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel invitationDescriptionText; javax.swing.JLabel invitationPasswordLabel; javax.swing.JLabel memberPasswordLabel; memberTab = new javax.swing.JPanel(); memberPasswordLabel = new javax.swing.JLabel(); memberPasswordField = new javax.swing.JPasswordField(); generateMemberCertButton = new javax.swing.JButton(); memberAuthenticateButton = new javax.swing.JButton(); memberGenerateCSRButton = new javax.swing.JButton(); memberImportCertButton = new javax.swing.JButton(); memberResignButton = new javax.swing.JButton(); adminTab = new javax.swing.JPanel(); adminSignCSRButton = new javax.swing.JButton(); adminInviteButton = new javax.swing.JButton(); adminInvitationPasswordLabel = new javax.swing.JLabel(); adminInvitationPasswordField = new javax.swing.JPasswordField(); ownerTab = new javax.swing.JPanel(); ownerSignCSRButton = new javax.swing.JButton(); ownerPasswordLabel = new javax.swing.JLabel(); ownerPasswordField = new javax.swing.JPasswordField(); ownerAuthenticateButton = new javax.swing.JButton(); ownerResignButton = new javax.swing.JButton(); invitationTab = new javax.swing.JPanel(); invitationDescriptionText = new javax.swing.JLabel(); invitationPasswordLabel = new javax.swing.JLabel(); invitationPasswordField = new javax.swing.JPasswordField(); invitationConfirmButton = new javax.swing.JButton(); keyStorePasswordLabel = new javax.swing.JLabel(); keyStorePasswordField = new javax.swing.JPasswordField(); tabs = new javax.swing.JTabbedPane(); authenticationStatus = new javax.swing.JTextField(); memberTab.setLayout(new java.awt.GridBagLayout()); memberTab.setToolTipText("Actions for Peer Group Members"); memberTab.setName("Member"); memberTab.setNextFocusableComponent(adminTab); if (membership.getPSEConfig().isInitialized()) { tabs.add(memberTab); } memberPasswordLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); memberPasswordLabel.setLabelFor(memberPasswordField); memberPasswordLabel.setText("Member Password"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 3); memberTab.add(memberPasswordLabel, gridBagConstraints); memberPasswordField.setColumns(16); memberPasswordField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { memberPasswordFieldActionPerformed(evt); } }); memberPasswordField.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyReleased(java.awt.event.KeyEvent evt) { memberPasswordFieldKeyReleasedHandler(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(4, 2, 2, 4); memberTab.add(memberPasswordField, gridBagConstraints); generateMemberCertButton.setText("Generate Certificate "); generateMemberCertButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { generateMemberCertButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); memberTab.add(generateMemberCertButton, gridBagConstraints); memberAuthenticateButton.setText("Authenticate"); memberAuthenticateButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { memberAuthenticateButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); memberTab.add(memberAuthenticateButton, gridBagConstraints); memberGenerateCSRButton.setText("Generate CSR..."); memberGenerateCSRButton.setEnabled(false); memberGenerateCSRButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { memberGenerateCSRButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); memberTab.add(memberGenerateCSRButton, gridBagConstraints); memberImportCertButton.setText("Import Signed Certificate..."); memberImportCertButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { memberImportCertButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); memberTab.add(memberImportCertButton, gridBagConstraints); memberResignButton.setText("Resign"); memberResignButton.setEnabled(false); memberResignButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { memberResignButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); memberTab.add(memberResignButton, gridBagConstraints); adminTab.setLayout(new java.awt.GridBagLayout()); adminTab.setToolTipText("Actions for Peer Group Administrators"); adminTab.setName("Administrator"); adminTab.setNextFocusableComponent(ownerTab); adminSignCSRButton.setText("Sign CSR..."); adminSignCSRButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { adminSignCSRButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); adminTab.add(adminSignCSRButton, gridBagConstraints); adminInviteButton.setText("Generate Invitation..."); adminInviteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { adminInviteButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); adminTab.add(adminInviteButton, gridBagConstraints); adminInvitationPasswordLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); adminInvitationPasswordLabel.setLabelFor(adminInvitationPasswordField); adminInvitationPasswordLabel.setText("Invitation Password"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 3); adminTab.add(adminInvitationPasswordLabel, gridBagConstraints); adminInvitationPasswordField.setColumns(16); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(4, 2, 2, 4); adminTab.add(adminInvitationPasswordField, gridBagConstraints); ownerTab.setLayout(new java.awt.GridBagLayout()); ownerTab.setToolTipText("Actions for Peer Group Owner"); ownerTab.setName("Owner"); ownerTab.setNextFocusableComponent(keyStorePasswordField); ownerSignCSRButton.setText("Sign CSR..."); ownerSignCSRButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ownerSignCSRButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); ownerTab.add(ownerSignCSRButton, gridBagConstraints); ownerPasswordLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); ownerPasswordLabel.setLabelFor(ownerPasswordField); ownerPasswordLabel.setText("Owner Password"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 3); ownerTab.add(ownerPasswordLabel, gridBagConstraints); ownerPasswordField.setColumns(16); ownerPasswordField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ownerPasswordFieldActionPerformed(evt); } }); ownerPasswordField.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyReleased(java.awt.event.KeyEvent evt) { ownerPasswordFieldKeyReleasedHandler(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END; gridBagConstraints.insets = new java.awt.Insets(4, 2, 2, 4); ownerTab.add(ownerPasswordField, gridBagConstraints); ownerAuthenticateButton.setText("Authencticate"); ownerAuthenticateButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ownerAuthenticateButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); ownerTab.add(ownerAuthenticateButton, gridBagConstraints); ownerResignButton.setText("Resign"); ownerResignButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ownerResignButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); ownerTab.add(ownerResignButton, gridBagConstraints); invitationTab.setLayout(new java.awt.GridBagLayout()); invitationTab.setToolTipText("Actions for Confirming a Peer Group Invitation"); invitationTab.setFocusable(false); invitationTab.setName("Invitation"); invitationTab.setNextFocusableComponent(keyStorePasswordField); if (!membership.getPSEConfig().isInitialized()) { tabs.add(invitationTab); } invitationDescriptionText.setFont(new java.awt.Font("Dialog", 0, 12)); invitationDescriptionText.setText("Confirm the invitation \"%1\" from \"%2\" to join the JXTA Peer Group \"%3\"."); invitationDescriptionText.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); if (!membership.getPSEConfig().isInitialized()) { try { AuthenticationCredential application = new AuthenticationCredential(group, "StringAuthentication", null); invitationAuthenticator = (StringAuthenticator) membership.apply(application); } catch (ProtocolNotSupportedException noAuthenticator) { throw new UndeclaredThrowableException(noAuthenticator, "String authenticator not available!"); } // The invitation authenticator allows us to get the invitation // certificate even if we don't have a keystore password. The certificate // will be requestable via the local peer's peer id. X509Certificate invitationCert = invitationAuthenticator.getCertificate(new char[0], group.getPeerID()); StringBuilder description = new StringBuilder(invitationDescriptionText.getText()); String subjectName = PSEUtils.getCertSubjectCName(invitationCert); int replaceIdx = description.indexOf("%1"); if ((-1 != replaceIdx) && (null != subjectName)) { description.replace(replaceIdx, replaceIdx + 2, subjectName); } String issuerName = PSEUtils.getCertIssuerCName(invitationCert); replaceIdx = description.indexOf("%2"); if ((-1 != replaceIdx) && (null != issuerName)) { description.replace(replaceIdx, replaceIdx + 2, issuerName); } replaceIdx = description.indexOf("%3"); if (-1 != replaceIdx) { String groupName = group.getPeerGroupName(); if (null == groupName) { groupName = "ID " + group.getPeerGroupID().toString(); } description.replace(replaceIdx, replaceIdx + 2, groupName); } invitationDescriptionText.setText(description.toString()); } gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.gridheight = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; invitationTab.add(invitationDescriptionText, gridBagConstraints); invitationPasswordLabel.setLabelFor(invitationPasswordField); invitationPasswordLabel.setText("Invitation Password"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 3); invitationTab.add(invitationPasswordLabel, gridBagConstraints); invitationPasswordField.setColumns(16); invitationPasswordField.setToolTipText("Enter the password for the invitation"); invitationPasswordField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { invitationPasswordFieldActionPerformed(evt); } }); invitationPasswordField.addKeyListener(new java.awt.event.KeyAdapter() { @Override public void keyReleased(java.awt.event.KeyEvent evt) { invitationPasswordFieldKeyReleased(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START; gridBagConstraints.insets = new java.awt.Insets(4, 2, 2, 4); invitationTab.add(invitationPasswordField, gridBagConstraints); invitationConfirmButton.setEnabled(!invitationTab.isEnabled()); invitationConfirmButton.setText("Confirm"); invitationConfirmButton.setToolTipText("Click to confirm the peer group invitation."); invitationConfirmButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { invitationConfirmButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.ipady = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_END; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); invitationTab.add(invitationConfirmButton, gridBagConstraints); getContentPane().setLayout(new java.awt.GridBagLayout()); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("PSE Peer Group Sample"); addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosed(java.awt.event.WindowEvent evt) { swingUIClosed(evt); } }); keyStorePasswordLabel.setLabelFor(keyStorePasswordField); keyStorePasswordLabel.setText("Key Store Password"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.ipadx = 3; gridBagConstraints.ipady = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START; gridBagConstraints.insets = new java.awt.Insets(5, 3, 1, 0); getContentPane().add(keyStorePasswordLabel, gridBagConstraints); keyStorePasswordField.setColumns(16); keyStorePasswordField.setNextFocusableComponent(invitationTab); keyStorePasswordField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { keyStorePasswordFieldActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_END; gridBagConstraints.insets = new java.awt.Insets(4, 0, 1, 2); getContentPane().add(keyStorePasswordField, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.ipadx = 3; gridBagConstraints.ipady = 3; gridBagConstraints.insets = new java.awt.Insets(1, 0, 1, 0); getContentPane().add(tabs, gridBagConstraints); authenticationStatus.setColumns(32); authenticationStatus.setEditable(false); authenticationStatus.setFont(new java.awt.Font("Dialog", 0, 10)); authenticationStatus.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.LOWERED)); authenticationStatus.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { authenticationStatusActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.ipady = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.LAST_LINE_END; gridBagConstraints.insets = new java.awt.Insets(1, 0, 4, 0); getContentPane().add(authenticationStatus, gridBagConstraints); pack(); } // </editor-fold>//GEN-END:initComponents private void memberPasswordFieldKeyReleasedHandler(java.awt.event.KeyEvent evt) { // GEN-FIRST:event_memberPasswordFieldKeyReleasedHandler if (null == memberAuthenticator) { try { AuthenticationCredential application = new AuthenticationCredential(group, "StringAuthentication", null); memberAuthenticator = (StringAuthenticator) membership.apply(application); } catch (ProtocolNotSupportedException noAuthenticator) { authenticationStatus.setText("Could not create authenticator: " + noAuthenticator.getMessage()); return; } memberAuthenticator.setAuth1_KeyStorePassword(keyStorePasswordField.getPassword()); memberAuthenticator.setAuth2Identity(group.getPeerID()); } memberAuthenticator.setAuth3_IdentityPassword(memberPasswordField.getPassword()); memberAuthenticateButton.setEnabled(memberAuthenticator.isReadyForJoin()); }// GEN-LAST:event_memberPasswordFieldKeyReleasedHandler private void memberPasswordFieldActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_memberPasswordFieldActionPerformed // TODO add your handling code here: }// GEN-LAST:event_memberPasswordFieldActionPerformed private void ownerPasswordFieldActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_ownerPasswordFieldActionPerformed // TODO add your handling code here: }// GEN-LAST:event_ownerPasswordFieldActionPerformed private void ownerPasswordFieldKeyReleasedHandler(java.awt.event.KeyEvent evt) { // GEN-FIRST:event_ownerPasswordFieldKeyReleasedHandler if (null == ownerAuthenticator) { try { AuthenticationCredential application = new AuthenticationCredential(group, "StringAuthentication", null); ownerAuthenticator = (StringAuthenticator) membership.apply(application); } catch (ProtocolNotSupportedException noAuthenticator) { authenticationStatus.setText("Could not create authenticator: " + noAuthenticator.getMessage()); return; } ownerAuthenticator.setAuth1_KeyStorePassword(keyStorePasswordField.getPassword()); ownerAuthenticator.setAuth2Identity(group.getPeerGroupID()); } ownerAuthenticator.setAuth3_IdentityPassword(ownerPasswordField.getPassword()); ownerAuthenticateButton.setEnabled(ownerAuthenticator.isReadyForJoin()); }// GEN-LAST:event_ownerPasswordFieldKeyReleasedHandler private void adminInviteButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_adminInviteButtonActionPerformed if (null == memberCredential) { authenticationStatus.setText("Not authenticated -- cannot create invitation."); return; } X509Certificate[] issuerChain = memberCredential.getCertificateChain(); PrivateKey issuerKey = null; try { issuerKey = memberCredential.getPrivateKey(); } catch (IllegalStateException notLocal) { ; } if (null == issuerKey) { authenticationStatus.setText("Member credential is not a local login credential."); return; } if (issuerChain.length < 2) { authenticationStatus.setText("Member credential is not certified as a Peer Group Administrator."); return; } if (!issuerChain[1].getPublicKey().equals(Main.PSE_SAMPLE_GROUP_ROOT_CERT.getPublicKey())) { authenticationStatus.setText("Member credential is not certified as a Peer Group Administrator."); return; } // Build the Module Impl Advertisemet we will use for our group. ModuleImplAdvertisement pseImpl = Main.build_psegroup_impl_adv(parentgroup); // Publish the Module Impl Advertisement to the group where the // peergroup will be advertised. This should be done in every peer // group in which the Peer Group is also advertised. // We use the same expiration and lifetime that the Peer Group Adv // will use (the default). try { parentgroup.getDiscoveryService().publish(pseImpl, PeerGroup.DEFAULT_LIFETIME, PeerGroup.DEFAULT_EXPIRATION); } catch (IOException failed) { ; } PeerGroupAdvertisement pse_pga = null; PSEUtils.IssuerInfo issuer = new PSEUtils.IssuerInfo(); issuer.cert = issuerChain[0]; issuer.subjectPkey = issuerKey; PSEUtils.IssuerInfo newcert = PSEUtils.genCert("Invitation", issuer); List<X509Certificate> chain = new ArrayList<X509Certificate>(); chain.add(newcert.cert); chain.addAll(Arrays.asList(issuerChain)); EncryptedPrivateKeyInfo encryptedInvitationKey = PSEUtils.pkcs5_Encrypt_pbePrivateKey( adminInvitationPasswordField.getPassword(), newcert.subjectPkey, 10000); // Create the invitation. pse_pga = Main.build_psegroup_adv(pseImpl, (X509Certificate[]) chain.toArray(new X509Certificate[chain.size()]) , encryptedInvitationKey); XMLDocument asXML = (XMLDocument) pse_pga.getDocument(MimeMediaType.XMLUTF8); try { JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { FileWriter invitation_file = new FileWriter(fc.getSelectedFile()); asXML.sendToWriter(invitation_file); invitation_file.close(); authenticationStatus.setText("Invitation created as file : " + fc.getSelectedFile().getAbsolutePath()); } else { authenticationStatus.setText("Invitation creation cancelled."); } } catch (IOException failed) { authenticationStatus.setText("Failed invitation creation : " + failed); } }// GEN-LAST:event_adminInviteButtonActionPerformed private void ownerSignCSRButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_ownerSignCSRButtonActionPerformed if (null == ownerCredential) { authenticationStatus.setText("Not authenticated -- cannot sign certificates."); return; } PSEUtils.IssuerInfo issuer = null; X509Certificate[] issuerChain = null; issuerChain = ownerCredential.getCertificateChain(); PrivateKey issuerKey = null; try { issuerKey = ownerCredential.getPrivateKey(); } catch (IllegalStateException notLocal) { ; } if (null == issuerKey) { authenticationStatus.setText("Owner credential is not a local login credential."); return; } issuer = new PSEUtils.IssuerInfo(); issuer.cert = issuerChain[0]; issuer.subjectPkey = issuerKey; org.bouncycastle.jce.PKCS10CertificationRequest csr; try { JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showOpenDialog(this); XMLDocument csr_doc = null; if (returnVal == JFileChooser.APPROVE_OPTION) { FileReader csr_file = new FileReader(fc.getSelectedFile()); csr_doc = (XMLDocument) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, csr_file); csr_file.close(); } else { authenticationStatus.setText("Certificate signing cancelled."); return; } net.jxta.impl.protocol.CertificateSigningRequest csr_msg = new net.jxta.impl.protocol.CertificateSigningRequest( csr_doc); csr = csr_msg.getCSR(); } catch (IOException failed) { authenticationStatus.setText("Failed to read certificate signing request: " + failed); return; } // set validity 10 years from today Date today = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(today); cal.add(Calendar.DATE, 10 * 365); Date until = cal.getTime(); // generate cert try { X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); certGen.setIssuerDN(new X509Principal(true, issuer.cert.getSubjectX500Principal().getName())); certGen.setSubjectDN(csr.getCertificationRequestInfo().getSubject()); certGen.setNotBefore(today); certGen.setNotAfter(until); certGen.setPublicKey(csr.getPublicKey()); // certGen.setSignatureAlgorithm("SHA1withDSA"); certGen.setSignatureAlgorithm("SHA1withRSA"); // FIXME bondolo 20040317 needs fixing. certGen.setSerialNumber(BigInteger.valueOf(1)); // return issuer info for generating service cert // the cert X509Certificate newCert = certGen.generateX509Certificate(issuer.subjectPkey); net.jxta.impl.protocol.Certificate cert_msg = new net.jxta.impl.protocol.Certificate(); List<X509Certificate> newChain = new ArrayList<X509Certificate>(Arrays.asList(issuerChain)); newChain.add(0, newCert); cert_msg.setCertificates(newChain); XMLDocument asXML = (XMLDocument) cert_msg.getDocument(MimeMediaType.XMLUTF8); JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { FileWriter csr_file = new FileWriter(fc.getSelectedFile()); asXML.sendToWriter(csr_file); csr_file.close(); authenticationStatus.setText("Signed admin certificate saved."); } else { authenticationStatus.setText("Save admin certificate cancelled."); } } catch (NoSuchAlgorithmException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (NoSuchProviderException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (InvalidKeyException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (SignatureException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (IOException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } }// GEN-LAST:event_ownerSignCSRButtonActionPerformed private void ownerResignButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_ownerResignButtonActionPerformed if (null == ownerCredential) { authenticationStatus.setText("Already resigned."); return; } ownerCredential = null; }// GEN-LAST:event_ownerResignButtonActionPerformed private void ownerAuthenticateButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_ownerAuthenticateButtonActionPerformed if (null == membership.getDefaultCredential()) { // if the keychain hasn't been unlocked then set the keystore password. membership.getPSEConfig().setKeyStorePassword(keyStorePasswordField.getPassword()); } StringAuthenticator ownerAuthenticator = null; try { AuthenticationCredential application = new AuthenticationCredential(group, "StringAuthentication", null); ownerAuthenticator = (StringAuthenticator) membership.apply(application); } catch (ProtocolNotSupportedException noAuthenticator) { authenticationStatus.setText("Could not create authenticator: " + noAuthenticator.getMessage()); return; } ownerAuthenticator.setAuth1_KeyStorePassword(keyStorePasswordField.getPassword()); ownerAuthenticator.setAuth2Identity(group.getPeerGroupID()); ownerAuthenticator.setAuth3_IdentityPassword(ownerPasswordField.getPassword()); // clear the password ownerPasswordField.setText(""); try { ownerCredential = (PSECredential) membership.join(ownerAuthenticator); authenticationStatus.setText("Owner authentication successful."); } catch (PeerGroupException failed) { authenticationStatus.setText("Owner authentication failed: " + failed.getMessage()); } }// GEN-LAST:event_ownerAuthenticateButtonActionPerformed private void memberResignButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_memberResignButtonActionPerformed if (null == memberCredential) { authenticationStatus.setText("Already resigned."); return; } memberGenerateCSRButton.setEnabled(false); memberResignButton.setEnabled(false); memberCredential = null; }// GEN-LAST:event_memberResignButtonActionPerformed private void memberImportCertButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_memberImportCertButtonActionPerformed if (null == memberCredential) { authenticationStatus.setText("Not authenticated -- cannot import certificates."); return; } JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showOpenDialog(this); XMLDocument certs_doc = null; try { if (returnVal == JFileChooser.APPROVE_OPTION) { FileReader certs_file = new FileReader(fc.getSelectedFile()); certs_doc = (XMLDocument) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, certs_file); certs_file.close(); } else { authenticationStatus.setText("Certificate import cancelled."); return; } } catch (IOException failed) { authenticationStatus.setText("Certificate import failed: " + failed.getMessage()); } Certificate cert_msg = new Certificate(certs_doc); try { Iterator<X509Certificate> sourceChain = Arrays.asList(cert_msg.getCertificates()).iterator(); int imported = 0; X509Certificate aCert = sourceChain.next(); ID createid = group.getPeerGroupID(); do { if (null != membership.getPSEConfig().getTrustedCertificateID(aCert)) { break; } membership.getPSEConfig().erase(createid); membership.getPSEConfig().setTrustedCertificate(createid, aCert); imported++; // create a codat id for the next certificate in the chain. aCert = null; if (sourceChain.hasNext()) { aCert = sourceChain.next(); if (null != membership.getPSEConfig().getTrustedCertificateID(aCert)) { // it's already in the pse, time to bail! break; } byte[] der = aCert.getEncoded(); createid = IDFactory.newCodatID(group.getPeerGroupID(), new ByteArrayInputStream(der)); } } while (null != aCert); authenticationStatus.setText(" Imported " + imported + " certificates. "); } catch (CertificateEncodingException failure) { authenticationStatus.setText("Bad certificate: " + failure); } catch (KeyStoreException failure) { authenticationStatus.setText("KeyStore failure while importing certificate: " + failure); } catch (IOException failure) { authenticationStatus.setText("IO failure while importing certificate: " + failure); } }// GEN-LAST:event_memberImportCertButtonActionPerformed private void adminSignCSRButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_adminSignCSRButtonActionPerformed if (null == memberCredential) { authenticationStatus.setText("Not authenticated -- cannot sign certificates."); return; } PSEUtils.IssuerInfo issuer = null; X509Certificate[] issuerChain = null; issuerChain = memberCredential.getCertificateChain(); PrivateKey issuerKey = null; try { issuerKey = memberCredential.getPrivateKey(); } catch (IllegalStateException notLocal) { ; } if (null == issuerKey) { authenticationStatus.setText("Credential is not a local login credential."); return; } issuer = new PSEUtils.IssuerInfo(); issuer.cert = issuerChain[0]; issuer.subjectPkey = issuerKey; org.bouncycastle.jce.PKCS10CertificationRequest csr; try { JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showOpenDialog(this); XMLDocument csr_doc = null; if (returnVal == JFileChooser.APPROVE_OPTION) { FileReader csr_file = new FileReader(fc.getSelectedFile()); csr_doc = (XMLDocument) StructuredDocumentFactory.newStructuredDocument(MimeMediaType.XMLUTF8, csr_file); csr_file.close(); } else { authenticationStatus.setText("Certificate Signing cancelled."); return; } net.jxta.impl.protocol.CertificateSigningRequest csr_msg = new net.jxta.impl.protocol.CertificateSigningRequest( csr_doc); csr = csr_msg.getCSR(); } catch (IOException failed) { authenticationStatus.setText("Failed to read certificate signing request: " + failed); return; } // set validity 10 years from today Date today = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(today); cal.add(Calendar.DATE, 10 * 365); Date until = cal.getTime(); // generate cert try { X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); certGen.setIssuerDN(new X509Principal(true, issuer.cert.getSubjectX500Principal().getName())); certGen.setSubjectDN(csr.getCertificationRequestInfo().getSubject()); certGen.setNotBefore(today); certGen.setNotAfter(until); certGen.setPublicKey(csr.getPublicKey()); // certGen.setSignatureAlgorithm("SHA1withDSA"); certGen.setSignatureAlgorithm("SHA1withRSA"); // FIXME bondolo 20040317 needs fixing. certGen.setSerialNumber(BigInteger.valueOf(1)); // return issuer info for generating service cert // the cert X509Certificate newCert = certGen.generateX509Certificate(issuer.subjectPkey); net.jxta.impl.protocol.Certificate cert_msg = new net.jxta.impl.protocol.Certificate(); List<X509Certificate> newChain = new ArrayList<X509Certificate>(Arrays.asList(issuerChain)); newChain.add(0, newCert); cert_msg.setCertificates(newChain); XMLDocument asXML = (XMLDocument) cert_msg.getDocument(MimeMediaType.XMLUTF8); JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { FileWriter csr_file = new FileWriter(fc.getSelectedFile()); asXML.sendToWriter(csr_file); csr_file.close(); authenticationStatus.setText("Signed certificate saved."); } else { authenticationStatus.setText("Save certificate cancelled."); } } catch (NoSuchAlgorithmException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (NoSuchProviderException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (InvalidKeyException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (SignatureException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } catch (IOException failed) { authenticationStatus.setText("Certificate signing failed:" + failed.getMessage()); } }// GEN-LAST:event_adminSignCSRButtonActionPerformed private void memberGenerateCSRButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_memberGenerateCSRButtonActionPerformed if (null == memberCredential) { authenticationStatus.setText("Not authenticated -- cannot generate Certificate Signing Request."); return; } X509Certificate cert = memberCredential.getCertificate(); PrivateKey key = null; try { key = memberCredential.getPrivateKey(); } catch (IllegalStateException notLocal) { ; } if (null == key) { authenticationStatus.setText("Credential is not a local login credential."); return; } try { PKCS10CertificationRequest csr = new PKCS10CertificationRequest("SHA1withRSA" , new X509Principal(cert.getSubjectX500Principal().getEncoded()), cert.getPublicKey(), new DERSet(), key); net.jxta.impl.protocol.CertificateSigningRequest csr_msg = new net.jxta.impl.protocol.CertificateSigningRequest(); csr_msg.setCSR(csr); XMLDocument asXML = (XMLDocument) csr_msg.getDocument(MimeMediaType.XMLUTF8); JFileChooser fc = new JFileChooser(); // In response to a button click: int returnVal = fc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { FileWriter csr_file = new FileWriter(fc.getSelectedFile()); asXML.sendToWriter(csr_file); csr_file.close(); authenticationStatus.setText( "Certificate Signing Request saved as file: " + fc.getSelectedFile().getCanonicalPath()); } else { authenticationStatus.setText("Certificate Signing Request not saved."); } } catch (NoSuchAlgorithmException failed) { authenticationStatus.setText("Certificate Signing Request generation failed:" + failed.getMessage()); } catch (NoSuchProviderException failed) { authenticationStatus.setText("Certificate Signing Request generation failed:" + failed.getMessage()); } catch (InvalidKeyException failed) { authenticationStatus.setText("Certificate Signing Request generation failed:" + failed.getMessage()); } catch (SignatureException failed) { authenticationStatus.setText("Certificate Signing Request generation failed:" + failed.getMessage()); } catch (IOException failed) { authenticationStatus.setText("Certificate Signing Request generation failed:" + failed.getMessage()); } }// GEN-LAST:event_memberGenerateCSRButtonActionPerformed private void memberAuthenticateButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_memberAuthenticateButtonActionPerformed if (null != memberCredential) { authenticationStatus.setText("Already authenticated."); return; } StringAuthenticator memberAuthenticator = null; try { AuthenticationCredential application = new AuthenticationCredential(group, "StringAuthentication", null); memberAuthenticator = (StringAuthenticator) membership.apply(application); } catch (ProtocolNotSupportedException noAuthenticator) { authenticationStatus.setText("Could not create authenticator: " + noAuthenticator.getMessage()); return; } memberAuthenticator.setAuth1_KeyStorePassword(keyStorePasswordField.getPassword()); memberAuthenticator.setAuth2Identity(group.getPeerID()); memberAuthenticator.setAuth3_IdentityPassword(memberPasswordField.getPassword()); // clear the password memberPasswordField.setText(""); try { memberCredential = (PSECredential) membership.join(memberAuthenticator); authenticationStatus.setText("Member authentication successful."); } catch (PeerGroupException failed) { authenticationStatus.setText("Member authentication failed: " + failed.getMessage()); return; } X509Certificate[] chain = memberCredential.getCertificateChain(); memberGenerateCSRButton.setEnabled(true); memberResignButton.setEnabled(true); if (chain.length > 1) { // If there's a certificate chain then perhaps admin and owner // be should enabled. if (chain[1].getPublicKey().equals(Main.PSE_SAMPLE_GROUP_ROOT_CERT.getPublicKey())) { // Signed by the root? That makes us an admin and maybe an owner tabs.add(adminTab); tabs.add(ownerTab); } } }// GEN-LAST:event_memberAuthenticateButtonActionPerformed private void swingUIClosed(java.awt.event.WindowEvent evt) { // GEN-FIRST:event_swingUIClosed // Shutdown the pse peer group. group.stopApp(); group.unref(); // Un-reference the parent peer group. parentgroup.unref(); }// GEN-LAST:event_swingUIClosed private void invitationPasswordFieldKeyReleased(java.awt.event.KeyEvent evt) { // GEN-FIRST:event_invitationPasswordFieldKeyReleased invitationAuthenticator.setAuth3_IdentityPassword(invitationPasswordField.getPassword()); invitationConfirmButton.setEnabled(invitationAuthenticator.isReadyForJoin()); }// GEN-LAST:event_invitationPasswordFieldKeyReleased private void invitationConfirmButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_invitationConfirmButtonActionPerformed boolean ownerInvite = invitationAuthenticator.getCertificate(null, group.getPeerID()).getPublicKey().equals( Main.PSE_SAMPLE_GROUP_ROOT_CERT.getPublicKey()); invitationAuthenticator.setAuth1_KeyStorePassword(keyStorePasswordField.getPassword()); if (ownerInvite) { // If the invitation is for the owner identity then store it under the peer group id. invitationAuthenticator.setAuth2Identity(group.getPeerGroupID()); } else { // Otherwise store it under another random key. invitationAuthenticator.setAuth2Identity(IDFactory.newCodatID(group.getPeerGroupID())); } invitationAuthenticator.setAuth3_IdentityPassword(invitationPasswordField.getPassword()); // clear the password invitationPasswordField.setText(""); try { invitationCredential = (PSECredential) membership.join(invitationAuthenticator); tabs.remove(invitationTab); tabs.add(memberTab); if (ownerInvite) { tabs.add(ownerTab); } authenticationStatus.setText("Invitation confirmed."); } catch (PeerGroupException failed) { authenticationStatus.setText("Invitation confirmation failed: " + failed.getMessage()); } }// GEN-LAST:event_invitationConfirmButtonActionPerformed private void invitationPasswordFieldActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_invitationPasswordFieldActionPerformed // TODO add your handling code here: }// GEN-LAST:event_invitationPasswordFieldActionPerformed private void keyStorePasswordFieldActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_keyStorePasswordFieldActionPerformed // TODO add your handling code here: }// GEN-LAST:event_keyStorePasswordFieldActionPerformed private void generateMemberCertButtonActionPerformed(java.awt.event.ActionEvent evt) { // GEN-FIRST:event_generateMemberCertButtonActionPerformed try { X509Certificate checkCert = membership.getPSEConfig().getTrustedCertificate(group.getPeerID()); if (null != checkCert) { authenticationStatus.setText("Member certificate already present."); } PSEUtils.IssuerInfo issuer = null; if (null != invitationCredential) { issuer = new PSEUtils.IssuerInfo(); issuer.cert = invitationCredential.getCertificate(); issuer.subjectPkey = invitationCredential.getPrivateKey(); } PSEUtils.IssuerInfo certs = PSEUtils.genCert(group.getPeerName(), issuer); X509Certificate chain[]; if (null != issuer) { chain = new X509Certificate[] { certs.cert, certs.issuer}; } else { chain = new X509Certificate[] { certs.cert}; } if (null == membership.getDefaultCredential()) { // if the keychain hasn't been unlocked then set the keystore password. membership.getPSEConfig().setKeyStorePassword(keyStorePasswordField.getPassword()); } // Save our new certificate into the keystore. membership.getPSEConfig().setKey(group.getPeerID(), chain, certs.subjectPkey, memberPasswordField.getPassword()); authenticationStatus.setText("New member certificate generated."); memberAuthenticateButton.setEnabled(true); } catch (KeyStoreException failed) { authenticationStatus.setText("Certificate generation failed: " + failed.getMessage()); } catch (IOException failed) { authenticationStatus.setText("Certificate generation failed: " + failed.getMessage()); } }// GEN-LAST:event_generateMemberCertButtonActionPerformed private void authenticationStatusActionPerformed(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_authenticationStatusActionPerformed // TODO add your handling code here: }// GEN-LAST:event_authenticationStatusActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPasswordField adminInvitationPasswordField; private javax.swing.JLabel adminInvitationPasswordLabel; private javax.swing.JButton adminInviteButton; private javax.swing.JButton adminSignCSRButton; private javax.swing.JPanel adminTab; private javax.swing.JTextField authenticationStatus; private javax.swing.JButton generateMemberCertButton; private javax.swing.JButton invitationConfirmButton; private javax.swing.JPasswordField invitationPasswordField; private javax.swing.JPanel invitationTab; private javax.swing.JPasswordField keyStorePasswordField; private javax.swing.JLabel keyStorePasswordLabel; private javax.swing.JButton memberAuthenticateButton; private javax.swing.JButton memberGenerateCSRButton; private javax.swing.JButton memberImportCertButton; private javax.swing.JPasswordField memberPasswordField; private javax.swing.JButton memberResignButton; private javax.swing.JPanel memberTab; private javax.swing.JButton ownerAuthenticateButton; private javax.swing.JPasswordField ownerPasswordField; private javax.swing.JLabel ownerPasswordLabel; private javax.swing.JButton ownerResignButton; private javax.swing.JButton ownerSignCSRButton; private javax.swing.JPanel ownerTab; private javax.swing.JTabbedPane tabs; // End of variables declaration//GEN-END:variables }