From 69cce41f9e93170f95da913f28f2e2c46ea3f7ee Mon Sep 17 00:00:00 2001 From: Jakob Heher Date: Thu, 22 Feb 2024 15:26:02 +0100 Subject: [PATCH] Properly shutdown during A-Trust communication (#113) This properly winds down A-Trust communication and exits cleanly if the main window is closed while waiting for user input. --- .../MobileBKUEnterNumberComposite.java | 13 +---- .../gui/workflow/states/MobileBKUState.java | 52 +++++++------------ 2 files changed, 20 insertions(+), 45 deletions(-) diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java index 6afedf56..e9c6e85c 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java @@ -81,17 +81,6 @@ public void widgetSelected(SelectionEvent e) { } }; - /** - * - */ - private final SelectionListener cancelListener = new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - MobileBKUEnterNumberComposite.this.userCancel = true; - } - }; - - String mobileNumber; String mobilePassword; @@ -195,7 +184,7 @@ public MobileBKUEnterNumberComposite(Composite parent, int style, State state) { this.btn_cancel = new Button(containerComposite, SWT.NATIVE); SWTUtils.anchor(btn_cancel).bottom(100, -20).right(btn_ok, -10); - this.btn_cancel.addSelectionListener(this.cancelListener); + SWTUtils.addSelectionListener(btn_cancel, () -> { this.userCancel = true; }); this.lbl_error = new Label(containerComposite, SWT.WRAP | SWT.NATIVE ); SWTUtils.anchor(lbl_error).bottom(103, -20).left(5, 0).right(btn_cancel, -10); 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 4e105ab8..932091a1 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 @@ -19,6 +19,7 @@ import java.net.ConnectException; import java.net.URI; import java.net.UnknownHostException; +import java.util.function.Supplier; // Imports import at.asit.pdfover.signer.UserCancelledException; @@ -34,6 +35,7 @@ import org.apache.hc.core5.http.io.entity.EntityUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; import at.asit.pdfover.gui.MainWindow.Buttons; import at.asit.pdfover.gui.MainWindowBehavior; @@ -270,6 +272,17 @@ private void updateRememberPasswordSetting(boolean enabled, boolean allowEnablin } } + public void readAndDispatchSWTUntil(Supplier pred) throws UserCancelledException { + Shell shell = getStateMachine().getMainShell(); + Display display = shell.getDisplay(); + while (!pred.get()) { + if (!display.readAndDispatch()) + display.sleep(); + if (shell.isDisposed()) + throw new UserCancelledException(); + } + } + public void getCredentialsFromUserTo(@NonNull UsernameAndPassword credentials, String errorMessage) throws UserCancelledException { Display.getDefault().syncCall(() -> { MobileBKUEnterNumberComposite ui = this.getMobileBKUEnterNumberComposite(); @@ -291,12 +304,7 @@ public void getCredentialsFromUserTo(@NonNull UsernameAndPassword credentials, S ui.enableButton(); getStateMachine().display(ui); - Display display = getStateMachine().getMainShell().getDisplay(); - while (!ui.userAck && !ui.userCancel) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } + readAndDispatchSWTUntil(() -> (ui.userAck || ui.userCancel)); } updateRememberPasswordSetting(ui.isRememberPassword(), !ui.userCancel); @@ -340,12 +348,7 @@ public static enum ResultType { TO_FIDO2, SMSTAN }; tan.setFIDO2Enabled(showFido2); getStateMachine().display(tan); - Display display = getStateMachine().getMainShell().getDisplay(); - while (!tan.isDone()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } + readAndDispatchSWTUntil(() -> tan.isDone()); getStateMachine().display(getWaitingComposite()); if (tan.isUserCancel()) @@ -400,12 +403,7 @@ public enum QRResult { return Display.getDefault().syncCall(() -> { MobileBKUQRComposite qr = getMobileBKUQRComposite(); - Display display = getStateMachine().getMainShell().getDisplay(); - while (!qr.isDone()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } + readAndDispatchSWTUntil(() -> qr.isDone()); getStateMachine().display(this.getWaitingComposite()); @@ -460,11 +458,7 @@ public enum AppOpenResult { return Display.getDefault().syncCall(() -> { WaitingForAppComposite wfa = getWaitingForAppComposite(); - Display display = wfa.getDisplay(); - while (!wfa.isDone()) { - if (!display.readAndDispatch()) - display.sleep(); - } + readAndDispatchSWTUntil(() -> wfa.isDone()); getStateMachine().display(this.getWaitingComposite()); @@ -520,11 +514,7 @@ public enum AppBiometryResult { return Display.getDefault().syncCall(() -> { MobileBKUFingerprintComposite bio = getMobileBKUFingerprintComposite(); - Display display = bio.getDisplay(); - while (!bio.isDone()) { - if (!display.readAndDispatch()) - display.sleep(); - } + readAndDispatchSWTUntil(() -> bio.isDone()); getStateMachine().display(this.getWaitingComposite()); @@ -571,11 +561,7 @@ public static enum ResultType { TO_SMS, CREDENTIAL }; getStateMachine().display(fido2); - Display display = fido2.getDisplay(); - while (!fido2.isDone()) { - if (!display.readAndDispatch()) - display.sleep(); - } + readAndDispatchSWTUntil(() -> fido2.isDone()); getStateMachine().display(this.getWaitingComposite());