From 6d3b9d99b0e708d2516caf0f098c58c8a9585114 Mon Sep 17 00:00:00 2001 From: tkellner Date: Wed, 10 Apr 2013 18:54:34 +0000 Subject: Mobile BKU first working (currently set to work with test mobile BKU from A-Trust git-svn-id: https://joinup.ec.europa.eu/svn/pdf-over/trunk@31 174cde9d-5d70-4d2a-aa98-46368bc2aaf7 --- .../java/at/asit/pdfover/gui/DeveloperMain.java | 3 + .../gui/composites/BKUSelectionComposite.java | 2 +- .../pdfover/gui/composites/ErrorComposite.java | 16 +- .../composites/MobileBKUEnterNumberComposite.java | 325 +++++++++++++++++++++ .../gui/composites/MobileBKUEnterTANComposite.java | 243 +++++++++++++++ .../asit/pdfover/gui/workflow/ConfigProvider.java | 2 +- .../pdfover/gui/workflow/ConfigProviderImpl.java | 2 +- .../java/at/asit/pdfover/gui/workflow/Status.java | 5 +- .../at/asit/pdfover/gui/workflow/StatusImpl.java | 2 +- .../gui/workflow/states/BKUSelectionState.java | 21 +- .../pdfover/gui/workflow/states/ErrorState.java | 29 +- .../pdfover/gui/workflow/states/LocalBKUState.java | 17 +- .../gui/workflow/states/MobileBKUState.java | 228 ++++++++++++++- .../gui/workflow/states/PrepareSigningState.java | 9 +- .../pdfover/gui/workflow/states/SigningState.java | 5 +- .../states/mobilebku/ASITTrustManager.java | 65 +++++ .../workflow/states/mobilebku/ATrustHelper.java | 67 +++++ .../mobilebku/MobileBKUCommunicationState.java | 42 +++ .../workflow/states/mobilebku/MobileBKUStatus.java | 203 +++++++++++++ .../states/mobilebku/PostCredentialsThread.java | 176 +++++++++++ .../states/mobilebku/PostSLRequestThread.java | 164 +++++++++++ .../workflow/states/mobilebku/PostTanThread.java | 173 +++++++++++ .../states/mobilebku/TrustedSocketFactory.java | 159 ++++++++++ .../main/java/at/asit/pdfover/signator/BKUs.java | 40 +++ .../java/at/asit/pdfover/signator/SLRequest.java | 2 +- .../asit/pdfover/signator/SignatureParameter.java | 16 + .../at/asit/pdfover/signer/pdfas/PDFASSigner.java | 10 +- 27 files changed, 1964 insertions(+), 62 deletions(-) create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterNumberComposite.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterTANComposite.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ASITTrustManager.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ATrustHelper.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUCommunicationState.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUStatus.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostCredentialsThread.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostSLRequestThread.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostTanThread.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/TrustedSocketFactory.java create mode 100644 pdf-over-signator/src/main/java/at/asit/pdfover/signator/BKUs.java diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/DeveloperMain.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/DeveloperMain.java index cac40c4d..16209693 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/DeveloperMain.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/DeveloperMain.java @@ -38,6 +38,9 @@ public class DeveloperMain { //BasicConfigurator.configure(); + // Set PDF-AS log4j configuration: + System.setProperty("log4j.configuration", "log4j.properties"); + StateMachineImpl flow = new StateMachineImpl(args); log.debug("Starting workflow ..."); 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 893b0e87..8b8f5b10 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 @@ -27,8 +27,8 @@ import org.eclipse.swt.widgets.Composite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; import at.asit.pdfover.gui.workflow.states.State; +import at.asit.pdfover.signator.BKUs; /** * diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java index 38b0f877..93486894 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java @@ -65,6 +65,7 @@ public class ErrorComposite extends StateComposite { } private Exception exception; + private Label lbl_message; /** @@ -73,6 +74,7 @@ public class ErrorComposite extends StateComposite { */ public void setException(Exception exception) { this.exception = exception; + this.lbl_message.setText(this.exception.getMessage()); } /** @@ -86,14 +88,14 @@ public class ErrorComposite extends StateComposite { this.setLayout(new FormLayout()); - Label lbl_message = new Label(this, SWT.NATIVE | SWT.RESIZE); + this.lbl_message = new Label(this, SWT.WRAP | SWT.NATIVE | SWT.RESIZE); FormData fd_lbl_message = new FormData(); fd_lbl_message.left = new FormAttachment(10, 0); fd_lbl_message.right = new FormAttachment(90, 0); - fd_lbl_message.top = new FormAttachment(40, 0); - fd_lbl_message.bottom = new FormAttachment(50, 0); - lbl_message.setLayoutData(fd_lbl_message); - lbl_message.setText(this.exception.getMessage()); + fd_lbl_message.top = new FormAttachment(10, 0); + fd_lbl_message.bottom = new FormAttachment(80, 0); + this.lbl_message.setLayoutData(fd_lbl_message); + //lbl_message.setText(this.exception.getMessage()); Button btn_ok = new Button(this, SWT.NATIVE | SWT.RESIZE); btn_ok.setText("OK"); @@ -101,8 +103,8 @@ public class ErrorComposite extends StateComposite { FormData fd_btn_ok = new FormData(); fd_btn_ok.left = new FormAttachment(45, 0); fd_btn_ok.right = new FormAttachment(55, 0); - fd_btn_ok.top = new FormAttachment(70, 0); - fd_btn_ok.bottom = new FormAttachment(75, 0); + fd_btn_ok.top = new FormAttachment(85, 0); + fd_btn_ok.bottom = new FormAttachment(95, 0); btn_ok.setLayoutData(fd_btn_ok); btn_ok.addSelectionListener(new OkSelectionListener()); } diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterNumberComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterNumberComposite.java new file mode 100644 index 00000000..45c0881b --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterNumberComposite.java @@ -0,0 +1,325 @@ +/* + * 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.composites; + +// Imports +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.State; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; + +/** + * + */ +public class MobileBKUEnterNumberComposite extends StateComposite { + /** + * + */ + private final class OkSelectionListener implements SelectionListener { + + /** + * Regular expression for mobile phone numbers: + * this allows the entrance of mobile numbers in the following formats: + * + * +(countryCode)99999999999 + * 00(countryCode)99999999999 + * 099999999999 + * 1030199999999999 (A-Trust Test bku) + */ + private static final String NUMBER_REGEX = "^((\\+[\\d]{2})|(00[\\d]{2})|(0)|(10301))([1-9][\\d]+)$"; //$NON-NLS-1$ + + /** + * + */ + public OkSelectionListener() { + // Nothing to do here + } + + @Override + public void widgetSelected(SelectionEvent e) { + + try { + String number = MobileBKUEnterNumberComposite.this.txt_number + .getText(); + + // Verify number and normalize + + // Compile and use regular expression + Pattern pattern = Pattern.compile(NUMBER_REGEX); + Matcher matcher = pattern.matcher(number); + + if (!matcher.find()) { + MobileBKUEnterNumberComposite.this + .setErrorMessage("Given phone number is invalid! Example: +43664123456789"); + return; + } + + if (matcher.groupCount() != 6) { + MobileBKUEnterNumberComposite.this + .setErrorMessage("Given phone number is invalid! Example: +43664123456789"); + return; + } + + String countryCode = matcher.group(1); + + String normalNumber = matcher.group(6); + + if (countryCode.equals("10301")) { //$NON-NLS-1$ + // A-Trust Testnumber! + } else { + + countryCode = countryCode.replace("00", "+"); //$NON-NLS-1$ //$NON-NLS-2$ + + if (countryCode.equals("0")) { //$NON-NLS-1$ + countryCode = "+43"; //$NON-NLS-1$ + } + + number = countryCode + normalNumber; + } + MobileBKUEnterNumberComposite.this.setMobileNumber(number); + + MobileBKUEnterNumberComposite.this.mobileNumber = number; + + String password = MobileBKUEnterNumberComposite.this.txt_password + .getText(); + + // TODO: Logic to verify password + + if (password.length() < 6 || password.length() > 20) { + if (password.length() < 6) { + MobileBKUEnterNumberComposite.this + .setErrorMessage("Given password is too short!"); + } else { + MobileBKUEnterNumberComposite.this + .setErrorMessage("Given password is too long!"); + } + return; + } + + MobileBKUEnterNumberComposite.this.mobilePassword = password; + MobileBKUEnterNumberComposite.this.setUserAck(true); + } catch (Exception ex) { + log.error("Validating input for Mobile BKU failed!", ex); //$NON-NLS-1$ + // TODO: NOT VALID + MobileBKUEnterNumberComposite.this + .setErrorMessage("Given phone number is invalid! Example: +43664123456789"); + return; + } + MobileBKUEnterNumberComposite.this.state.updateStateMachine(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing to do! + } + } + + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(MobileBKUEnterNumberComposite.class); + + String mobileNumber; + + String mobilePassword; + + Text txt_number; + + Text txt_password; + + String errorMessage = null; + + boolean userAck = false; + + /** + * @return the userAck + */ + public boolean isUserAck() { + return this.userAck; + } + + /** + * @param userAck + * the userAck to set + */ + public void setUserAck(boolean userAck) { + this.userAck = userAck; + } + + private Label lbl_error; + + /** + * @return the errorMessage + */ + public String getErrorMessage() { + return this.errorMessage; + } + + /** + * @param errorMessage + * the errorMessage to set + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + + if (this.errorMessage != null) { + this.lbl_error.setText(this.errorMessage); + } else { + this.lbl_error.setText(""); //$NON-NLS-1$ + } + } + + /** + * Create the composite. + * + * @param parent + * @param style + * @param state + */ + public MobileBKUEnterNumberComposite(Composite parent, int style, + State state) { + super(parent, style, state); + setLayout(new FormLayout()); + + this.txt_number = new Text(this, SWT.SINGLE | SWT.NATIVE | SWT.BORDER); + FormData fd_number = new FormData(); + fd_number.top = new FormAttachment(30, -15); + fd_number.bottom = new FormAttachment(30, 15); + fd_number.left = new FormAttachment(50, 0); + fd_number.right = new FormAttachment(85, 0); + this.txt_number.setLayoutData(fd_number); + this.txt_number.setEditable(true); + + Label lbl_number = new Label(this, SWT.NATIVE); + lbl_number.setText("Nummer:"); + FormData fd_lbl_number = new FormData(); + fd_lbl_number.top = new FormAttachment(30, -15); + fd_lbl_number.bottom = new FormAttachment(30, 15); + fd_lbl_number.left = new FormAttachment(15, 0); + fd_lbl_number.right = new FormAttachment(45, 0); + lbl_number.setLayoutData(fd_lbl_number); + + this.txt_password = new Text(this, SWT.SINGLE | SWT.PASSWORD + | SWT.BORDER | SWT.NATIVE); + FormData fd_password = new FormData(); + fd_password.top = new FormAttachment(50, -15); + fd_password.bottom = new FormAttachment(50, 15); + fd_password.left = new FormAttachment(50, 0); + fd_password.right = new FormAttachment(85, 0); + this.txt_password.setLayoutData(fd_password); + this.txt_password.setEditable(true); + + Label lbl_password = new Label(this, SWT.NATIVE); + lbl_password.setText("Passwort:"); + FormData fd_lbl_password = new FormData(); + fd_lbl_password.top = new FormAttachment(50, -15); + fd_lbl_password.bottom = new FormAttachment(50, 15); + fd_lbl_password.left = new FormAttachment(15, 0); + fd_lbl_password.right = new FormAttachment(45, 0); + lbl_password.setLayoutData(fd_lbl_password); + + this.lbl_error = new Label(this, SWT.WRAP | SWT.NATIVE); + FormData fd_lbl_error = new FormData(); + fd_lbl_error.top = new FormAttachment(70, -15); + fd_lbl_error.bottom = new FormAttachment(70, 15); + fd_lbl_error.left = new FormAttachment(15, 0); + fd_lbl_error.right = new FormAttachment(85, 0); + this.lbl_error.setLayoutData(fd_lbl_error); + + Button btn_ok = new Button(this, SWT.NATIVE); + btn_ok.setText("Ok"); + FormData fd_btn_ok = new FormData(); + fd_btn_ok.top = new FormAttachment(87, 0); + fd_btn_ok.bottom = new FormAttachment(95, 0); + fd_btn_ok.left = new FormAttachment(75, 0); + fd_btn_ok.right = new FormAttachment(95, 0); + btn_ok.setLayoutData(fd_btn_ok); + btn_ok.addSelectionListener(new OkSelectionListener()); + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* + * (non-Javadoc) + * + * @see at.asit.pdfover.gui.composites.StateComposite#doLayout() + */ + @Override + public void doLayout() { + // Nothing to do here till now + } + + /** + * @return the mobileNumber + */ + public String getMobileNumber() { + return this.mobileNumber; + } + + /** + * @param mobileNumber + * the mobileNumber to set + */ + public void setMobileNumber(String mobileNumber) { + this.mobileNumber = mobileNumber; + + if (this.mobileNumber != null) { + this.txt_number.setText(this.mobileNumber); + } else { + this.txt_number.setText(""); //$NON-NLS-1$ + } + } + + /** + * @return the mobilePassword + */ + public String getMobilePassword() { + return this.mobilePassword; + } + + /** + * @param mobilePassword + * the mobilePassword to set + */ + public void setMobilePassword(String mobilePassword) { + this.mobilePassword = mobilePassword; + + if (this.mobilePassword != null) { + this.txt_password.setText(this.mobilePassword); + } else { + this.txt_password.setText(""); //$NON-NLS-1$ + } + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterTANComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterTANComposite.java new file mode 100644 index 00000000..0a23b947 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/MobileBKUEnterTANComposite.java @@ -0,0 +1,243 @@ +/* + * 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.composites; + +// Imports +import org.eclipse.swt.widgets.Composite; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.State; + +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowLayout; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormAttachment; + +/** + * + */ +public class MobileBKUEnterTANComposite extends StateComposite { + /** + * + */ + private final class OkSelectionListener implements SelectionListener { + /** + * + */ + public OkSelectionListener() { + // Nothing to do + } + + @Override + public void widgetSelected(SelectionEvent e) { + String tan = MobileBKUEnterTANComposite.this.txt_tan.getText(); + + tan = tan.trim(); + + if(MobileBKUEnterTANComposite.this.vergleichswert.startsWith(tan)) { + MobileBKUEnterTANComposite.this.setMessage("Sie haben den Vergleichswert eingegeben!"); + return; + } + + if(tan.length() > 6) { + MobileBKUEnterTANComposite.this.setMessage("Eingabe zu lange für TAN"); + return; + } + + // TODO: Check TAN! + + MobileBKUEnterTANComposite.this.tan = tan; + MobileBKUEnterTANComposite.this.setUserAck(true); + MobileBKUEnterTANComposite.this.state.updateStateMachine(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing to do + } + } + + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(MobileBKUEnterTANComposite.class); + + Text txt_tan; + + boolean userAck = false; + + /** + * @return the userAck + */ + public boolean isUserAck() { + return this.userAck; + } + + public void setTries(int tries) { + this.lbl_tries.setText(tries + " tries left!"); + } + + public void setMessage(String msg) { + this.lbl_tries.setText(msg); + } + + /** + * @param userAck the userAck to set + */ + public void setUserAck(boolean userAck) { + this.userAck = userAck; + } + + private Label lblvergleich; + + String vergleichswert; + + String tan; + + private Label lbl_tries; + + /** + * @return the vergleichswert + */ + public String getVergleichswert() { + return this.vergleichswert; + } + + /** + * @param vergleichswert the vergleichswert to set + */ + public void setVergleichswert(String vergleichswert) { + this.vergleichswert = vergleichswert.trim(); + + if(this.vergleichswert != null) { + this.lblvergleich.setText(this.vergleichswert); + } else { + this.lblvergleich.setText(""); + } + + } + + /** + * @return the tan + */ + public String getTan() { + return this.tan; + } + + /** + * @param tan the tan to set + */ + public void setTan(String tan) { + this.tan = tan; + + if(this.tan == null) { + this.txt_tan.setText(""); //$NON-NLS-1$ + } else { + this.txt_tan.setText(this.tan); + } + } + + /** + * Create the composite. + * @param parent + * @param style + * @param state + */ + public MobileBKUEnterTANComposite(Composite parent, int style, State state) { + super(parent, style, state); + setLayout(new FormLayout()); + + Label lblVergleichswert = new Label(this, SWT.NATIVE); + FormData fd_lblVergleichswert = new FormData(); + fd_lblVergleichswert.left = new FormAttachment(15, 0); + fd_lblVergleichswert.right = new FormAttachment(50, 0); + fd_lblVergleichswert.top = new FormAttachment(30, -15); + fd_lblVergleichswert.bottom = new FormAttachment(30, 15); + lblVergleichswert.setLayoutData(fd_lblVergleichswert); + lblVergleichswert.setText("Vergleichswert"); + + this.lblvergleich = new Label(this, SWT.NATIVE); + FormData fd_lblvergleich = new FormData(); + fd_lblvergleich.left = new FormAttachment(50, 0); + fd_lblvergleich.right = new FormAttachment(85, 0); + fd_lblvergleich.top = new FormAttachment(30, -15); + fd_lblvergleich.bottom = new FormAttachment(30, 15); + this.lblvergleich.setLayoutData(fd_lblvergleich); + this.lblvergleich.setText("New Label"); //$NON-NLS-1$ + + Label lblTan = new Label(this, SWT.NATIVE); + FormData fd_lblTan = new FormData(); + fd_lblTan.left = new FormAttachment(15, 5); + fd_lblTan.right = new FormAttachment(50, -5); + fd_lblTan.top = new FormAttachment(50, -15); + fd_lblTan.bottom = new FormAttachment(50, 15); + lblTan.setLayoutData(fd_lblTan); + lblTan.setText("TAN:"); + + this.txt_tan = new Text(this, SWT.BORDER | SWT.NATIVE); + FormData fd_text = new FormData(); + fd_text.left = new FormAttachment(50, 0); + fd_text.right = new FormAttachment(85, 0); + fd_text.top = new FormAttachment(50, -15); + fd_text.left = new FormAttachment(50, 15); + this.txt_tan.setEditable(true); + this.txt_tan.setLayoutData(fd_text); + + this.lbl_tries = new Label(this, SWT.WRAP | SWT.NATIVE); + FormData fd_lbl_tries = new FormData(); + fd_lbl_tries.left = new FormAttachment(15, 5); + fd_lbl_tries.right = new FormAttachment(85, -5); + fd_lbl_tries.top = new FormAttachment(70, -15); + fd_lbl_tries.bottom = new FormAttachment(70, 15); + this.lbl_tries.setLayoutData(fd_lbl_tries); + + Button btn_ok = new Button(this, SWT.NATIVE); + FormData fd_btn_ok = new FormData(); + fd_btn_ok.left = new FormAttachment(15, 0); + fd_btn_ok.right = new FormAttachment(95, 0); + fd_btn_ok.top = new FormAttachment(85); + fd_btn_ok.bottom = new FormAttachment(95); + + btn_ok.setLayoutData(fd_btn_ok); + btn_ok.setText("Ok"); + btn_ok.addSelectionListener(new OkSelectionListener()); + + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.composites.StateComposite#doLayout() + */ + @Override + public void doLayout() { + // TODO Auto-generated method stub + + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProvider.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProvider.java index 30d7aed8..b2f1336b 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProvider.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProvider.java @@ -15,7 +15,7 @@ */ package at.asit.pdfover.gui.workflow; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; +import at.asit.pdfover.signator.BKUs; import at.asit.pdfover.signator.SignaturePosition; /** diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProviderImpl.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProviderImpl.java index 3787ef50..adedd1b0 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProviderImpl.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/ConfigProviderImpl.java @@ -19,7 +19,7 @@ package at.asit.pdfover.gui.workflow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; +import at.asit.pdfover.signator.BKUs; import at.asit.pdfover.signator.SignaturePosition; /** diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java index ba3c210b..3cd1377f 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java @@ -20,6 +20,7 @@ import java.io.File; import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.workflow.states.BKUSelectionState; import at.asit.pdfover.gui.workflow.states.State; +import at.asit.pdfover.signator.BKUs; import at.asit.pdfover.signator.SignResult; import at.asit.pdfover.signator.SignaturePosition; import at.asit.pdfover.signator.SigningState; @@ -56,13 +57,13 @@ public interface Status { * Sets the selected BKU * @param bku the selected BKU */ - public void setBKU(BKUSelectionState.BKUs bku); + public void setBKU(BKUs bku); /** * Gets the selected BKU * @return the selected BKU */ - public BKUSelectionState.BKUs getBKU(); + public BKUs getBKU(); /** * Gets the current state diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java index 5f0f53b7..355ab6bd 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java @@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; +import at.asit.pdfover.signator.BKUs; import at.asit.pdfover.signator.SignResult; import at.asit.pdfover.signator.SignaturePosition; import at.asit.pdfover.signator.SigningState; diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java index 6d4fa9fb..b4507e08 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java @@ -26,6 +26,7 @@ import at.asit.pdfover.gui.composites.BKUSelectionComposite; import at.asit.pdfover.gui.workflow.ConfigProvider; import at.asit.pdfover.gui.workflow.StateMachine; import at.asit.pdfover.gui.workflow.Status; +import at.asit.pdfover.signator.BKUs; /** * Decides which BKU to use (preconfigured or let user choose) @@ -39,26 +40,6 @@ public class BKUSelectionState extends State { super(stateMachine); } - /** - * Enumeration of available BKU types - */ - public enum BKUs { - /** - * Local bku - */ - LOCAL, - - /** - * Mobile bku - */ - MOBILE, - - /** - * None bku - */ - NONE - } - /** * SFL4J Logger instance **/ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java index e444fbf9..47485a0c 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java @@ -37,8 +37,15 @@ public class ErrorState extends State { private Exception exception; - private boolean userInformed = false; + private State recoverState = null; + /** + * @param recoverState the recoverState to set + */ + public void setRecoverState(State recoverState) { + this.recoverState = recoverState; + } + /** * SLF4J Logger instance **/ @@ -62,22 +69,24 @@ public class ErrorState extends State { public void run() { Status status = this.stateMachine.getStatus(); - if(this.errorComposite != null) { - this.userInformed = this.errorComposite.isUserOk(); - } + ErrorComposite errorComposite = this.getComposite(); - if(this.exception != null && !this.userInformed) { + if(this.exception != null && !errorComposite.isUserOk()) { // Display Exception .... - ErrorComposite errorComposite = this.getComposite(); this.errorComposite.setException(this.exception); - this.userInformed = this.errorComposite.isUserOk(); - this.stateMachine.getGUIProvider().display(errorComposite); + return; } - // TODO: Think should we do this? (possible infinity loop with exception ...) - this.setNextState(status.getPreviousState()); + // User was informed! + if(this.recoverState != null) { + // see if we can recover! + this.setNextState(this.recoverState); + } else { + // we cannot recover exit! + this.stateMachine.exit(); + } } /* (non-Javadoc) diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java index c1586d45..deec44dd 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java @@ -50,12 +50,16 @@ public class LocalBKUState extends State { */ public final static String BKU_REPSONE_HEADER_SIGNATURE_LAYOUT = "SignatureLayout"; //$NON-NLS-1$ + /** + * TODO: move to a better location ... + */ + public static final String PDF_OVER_USER_AGENT_STRING = "PDF-Over 4.0"; //$NON-NLS-1$ /** * */ private final class SignLocalBKUThread implements Runnable { - + private LocalBKUState state; /** @@ -74,11 +78,13 @@ public class LocalBKUState extends State { String sl_request = request.getBase64Request(); HttpClient client = new HttpClient(); - client.getParams().setParameter("http.useragent", //$NON-NLS-1$ - "PDF-Over 4.0"); //$NON-NLS-1$ + PostMethod method = new PostMethod( "http://127.0.0.1:3495/http-security-layer-request"); //$NON-NLS-1$ + + log.debug("SL REQUEST: " + sl_request); //$NON-NLS-1$ + method.addParameter("XMLRequest", sl_request); //$NON-NLS-1$ int returnCode = client.executeMethod(method); @@ -160,7 +166,10 @@ public class LocalBKUState extends State { } if(this.threadException != null) { - // TODO: Jump to error state! + ErrorState error = new ErrorState(this.stateMachine); + error.setException(this.threadException); + this.setNextState(error); + return; } if(!this.signingState.hasSignatureResponse()) { diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java index 3e1eb21a..e135f02b 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java @@ -16,12 +16,23 @@ package at.asit.pdfover.gui.workflow.states; // Imports +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; 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.composites.BKUSelectionComposite; +import at.asit.pdfover.gui.composites.MobileBKUEnterNumberComposite; +import at.asit.pdfover.gui.composites.MobileBKUEnterTANComposite; +import at.asit.pdfover.gui.composites.WaitingComposite; import at.asit.pdfover.gui.workflow.StateMachine; +import at.asit.pdfover.gui.workflow.states.mobilebku.MobileBKUCommunicationState; +import at.asit.pdfover.gui.workflow.states.mobilebku.MobileBKUStatus; +import at.asit.pdfover.gui.workflow.states.mobilebku.PostCredentialsThread; +import at.asit.pdfover.gui.workflow.states.mobilebku.PostSLRequestThread; +import at.asit.pdfover.gui.workflow.states.mobilebku.PostTanThread; /** * Logical state for performing the BKU Request to the A-Trust Mobile BKU @@ -32,6 +43,7 @@ public class MobileBKUState extends State { */ public MobileBKUState(StateMachine stateMachine) { super(stateMachine); + this.status = new MobileBKUStatus(); } /** @@ -41,17 +53,208 @@ public class MobileBKUState extends State { private static final Logger log = LoggerFactory .getLogger(MobileBKUState.class); - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui.workflow.Workflow) + at.asit.pdfover.signator.SigningState signingState; + + Exception threadException = null; + + MobileBKUCommunicationState communicationState = MobileBKUCommunicationState.POST_REQUEST; + + MobileBKUStatus status = null; + + MobileBKUEnterNumberComposite mobileBKUEnterNumberComposite = null; + + MobileBKUEnterTANComposite mobileBKUEnterTANComposite = null; + + WaitingComposite waitingComposite = null; + + private WaitingComposite getWaitingComposite() { + if (this.waitingComposite == null) { + this.waitingComposite = this.stateMachine.getGUIProvider() + .createComposite(WaitingComposite.class, SWT.RESIZE, this); + } + + return this.waitingComposite; + } + + private MobileBKUEnterTANComposite getMobileBKUEnterTANComposite() { + if (this.mobileBKUEnterTANComposite == null) { + this.mobileBKUEnterTANComposite = this.stateMachine + .getGUIProvider().createComposite( + MobileBKUEnterTANComposite.class, SWT.RESIZE, this); + } + + return this.mobileBKUEnterTANComposite; + } + + private MobileBKUEnterNumberComposite getMobileBKUEnterNumberComposite() { + if (this.mobileBKUEnterNumberComposite == null) { + this.mobileBKUEnterNumberComposite = this.stateMachine + .getGUIProvider().createComposite( + MobileBKUEnterNumberComposite.class, SWT.RESIZE, + this); + } + + return this.mobileBKUEnterNumberComposite; + } + + /** + * @return the status + */ + public MobileBKUStatus getStatus() { + return this.status; + } + + /** + * @return the communicationState + */ + public MobileBKUCommunicationState getCommunicationState() { + return this.communicationState; + } + + /** + * @param communicationState + * the communicationState to set + */ + public void setCommunicationState( + MobileBKUCommunicationState communicationState) { + this.communicationState = communicationState; + } + + /** + * @return the signingState + */ + public at.asit.pdfover.signator.SigningState getSigningState() { + return this.signingState; + } + + /** + * @param threadException + * the threadException to set + */ + public void setThreadException(Exception threadException) { + this.threadException = threadException; + } + + /* + * (non-Javadoc) + * + * @see + * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui + * .workflow.Workflow) */ @Override public void run() { - // TODO Process SL Request and set SL Response - - this.setNextState(new SigningState(this.stateMachine)); + + this.signingState = this.stateMachine.getStatus().getSigningState(); + + MobileBKUStatus mobileStatus = this.getStatus(); + + if (this.threadException != null) { + ErrorState error = new ErrorState(this.stateMachine); + error.setException(this.threadException); + this.setNextState(error); + return; + } + + switch (this.communicationState) { + case POST_REQUEST: + this.stateMachine.getGUIProvider().display( + this.getWaitingComposite()); + Thread postSLRequestThread = new Thread(new PostSLRequestThread( + this)); + postSLRequestThread.start(); + break; + case POST_NUMBER: + // Check if number and password is set ... + // if not show UI + // else start thread + + // check if we have everything we need! + if (mobileStatus.getPhoneNumber() != null + && mobileStatus.getMobilePassword() != null) { + // post to bku + Thread postCredentialsThread = new Thread( + new PostCredentialsThread(this)); + postCredentialsThread.start(); + // resets password if incorrect to null + } else { + + MobileBKUEnterNumberComposite ui = this + .getMobileBKUEnterNumberComposite(); + + if (ui.isUserAck()) { + // user hit ok + + ui.setUserAck(false); + + // get number and password from UI + mobileStatus.setPhoneNumber(ui.getMobileNumber()); + mobileStatus.setMobilePassword(ui.getMobilePassword()); + + // show waiting composite + this.stateMachine.getGUIProvider().display( + this.getWaitingComposite()); + + // post to BKU + Thread postCredentialsThread = new Thread( + new PostCredentialsThread(this)); + postCredentialsThread.start(); + + } else { + // We need at least number of password => show UI! + + // set possible error message + ui.setErrorMessage(mobileStatus.getErrorMessage()); + + // set possible phone number + ui.setMobileNumber(mobileStatus.getPhoneNumber()); + + // set possible password + ui.setMobilePassword(mobileStatus.getMobilePassword()); + + this.stateMachine.getGUIProvider().display(ui); + } + } + break; + case POST_TAN: + // Get TAN from UI + + MobileBKUEnterTANComposite tan = this + .getMobileBKUEnterTANComposite(); + + if (tan.isUserAck()) { + // user hit ok! + tan.setUserAck(false); + + mobileStatus.setTan(tan.getTan()); + + // post to BKU! + Thread postTanThread = new Thread(new PostTanThread(this)); + postTanThread.start(); + + } else { + tan.setVergleichswert(mobileStatus.getVergleichswert()); + + if(mobileStatus.getTanTries() < MobileBKUStatus.MOBILE_MAX_TAN_TRIES + && mobileStatus.getTanTries() > 0) { + // show warning message x tries left! + + tan.setTries(mobileStatus.getTanTries()); + + } + this.stateMachine.getGUIProvider().display(tan); + } + + break; + case FINAL: + this.setNextState(new SigningState(this.stateMachine)); + break; + } } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() */ @Override @@ -59,12 +262,15 @@ public class MobileBKUState extends State { // No composite - no cleanup necessary } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ @Override public void updateMainWindowBehavior() { - MainWindowBehavior behavior = this.stateMachine.getStatus().getBehavior(); + MainWindowBehavior behavior = this.stateMachine.getStatus() + .getBehavior(); behavior.reset(); behavior.setActive(Buttons.OPEN, true); behavior.setActive(Buttons.POSITION, true); @@ -72,7 +278,11 @@ public class MobileBKUState extends State { } @Override - public String toString() { + public String toString() { return this.getClass().getName(); } + + public void invokeUpdate() { + this.stateMachine.invokeUpdate(); + } } 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 af797756..1b7ed600 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 @@ -25,7 +25,7 @@ import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.composites.WaitingComposite; import at.asit.pdfover.gui.workflow.StateMachine; import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; +import at.asit.pdfover.signator.BKUs; import at.asit.pdfover.signator.PDFFileDocumentSource; import at.asit.pdfover.signator.SignatureParameter; import at.asit.pdfover.signator.Signer; @@ -66,7 +66,7 @@ public class PrepareSigningState extends State { } this.state.signatureParameter.setInputDocument(new PDFFileDocumentSource(this.state.stateMachine.getStatus().getDocument())); - + this.state.signatureParameter.setSignatureDevice(this.state.stateMachine.getStatus().getBKU()); this.state.signatureParameter.setSignaturePosition(this.state.stateMachine.getStatus().getSignaturePosition()); // TODO: Fill library specific signature Parameters ... @@ -129,7 +129,10 @@ public class PrepareSigningState extends State { } if(this.threadException != null) { - // TODO: Jump to error state! + ErrorState error = new ErrorState(this.stateMachine); + error.setException(this.threadException); + this.setNextState(error); + return; } if(this.signingState == null || this.signingState.getSignatureRequest() == null) { diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java index 524fc868..20813f00 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java @@ -84,7 +84,10 @@ public class SigningState extends State { } if(this.threadException != null) { - // TODO: Jump to error state + ErrorState error = new ErrorState(this.stateMachine); + error.setException(this.threadException); + this.setNextState(error); + return; } if(status.getSignResult() == null) { diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ASITTrustManager.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ASITTrustManager.java new file mode 100644 index 00000000..38bdfc74 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ASITTrustManager.java @@ -0,0 +1,65 @@ +/* + * 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.mobilebku; + +// Imports +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public class ASITTrustManager implements X509TrustManager { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(ASITTrustManager.class); + + /* (non-Javadoc) + * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String) + */ + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + // Ignore client certificates ... + } + + /* (non-Javadoc) + * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String) + */ + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + // TODO: Check trusted server certificate! + } + + /* (non-Javadoc) + * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() + */ + @Override + public X509Certificate[] getAcceptedIssuers() { + // TODO: Build accepted issuers + return null; + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ATrustHelper.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ATrustHelper.java new file mode 100644 index 00000000..c9254317 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/ATrustHelper.java @@ -0,0 +1,67 @@ +/* + * 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.mobilebku; + +// Imports +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public class ATrustHelper { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(ATrustHelper.class); + + /** + * @param data + * @param start + * @param end + * @return + * @throws Exception + */ + public static String extractTag(String data, String start, String end) throws Exception { + int startidx = data.indexOf(start); + if(startidx > 0) { + startidx = startidx+start.length(); + int endidx = data.indexOf(end, startidx); + if(endidx > startidx) { + return data.substring(startidx, endidx); + } else { + // TODO: throw exception + throw new Exception("end tag not available!"); + } + } else { + // TODO: throw exception + throw new Exception("start tag not available!"); + } + } + + /** + * @param query + * @return + */ + public static String stripQueryString(String query) { + int pathidx = query.lastIndexOf('/'); + if(pathidx > 0) { + return query.substring(0, pathidx); + } + return query; + } +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUCommunicationState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUCommunicationState.java new file mode 100644 index 00000000..339f2db3 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUCommunicationState.java @@ -0,0 +1,42 @@ +/* + * 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.mobilebku; + +/** + * Communication states for Mobile BKU + */ +public enum MobileBKUCommunicationState { + + /** + * POST SL Request to A-Trust BKU + */ + POST_REQUEST, + + /** + * POST User informations (number, password) to A-Trust BKU + */ + POST_NUMBER, + + /** + * POST tan to A-Trust BKU and retrieve SL Response + */ + POST_TAN, + + /** + * Final state + */ + FINAL +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUStatus.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUStatus.java new file mode 100644 index 00000000..344eaf58 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/MobileBKUStatus.java @@ -0,0 +1,203 @@ +/* + * 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.mobilebku; + +// Imports +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public class MobileBKUStatus { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(MobileBKUStatus.class); + + public static final int MOBILE_MAX_TAN_TRIES = 3; + + /** + * Constructor + */ + public MobileBKUStatus() { + // TODO: Fill number and password with possible config values! + } + + String viewstate; + + String eventvalidation; + + String sessionID; + + String phoneNumber; + + String mobilePassword; + + String baseURL; + + String vergleichswert; + + String errorMessage; + + String tan; + + int tanTries = MOBILE_MAX_TAN_TRIES; + + /** + * @return the tanTries + */ + public int getTanTries() { + return this.tanTries; + } + + /** + * Decreases the TAN Tries! + */ + public void decreaseTanTries() { + this.tanTries--; + } + + /** + * @return the tan + */ + public String getTan() { + return this.tan; + } + + /** + * @param tan the tan to set + */ + public void setTan(String tan) { + this.tan = tan; + } + + /** + * @return the errorMessage + */ + public String getErrorMessage() { + return this.errorMessage; + } + + /** + * @param errorMessage the errorMessage to set + */ + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + /** + * @return the vergleichswert + */ + public String getVergleichswert() { + return this.vergleichswert; + } + + /** + * @param vergleichswert the vergleichswert to set + */ + public void setVergleichswert(String vergleichswert) { + this.vergleichswert = vergleichswert; + } + + /** + * @return the credentialsFormAction + */ + public String getBaseURL() { + return this.baseURL; + } + + /** + * @param credentialsFormAction the credentialsFormAction to set + */ + public void setBaseURL(String baseURL) { + this.baseURL = baseURL; + } + + /** + * @return the viewstate + */ + public String getViewstate() { + return this.viewstate; + } + + /** + * @param viewstate + * the viewstate to set + */ + public void setViewstate(String viewstate) { + this.viewstate = viewstate; + } + + /** + * @return the eventvalidation + */ + public String getEventvalidation() { + return this.eventvalidation; + } + + /** + * @param eventvalidation the eventvalidation to set + */ + public void setEventvalidation(String eventvalidation) { + this.eventvalidation = eventvalidation; + } + + /** + * @return the phoneNumber + */ + public String getPhoneNumber() { + return this.phoneNumber; + } + + /** + * @param phoneNumber the phoneNumber to set + */ + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + /** + * @return the mobilePassword + */ + public String getMobilePassword() { + return this.mobilePassword; + } + + /** + * @param mobilePassword the mobilePassword to set + */ + public void setMobilePassword(String mobilePassword) { + this.mobilePassword = mobilePassword; + } + + /** + * @return the identification_url + */ + public String getSessionID() { + return this.sessionID; + } + + /** + * @param sessionID the identification_url to set + */ + public void setSessionID(String sessionID) { + this.sessionID = sessionID; + } + + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostCredentialsThread.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostCredentialsThread.java new file mode 100644 index 00000000..df18c231 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostCredentialsThread.java @@ -0,0 +1,176 @@ +/* + * 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.mobilebku; + +// Imports +import java.io.IOException; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.protocol.Protocol; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.LocalBKUState; +import at.asit.pdfover.gui.workflow.states.MobileBKUState; + +/** + * + */ +public class PostCredentialsThread implements Runnable { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(PostCredentialsThread.class); + + private MobileBKUState state; + + /** + * Constructor + * + * @param state + */ + public PostCredentialsThread(MobileBKUState state) { + this.state = state; + } + + /* (non-Javadoc) + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + MobileBKUStatus status = this.state.getStatus(); + + + Protocol.registerProtocol("https", //$NON-NLS-1$ + new Protocol("https", new TrustedSocketFactory(), 443)); //$NON-NLS-1$ + + HttpClient client = new HttpClient(); + client.getParams().setParameter("http.useragent", //$NON-NLS-1$ + LocalBKUState.PDF_OVER_USER_AGENT_STRING); + + PostMethod method = new PostMethod(status.getBaseURL() + "/identification.aspx?sid=" + status.getSessionID()); + + method.addParameter("__VIEWSTATE", status.getViewstate()); //$NON-NLS-1$ + method.addParameter("__EVENTVALIDATION", status.getEventvalidation()); //$NON-NLS-1$ + method.addParameter("handynummer", status.getPhoneNumber()); //$NON-NLS-1$ + method.addParameter("signaturpasswort", status.getMobilePassword()); //$NON-NLS-1$ + method.addParameter("Button_Identification", "Identifizieren"); //$NON-NLS-1$ //$NON-NLS-2$ + + int returnCode = client.executeMethod(method); + + String redirectLocation = null; + + GetMethod gmethod = null; + + String responseData = null; + + // Follow redirects + do { + // check return code + if (returnCode == HttpStatus.SC_MOVED_TEMPORARILY || + returnCode == HttpStatus.SC_MOVED_PERMANENTLY) { + + Header locationHeader = method + .getResponseHeader("location"); //$NON-NLS-1$ + if (locationHeader != null) { + redirectLocation = locationHeader.getValue(); + } else { + throw new IOException( + "Got HTTP 302 but no location to follow!"); //$NON-NLS-1$ + } + } else if(returnCode == HttpStatus.SC_OK) { + if(gmethod != null) { + responseData = gmethod.getResponseBodyAsString(); + } else { + responseData = method.getResponseBodyAsString(); + } + redirectLocation = null; + } else { + throw new HttpException(HttpStatus.getStatusText(returnCode)); + } + + if(redirectLocation != null) { + gmethod = new GetMethod(redirectLocation); + gmethod.setFollowRedirects(true); + returnCode = client.executeMethod(gmethod); + } + + } while(redirectLocation != null); + + // Now we have received some data lets check it: + + log.debug("Repsonse from A-Trust: " + responseData); //$NON-NLS-1$ + + String viewState = status.getViewstate(); + String eventValidation = status.getEventvalidation(); + String sessionID = status.getSessionID(); + + String vergleichswert = null; + + status.setVergleichswert(null); + status.setErrorMessage(null); + + if(responseData.contains("signature.aspx?sid=")) { //$NON-NLS-1$ + // credentials ok! TAN eingabe + sessionID = ATrustHelper.extractTag(responseData, "signature.aspx?sid=", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + viewState = ATrustHelper.extractTag(responseData, "id=\"__VIEWSTATE\" value=\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + + eventValidation = ATrustHelper.extractTag(responseData, "id=\"__EVENTVALIDATION\" value=\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + + vergleichswert = ATrustHelper.extractTag(responseData, "id='vergleichswert'>Vergleichswert:", ""); //$NON-NLS-1$//$NON-NLS-2$ + + status.setVergleichswert(vergleichswert); + + this.state.setCommunicationState(MobileBKUCommunicationState.POST_TAN); + } else { + // error seite + // extract error text! + + String errorMessage = ATrustHelper.extractTag(responseData, "", ""); //$NON-NLS-1$ //$NON-NLS-2$ + + this.state.getStatus().setErrorMessage(errorMessage); + + // force UI again! + status.setMobilePassword(null); + } + + log.info("sessionID: " + sessionID); //$NON-NLS-1$ + log.info("Vergleichswert: " + vergleichswert); //$NON-NLS-1$ + log.info("viewState: " + viewState); //$NON-NLS-1$ + log.info("eventValidation: " + eventValidation); //$NON-NLS-1$ + + status.setSessionID(sessionID); + + status.setViewstate(viewState); + + status.setEventvalidation(eventValidation); + + } catch (Exception ex) { + log.error("Error in PostCredentialsThread", ex); //$NON-NLS-1$ + this.state.setThreadException(ex); + } finally { + this.state.invokeUpdate(); + } + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostSLRequestThread.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostSLRequestThread.java new file mode 100644 index 00000000..83f42574 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostSLRequestThread.java @@ -0,0 +1,164 @@ +/* + * 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.mobilebku; + +// Imports +import java.io.IOException; + +import javax.xml.ws.http.HTTPException; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpState; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.protocol.Protocol; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.LocalBKUState; +import at.asit.pdfover.gui.workflow.states.MobileBKUState; + +/** + * + */ +public class PostSLRequestThread implements Runnable { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(PostSLRequestThread.class); + + private MobileBKUState state; + + /** + * Constructor + * + * @param state + */ + public PostSLRequestThread(MobileBKUState state) { + this.state = state; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + String sl_request = this.state.getSigningState() + .getSignatureRequest().getBase64Request(); + + Protocol.registerProtocol("https", //$NON-NLS-1$ + new Protocol("https", new TrustedSocketFactory(), 443)); //$NON-NLS-1$ + + HttpClient client = new HttpClient(); + client.getParams().setParameter("http.useragent", //$NON-NLS-1$ + LocalBKUState.PDF_OVER_USER_AGENT_STRING); + + // TODO: move URL to config!! + + //String url = "https://www.a-trust.at/mobile/https-security-layer-request/default.aspx"; + String url = "https://test1.a-trust.at/https-security-layer-request/default.aspx"; + + PostMethod method = new PostMethod(url); + + method.addParameter("XMLRequest", sl_request); //$NON-NLS-1$ + + int returnCode = client.executeMethod(method); + + String redirectLocation = null; + + GetMethod gmethod = null; + + String responseData = null; + + this.state.getStatus().setBaseURL(ATrustHelper.stripQueryString(url)); + + // Follow redirects + do { + // check return code + if (returnCode == HttpStatus.SC_MOVED_TEMPORARILY || + returnCode == HttpStatus.SC_MOVED_PERMANENTLY) { + + Header locationHeader = method + .getResponseHeader("location"); //$NON-NLS-1$ + if (locationHeader != null) { + redirectLocation = locationHeader.getValue(); + } else { + throw new IOException( + "Got HTTP 302 but no location to follow!"); //$NON-NLS-1$ + } + } else if(returnCode == HttpStatus.SC_OK) { + if(gmethod != null) { + responseData = gmethod.getResponseBodyAsString(); + } else { + responseData = method.getResponseBodyAsString(); + } + redirectLocation = null; + } else { + throw new HttpException(HttpStatus.getStatusText(returnCode)); + } + + if(redirectLocation != null) { + gmethod = new GetMethod(redirectLocation); + gmethod.setFollowRedirects(true); + returnCode = client.executeMethod(gmethod); + } + + } while(redirectLocation != null); + + // Now we have received some data lets check it: + + log.debug("Repsonse from A-Trust: " + responseData); //$NON-NLS-1$ + + // Extract infos: + + String sessionID = ATrustHelper.extractTag(responseData, "identification.aspx?sid=", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + + String viewState = ATrustHelper.extractTag(responseData, "id=\"__VIEWSTATE\" value=\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + + String eventValidation = ATrustHelper.extractTag(responseData, "id=\"__EVENTVALIDATION\" value=\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + + log.info("sessionID: " + sessionID); //$NON-NLS-1$ + log.info("viewState: " + viewState); //$NON-NLS-1$ + log.info("eventValidation: " + eventValidation); //$NON-NLS-1$ + + this.state.getStatus().setSessionID(sessionID); + + this.state.getStatus().setViewstate(viewState); + + this.state.getStatus().setEventvalidation(eventValidation); + + /* + * If all went well we can set the communication state to the new + * state + */ + this.state + .setCommunicationState(MobileBKUCommunicationState.POST_NUMBER); + } catch (Exception ex) { + log.error("Error in PostSLRequestThread", ex); //$NON-NLS-1$ + this.state.setThreadException(ex); + } finally { + this.state.invokeUpdate(); + } + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostTanThread.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostTanThread.java new file mode 100644 index 00000000..e4a2242a --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/PostTanThread.java @@ -0,0 +1,173 @@ +/* + * 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.mobilebku; + +// Imports +import java.io.IOException; + +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.protocol.Protocol; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.LocalBKUState; +import at.asit.pdfover.gui.workflow.states.MobileBKUState; +import at.asit.pdfover.signator.SLResponse; + +/** + * + */ +public class PostTanThread implements Runnable { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(PostTanThread.class); + + private MobileBKUState state; + + /** + * Constructor + * + * @param state + */ + public PostTanThread(MobileBKUState state) { + this.state = state; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + try { + MobileBKUStatus status = this.state.getStatus(); + + Protocol.registerProtocol("https", //$NON-NLS-1$ + new Protocol("https", new TrustedSocketFactory(), 443)); //$NON-NLS-1$ + + HttpClient client = new HttpClient(); + client.getParams().setParameter("http.useragent", //$NON-NLS-1$ + LocalBKUState.PDF_OVER_USER_AGENT_STRING); + + PostMethod method = new PostMethod(status.getBaseURL() + + "/signature.aspx?sid=" + status.getSessionID()); //$NON-NLS-1$ + + method.addParameter("__VIEWSTATE", status.getViewstate()); //$NON-NLS-1$ + method.addParameter( + "__EVENTVALIDATION", status.getEventvalidation()); //$NON-NLS-1$ + method.addParameter("input_tan", status.getTan()); //$NON-NLS-1$ + method.addParameter("SignButton", "Signieren"); //$NON-NLS-1$ //$NON-NLS-2$ + method.addParameter("Button1", "Identifizieren"); //$NON-NLS-1$ //$NON-NLS-2$ + + int returnCode = client.executeMethod(method); + + String redirectLocation = null; + + GetMethod gmethod = null; + + String responseData = null; + + String server = ""; //$NON-NLS-1$ + + // Follow redirects + do { + // check return code + if (returnCode == HttpStatus.SC_MOVED_TEMPORARILY + || returnCode == HttpStatus.SC_MOVED_PERMANENTLY) { + + Header locationHeader = method + .getResponseHeader("location"); //$NON-NLS-1$ + if (locationHeader != null) { + redirectLocation = locationHeader.getValue(); + } else { + throw new IOException( + "Got HTTP 302 but no location to follow!"); //$NON-NLS-1$ + } + } else if (returnCode == HttpStatus.SC_OK) { + + if (gmethod != null) { + responseData = gmethod.getResponseBodyAsString(); + + if (gmethod + .getResponseHeader(LocalBKUState.BKU_REPSONE_HEADER_SERVER) != null) { + server = gmethod.getResponseHeader( + LocalBKUState.BKU_REPSONE_HEADER_SERVER) + .getValue(); + } + + } else { + responseData = method.getResponseBodyAsString(); + + if (method + .getResponseHeader(LocalBKUState.BKU_REPSONE_HEADER_SERVER) != null) { + server = method.getResponseHeader( + LocalBKUState.BKU_REPSONE_HEADER_SERVER) + .getValue(); + } + + } + redirectLocation = null; + } else { + throw new HttpException( + HttpStatus.getStatusText(returnCode)); + } + + if (redirectLocation != null) { + gmethod = new GetMethod(redirectLocation); + gmethod.setFollowRedirects(true); + returnCode = client.executeMethod(gmethod); + } + + } while (redirectLocation != null); + + // Now we have received some data lets check it: + + log.debug("Repsonse from A-Trust: " + responseData); //$NON-NLS-1$ + + log.info("Server: " + server); //$NON-NLS-1$ + + if (responseData.contains("sl:CreateXMLSignatureResponse xmlns:sl")) { //$NON-NLS-1$ + // success !! + + this.state.getSigningState().setSignatureResponse( + new SLResponse(responseData, server, null, null)); + this.state + .setCommunicationState(MobileBKUCommunicationState.FINAL); + } else { + status.decreaseTanTries(); + + if (status.getTanTries() <= 0) { + // move to POST_REQUEST + this.state.setCommunicationState(MobileBKUCommunicationState.POST_REQUEST); + } + } + } catch (Exception ex) { + log.error("Error in PostTanThread", ex); //$NON-NLS-1$ + this.state.setThreadException(ex); + } finally { + this.state.invokeUpdate(); + } + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/TrustedSocketFactory.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/TrustedSocketFactory.java new file mode 100644 index 00000000..6b5a6fdd --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/mobilebku/TrustedSocketFactory.java @@ -0,0 +1,159 @@ +/* + * 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.mobilebku; + +// Imports +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.UnknownHostException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; + +import org.apache.commons.httpclient.ConnectTimeoutException; +import org.apache.commons.httpclient.params.HttpConnectionParams; +import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public class TrustedSocketFactory implements ProtocolSocketFactory { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(TrustedSocketFactory.class); + + private SSLSocketFactory getFactory() throws NoSuchAlgorithmException, + KeyManagementException { + SSLContext sslContext = SSLContext.getInstance("TLS"); //$NON-NLS-1$ + sslContext.init(null, new TrustManager[] { new ASITTrustManager() }, + new java.security.SecureRandom()); + + return sslContext.getSocketFactory(); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket + * (java.lang.String, int) + */ + @Override + public Socket createSocket(String host, int port) throws IOException, + UnknownHostException { + try { + SSLSocket sslSocket = (SSLSocket) getFactory().createSocket(host, + port); + + return sslSocket; + } catch (Exception ex) { + log.error("TrustedSocketFactory: ", ex); + if (ex instanceof IOException) { + throw (IOException) ex; + } else if (ex instanceof UnknownHostException) { + throw (UnknownHostException) ex; + } else { + throw new IOException( + "Not really an IOException! See inner exception", ex); + } + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket + * (java.lang.String, int, java.net.InetAddress, int) + */ + @Override + public Socket createSocket(String host, int port, InetAddress clientHost, + int clientPort) throws IOException, UnknownHostException { + try { + SSLSocket sslSocket = (SSLSocket) getFactory().createSocket(host, + port, clientHost, clientPort); + + return sslSocket; + } catch (Exception ex) { + log.error("TrustedSocketFactory: ", ex); + if (ex instanceof IOException) { + throw (IOException) ex; + } else if (ex instanceof UnknownHostException) { + throw (UnknownHostException) ex; + } else { + throw new IOException( + "Not really an IOException! See inner exception", ex); + } + } + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket + * (java.lang.String, int, java.net.InetAddress, int, + * org.apache.commons.httpclient.params.HttpConnectionParams) + */ + @Override + public Socket createSocket(String host, int port, InetAddress clientHost, + int clientPort, HttpConnectionParams params) throws IOException, + UnknownHostException, ConnectTimeoutException { + try { + if (params == null) { + throw new IllegalArgumentException("Parameters may not be null"); + } + int timeout = params.getConnectionTimeout(); + Socket socket = null; + + SSLSocketFactory socketfactory = getFactory(); + if (timeout == 0) { + socket = socketfactory.createSocket(host, port, clientHost, + clientPort); + } else { + socket = socketfactory.createSocket(); + SocketAddress localaddr = new InetSocketAddress(clientHost, + clientPort); + SocketAddress remoteaddr = new InetSocketAddress(host, port); + socket.bind(localaddr); + socket.connect(remoteaddr, timeout); + } + return socket; + } catch (Exception ex) { + log.error("TrustedSocketFactory: ", ex); + if (ex instanceof IOException) { + throw (IOException) ex; + } else if (ex instanceof UnknownHostException) { + throw (UnknownHostException) ex; + } else { + throw new IOException( + "Not really an IOException! See inner exception", ex); + } + } + } + +} 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 new file mode 100644 index 00000000..95b2f280 --- /dev/null +++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/BKUs.java @@ -0,0 +1,40 @@ +/* + * 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.signator; + +// Imports +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Enumeration of available BKU types + */ +public enum BKUs { + /** + * Local bku + */ + LOCAL, + + /** + * Mobile bku + */ + MOBILE, + + /** + * None bku + */ + NONE +} diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java index e3a372c5..f4e1fa8e 100644 --- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java +++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java @@ -55,7 +55,7 @@ public class SLRequest { * @return SL request String */ public String getBase64Request() { - byte[] b64content = Base64.encodeBase64(getSignatureData().getByteArray()); + String b64content = new String(Base64.encodeBase64(getSignatureData().getByteArray())); String b64request = this.request.replace( DATAOBJECT_STRING, diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SignatureParameter.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SignatureParameter.java index f3ba2a34..a89f9784 100644 --- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SignatureParameter.java +++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SignatureParameter.java @@ -48,6 +48,22 @@ public abstract class SignatureParameter { */ protected Emblem emblem; + protected BKUs signatureDevice; + + /** + * @return the signatureDevice + */ + public BKUs getSignatureDevice() { + return this.signatureDevice; + } + + /** + * @param signatureDevice the signatureDevice to set + */ + public void setSignatureDevice(BKUs signatureDevice) { + this.signatureDevice = signatureDevice; + } + /** * Getter of the property signaturePosition * @return Returns the signaturePosition. diff --git a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java index a2f34e9a..43179367 100644 --- a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java +++ b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java @@ -1,5 +1,6 @@ package at.asit.pdfover.signer.pdfas; +import at.asit.pdfover.signator.BKUs; import at.asit.pdfover.signator.ByteArrayDocumentSource; import at.asit.pdfover.signator.SLResponse; import at.asit.pdfover.signator.SignatureException; @@ -58,7 +59,14 @@ public class PDFASSigner implements Signer { SignParameters params = new SignParameters(); params.setSignaturePositioning(sign_para.getPDFASPositioning()); - params.setSignatureDevice(Constants.SIGNATURE_DEVICE_BKU); + + if(parameter.getSignatureDevice() == BKUs.LOCAL) { + params.setSignatureDevice(Constants.SIGNATURE_DEVICE_BKU); + } else if(parameter.getSignatureDevice() == BKUs.MOBILE) { + // TODO: change to MOBILE!! + params.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOBILE); + //params.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOBILETEST); + } params.setSignatureType(Constants.SIGNATURE_TYPE_BINARY); params.setSignatureProfileId(PROFILE_ID); -- cgit v1.2.3