diff options
9 files changed, 241 insertions, 49 deletions
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java index d21afcaa..8eebe02d 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java @@ -17,7 +17,7 @@ package at.asit.pdfover.gui.composites; // Imports import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; @@ -84,6 +84,23 @@ public class BKUSelectionComposite extends StateComposite { } /** + * Listener for keystore selection + */ + private final class KSSelectionListener extends SelectionAdapter { + /** + * Empty constructor + */ + public KSSelectionListener() { + } + + @Override + public void widgetSelected(SelectionEvent e) { + log.debug("Setting BKU to KS"); //$NON-NLS-1$ + setSelected(BKUs.KS); + } + } + + /** * SLF4J Logger instance **/ static final Logger log = LoggerFactory @@ -94,7 +111,9 @@ public class BKUSelectionComposite extends StateComposite { private Button btnMobile; private Button btnCard; - + + private Button btnKS; + /** * Gets selected BKU type * @return BKUS enum @@ -122,68 +141,46 @@ public class BKUSelectionComposite extends StateComposite { super(parent, style, state); this.setLayout(new FormLayout()); - + ClickableCanvas cc_mobile = new ClickableCanvas(this, SWT.NATIVE | SWT.RESIZE); FormData fd_cc_mobile = new FormData(); fd_cc_mobile.right = new FormAttachment(50, -5); fd_cc_mobile.top = new FormAttachment(40, -20); - cc_mobile.addMouseListener(new MouseListener() { - - @Override - public void mouseUp(org.eclipse.swt.events.MouseEvent e) { - // Nothing to do here - } - + cc_mobile.addMouseListener(new MouseAdapter() { @Override public void mouseDown(org.eclipse.swt.events.MouseEvent e) { setSelected(BKUs.MOBILE); } - - @Override - public void mouseDoubleClick(org.eclipse.swt.events.MouseEvent e) { - // Nothing to do here - } }); cc_mobile.setLayoutData(fd_cc_mobile); - + Image mobile = new Image(getDisplay(), new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_MOBILE))); cc_mobile.setImage(mobile); FontData[] fD_cc_mobile = cc_mobile.getFont().getFontData(); fD_cc_mobile[0].setHeight(Constants.TEXT_SIZE_BUTTON); cc_mobile.setFont(new Font(Display.getCurrent(), fD_cc_mobile[0])); - + ClickableCanvas cc_karte = new ClickableCanvas(this, SWT.NATIVE | SWT.RESIZE); FormData fd_cc_karte = new FormData(); fd_cc_karte.left = new FormAttachment(50, 5); fd_cc_karte.top = new FormAttachment(40, -20); - cc_karte.addMouseListener(new MouseListener() { - - @Override - public void mouseUp(org.eclipse.swt.events.MouseEvent e) { - // Nothing to do here - } - + cc_karte.addMouseListener(new MouseAdapter() { @Override public void mouseDown(org.eclipse.swt.events.MouseEvent e) { setSelected(BKUs.LOCAL); } - - @Override - public void mouseDoubleClick(org.eclipse.swt.events.MouseEvent e) { - // Nothing to do here - } }); cc_karte.setLayoutData(fd_cc_karte); - + Image karte = new Image(getDisplay(), new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_CARD))); - + cc_karte.setImage(karte); FontData[] fD_cc_karte = cc_mobile.getFont().getFontData(); fD_cc_karte[0].setHeight(Constants.TEXT_SIZE_BUTTON); cc_mobile.setFont(new Font(Display.getCurrent(), fD_cc_karte[0])); - + int mobilesize = cc_mobile.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - + this.btnMobile = new Button(this, SWT.NONE); FormData fd_btnMobile = new FormData(); fd_btnMobile.top = new FormAttachment(cc_mobile, 10); @@ -191,27 +188,36 @@ public class BKUSelectionComposite extends StateComposite { fd_btnMobile.right = new FormAttachment(50, -5); //fd_btnMobile.width = cc_mobile.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; this.btnMobile.setLayoutData(fd_btnMobile); - this.btnMobile.setText(Messages.getString("bku_selection.mobile")); //$NON-NLS-1$ this.btnMobile.addSelectionListener(new MobileSelectionListener()); - + int btnmsize = this.btnMobile.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - + fd_btnMobile.width = (btnmsize > mobilesize) ? btnmsize : mobilesize; - + this.btnCard = new Button(this, SWT.NONE); FormData fd_btnCard = new FormData(); fd_btnCard.top = new FormAttachment(cc_karte, 10); //fd_btnMobile.left = new FormAttachment(btn_mobile, 0); fd_btnCard.left = new FormAttachment(50, 5); int cardsize = cc_karte.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - + this.btnCard.setLayoutData(fd_btnCard); - this.btnCard.setText(Messages.getString("bku_selection.card")); //$NON-NLS-1$ this.btnCard.addSelectionListener(new LocalSelectionListener()); - + int btncsize = this.btnCard.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - + fd_btnCard.width = (btncsize > cardsize) ? btncsize : cardsize; + + this.btnKS = new Button(this, SWT.NONE); + FormData fd_btnKS = new FormData(); + fd_btnKS.top = new FormAttachment(this.btnCard, 10); + fd_btnKS.left = new FormAttachment(this.btnMobile, 0, SWT.LEFT); + fd_btnKS.right = new FormAttachment(this.btnCard, 0, SWT.RIGHT); + + this.btnKS.setLayoutData(fd_btnKS); + this.btnKS.addSelectionListener(new KSSelectionListener()); + + reloadResources(); //this.pack(); } @@ -235,5 +241,6 @@ public class BKUSelectionComposite extends StateComposite { public void reloadResources() { this.btnMobile.setText(Messages.getString("bku_selection.mobile")); //$NON-NLS-1$ this.btnCard.setText(Messages.getString("bku_selection.card")); //$NON-NLS-1$ + this.btnKS.setText(Messages.getString("bku_selection.ks")); //$NON-NLS-1$ } } diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/KSState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/KSState.java new file mode 100644 index 00000000..1072942c --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/KSState.java @@ -0,0 +1,113 @@ +/* + * 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.workflow.states; + +// Imports +import org.eclipse.swt.SWT; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.MainWindow.Buttons; +import at.asit.pdfover.gui.MainWindowBehavior; +import at.asit.pdfover.gui.controls.Dialog.BUTTONS; +import at.asit.pdfover.gui.controls.ErrorDialog; +import at.asit.pdfover.gui.utils.Messages; +import at.asit.pdfover.gui.workflow.StateMachine; +import at.asit.pdfover.gui.workflow.Status; +import at.asit.pdfover.signator.SignatureException; +import at.asit.pdfover.signator.SigningState; + +/** + * Logical state for performing the BKU Request to a local BKU + */ +public class KSState extends State { + + /** + * SLF4J Logger instance + **/ + static final Logger log = LoggerFactory.getLogger(KSState.class); + + /** + * Constructor + * @param stateMachine the StateMachine + */ + public KSState(StateMachine stateMachine) { + super(stateMachine); + } + + /* + * (non-Javadoc) + * + * @see + * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui + * .workflow.Workflow) + */ + @Override + public void run() { + Status status = getStateMachine().getStatus(); + + SigningState signingState = status.getSigningState(); + + try { + signingState.setKSSigner("D:/Downloads/test.p12", "ecc_test", "123456", "123456", "PKCS12"); + } catch (SignatureException e) { + log.error("Error loading keystore", e); //$NON-NLS-1$ + ErrorDialog dialog = new ErrorDialog( + getStateMachine().getGUIProvider().getMainShell(), + Messages.getString("error.KeyStore"), //$NON-NLS-1$ + BUTTONS.RETRY_CANCEL); + if (dialog.open() != SWT.RETRY) { + //getStateMachine().exit(); + this.setNextState(new BKUSelectionState(getStateMachine())); + return; + } + return; + } + + // OK + this.setNextState(new at.asit.pdfover.gui.workflow.states.SigningState(getStateMachine())); + } + + /* + * (non-Javadoc) + * + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + // No composite - no cleanup necessary + } + + /* + * (non-Javadoc) + * + * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() + */ + @Override + public void updateMainWindowBehavior() { + MainWindowBehavior behavior = getStateMachine().getStatus() + .getBehavior(); + behavior.reset(); + behavior.setActive(Buttons.OPEN, true); + behavior.setActive(Buttons.POSITION, true); + behavior.setActive(Buttons.SIGN, true); + } + + @Override + public String toString() { + return this.getClass().getName(); + } +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java index 21664d85..45636568 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java @@ -235,10 +235,12 @@ public class PrepareSigningState extends State { // We got the Request set it into status and move on to next state ... status.setSigningState(this.signingState); - if (getStateMachine().getStatus().getBKU() == BKUs.LOCAL) { + if (status.getBKU() == BKUs.LOCAL) { this.setNextState(new LocalBKUState(getStateMachine())); - } else if (getStateMachine().getStatus().getBKU() == BKUs.MOBILE) { + } else if (status.getBKU() == BKUs.MOBILE) { this.setNextState(new MobileBKUState(getStateMachine())); + } else if (status.getBKU() == BKUs.KS) { + this.setNextState(new KSState(getStateMachine())); } else { log.error("Invalid selected BKU Value \"NONE\" in PrepareSigningState!"); //$NON-NLS-1$ this.setNextState(new BKUSelectionState(getStateMachine())); 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 7502163c..9b5bd3db 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 @@ -1,5 +1,6 @@ #Eclipse messages class #Fri Jun 26 16:29:30 CEST 2015 +BKU.KS=Keystore BKU.LOCAL=Local CCE BKU.MOBILE=Mobile CCE BKU.NONE=no default @@ -67,6 +68,7 @@ argument.invalid.proxypass=Proxy password argument invalid\! Usage\: argument.invalid.proxyport=Proxy port argument invalid\! Usage\: argument.invalid.proxyuser=Proxy username argument invalid\! Usage\: bku_selection.card=&Card +bku_selection.ks=&Keystore bku_selection.mobile=&Mobile common.AllExtension_Description=All files common.Cancel=C&ancel @@ -102,6 +104,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.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 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 49359c64..bba89f05 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 @@ -1,5 +1,6 @@ #Eclipse messages class #Fri Jun 26 18:01:09 CEST 2015 +BKU.KS=KeyStore BKU.LOCAL=Lokale BKU BKU.MOBILE=Handy-BKU BKU.NONE=Keine Voreinstellung @@ -67,6 +68,7 @@ argument.invalid.proxypass=Proxy-Passwort ung\u00FCltig\! Verwendung\: argument.invalid.proxyport=Proxy-Port ung\u00FCltig\! Verwendung\: argument.invalid.proxyuser=Proxy-Benutzername ung\u00FCltig\! Verwendung\: bku_selection.card=&Karte +bku_selection.ks=Key&Store bku_selection.mobile=&Handy common.AllExtension_Description=Alle Dateien common.Cancel=&Abbrechen @@ -102,6 +104,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.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 diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/BKUs.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/BKUs.java index 774508a6..8d936d3c 100644 --- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/BKUs.java +++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/BKUs.java @@ -26,6 +26,9 @@ public enum BKUs { /** Mobile BKU */ MOBILE, + /** KeyStore */ + KS, + /** No BKU */ NONE } diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java index f624e5b4..1ca365b4 100644 --- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java +++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java @@ -49,4 +49,16 @@ public interface SigningState { * @param connector the BKU connector */ public void setBKUConnector(BkuSlConnector connector); + + /** + * Set the KeyStore signer + * @param file KeyStore filename + * @param alias KeyStore alias + * @param kspassword KeyStore password + * @param keypassword KeyStore private key password + * @param type KeyStore type + * @throws SignatureException + */ + public void setKSSigner(String file, String alias, String kspassword, + String keypassword, String type) throws SignatureException; } diff --git a/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java b/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java index efce1c6e..344c2e7e 100644 --- a/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java +++ b/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4Signer.java @@ -23,6 +23,7 @@ import at.gv.egiz.pdfas.lib.api.Configuration; import at.gv.egiz.pdfas.lib.api.IConfigurationConstants; import at.gv.egiz.pdfas.lib.api.PdfAs; import at.gv.egiz.pdfas.lib.api.PdfAsFactory; +import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner; import at.gv.egiz.pdfas.lib.api.sign.SignParameter; import at.gv.egiz.pdfas.sigs.pades.PAdESSigner; import at.gv.egiz.sl.util.ISLConnector; @@ -115,8 +116,16 @@ public class PdfAs4Signer implements Signer { IConfigurationConstants.SL_REQUEST_TYPE_BASE64 : IConfigurationConstants.SL_REQUEST_TYPE_UPLOAD); - ISLConnector connector = new PdfAs4BKUSLConnector(sstate.getBKUConnector()); - param.setPlainSigner(new PAdESSigner(connector)); + IPlainSigner signer; + if (sstate.hasBKUConnector()) { + ISLConnector connector = new PdfAs4BKUSLConnector(sstate.getBKUConnector()); + signer = new PAdESSigner(connector); + } else if (sstate.hasKSSigner()) { + signer = sstate.getKSSigner(); + } else { + throw new SignatureException("SigningState doesn't have a signer"); + } + param.setPlainSigner(signer); pdfas.sign(param); diff --git a/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SigningState.java b/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SigningState.java index ec2efdae..71be5577 100644 --- a/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SigningState.java +++ b/pdf-over-signer/pdf-over-sigpdfas4/src/main/java/at/asit/pdfover/signer/pdfas/PdfAs4SigningState.java @@ -21,8 +21,12 @@ import java.io.ByteArrayOutputStream; import at.asit.pdfover.signator.BkuSlConnector; import at.asit.pdfover.signator.SLRequest; import at.asit.pdfover.signator.SLResponse; +import at.asit.pdfover.signator.SignatureException; import at.asit.pdfover.signator.SigningState; +import at.gv.egiz.pdfas.common.exceptions.PDFASError; +import at.gv.egiz.pdfas.lib.api.sign.IPlainSigner; import at.gv.egiz.pdfas.lib.api.sign.SignParameter; +import at.gv.egiz.pdfas.sigs.pades.PAdESSignerKeystore; /** * Signing State for PDFAS Wrapper @@ -46,7 +50,9 @@ public class PdfAs4SigningState implements SigningState { private ByteArrayOutputStream output; - private BkuSlConnector connector; + private BkuSlConnector bkuconnector = null; + + private IPlainSigner kssigner = null; private boolean useBase64Request; @@ -139,13 +145,47 @@ public class PdfAs4SigningState implements SigningState { */ @Override public void setBKUConnector(BkuSlConnector connector) { - this.connector = connector; + this.bkuconnector = connector; + } + + /* (non-Javadoc) + * @see at.asit.pdfover.signator.SigningState#setKSSigner(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public void setKSSigner(String file, String alias, String kspassword, + String keypassword, String type) throws SignatureException { + try { + this.kssigner = new PAdESSignerKeystore(file, alias, kspassword, keypassword, type); + } catch (PDFASError e) { + throw new SignatureException(e); + } + } + + /** + * @return whether a BKU connector was set + */ + public boolean hasBKUConnector() { + return this.bkuconnector != null; } /** - * @return the connector + * @return the BKU connector */ public BkuSlConnector getBKUConnector() { - return this.connector; + return this.bkuconnector; + } + + /** + * @return whether a KS signer was set + */ + public boolean hasKSSigner() { + return this.kssigner != null; + } + + /** + * @return the KS signer + */ + public IPlainSigner getKSSigner() { + return this.kssigner; } } |