+++ /dev/null
-package com.axyus.signature.pes.producer;\r
-\r
-import com.axyus.signature.pes.producer.AbstractKeyStoreLoader.KeyAliases;\r
-import com.axyus.signature.pes.verifier.CertificateProcessor.CertificatInformation;\r
-import com.axyus.signature.pes.verifier.CertificateProcessor.CertificateProcessorException;\r
-import com.axyus.signature.pes.verifier.UnExpectedException;\r
-import com.axyus.signature.pes.verifier.formater.PropertiesDisplayFormater;\r
-import com.axyus.signature.utilities.UiUtilities;\r
-import com.axyus.swing.components.wizard.WizardProcess;\r
-import com.axyus.swing.components.wizard.WizardProcess.Step.StepInitialisationException;\r
-import com.axyus.swing.components.wizard.WizardProcess.Step.StepValidationException;\r
-import java.awt.Component;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.security.InvalidAlgorithmParameterException;\r
-import java.security.KeyStoreException;\r
-import java.security.NoSuchAlgorithmException;\r
-import java.security.cert.CRLException;\r
-import java.security.cert.CertificateException;\r
-import java.security.cert.X509Certificate;\r
-import java.text.DateFormat;\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.Comparator;\r
-import java.util.Date;\r
-import java.util.List;\r
-import java.util.Locale;\r
-import javax.swing.JFileChooser;\r
-import javax.swing.JFrame;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JTable;\r
-import javax.swing.filechooser.FileNameExtensionFilter;\r
-import javax.swing.table.DefaultTableModel;\r
-import javax.swing.table.TableRowSorter;\r
-\r
-/**\r
- * @author CBO\r
- */\r
-public class TabCertificatChooserStep extends WizardProcess.Step<SignatureProducerWizardProcess> {\r
-\r
- private TabCertificatChooserUI tabCertificatChooserUI;\r
- private JFileChooser magasinFileChooser;\r
- private UiUtilities uiutilities = new UiUtilities();\r
- private char[] pass;\r
- private SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");\r
-\r
- public TabCertificatChooserStep() {\r
- this.tabCertificatChooserUI = new TabCertificatChooserUI();\r
- magasinFileChooser = new JFileChooser(new File(System.getProperty("user.home")));\r
- magasinFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Fichiers magasin (jks, pfx, p12)", "jks", "pfx", "p12"));\r
- tabCertificatChooserUI.getjTabbedPane1().add("Certificats du fichier importé", tabCertificatChooserUI.getFileCertificat());\r
- tabCertificatChooserUI.getjTabbedPane1().add("Certificats du magasin Windows", tabCertificatChooserUI.getWindowCertificat());\r
- tabCertificatChooserUI.getFileCertificat().getFileSelectButton().addActionListener(new SelectFileButtonActionListener());\r
- }\r
-\r
- @Override\r
- public String getTile() {\r
- return "Sélection de la clef de signature";\r
- }\r
-\r
- private X509Certificate getSelectedCertificat() throws KeyStoreException {\r
- if (tabCertificatChooserUI.getjTabbedPane1().getSelectedIndex() == 0) {\r
- // Onglet des certificats dans un fichier\r
- if (tabCertificatChooserUI.getFileCertificat().getFileTable().getSelectedRow() >= 0) {\r
- FileKeyStoreLoader fileKeyStoreLoader = getWizardProcess().getFileKeyStoreLoader();\r
- return (X509Certificate) fileKeyStoreLoader.getKeyStore().getCertificateChain(fileKeyStoreLoader.recupPrivateKeyAliasList().get(tabCertificatChooserUI.getFileCertificat().getFileTable().getSelectedRow()))[0];\r
- } else {\r
- return null;\r
- }\r
- } else {\r
- // Onglet des certificats windows\r
- if (tabCertificatChooserUI.getWindowCertificat().getTable().getSelectedRow() >= 0) {\r
- return (X509Certificate) getWizardProcess().getWindowsKeyStoreLoader().getKeyStore().getCertificateChain(getWizardProcess().getWindowsKeyStoreLoader().recupPrivateKeyAliasList().get(tabCertificatChooserUI.getWindowCertificat().getTable().getSelectedRow()))[0];\r
- } else {\r
- return null;\r
- }\r
- }\r
- }\r
-\r
- private String getSelectedAlias() throws KeyStoreException {\r
- if (tabCertificatChooserUI.getjTabbedPane1().getSelectedIndex() == 0) {\r
- if (tabCertificatChooserUI.getFileCertificat().getFileTable().getSelectedRow() >= 0) {\r
- FileKeyStoreLoader fileKeyStoreLoader = getWizardProcess().getFileKeyStoreLoader();\r
- return fileKeyStoreLoader.recupPrivateKeyAliasList().get(tabCertificatChooserUI.getFileCertificat().getFileTable().getSelectedRow());\r
- }\r
- } else {\r
- if (tabCertificatChooserUI.getWindowCertificat().getTable().getSelectedRow() >= 0) {\r
- return getWizardProcess().getWindowsKeyStoreLoader().recupPrivateKeyAliasList().get(tabCertificatChooserUI.getWindowCertificat().getTable().getSelectedRow());\r
- }\r
- }\r
- return null;\r
- }\r
-\r
- private AbstractKeyStoreLoader getSelectedKeyStoreLoader() {\r
- if (tabCertificatChooserUI.getjTabbedPane1().getSelectedIndex() == 0) {\r
- return getWizardProcess().getFileKeyStoreLoader();\r
- } else {\r
- return getWizardProcess().getWindowsKeyStoreLoader();\r
- }\r
- }\r
-\r
- @Override\r
- public void validate() throws StepValidationException {\r
- try {\r
- X509Certificate certificate = getSelectedCertificat();\r
- if (certificate == null) {\r
- throw new StepValidationException("Veuillez sélectionner un certificat");\r
- } else {\r
- String verificationResultMessage = verifyCertificateValidity(certificate);\r
- if (verificationResultMessage != null && verificationResultMessage.trim().length() > 0) {\r
- if (JOptionPane.showConfirmDialog(new JFrame(), new StringBuilder(verificationResultMessage).append("Voulez-vous continuer?").toString(), "Vérification du certificat", JOptionPane.YES_NO_OPTION) == 0) {\r
- // TODO : Continue signature process :\r
- openSelectedKey(getSelectedAlias(), getSelectedKeyStoreLoader());\r
- } else {\r
- throw new StepValidationException("Signature annulée par l'utilisateur");\r
- }\r
- } else {\r
- openSelectedKey(getSelectedAlias(), getSelectedKeyStoreLoader());\r
- }\r
- }\r
- } catch (KeyStoreException kse) {\r
- throw new UnExpectedException(kse);\r
- }\r
- }\r
-\r
- /*@Override\r
- public void validate() throws StepValidationException {\r
- int i = -1;\r
- int certOk = 0;\r
- //Onglet des certificats dans un fichier\r
- if (tabCertificatChooserUI.getjTabbedPane1().getSelectedIndex() == 0) {\r
- i = tabCertificatChooserUI.getFileCertificat().getFileTable().getSelectedRow();\r
- if (i != -1) {\r
- FileKeyStoreLoader tmp = getWizardProcess().getFileKeyStoreLoader();\r
- String CertTestResult = null;\r
- try {\r
- CertTestResult = verifyCertificateValidity((X509Certificate) tmp.getKeyStore().getCertificateChain(tmp.recupPrivateKeyAliasList().get(i))[0]);\r
- } catch (KeyStoreException ex) {\r
- throw new UnExpectedException(ex);\r
- }\r
- \r
- if (CertTestResult != null && !CertTestResult.equals("")) {\r
- certOk = JOptionPane.showConfirmDialog(new JFrame(), new StringBuilder(CertTestResult).append("Voulez-vous continuer?").toString(),\r
- "Vérification du certificat", JOptionPane.YES_NO_OPTION);\r
- }\r
- if (certOk == 0) {\r
- openSelectedKey(tmp.recupPrivateKeyAliasList().get(i), tmp);\r
- } else {\r
- throw new StepValidationException("Signature annulée par l'utilisateur");\r
- }\r
- \r
- } else {\r
- throw new StepValidationException("Un certificat doit être sélectionné");\r
- }\r
- //Onglet des certificats windows\r
- } else if (tabCertificatChooserUI.getjTabbedPane1().getSelectedIndex() == 1) {\r
- i = tabCertificatChooserUI.getWindowCertificat().getTable().getSelectedRow();\r
- if (i != -1) {\r
- openSelectedKey(getWizardProcess().getWindowsKeyStoreLoader().recupPrivateKeyAliasList().get(i), getWizardProcess().getWindowsKeyStoreLoader());\r
- } else {\r
- throw new StepValidationException("Un certificat doit être sélectionné");\r
- }\r
- }\r
- }*/\r
- @Override\r
- public Component getUI() {\r
- return tabCertificatChooserUI;\r
- }\r
-\r
- @Override\r
- public void beforeDisplay() {\r
-\r
- defineTableModel(tabCertificatChooserUI.getWindowCertificat().getTable());\r
- initCertTableRows((DefaultTableModel) tabCertificatChooserUI.getWindowCertificat().getTable().getModel(), getWizardProcess().getWindowsKeyStoreLoader());\r
- getWizardProcess().getWizardDialog().setNextButtonText("Suivant >");\r
- }\r
-\r
- public void refreshDisplay() {\r
- pass = null;\r
- uiutilities.typeKeyStorePassword("Password du magasin", new ValiderButtonActionListener());\r
- uiutilities.initKeystoreLoader(getWizardProcess().getFileKeyStoreLoader(), pass);\r
- defineTableModel(tabCertificatChooserUI.getFileCertificat().getFileTable());\r
- initCertTableRows((DefaultTableModel) tabCertificatChooserUI.getFileCertificat().getFileTable().getModel(), getWizardProcess().getFileKeyStoreLoader());\r
- tabCertificatChooserUI.getFileCertificat().getFileNameTextField().setText(getWizardProcess().getFileKeyStoreLoader().getKeyStoreFile().getAbsolutePath());\r
- getWizardProcess().getWizardDialog().setNextButtonText("Suivant >");\r
- }\r
-\r
- private void initCertTableRows(DefaultTableModel tableModel, AbstractKeyStoreLoader keystoreLoader) {\r
- List<String> keyAliasList = keystoreLoader.recupPrivateKeyAliasList();\r
-\r
- try {\r
- for (int i = 0; i < keyAliasList.size(); i++) {\r
- KeyAliases acertAlias;\r
- acertAlias = keystoreLoader.new KeyAliases(null, keyAliasList.get(i), keystoreLoader.getKeyStore().getCertificateChain(keyAliasList.get(i)));\r
- String[] table = new String[5];\r
- table[0] = UiUtilities.recupPropertyDN(((X509Certificate) acertAlias.getUserCert()).getSubjectDN().getName(), UiUtilities.PROPERTY_CN);\r
- table[1] = UiUtilities.recupPropertyDN(((X509Certificate) acertAlias.getUserCert()).getIssuerDN().getName(), UiUtilities.PROPERTY_CN);\r
- table[2] = dateFormat.format(((X509Certificate) acertAlias.getUserCert()).getNotBefore());\r
- table[3] = dateFormat.format(((X509Certificate) acertAlias.getUserCert()).getNotAfter());\r
- table[4] = PropertiesDisplayFormater.keyUsageFormat(((X509Certificate) acertAlias.getUserCert()).getKeyUsage());\r
- tableModel.addRow(table);\r
- }\r
- } catch (KeyStoreException ex) {\r
- throw new StepInitialisationException("Keystore non chargé");\r
- }\r
- }\r
-\r
- private void defineTableModel(JTable table) {\r
- javax.swing.table.TableModel tm = new DefaultTableModel(\r
- new Object[][]{},\r
- new String[]{\r
- "Délivré à", "Délivré par", "Valable de", "A", "Usage"\r
- }) {\r
-\r
- Class[] types = new Class[]{\r
- java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class\r
- };\r
- boolean[] canEdit = new boolean[]{\r
- false, false, false, false, false\r
- };\r
-\r
- @Override\r
- public Class getColumnClass(int columnIndex) {\r
- return types[columnIndex];\r
- }\r
-\r
- @Override\r
- public boolean isCellEditable(int rowIndex, int columnIndex) {\r
- return canEdit[columnIndex];\r
- }\r
- };\r
- table.setModel(tm);\r
- TableRowSorter trs = new TableRowSorter(tm);\r
- Comparator dateComparator = new Comparator() {\r
-\r
- public int compare(Object o1, Object o2) {\r
- String s1 = o1.toString();\r
- String s2 = o2.toString();\r
-\r
- try {\r
- Date d1 = dateFormat.parse(s1);\r
- Date d2 = dateFormat.parse(s2);\r
- if (d1.before(d2)) {\r
- return -1;\r
- }\r
- if (d1.after(d2)) {\r
- return 1;\r
- }\r
- return 0;\r
- } catch (Exception e) {\r
- System.out.println(e);\r
- return 0;\r
- }\r
- }\r
- };\r
- \r
- // ATTENTION SI ON CHANGE LA PLACE DES DATES DANS LE TABLEAU!!\r
- trs.setComparator(2, dateComparator);\r
- trs.setComparator(3, dateComparator);\r
- table.setRowSorter(trs);\r
-\r
-\r
- }\r
-\r
- private String verifyCertificateValidity(X509Certificate certificate) {\r
- Date temp = new Date();\r
- StringBuilder sb = new StringBuilder();\r
- if (certificate.getNotBefore().after(temp)) {\r
- sb.append("La date de début de validité du certificat est postérieure à la date du jour.\n");\r
- }\r
- if (certificate.getNotAfter().before(temp)) {\r
- sb.append("La date de fin de validité du certificat est antérieure à la date du jour.\n");\r
- }\r
- if (certificate.getKeyUsage() != null && !certificate.getKeyUsage()[1]) {\r
-\r
- sb.append("Le certificat n'est pas destiné à effectuer de la signature de document.\n");\r
- }\r
-\r
- List<X509Certificate> temList = new ArrayList<X509Certificate>();\r
- temList.add(certificate);\r
- CertificatInformation certInfo = null;\r
-\r
- try {\r
- certInfo = getWizardProcess().getPesAnalyser().getSignatureVerifier().getCertificateProcessor().process(getWizardProcess().getPesAnalyser().getSignatureVerifier().getTrustStore(), temList, null, getWizardProcess().getPesAnalyser().getSignatureVerifier().getInterTrustStore());\r
- } catch (CertificateProcessorException ex) {\r
- throw new UnExpectedException(ex);\r
- } catch (IOException ex) {\r
- throw new UnExpectedException(ex);\r
- } catch (CertificateException ex) {\r
- throw new UnExpectedException(ex);\r
- } catch (KeyStoreException ex) {\r
- throw new UnExpectedException(ex);\r
- } catch (CRLException ex) {\r
- throw new UnExpectedException(ex);\r
- } catch (NoSuchAlgorithmException ex) {\r
- throw new UnExpectedException(ex);\r
- } catch (InvalidAlgorithmParameterException ex) {\r
- throw new UnExpectedException(ex);\r
- }\r
-\r
- if (certInfo != null && certInfo.getCertPathBuilderException() != null) {\r
- sb.append("Le certificat ne fait pas partie des certificats de confiance\n");\r
- } else {\r
- if (certInfo != null && !certInfo.isAuthorizedCertPath()) {\r
- sb.append("Le certificat ne fait pas partie des certificats autorisés\n");\r
- }\r
- }\r
-\r
-\r
-\r
- return sb.toString();\r
- }\r
-\r
- private void openSelectedKey(String selectedAlias, AbstractKeyStoreLoader keystoreLoader) throws StepValidationException {\r
- KeyAliases selectedKeyAlias = keystoreLoader.recupPrivateKey(selectedAlias, "".toCharArray());\r
-\r
- if (selectedKeyAlias == null) {\r
- selectedKeyAlias = keystoreLoader.recupPrivateKey(selectedAlias, keystoreLoader.getPassword());\r
- }\r
- if (selectedKeyAlias == null) {\r
- pass = null;\r
- uiutilities.typeKeyStorePassword("Password de la clef", new ValiderButtonActionListener());\r
- selectedKeyAlias = keystoreLoader.recupPrivateKey(selectedAlias, pass);\r
- }\r
- if (selectedKeyAlias == null) {\r
- throw new StepValidationException("Le mot de passe de la clef est erroné");\r
- }\r
- getWizardProcess().setSelectedKey(selectedKeyAlias);\r
- }\r
-\r
- public class ValiderButtonActionListener implements ActionListener {\r
-\r
- @Override\r
- public void actionPerformed(ActionEvent e) {\r
- pass = uiutilities.getPasswordTypingComponent().getPassword();\r
- uiutilities.getPasswordTypingComponent().dispose();\r
- }\r
- }\r
-\r
- public class SelectFileButtonActionListener implements ActionListener {\r
-\r
- @Override\r
- public void actionPerformed(ActionEvent e) {\r
-\r
- if (magasinFileChooser.showDialog(null, "Ouvrir") == JFileChooser.APPROVE_OPTION) {\r
- getWizardProcess().setFileKeyStoreLoader(new FileKeyStoreLoader(magasinFileChooser.getSelectedFile()));\r
- executeInBackGroundThread(new Runnable() {\r
-\r
- @Override\r
- public void run() {\r
- refreshDisplay();\r
- }\r
- });\r
-\r
- }\r
- }\r
- }\r
-}\r