From 2c61afd4baa2f542247d3360f921628d5d8e97a5 Mon Sep 17 00:00:00 2001 From: Tobias Kellner Date: Mon, 12 Oct 2015 04:25:03 +0200 Subject: Complete keystore config dialog --- .../gui/composites/ConfigurationComposite.java | 18 +- .../composites/KeystoreConfigurationComposite.java | 473 ++++++++++++++++++--- .../gui/exceptions/CantLoadKeystoreException.java | 36 ++ .../exceptions/KeystoreDoesntExistException.java | 38 ++ .../at/asit/pdfover/gui/messages.properties | 18 +- .../at/asit/pdfover/gui/messages_de.properties | 20 +- 6 files changed, 529 insertions(+), 74 deletions(-) create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java (limited to 'pdf-over-gui/src') diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java index 77b1bd98..ed85f77b 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java @@ -287,6 +287,10 @@ public class ConfigurationComposite extends StateComposite { // not needed at the moment this.advancedConfigComposite.setSigner(getSigner()); } + if (this.keystoreConfigComposite != null) { + // not needed at the moment + this.keystoreConfigComposite.setSigner(getSigner()); + } } private class AboutComposite extends StateComposite { @@ -300,20 +304,6 @@ public class ConfigurationComposite extends StateComposite { setLayout(new FormLayout()); - /*Group grpAbout = new Group(this, SWT.NONE | SWT.RESIZE); - FormData fd_grpAbout = new FormData(); - fd_grpAbout.right = new FormAttachment(100, -5); - fd_grpAbout.left = new FormAttachment(0, 5); - fd_grpAbout.top = new FormAttachment(0, 5); - grpAbout.setLayoutData(fd_grpAbout); - grpAbout.setLayout(new FillLayout()); - - FontData[] fD_grpAbout = grpAbout.getFont() - .getFontData(); - fD_grpAbout[0].setHeight(Constants.TEXT_SIZE_NORMAL); - grpAbout.setFont(new Font(Display.getCurrent(), - fD_grpAbout[0]));*/ - this.lnkAbout = new Link(this, SWT.WRAP); FormData fd_lnkAbout = new FormData(); diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/KeystoreConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/KeystoreConfigurationComposite.java index aa42a7bb..24170e24 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/KeystoreConfigurationComposite.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/KeystoreConfigurationComposite.java @@ -17,39 +17,29 @@ package at.asit.pdfover.gui.composites; // Imports import java.io.File; -import java.util.Locale; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DropTarget; -import org.eclipse.swt.dnd.DropTargetAdapter; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.dnd.FileTransfer; -import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; @@ -61,18 +51,15 @@ import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.Constants; import at.asit.pdfover.gui.controls.Dialog.BUTTONS; import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.ErrorMarker; -import at.asit.pdfover.gui.exceptions.InvalidEmblemFile; -import at.asit.pdfover.gui.exceptions.InvalidNumberException; -import at.asit.pdfover.gui.exceptions.PDFOverGUIException; +import at.asit.pdfover.gui.exceptions.CantLoadKeystoreException; +import at.asit.pdfover.gui.exceptions.KeystoreDoesntExistException; +import at.asit.pdfover.gui.exceptions.OutputfolderDoesntExistException; +import at.asit.pdfover.gui.exceptions.OutputfolderNotADirectoryException; import at.asit.pdfover.gui.utils.Messages; -import at.asit.pdfover.gui.utils.SignaturePlaceholderCache; import at.asit.pdfover.gui.workflow.config.ConfigManipulator; import at.asit.pdfover.gui.workflow.config.ConfigurationContainer; import at.asit.pdfover.gui.workflow.config.PersistentConfigProvider; import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.signator.FileNameEmblem; -import at.asit.pdfover.signator.SignatureParameter; /** * @@ -86,6 +73,21 @@ public class KeystoreConfigurationComposite extends BaseConfigurationComposite { .getLogger(KeystoreConfigurationComposite.class); private Group grpKeystore; + private Label lblKeystoreFile; + Text txtKeystoreFile; + private Button btnBrowse; + private Label lblKeystoreType; + Combo cmbKeystoreType; + private Label lblKeystoreStorePass; + Text txtKeystoreStorePass; + private Button btnLoad; + private Label lblKeystoreAlias; + Combo cmbKeystoreAlias; + private Label lblKeystoreKeyPass; + Text txtKeystoreKeyPass; + + private Map keystoreTypes; + private Map keystoreTypes_i; /** * @param parent @@ -100,56 +102,363 @@ public class KeystoreConfigurationComposite extends BaseConfigurationComposite { setLayout(new FormLayout()); this.grpKeystore = new Group(this, SWT.NONE | SWT.RESIZE); + FormLayout layout = new FormLayout(); + layout.marginHeight = 10; + layout.marginWidth = 5; + this.grpKeystore.setLayout(layout); FormData fd_grpKeystore = new FormData(); - fd_grpKeystore.right = new FormAttachment(100, -5); - fd_grpKeystore.left = new FormAttachment(0, 5); fd_grpKeystore.top = new FormAttachment(0, 5); + fd_grpKeystore.left = new FormAttachment(0, 5); + fd_grpKeystore.right = new FormAttachment(100, -5); this.grpKeystore.setLayoutData(fd_grpKeystore); - this.grpKeystore.setLayout(new GridLayout(2, false)); - FontData[] fD_grpKeystore = this.grpKeystore.getFont() - .getFontData(); + FontData[] fD_grpKeystore = this.grpKeystore.getFont().getFontData(); fD_grpKeystore[0].setHeight(Constants.TEXT_SIZE_NORMAL); this.grpKeystore.setFont(new Font(Display.getCurrent(), fD_grpKeystore[0])); + this.lblKeystoreFile = new Label(this.grpKeystore, SWT.NONE); + FormData fd_lblKeystoreFile = new FormData(); + fd_lblKeystoreFile.top = new FormAttachment(0); + fd_lblKeystoreFile.left = new FormAttachment(0, 5); + this.lblKeystoreFile.setLayoutData(fd_lblKeystoreFile); + + FontData[] fD_lblKeystoreFile = this.lblKeystoreFile.getFont() + .getFontData(); + fD_lblKeystoreFile[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.lblKeystoreFile.setFont(new Font(Display.getCurrent(), + fD_lblKeystoreFile[0])); + + this.txtKeystoreFile = new Text(this.grpKeystore, SWT.BORDER); + FormData fd_txtKeystoreFile = new FormData(); + fd_txtKeystoreFile.top = new FormAttachment(this.lblKeystoreFile, 5); + fd_txtKeystoreFile.left = new FormAttachment(0, 15); + this.txtKeystoreFile.setLayoutData(fd_txtKeystoreFile); + + FontData[] fD_txtKeystoreFile = this.txtKeystoreFile.getFont() + .getFontData(); + fD_txtKeystoreFile[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.txtKeystoreFile.setFont(new Font(Display.getCurrent(), + fD_txtKeystoreFile[0])); + + this.txtKeystoreFile.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + performKeystoreFileChanged(KeystoreConfigurationComposite.this. + txtKeystoreFile.getText()); + } + }); + + this.btnBrowse = new Button(this.grpKeystore, SWT.NONE); + fd_txtKeystoreFile.right = new FormAttachment(this.btnBrowse, -5); + + FontData[] fD_btnBrowse = this.btnBrowse.getFont().getFontData(); + fD_btnBrowse[0].setHeight(Constants.TEXT_SIZE_BUTTON); + this.btnBrowse.setFont(new Font(Display.getCurrent(), fD_btnBrowse[0])); + + FormData fd_btnBrowse = new FormData(); + fd_btnBrowse.top = new FormAttachment(this.lblKeystoreFile, 5); + fd_btnBrowse.right = new FormAttachment(100, -5); + this.btnBrowse.setLayoutData(fd_btnBrowse); + + this.btnBrowse.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog( + KeystoreConfigurationComposite.this.getShell(), SWT.OPEN); + dialog.setFilterExtensions(new String[] { + "*.p12;*.pkcs12;*.pfx;*.ks;*.jks", "*.p12;*.pkcs12;*.pfx;", "*.ks;*.jks*.", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + dialog.setFilterNames(new String[] { + Messages.getString("common.KeystoreExtension_Description"), //$NON-NLS-1$ + Messages.getString("common.PKCS12Extension_Description"), //$NON-NLS-1$ + Messages.getString("common.KSExtension_Description"), //$NON-NLS-1$ + Messages.getString("common.AllExtension_Description") }); //$NON-NLS-1$ + String fileName = dialog.open(); + File file = null; + if (fileName != null) { + file = new File(fileName); + if (file.exists()) { + performKeystoreFileChanged(fileName); + } + } + } + }); + + this.lblKeystoreType = new Label(this.grpKeystore, SWT.NONE); + FormData fd_lblKeystoreType = new FormData(); + fd_lblKeystoreType.top = new FormAttachment(this.txtKeystoreFile, 5); + fd_lblKeystoreType.left = new FormAttachment(0, 5); + this.lblKeystoreType.setLayoutData(fd_lblKeystoreType); + + FontData[] fD_lblKeystoreType = this.lblKeystoreType.getFont() + .getFontData(); + fD_lblKeystoreType[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.lblKeystoreType.setFont(new Font(Display.getCurrent(), + fD_lblKeystoreType[0])); + + this.cmbKeystoreType = new Combo(this.grpKeystore, SWT.READ_ONLY); + FormData fd_cmbKeystoreType = new FormData(); + fd_cmbKeystoreType.right = new FormAttachment(100, -5); + fd_cmbKeystoreType.top = new FormAttachment(this.lblKeystoreType, 5); + fd_cmbKeystoreType.left = new FormAttachment(0, 15); + this.cmbKeystoreType.setLayoutData(fd_cmbKeystoreType); + + FontData[] fD_cmbKeystoreType = this.cmbKeystoreType.getFont() + .getFontData(); + fD_cmbKeystoreType[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.cmbKeystoreType.setFont(new Font(Display.getCurrent(), + fD_cmbKeystoreType[0])); + + initKeystoreTypes(); + this.cmbKeystoreType.setItems(this.keystoreTypes.keySet().toArray(new String[0])); + this.cmbKeystoreType.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + performKeystoreTypeChanged( + KeystoreConfigurationComposite.this.cmbKeystoreType.getItem( + KeystoreConfigurationComposite.this.cmbKeystoreType.getSelectionIndex())); + } + }); + + this.lblKeystoreStorePass = new Label(this.grpKeystore, SWT.NONE); + FormData fd_lblKeystoreStorePass = new FormData(); + fd_lblKeystoreStorePass.top = new FormAttachment(this.cmbKeystoreType, 5); + fd_lblKeystoreStorePass.left = new FormAttachment(0, 5); + this.lblKeystoreStorePass.setLayoutData(fd_lblKeystoreStorePass); + + FontData[] fD_lblKeystoreStorePass = this.lblKeystoreStorePass.getFont() + .getFontData(); + fD_lblKeystoreStorePass[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.lblKeystoreStorePass.setFont(new Font(Display.getCurrent(), + fD_lblKeystoreStorePass[0])); + + this.txtKeystoreStorePass = new Text(this.grpKeystore, SWT.BORDER | SWT.PASSWORD); + FormData fd_txtKeystoreStorePass = new FormData(); + fd_txtKeystoreStorePass.top = new FormAttachment(this.lblKeystoreStorePass, 5); + fd_txtKeystoreStorePass.left = new FormAttachment(0, 15); + this.txtKeystoreStorePass.setLayoutData(fd_txtKeystoreStorePass); + + FontData[] fD_txtKeystoreStorePass = this.txtKeystoreStorePass.getFont() + .getFontData(); + fD_txtKeystoreStorePass[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.txtKeystoreStorePass.setFont(new Font(Display.getCurrent(), + fD_txtKeystoreStorePass[0])); + + this.txtKeystoreStorePass.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + performKeystoreStorePassChanged(KeystoreConfigurationComposite. + this.txtKeystoreStorePass.getText()); + } + }); + + this.btnLoad = new Button(this.grpKeystore, SWT.NONE); + fd_txtKeystoreStorePass.right = new FormAttachment(this.btnLoad, -5); + + FontData[] fD_btnLoad = this.btnLoad.getFont().getFontData(); + fD_btnLoad[0].setHeight(Constants.TEXT_SIZE_BUTTON); + this.btnLoad.setFont(new Font(Display.getCurrent(), fD_btnLoad[0])); + + FormData fd_btnLoad = new FormData(); + fd_btnLoad.top = new FormAttachment(this.lblKeystoreStorePass, 5); + fd_btnLoad.right = new FormAttachment(100, -5); + this.btnLoad.setLayoutData(fd_btnLoad); + + this.btnLoad.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + File f = new File(KeystoreConfigurationComposite.this + .configurationContainer.getKeyStoreFile()); + try { + loadKeystore(); + } catch (KeyStoreException ex) { + log.error("Error loading keystore", ex); //$NON-NLS-1$ + showErrorDialog(Messages.getString("error.KeyStore")); //$NON-NLS-1$ + } catch (FileNotFoundException ex) { + log.error("Error loading keystore", ex); //$NON-NLS-1$ + showErrorDialog(String.format(Messages.getString( + "error.FileNotExist"), f.getName())); //$NON-NLS-1$ + } catch (NoSuchAlgorithmException ex) { + log.error("Error loading keystore", ex); //$NON-NLS-1$ + showErrorDialog(Messages.getString("error.KeyStore")); //$NON-NLS-1$ + } catch (CertificateException ex) { + log.error("Error loading keystore", ex); //$NON-NLS-1$ + showErrorDialog(Messages.getString("error.KeyStore")); //$NON-NLS-1$ + } catch (IOException ex) { + log.error("Error loading keystore", ex); //$NON-NLS-1$ + showErrorDialog(Messages.getString("error.KeyStore")); //$NON-NLS-1$ + } + + } + }); + + this.lblKeystoreAlias = new Label(this.grpKeystore, SWT.NONE); + FormData fd_lblKeystoreAlias = new FormData(); + fd_lblKeystoreAlias.top = new FormAttachment(this.txtKeystoreStorePass, 5); + fd_lblKeystoreAlias.left = new FormAttachment(0, 5); + this.lblKeystoreAlias.setLayoutData(fd_lblKeystoreAlias); + + FontData[] fD_lblKeystoreAlias = this.lblKeystoreAlias.getFont() + .getFontData(); + fD_lblKeystoreAlias[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.lblKeystoreAlias.setFont(new Font(Display.getCurrent(), + fD_lblKeystoreAlias[0])); + + this.cmbKeystoreAlias = new Combo(this.grpKeystore, SWT.READ_ONLY); + FormData fd_cmbKeystoreAlias = new FormData(); + fd_cmbKeystoreAlias.right = new FormAttachment(100, -5); + fd_cmbKeystoreAlias.top = new FormAttachment(this.lblKeystoreAlias, 5); + fd_cmbKeystoreAlias.left = new FormAttachment(0, 15); + this.cmbKeystoreAlias.setLayoutData(fd_cmbKeystoreAlias); + + FontData[] fD_cmbKeystoreAlias = this.cmbKeystoreAlias.getFont() + .getFontData(); + fD_cmbKeystoreAlias[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.cmbKeystoreAlias.setFont(new Font(Display.getCurrent(), + fD_cmbKeystoreAlias[0])); + + this.cmbKeystoreAlias.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + performKeystoreAliasChanged( + KeystoreConfigurationComposite.this.cmbKeystoreAlias.getItem( + KeystoreConfigurationComposite.this.cmbKeystoreAlias.getSelectionIndex())); + } + }); + + this.lblKeystoreKeyPass = new Label(this.grpKeystore, SWT.NONE); + FormData fd_lblKeystoreKeyPass = new FormData(); + fd_lblKeystoreKeyPass.top = new FormAttachment(this.cmbKeystoreAlias, 5); + fd_lblKeystoreKeyPass.left = new FormAttachment(0, 5); + this.lblKeystoreKeyPass.setLayoutData(fd_lblKeystoreKeyPass); + + FontData[] fD_lblKeystoreKeyPass = this.lblKeystoreKeyPass.getFont() + .getFontData(); + fD_lblKeystoreKeyPass[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.lblKeystoreKeyPass.setFont(new Font(Display.getCurrent(), + fD_lblKeystoreKeyPass[0])); + + this.txtKeystoreKeyPass = new Text(this.grpKeystore, SWT.BORDER | SWT.PASSWORD); + FormData fd_txtKeystoreKeyPass = new FormData(); + fd_txtKeystoreKeyPass.top = new FormAttachment(this.lblKeystoreKeyPass, 5); + fd_txtKeystoreKeyPass.left = new FormAttachment(0, 15); + fd_txtKeystoreKeyPass.right = new FormAttachment(100, -5); + this.txtKeystoreKeyPass.setLayoutData(fd_txtKeystoreKeyPass); + + FontData[] fD_txtKeystoreKeyPass = this.txtKeystoreKeyPass.getFont() + .getFontData(); + fD_txtKeystoreKeyPass[0].setHeight(Constants.TEXT_SIZE_NORMAL); + this.txtKeystoreKeyPass.setFont(new Font(Display.getCurrent(), + fD_txtKeystoreKeyPass[0])); + + this.txtKeystoreKeyPass.addFocusListener(new FocusAdapter() { + @Override + public void focusLost(FocusEvent e) { + performKeystoreKeyPassChanged(KeystoreConfigurationComposite. + this.txtKeystoreKeyPass.getText()); + } + }); + // Load localized strings reloadResources(); } + void showErrorDialog(String error) { + ErrorDialog e = new ErrorDialog(getShell(), error, BUTTONS.OK); + e.open(); + } + + void loadKeystore() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { + ConfigurationContainer config = + KeystoreConfigurationComposite.this.configurationContainer; + File f = new File(config.getKeyStoreFile()); + KeyStore ks = KeyStore.getInstance(config.getKeyStoreType()); + FileInputStream fis = new FileInputStream(f); + ks.load(fis, config.getKeyStoreStorePass().toCharArray()); + this.cmbKeystoreAlias.removeAll(); + Enumeration aliases = ks.aliases(); + while (aliases.hasMoreElements()) + this.cmbKeystoreAlias.add(aliases.nextElement()); + } + + private void initKeystoreTypes() { + this.keystoreTypes = new HashMap(); + this.keystoreTypes_i = new HashMap(); + this.keystoreTypes.put(Messages.getString("keystore_config.KeystoreType_PKCS12"), "PKCS12"); //$NON-NLS-1$ //$NON-NLS-2$ + this.keystoreTypes_i.put("PKCS12", Messages.getString("keystore_config.KeystoreType_PKCS12")); //$NON-NLS-1$ //$NON-NLS-2$ + this.keystoreTypes.put(Messages.getString("keystore_config.KeystoreType_JKS"), "JCEKS"); //$NON-NLS-1$ //$NON-NLS-2$ + this.keystoreTypes_i.put("JCEKS", Messages.getString("keystore_config.KeystoreType_JKS")); //$NON-NLS-1$ //$NON-NLS-2$ + } + /** - * + * @param fileName */ - private final class KeystoreFileBrowser extends SelectionAdapter { - /** - * - */ - public KeystoreFileBrowser() { - // Nothing to do + protected void performKeystoreFileChanged(String fileName) { + log.debug("Selected keystore file: " + fileName); //$NON-NLS-1$ + this.configurationContainer.setKeyStoreFile(fileName); + KeystoreConfigurationComposite.this.txtKeystoreFile.setText(fileName); + int i = fileName.lastIndexOf('.'); + if (i > 0) { + String ext = fileName.substring(i+1); + if ( + ext.equalsIgnoreCase("p12") || //$NON-NLS-1$ + ext.equalsIgnoreCase("pkcs12") || //$NON-NLS-1$ + ext.equalsIgnoreCase("pfx")) //$NON-NLS-1$ + performKeystoreTypeChanged(this.keystoreTypes_i.get("PKCS12")); //$NON-NLS-1$ + else if ( + ext.equalsIgnoreCase("ks") || //$NON-NLS-1$ + ext.equalsIgnoreCase("jks")) //$NON-NLS-1$ + performKeystoreTypeChanged(this.keystoreTypes_i.get("JCEKS")); //$NON-NLS-1$ } + } - @Override - public void widgetSelected(SelectionEvent e) { - FileDialog dialog = new FileDialog( - KeystoreConfigurationComposite.this.getShell(), SWT.OPEN); - dialog.setFilterExtensions(new String[] { - "*.p12;*.pkcs12;*.ks;*.jks", "*.p12;*.pkcs12", "*.ks;*.jks*.", "*" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - dialog.setFilterNames(new String[] { - Messages.getString("common.KeystoreExtension_Description"), //$NON-NLS-1$ - Messages.getString("common.PKCS12Extension_Description"), //$NON-NLS-1$ - Messages.getString("common.KSExtension_Description"), //$NON-NLS-1$ - Messages.getString("common.AllExtension_Description") }); //$NON-NLS-1$ - String fileName = dialog.open(); - File file = null; - if (fileName != null) { - file = new File(fileName); - if (file.exists()) { - //processEmblemChanged(fileName); - } + /** + * @param type + */ + protected void performKeystoreTypeChanged(String type) { + log.debug("Selected keystore type: " + type); //$NON-NLS-1$ + this.configurationContainer.setKeyStoreType( + this.keystoreTypes.get(type)); + for (int i = 0; i < this.cmbKeystoreType.getItemCount(); ++i) { + if (this.cmbKeystoreType.getItem(i).equals(type)) { + this.cmbKeystoreType.select(i); + break; } } } + /** + * @param storepass + */ + protected void performKeystoreStorePassChanged(String storepass) { + log.debug("Changed keystore store password"); //$NON-NLS-1$ + this.configurationContainer.setKeyStoreStorePass(storepass); + this.txtKeystoreStorePass.setText(storepass); + } + + /** + * @param alias + */ + protected void performKeystoreAliasChanged(String alias) { + log.debug("Selected keystore alias: " + alias); //$NON-NLS-1$ + this.configurationContainer.setKeyStoreAlias(alias); + for (int i = 0; i < this.cmbKeystoreAlias.getItemCount(); ++i) { + if (this.cmbKeystoreAlias.getItem(i).equals(alias)) { + this.cmbKeystoreAlias.select(i); + break; + } + } + } + + /** + * @param keypass + */ + protected void performKeystoreKeyPassChanged(String keypass) { + log.debug("Changed keystore key password"); //$NON-NLS-1$ + this.configurationContainer.setKeyStoreKeyPass(keypass); + this.txtKeystoreKeyPass.setText(keypass); + } + /* * (non-Javadoc) * @@ -158,6 +467,7 @@ public class KeystoreConfigurationComposite extends BaseConfigurationComposite { */ @Override protected void signerChanged() { + // Nothing to do here (yet) } /* @@ -196,6 +506,21 @@ public class KeystoreConfigurationComposite extends BaseConfigurationComposite { @Override public void loadConfiguration() { // Initialize form fields from configuration Container + performKeystoreFileChanged( + this.configurationContainer.getKeyStoreFile()); + performKeystoreTypeChanged( + this.configurationContainer.getKeyStoreType()); + performKeystoreStorePassChanged( + this.configurationContainer.getKeyStoreStorePass()); + try { + loadKeystore(); + } catch (Exception e) { + log.error("Error loading keystore", e); //$NON-NLS-1$ + } + performKeystoreAliasChanged( + this.configurationContainer.getKeyStoreAlias()); + performKeystoreKeyPassChanged( + this.configurationContainer.getKeyStoreKeyPass()); } /* (non-Javadoc) @@ -220,6 +545,20 @@ public class KeystoreConfigurationComposite extends BaseConfigurationComposite { */ @Override public void validateSettings(int resumeFrom) throws Exception { + switch (resumeFrom) { + case 0: + File f = new File(this.configurationContainer.getKeyStoreFile()); + if (!f.exists() || !f.isFile()) + throw new KeystoreDoesntExistException(f, 2); //skip next check + // Fall through + case 1: + try { + loadKeystore(); + } catch (Exception e) { + throw new CantLoadKeystoreException(e, 2); + } + // Fall through + } } /* @@ -231,5 +570,25 @@ public class KeystoreConfigurationComposite extends BaseConfigurationComposite { public void reloadResources() { this.grpKeystore.setText(Messages .getString("keystore_config.Keystore_Title")); //$NON-NLS-1$ + this.lblKeystoreFile.setText(Messages + .getString("keystore_config.KeystoreFile")); //$NON-NLS-1$ + this.btnBrowse.setText(Messages.getString("common.browse")); //$NON-NLS-1$ + this.txtKeystoreFile.setToolTipText(Messages + .getString("keystore_config.KeystoreFile_ToolTip")); //$NON-NLS-1$ + this.lblKeystoreType.setText(Messages + .getString("keystore_config.KeystoreType")); //$NON-NLS-1$ + this.lblKeystoreStorePass.setText(Messages + .getString("keystore_config.KeystoreStorePass")); //$NON-NLS-1$ + this.txtKeystoreStorePass.setToolTipText(Messages + .getString("keystore_config.KeystoreStorePass_ToolTip")); //$NON-NLS-1$ + this.btnLoad.setText(Messages.getString("keystore_config.Load")); //$NON-NLS-1$ + this.btnLoad.setToolTipText(Messages + .getString("keystore_config.Load_ToolTip")); //$NON-NLS-1$ + this.lblKeystoreAlias.setText(Messages + .getString("keystore_config.KeystoreAlias")); //$NON-NLS-1$ + this.lblKeystoreKeyPass.setText(Messages + .getString("keystore_config.KeystoreKeyPass")); //$NON-NLS-1$ + this.txtKeystoreKeyPass.setToolTipText(Messages + .getString("keystore_config.KeystoreKeyPass_ToolTip")); //$NON-NLS-1$ } } diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java new file mode 100644 index 00000000..cb13c804 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java @@ -0,0 +1,36 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.exceptions; + +import at.asit.pdfover.gui.utils.Messages; + +/** + * + */ +public class CantLoadKeystoreException extends ResumableException { + /** + * + */ + private static final long serialVersionUID = 7554121273052104624L; + + /** + * @param resumeIndex The resume Index + * @param cause The original exception + */ + public CantLoadKeystoreException(Throwable cause, int resumeIndex) { + super(Messages.getString("error.KeyStore"), cause, resumeIndex); //$NON-NLS-1$ + } +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java new file mode 100644 index 00000000..f0b4f8f0 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.exceptions; + +import java.io.File; + +import at.asit.pdfover.gui.utils.Messages; + +/** + * + */ +public class KeystoreDoesntExistException extends ResumableException { + /** + * + */ + private static final long serialVersionUID = 8213496549933275086L; + + /** + * @param keystore The keystore file + * @param resumeIndex The resume Index + */ + public KeystoreDoesntExistException(final File keystore, int resumeIndex) { + super(String.format(Messages.getString("error.FileNotExist"), keystore.getPath()), resumeIndex); //$NON-NLS-1$ + } +} diff --git a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties index b987b77a..52ae3d6a 100644 --- a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties +++ b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages.properties @@ -110,7 +110,7 @@ error.InvalidBKU=Invalid CCE selection. Please check. error.InvalidLocale=Locale not valid error.InvalidPhoneNumber=Given phone number is invalid\! Example\: +43664123456789 error.InvalidSettings=Invalid settings are still present. Please check your input. -error.KeyStore=Error loading they keystore +error.KeyStore=Error loading they keystore. Wrong password? error.LocalBKU=Please check if a local CCE (citizen card environment) is running\n\nYou need a CCE to access your citizen card. Further information under www.buergerkarte.at error.MayNotBeAPDF=This may not be a PDF file error.NoTan=No TAN entered @@ -134,7 +134,23 @@ exception.PasswordTooLong=Given password is too long\! exception.PasswordTooShort=Given password is too short\! exception.PathNotDirectory=Path %s does not denote a directory\! exception.PathNotExist=Path %s does not exist\! +keystore.KeystoreStorePassEntry=Please enter keystore password: +keystore.KeystoreKeyPassEntry=Please enter key password: keystore_config.Keystore_Title=Keystore +keystore_config.KeystoreAlias=Key alias +keystore_config.KeystoreFile=Keystore file +keystore_config.KeystoreFile_ToolTip=Path to the keystore file +keystore_config.KeystoreFile.Dialog=Choose the keystore +keystore_config.KeystoreFile.Dialog_Title=Keystore selection +keystore_config.KeystoreKeyPass=Key password +keystore_config.KeystoreKeyPass_ToolTip=Warning: The password is stored in plain text. Leave empty to get prompted for password during signing. +keystore_config.KeystoreStorePass=Keystore password +keystore_config.KeystoreStorePass_ToolTip=Warning: The password is stored in plain text. Leave empty to get prompted for password during signing. +keystore_config.KeystoreType=Keystore type +keystore_config.KeystoreType_JKS=Java keystore +keystore_config.KeystoreType_PKCS12=PKCS12 +keystore_config.Load=Load keystore +keystore_config.Load_Tooltip=Load keystore to show available key aliases main.about=About %s main.configuration=Configuration main.done=Finish diff --git a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties index 613f1ee5..8c02616a 100644 --- a/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties +++ b/pdf-over-gui/src/main/resources/at/asit/pdfover/gui/messages_de.properties @@ -16,7 +16,7 @@ advanced_config.LocaleSelection_Title=S&prachauswahl advanced_config.LocaleSelection_ToolTip=W\u00E4hlen Sie die Sprache f\u00FCr das Benutzerinterface advanced_config.OutputFolder=Standard-Ausgabeordner\: advanced_config.OutputFolder.Dialog=W\u00E4hlen Sie einen Ordner -advanced_config.OutputFolder.Dialog_Title=Ausgabeordner W\u00E4hlen +advanced_config.OutputFolder.Dialog_Title=Ausgabeordner w\u00E4hlen advanced_config.OutputFolder_Title=Ausgabe&ort advanced_config.OutputFolder_ToolTip=W\u00E4hlen Sie einen Ordner, in dem signierte Dokumente automatisch abgelegt werden (deaktivert, wenn das Feld leer ist; ein einzelner Punkt (".") w\u00E4hlt das Verzeichnis des Ursprungsdokuments) advanced_config.PdfACompat=PDF/A-Kompatibilit\u00E4t @@ -110,7 +110,7 @@ error.InvalidBKU=Ung\u00FCltige BKU-Auswahl. Bitte \u00FCberpr\u00FCfen. error.InvalidLocale=Ung\u00FCltige Sprache error.InvalidPhoneNumber=Telefonnummer ung\u00FCltig\! Beispiel\: +43664123456789 error.InvalidSettings=Ung\u00FCltige Einstellungen vorhanden. Bitte \u00FCberpr\u00FCfen. -error.KeyStore=Fehler beim Laden des KeyStores +error.KeyStore=Fehler beim Laden des KeyStores. Falsches Passwort? error.LocalBKU=Bitte pr\u00FCfen sie, ob Ihre lokale BKU (B\u00FCrgerkartenumgebung) l\u00E4uft\n\nSie ben\u00F6tigen eine BKU, um auf Ihre B\u00FCrgerkarte zuzugreifen. Weitere Informationen unter www.buergerkarte.at error.MayNotBeAPDF=Dies ist m\u00F6glicherweise keine PDF-Datei error.NoTan=Keine TAN eingeben @@ -134,7 +134,23 @@ exception.PasswordTooLong=Eingegebenes Passwort ist zu lange\! exception.PasswordTooShort=Eingegebenes Passwort ist zu kurz\! exception.PathNotDirectory=Pfad %s ist kein g\u00FCltiger Ordner\! exception.PathNotExist=Pfad %s existiert nicht\! +keystore.KeystoreStorePassEntry=Keystore-Passwort eingeben: +keystore.KeystoreKeyPassEntry=Schl\u00FCssel-Passwort eingeben: keystore_config.Keystore_Title=Keystore +keystore_config.KeystoreAlias=Schl\u00FCssel-Alias +keystore_config.KeystoreFile=Keystore-Datei +keystore_config.KeystoreFile_ToolTip=Pfad zur Keystore-Datei +keystore_config.KeystoreFile.Dialog=W\u00E4hlen Sie den Keystore +keystore_config.KeystoreFile.Dialog_Title=Keystore w\u00E4hlen +keystore_config.KeystoreKeyPass=Schl\u00FCssel-Passwort +keystore_config.KeystoreKeyPass_ToolTip=Achtung: das Passwort wird im Klartext gespeichert. Leer lassen, um beim Signieren zur Eingabe aufgefordert zu werden. +keystore_config.KeystoreStorePass=Keystore-Passwort +keystore_config.KeystoreStorePass_ToolTip=Achtung: das Passwort wird im Klartext gespeichert. Leer lassen, um beim Signieren zur Eingabe aufgefordert zu werden. +keystore_config.KeystoreType=Keystore-Typ +keystore_config.KeystoreType_JKS=Java-Keystore +keystore_config.KeystoreType_PKCS12=PKCS12 +keystore_config.Load=Keystore laden +keystore_config.Load_ToolTip=Keystore laden, um die verf\u00FCgbaren Schl\u00FCssel-Aliases anzuzeigen main.about=\u00DCber %s main.configuration=Konfiguration main.done=Fertig -- cgit v1.2.3