From e7e98e908d4b71e875e9ff6d31dea052e5c9f3b8 Mon Sep 17 00:00:00 2001 From: Andreas Abraham Date: Tue, 7 Aug 2018 16:18:08 +0200 Subject: pdf-over support for fingerprint and faceid implemented --- .../gui/workflow/states/MobileBKUState.java | 1066 +++++++++++--------- 1 file changed, 581 insertions(+), 485 deletions(-) (limited to 'pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java') 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 2b9bbe06..cbb0af41 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 @@ -1,485 +1,581 @@ -/* - * 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; - -import java.io.InputStream; -import java.util.Timer; -import java.util.TimerTask; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -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.bku.MobileBKUConnector; -import at.asit.pdfover.gui.bku.mobile.ATrustHandler; -import at.asit.pdfover.gui.bku.mobile.ATrustStatus; -import at.asit.pdfover.gui.bku.mobile.IAIKHandler; -import at.asit.pdfover.gui.bku.mobile.IAIKStatus; -import at.asit.pdfover.gui.bku.mobile.MobileBKUHandler; -import at.asit.pdfover.gui.bku.mobile.MobileBKUStatus; -import at.asit.pdfover.gui.composites.MobileBKUEnterNumberComposite; -import at.asit.pdfover.gui.composites.MobileBKUEnterTANComposite; -import at.asit.pdfover.gui.composites.MobileBKUQRComposite; -import at.asit.pdfover.gui.composites.WaitingComposite; -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.config.ConfigProvider; -import at.asit.pdfover.signator.SigningState; - -/** - * Logical state for performing the BKU Request to the A-Trust Mobile BKU - */ -public class MobileBKUState extends State { - /** - * @param stateMachine - */ - public MobileBKUState(StateMachine stateMachine) { - super(stateMachine); - ConfigProvider provider = stateMachine.getConfigProvider(); - switch(provider.getMobileBKUType()) { - case A_TRUST: - this.status = new ATrustStatus(provider); - this.handler = new ATrustHandler(this, - stateMachine.getGUIProvider().getMainShell(), - provider.getMobileBKUBase64()); - break; - - case IAIK: - this.status = new IAIKStatus(provider); - this.handler = new IAIKHandler(this, - stateMachine.getGUIProvider().getMainShell()); - break; - } - - } - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory - .getLogger(MobileBKUState.class); - - SigningState signingState; - - Exception threadException = null; - - MobileBKUStatus status = null; - - MobileBKUHandler handler = null; - - MobileBKUEnterNumberComposite mobileBKUEnterNumberComposite = null; - - MobileBKUEnterTANComposite mobileBKUEnterTANComposite = null; - - MobileBKUQRComposite mobileBKUQRComposite = null; - - WaitingComposite waitingComposite = null; - - WaitingComposite getWaitingComposite() { - if (this.waitingComposite == null) { - this.waitingComposite = getStateMachine().getGUIProvider() - .createComposite(WaitingComposite.class, SWT.RESIZE, this); - } - - return this.waitingComposite; - } - - MobileBKUEnterTANComposite getMobileBKUEnterTANComposite() { - if (this.mobileBKUEnterTANComposite == null) { - this.mobileBKUEnterTANComposite = getStateMachine() - .getGUIProvider().createComposite( - MobileBKUEnterTANComposite.class, SWT.RESIZE, this); - } - - return this.mobileBKUEnterTANComposite; - } - - MobileBKUQRComposite getMobileBKUQRComposite() { - if (this.mobileBKUQRComposite == null) { - this.mobileBKUQRComposite = getStateMachine() - .getGUIProvider().createComposite( - MobileBKUQRComposite.class, SWT.RESIZE, this); - } - - return this.mobileBKUQRComposite; - } - - MobileBKUEnterNumberComposite getMobileBKUEnterNumberComposite() { - if (this.mobileBKUEnterNumberComposite == null) { - this.mobileBKUEnterNumberComposite = getStateMachine() - .getGUIProvider().createComposite( - MobileBKUEnterNumberComposite.class, SWT.RESIZE, - this); - } - - return this.mobileBKUEnterNumberComposite; - } - - /** - * Get the MobileBKUStatus - * @return the MobileBKUStatus - */ - public MobileBKUStatus getStatus() { - return this.status; - } - - /** - * Get the MobileBKUHandler - * @return the MobileBKUHandler - */ - public MobileBKUHandler getHandler() { - return this.handler; - } - - /** - * Get the mobile BKU URL - * @return the mobile BKU URL - */ - public String getURL() { - return getStateMachine().getConfigProvider().getMobileBKUURL(); - } - - /** - * @return the signingState - */ - public SigningState getSigningState() { - return this.signingState; - } - - /** - * @param threadException - * the threadException to set - */ - public void setThreadException(Exception threadException) { - this.threadException = threadException; - } - - /** - * Display an error message - * - * @param e - * the exception - */ - public void displayError(Exception e) { - String message = Messages.getString("error.Unexpected"); //$NON-NLS-1$ - log.error(message, e); - String errormsg = e.getLocalizedMessage(); - if (errormsg != null && !errormsg.isEmpty()) - message += ": " + errormsg; //$NON-NLS-1$ - displayError(message); - } - - /** - * Display an error message - * - * @param message - * the error message - */ - public void displayError(final String message) { - log.error(message); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - ErrorDialog error = new ErrorDialog(getStateMachine().getGUIProvider() - .getMainShell(), message, BUTTONS.OK); - error.open(); - } - }); - } - - /** - * Make sure phone number and password are set in the MobileBKUStatus - */ - public void checkCredentials() { - final MobileBKUStatus mobileStatus = this.getStatus(); - // check if we have everything we need! - if (mobileStatus.getPhoneNumber() != null && !mobileStatus.getPhoneNumber().isEmpty() && - mobileStatus.getMobilePassword() != null && !mobileStatus.getMobilePassword().isEmpty()) - return; - - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - MobileBKUEnterNumberComposite ui = MobileBKUState.this - .getMobileBKUEnterNumberComposite(); - - if (!ui.isUserAck()) { - // We need number and password => show UI! - if (mobileStatus.getErrorMessage() != null - && !mobileStatus.getErrorMessage().isEmpty()) { - // set possible error message - ui.setErrorMessage(mobileStatus.getErrorMessage()); - mobileStatus.setErrorMessage(null); - } else if (mobileStatus instanceof ATrustStatus) { - ui.setErrorMessage(Messages.getString("mobileBKU.aTrustDisclaimer")); //$NON-NLS-1$ - } - - if (ui.getMobileNumber() == null - || ui.getMobileNumber().isEmpty()) { - // set possible phone number - ui.setMobileNumber(mobileStatus.getPhoneNumber()); - } - - if (ui.getMobilePassword() == null - || ui.getMobilePassword().isEmpty()) { - // set possible password - ui.setMobilePassword(mobileStatus.getMobilePassword()); - } - ui.enableButton(); - getStateMachine().getGUIProvider().display(ui); - - Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); - while (!ui.isUserAck() && !ui.isUserCancel()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - } - - if (ui.isUserCancel()) { - ui.setUserCancel(false); - mobileStatus.setErrorMessage("cancel"); //$NON-NLS-1$ - return; - } - - // user hit ok - ui.setUserAck(false); - - // get number and password from UI - mobileStatus.setPhoneNumber(ui.getMobileNumber()); - mobileStatus.setMobilePassword(ui.getMobilePassword()); - - // show waiting composite - getStateMachine().getGUIProvider().display( - MobileBKUState.this.getWaitingComposite()); - } - }); - } - - /** - * Make sure TAN is set in the MobileBKUStatus - */ - public void checkTAN() { - final MobileBKUStatus mobileStatus = this.getStatus(); - - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - MobileBKUEnterTANComposite tan = MobileBKUState.this - .getMobileBKUEnterTANComposite(); - - if (!tan.isUserAck()) { - // we need the TAN - tan.setRefVal(mobileStatus.getRefVal()); - tan.setSignatureData(mobileStatus.getSignatureDataURL()); - tan.setErrorMessage(mobileStatus.getErrorMessage()); - if (mobileStatus.getTanTries() < mobileStatus.getMaxTanTries() - && mobileStatus.getTanTries() > 0) { - // show warning message x tries left! - // overrides error message - - tan.setTries(mobileStatus.getTanTries()); - } - tan.enableButton(); - getStateMachine().getGUIProvider().display(tan); - - Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); - while (!tan.isUserAck() && !tan.isUserCancel()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - } - - if (tan.isUserCancel()) { - tan.setUserCancel(false); - mobileStatus.setErrorMessage("cancel"); //$NON-NLS-1$ - return; - } - - // user hit ok! - tan.setUserAck(false); - - mobileStatus.setTan(tan.getTan()); - - // show waiting composite - getStateMachine().getGUIProvider().display( - MobileBKUState.this.getWaitingComposite()); - } - }); - } - - /** - * Show QR code - */ - public void showQR() { - final ATrustStatus status = (ATrustStatus) this.getStatus(); - final ATrustHandler handler = (ATrustHandler) this.getHandler(); - - final Timer checkDone = new Timer(true); - checkDone.scheduleAtFixedRate(new TimerTask() { - - @Override - public void run() { - // ping signature page to see if code has been scanned - try { - String resp = handler.getSignaturePage(); - if (handler.handleQRResponse(resp)) { - log.debug("Signature page response: " + resp); //$NON-NLS-1$ - getMobileBKUQRComposite().setDone(true); - Display display = getStateMachine().getGUIProvider(). - getMainShell().getDisplay(); - display.wake(); - } - Display.getDefault().wake(); - } catch (Exception e) { - log.error("Error getting signature page", e); //$NON-NLS-1$ - } - } - }, 0, 5000); - Display.getDefault().syncExec(new Runnable() { - @Override - public void run() { - MobileBKUQRComposite qr = getMobileBKUQRComposite(); - - qr.setRefVal(status.getRefVal()); - qr.setSignatureData(status.getSignatureDataURL()); - qr.setErrorMessage(status.getErrorMessage()); - InputStream qrcode = handler.getQRCode(); - if (qrcode == null) { - MobileBKUState.this.threadException = new Exception( - Messages.getString("error.FailedToLoadQRCode")); //$NON-NLS-1$ - } - qr.setQR(qrcode); - getStateMachine().getGUIProvider().display(qr); - - Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); - while (!qr.isUserCancel() && !qr.isUserSMS() && !qr.isDone()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - checkDone.cancel(); - - if (qr.isUserCancel()) { - qr.setUserCancel(false); - status.setErrorMessage("cancel"); //$NON-NLS-1$ - return; - } - - if (qr.isUserSMS()) { - qr.setUserSMS(false); - status.setQRCode(null); - } - - if (qr.isDone()) - qr.setDone(false); - - // show waiting composite - getStateMachine().getGUIProvider().display( - MobileBKUState.this.getWaitingComposite()); - } - }); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui - * .workflow.Workflow) - */ - @Override - public void run() { - this.signingState = getStateMachine().getStatus().getSigningState(); - - this.signingState.setBKUConnector(new MobileBKUConnector(this)); - log.debug("Setting base64 request to " + this.handler.useBase64Request()); //$NON-NLS-1$ - this.signingState.setUseBase64Request(this.handler.useBase64Request()); - - if (this.threadException != null) { - String message = Messages.getString("error.Unexpected"); //$NON-NLS-1$ - log.error(message, this.threadException); - String errormsg = this.threadException.getLocalizedMessage(); - if (errormsg != null && !errormsg.isEmpty()) - message += ": " + errormsg; //$NON-NLS-1$ - ErrorDialog error = new ErrorDialog( - getStateMachine().getGUIProvider().getMainShell(), - message, BUTTONS.OK); - // error.setException(this.threadException); - // this.setNextState(error); - error.open(); - getStateMachine().exit(); - return; - } - - getStateMachine().getGUIProvider().display( - this.getWaitingComposite()); - - 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() { - if (this.mobileBKUEnterNumberComposite != null) - this.mobileBKUEnterNumberComposite.dispose(); - if (this.mobileBKUEnterTANComposite != null) - this.mobileBKUEnterTANComposite.dispose(); - if (this.waitingComposite != null) - this.waitingComposite.dispose(); - } - - /* - * (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); - behavior.setEnabled(Buttons.OPEN, true); - behavior.setEnabled(Buttons.POSITION, true); - //behavior.setEnabled(Buttons.SIGN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } - - /** - * invoke state machine update in main thread - */ - public void invokeUpdate() { - getStateMachine().invokeUpdate(); - } -} +/* + * 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; + +import java.io.InputStream; +import java.util.Timer; +import java.util.TimerTask; + +// Imports +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +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.bku.MobileBKUConnector; +import at.asit.pdfover.gui.bku.mobile.ATrustHandler; +import at.asit.pdfover.gui.bku.mobile.ATrustStatus; +import at.asit.pdfover.gui.bku.mobile.IAIKHandler; +import at.asit.pdfover.gui.bku.mobile.IAIKStatus; +import at.asit.pdfover.gui.bku.mobile.MobileBKUHandler; +import at.asit.pdfover.gui.bku.mobile.MobileBKUStatus; +import at.asit.pdfover.gui.composites.MobileBKUEnterNumberComposite; +import at.asit.pdfover.gui.composites.MobileBKUEnterTANComposite; +import at.asit.pdfover.gui.composites.MobileBKUFingerprintComposite; +import at.asit.pdfover.gui.composites.MobileBKUQRComposite; +import at.asit.pdfover.gui.composites.WaitingComposite; +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.config.ConfigProvider; +import at.asit.pdfover.signator.SigningState; + +/** + * Logical state for performing the BKU Request to the A-Trust Mobile BKU + */ +public class MobileBKUState extends State { + /** + * @param stateMachine + */ + public MobileBKUState(StateMachine stateMachine) { + super(stateMachine); + ConfigProvider provider = stateMachine.getConfigProvider(); + switch(provider.getMobileBKUType()) { + case A_TRUST: + this.status = new ATrustStatus(provider); + this.handler = new ATrustHandler(this, + stateMachine.getGUIProvider().getMainShell(), + provider.getMobileBKUBase64()); + break; + + case IAIK: + this.status = new IAIKStatus(provider); + this.handler = new IAIKHandler(this, + stateMachine.getGUIProvider().getMainShell()); + break; + } + + } + + /** + * SLF4J Logger instance + **/ + static final Logger log = LoggerFactory + .getLogger(MobileBKUState.class); + + SigningState signingState; + + Exception threadException = null; + + MobileBKUStatus status = null; + + MobileBKUHandler handler = null; + + MobileBKUEnterNumberComposite mobileBKUEnterNumberComposite = null; + + MobileBKUEnterTANComposite mobileBKUEnterTANComposite = null; + + MobileBKUQRComposite mobileBKUQRComposite = null; + + MobileBKUFingerprintComposite mobileBKUFingerprintComposite = null; + + WaitingComposite waitingComposite = null; + + WaitingComposite getWaitingComposite() { + if (this.waitingComposite == null) { + this.waitingComposite = getStateMachine().getGUIProvider() + .createComposite(WaitingComposite.class, SWT.RESIZE, this); + } + + return this.waitingComposite; + } + + MobileBKUEnterTANComposite getMobileBKUEnterTANComposite() { + if (this.mobileBKUEnterTANComposite == null) { + this.mobileBKUEnterTANComposite = getStateMachine() + .getGUIProvider().createComposite( + MobileBKUEnterTANComposite.class, SWT.RESIZE, this); + } + + return this.mobileBKUEnterTANComposite; + } + + MobileBKUQRComposite getMobileBKUQRComposite() { + if (this.mobileBKUQRComposite == null) { + this.mobileBKUQRComposite = getStateMachine() + .getGUIProvider().createComposite( + MobileBKUQRComposite.class, SWT.RESIZE, this); + } + + return this.mobileBKUQRComposite; + } + + MobileBKUEnterNumberComposite getMobileBKUEnterNumberComposite() { + if (this.mobileBKUEnterNumberComposite == null) { + this.mobileBKUEnterNumberComposite = getStateMachine() + .getGUIProvider().createComposite( + MobileBKUEnterNumberComposite.class, SWT.RESIZE, + this); + } + + return this.mobileBKUEnterNumberComposite; + } + + + + + MobileBKUFingerprintComposite getMobileBKUFingerprintComposite() { + if (this.mobileBKUFingerprintComposite == null) { + this.mobileBKUFingerprintComposite = getStateMachine() + .getGUIProvider().createComposite( + MobileBKUFingerprintComposite.class, SWT.RESIZE, + this); + } + + return this.mobileBKUFingerprintComposite; + } + + + /** + * Get the MobileBKUStatus + * @return the MobileBKUStatus + */ + public MobileBKUStatus getStatus() { + return this.status; + } + + /** + * Get the MobileBKUHandler + * @return the MobileBKUHandler + */ + public MobileBKUHandler getHandler() { + return this.handler; + } + + /** + * Get the mobile BKU URL + * @return the mobile BKU URL + */ + public String getURL() { + return getStateMachine().getConfigProvider().getMobileBKUURL(); + } + + /** + * @return the signingState + */ + public SigningState getSigningState() { + return this.signingState; + } + + /** + * @param threadException + * the threadException to set + */ + public void setThreadException(Exception threadException) { + this.threadException = threadException; + } + + /** + * Display an error message + * + * @param e + * the exception + */ + public void displayError(Exception e) { + String message = Messages.getString("error.Unexpected"); //$NON-NLS-1$ + log.error(message, e); + String errormsg = e.getLocalizedMessage(); + if (errormsg != null && !errormsg.isEmpty()) + message += ": " + errormsg; //$NON-NLS-1$ + displayError(message); + } + + /** + * Display an error message + * + * @param message + * the error message + */ + public void displayError(final String message) { + log.error(message); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + ErrorDialog error = new ErrorDialog(getStateMachine().getGUIProvider() + .getMainShell(), message, BUTTONS.OK); + error.open(); + } + }); + } + + /** + * Make sure phone number and password are set in the MobileBKUStatus + */ + public void checkCredentials() { + final MobileBKUStatus mobileStatus = this.getStatus(); + // check if we have everything we need! + if (mobileStatus.getPhoneNumber() != null && !mobileStatus.getPhoneNumber().isEmpty() && + mobileStatus.getMobilePassword() != null && !mobileStatus.getMobilePassword().isEmpty()) + return; + + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + MobileBKUEnterNumberComposite ui = MobileBKUState.this + .getMobileBKUEnterNumberComposite(); + + if (!ui.isUserAck()) { + // We need number and password => show UI! + if (mobileStatus.getErrorMessage() != null + && !mobileStatus.getErrorMessage().isEmpty()) { + // set possible error message + ui.setErrorMessage(mobileStatus.getErrorMessage()); + mobileStatus.setErrorMessage(null); + } else if (mobileStatus instanceof ATrustStatus) { + ui.setErrorMessage(Messages.getString("mobileBKU.aTrustDisclaimer")); //$NON-NLS-1$ + } + + if (ui.getMobileNumber() == null + || ui.getMobileNumber().isEmpty()) { + // set possible phone number + ui.setMobileNumber(mobileStatus.getPhoneNumber()); + } + + if (ui.getMobilePassword() == null + || ui.getMobilePassword().isEmpty()) { + // set possible password + ui.setMobilePassword(mobileStatus.getMobilePassword()); + } + ui.enableButton(); + getStateMachine().getGUIProvider().display(ui); + + Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); + while (!ui.isUserAck() && !ui.isUserCancel()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + } + + if (ui.isUserCancel()) { + ui.setUserCancel(false); + mobileStatus.setErrorMessage("cancel"); //$NON-NLS-1$ + return; + } + + // user hit ok + ui.setUserAck(false); + + // get number and password from UI + mobileStatus.setPhoneNumber(ui.getMobileNumber()); + mobileStatus.setMobilePassword(ui.getMobilePassword()); + + // show waiting composite + getStateMachine().getGUIProvider().display( + MobileBKUState.this.getWaitingComposite()); + } + }); + } + + /** + * Make sure TAN is set in the MobileBKUStatus + */ + public void checkTAN() { + final MobileBKUStatus mobileStatus = this.getStatus(); + + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + MobileBKUEnterTANComposite tan = MobileBKUState.this + .getMobileBKUEnterTANComposite(); + + if (!tan.isUserAck()) { + // we need the TAN + tan.setRefVal(mobileStatus.getRefVal()); + tan.setSignatureData(mobileStatus.getSignatureDataURL()); + tan.setErrorMessage(mobileStatus.getErrorMessage()); + if (mobileStatus.getTanTries() < mobileStatus.getMaxTanTries() + && mobileStatus.getTanTries() > 0) { + // show warning message x tries left! + // overrides error message + + tan.setTries(mobileStatus.getTanTries()); + } + tan.enableButton(); + getStateMachine().getGUIProvider().display(tan); + + Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); + while (!tan.isUserAck() && !tan.isUserCancel()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + } + + if (tan.isUserCancel()) { + tan.setUserCancel(false); + mobileStatus.setErrorMessage("cancel"); //$NON-NLS-1$ + return; + } + + // user hit ok! + tan.setUserAck(false); + + mobileStatus.setTan(tan.getTan()); + + // show waiting composite + getStateMachine().getGUIProvider().display( + MobileBKUState.this.getWaitingComposite()); + } + }); + } + + /** + * Show QR code + */ + public void showQR() { + final ATrustStatus status = (ATrustStatus) this.getStatus(); + final ATrustHandler handler = (ATrustHandler) this.getHandler(); + + final Timer checkDone = new Timer(true); + checkDone.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + // ping signature page to see if code has been scanned + try { + String resp = handler.getSignaturePage(); + if (handler.handleQRResponse(resp)) { + log.debug("Signature page response: " + resp); //$NON-NLS-1$ + getMobileBKUQRComposite().setDone(true); + Display display = getStateMachine().getGUIProvider(). + getMainShell().getDisplay(); + display.wake(); + } + Display.getDefault().wake(); + } catch (Exception e) { + log.error("Error getting signature page", e); //$NON-NLS-1$ + } + } + }, 0, 5000); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + MobileBKUQRComposite qr = getMobileBKUQRComposite(); + + qr.setRefVal(status.getRefVal()); + qr.setSignatureData(status.getSignatureDataURL()); + qr.setErrorMessage(status.getErrorMessage()); + InputStream qrcode = handler.getQRCode(); + if (qrcode == null) { + MobileBKUState.this.threadException = new Exception( + Messages.getString("error.FailedToLoadQRCode")); //$NON-NLS-1$ + } + qr.setQR(qrcode); + getStateMachine().getGUIProvider().display(qr); + + Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); + while (!qr.isUserCancel() && !qr.isUserSMS() && !qr.isDone()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + checkDone.cancel(); + + if (qr.isUserCancel()) { + qr.setUserCancel(false); + status.setErrorMessage("cancel"); //$NON-NLS-1$ + return; + } + + if (qr.isUserSMS()) { + qr.setUserSMS(false); + status.setQRCode(null); + } + + if (qr.isDone()) + qr.setDone(false); + + // show waiting composite + getStateMachine().getGUIProvider().display( + MobileBKUState.this.getWaitingComposite()); + } + }); + } + + + /** + * when fingerprint or faceid is selected in the app + * this information is shown + */ + public void showFingerPrintInformation() { + final ATrustStatus status = (ATrustStatus) this.getStatus(); + final ATrustHandler handler = (ATrustHandler) this.getHandler(); + + final Timer checkDone = new Timer(true); + checkDone.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + // ping signature page to see if code has been scanned + try { + String resp = handler.getSignaturePage(); + if (handler.handleQRResponse(resp)) { + log.debug("Signature page response: " + resp); //$NON-NLS-1$ + getMobileBKUFingerprintComposite().setDone(true); + Display display = getStateMachine().getGUIProvider(). + getMainShell().getDisplay(); + display.wake(); + } + Display.getDefault().wake(); + } catch (Exception e) { + log.error("Error getting signature page", e); //$NON-NLS-1$ + } + } + }, 0, 5000); + Display.getDefault().syncExec(new Runnable() { + @Override + public void run() { + MobileBKUFingerprintComposite fingerprintComposite = getMobileBKUFingerprintComposite(); + + fingerprintComposite.setRefVal(status.getRefVal()); + fingerprintComposite.setSignatureData(status.getSignatureDataURL()); + fingerprintComposite.setErrorMessage(status.getErrorMessage()); + getStateMachine().getGUIProvider().display(fingerprintComposite); + + Display display = getStateMachine().getGUIProvider().getMainShell().getDisplay(); + while (!fingerprintComposite.isUserCancel() && !fingerprintComposite.isUserSMS() && !fingerprintComposite.isDone()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + checkDone.cancel(); + + if (fingerprintComposite.isUserCancel()) { + fingerprintComposite.setUserCancel(false); + status.setErrorMessage("cancel"); //$NON-NLS-1$ + return; + } + + if (fingerprintComposite.isUserSMS()) { +// fingerprintComposite.setUserSMS(false); + status.setQRCode(null); + } + + if (fingerprintComposite.isDone()) + fingerprintComposite.setDone(false); + + // show waiting composite + getStateMachine().getGUIProvider().display( + MobileBKUState.this.getWaitingComposite()); + } + }); + } + + /** + * @return a boolean true if the user has pressed the sms tan button + */ + public boolean getSMSStatus() { + + return this.getMobileBKUFingerprintComposite().isUserSMS(); + } + + + /* + * (non-Javadoc) + * + * @see + * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui + * .workflow.Workflow) + */ + @Override + public void run() { + this.signingState = getStateMachine().getStatus().getSigningState(); + + this.signingState.setBKUConnector(new MobileBKUConnector(this)); + log.debug("Setting base64 request to " + this.handler.useBase64Request()); //$NON-NLS-1$ + this.signingState.setUseBase64Request(this.handler.useBase64Request()); + + if (this.threadException != null) { + String message = Messages.getString("error.Unexpected"); //$NON-NLS-1$ + log.error(message, this.threadException); + String errormsg = this.threadException.getLocalizedMessage(); + if (errormsg != null && !errormsg.isEmpty()) + message += ": " + errormsg; //$NON-NLS-1$ + ErrorDialog error = new ErrorDialog( + getStateMachine().getGUIProvider().getMainShell(), + message, BUTTONS.OK); + // error.setException(this.threadException); + // this.setNextState(error); + error.open(); + getStateMachine().exit(); + return; + } + + getStateMachine().getGUIProvider().display( + this.getWaitingComposite()); + + 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() { + if (this.mobileBKUEnterNumberComposite != null) + this.mobileBKUEnterNumberComposite.dispose(); + if (this.mobileBKUEnterTANComposite != null) + this.mobileBKUEnterTANComposite.dispose(); + if (this.waitingComposite != null) + this.waitingComposite.dispose(); + } + + /* + * (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); + behavior.setEnabled(Buttons.OPEN, true); + behavior.setEnabled(Buttons.POSITION, true); + //behavior.setEnabled(Buttons.SIGN, true); + } + + @Override + public String toString() { + return this.getClass().getName(); + } + + /** + * invoke state machine update in main thread + */ + public void invokeUpdate() { + getStateMachine().invokeUpdate(); + } +} -- cgit v1.2.3