diff --git a/src/main/java/digital/slovensko/autogram/core/Autogram.java b/src/main/java/digital/slovensko/autogram/core/Autogram.java index 16f3981ad..439d0b39c 100644 --- a/src/main/java/digital/slovensko/autogram/core/Autogram.java +++ b/src/main/java/digital/slovensko/autogram/core/Autogram.java @@ -6,6 +6,7 @@ import digital.slovensko.autogram.drivers.TokenDriver; import digital.slovensko.autogram.ui.BatchUiResult; import digital.slovensko.autogram.ui.UI; +import digital.slovensko.autogram.util.Logging; import digital.slovensko.autogram.util.PDFUtils; import eu.europa.esig.dss.model.DSSException; import eu.europa.esig.dss.pdfa.PDFAStructureValidator; @@ -89,22 +90,37 @@ public void startVisualization(SigningJob job) { }); } + private void signCommonAndThen(SigningJob job, SigningKey signingKey, Consumer callback) { + try { + job.signWithKeyAndRespond(signingKey); + if (batch == null || batch.isEnded() || batch.isAllProcessed()) + passwordManager.reset(); + + callback.accept(job); + } catch (PINIncorrectException e) { + passwordManager.reset(); + throw e; + } catch (AutogramException e) { + throw e; + } catch (DSSException e) { + throw AutogramException.createFromDSSException(e); + } catch (IllegalArgumentException e) { + throw AutogramException.createFromIllegalArgumentException(e); + } catch (Exception e) { + throw new UnrecognizedException(e); + } + } + public void sign(SigningJob job, SigningKey signingKey) { ui.onWorkThreadDo(() -> { try { - job.signWithKeyAndRespond(signingKey); - if (batch == null || batch.isEnded()) passwordManager.reset(); - ui.onUIThreadDo(() -> ui.onSigningSuccess(job)); + signCommonAndThen(job, signingKey, (jobNew) -> { + ui.onUIThreadDo(() -> ui.onSigningSuccess(jobNew)); + }); } catch (ResponseNetworkErrorException e) { onSigningFailed(e, job); - } catch (PINIncorrectException e) { - passwordManager.reset(); } catch (AutogramException e) { onSigningFailed(e); - } catch (DSSException e) { - onSigningFailed(AutogramException.createFromDSSException(e)); - } catch (IllegalArgumentException e) { - onSigningFailed(AutogramException.createFromIllegalArgumentException(e)); } catch (Exception e) { onSigningFailed(new UnrecognizedException(e)); } @@ -142,14 +158,24 @@ public void batchSign(SigningJob job, String batchId) { ui.onWorkThreadDo(() -> { try { - ui.signBatch(job, batch.getSigningKey()); - } catch (PINIncorrectException e) { - ui.onUIThreadDo(() -> { - ui.cancelBatch(batch); + signCommonAndThen(job, batch.getSigningKey(), (jobNew) -> { + Logging.log("GUI: Signing batch job: " + job.hashCode() + " file " + job.getDocument().getName()); }); - - throw e; + } catch (AutogramException e) { + job.onDocumentSignFailed(e); + if (!e.batchCanContinue()) { + ui.onUIThreadDo(() -> { + ui.cancelBatch(batch); + }); + throw e; + } + } catch (Exception e) { + AutogramException autogramException = new AutogramException("Document signing has failed", "", "", e); + job.onDocumentSignFailed(autogramException); } + ui.onUIThreadDo(() -> { + ui.updateBatch(); + }); }); } diff --git a/src/main/java/digital/slovensko/autogram/core/PasswordManager.java b/src/main/java/digital/slovensko/autogram/core/PasswordManager.java index 74e6ccc20..f17dc4be3 100644 --- a/src/main/java/digital/slovensko/autogram/core/PasswordManager.java +++ b/src/main/java/digital/slovensko/autogram/core/PasswordManager.java @@ -29,6 +29,8 @@ public char[] getContextSpecificPassword() { public void reset() { if (cachedPassword != null) Arrays.fill(cachedPassword, '\0'); + + cachedPassword = null; } @Override diff --git a/src/main/java/digital/slovensko/autogram/core/errors/PINIncorrectException.java b/src/main/java/digital/slovensko/autogram/core/errors/PINIncorrectException.java index bebbd02cd..4ee5a0f3d 100644 --- a/src/main/java/digital/slovensko/autogram/core/errors/PINIncorrectException.java +++ b/src/main/java/digital/slovensko/autogram/core/errors/PINIncorrectException.java @@ -4,4 +4,9 @@ public class PINIncorrectException extends AutogramException { public PINIncorrectException() { super("Nastala chyba", "Zadali ste nesprávny bezpečnostný kód", "Pravdepodobne ste spravili chybu pri zadávaní bezpečnostného kódu.\n\nUistite sa, že zadávate správny bezpečnostný kód a skúste znova."); } + + @Override + public boolean batchCanContinue() { + return false; + } } diff --git a/src/main/java/digital/slovensko/autogram/ui/UI.java b/src/main/java/digital/slovensko/autogram/ui/UI.java index 2056c7cea..0f29eebee 100644 --- a/src/main/java/digital/slovensko/autogram/ui/UI.java +++ b/src/main/java/digital/slovensko/autogram/ui/UI.java @@ -17,8 +17,6 @@ public interface UI { void startBatch(Batch batch, Autogram autogram, Consumer callback); - void signBatch(SigningJob job, SigningKey key); - void cancelBatch(Batch batch); void showVisualization(Visualization visualization, Autogram autogram); @@ -60,4 +58,6 @@ public interface UI { char[] getKeystorePassword(); char[] getContextSpecificPassword(); + + public void updateBatch(); } diff --git a/src/main/java/digital/slovensko/autogram/ui/cli/CliUI.java b/src/main/java/digital/slovensko/autogram/ui/cli/CliUI.java index 7b3c64a3f..cdcd37d5e 100644 --- a/src/main/java/digital/slovensko/autogram/ui/cli/CliUI.java +++ b/src/main/java/digital/slovensko/autogram/ui/cli/CliUI.java @@ -60,11 +60,6 @@ public void startBatch(Batch batch, Autogram autogram, Consumer call // TODO Auto-generated method stub } - @Override - public void signBatch(SigningJob job, SigningKey key) { - // TODO Auto-generated method stub - } - @Override public void cancelBatch(Batch batch) { // TODO Auto-generated method stub @@ -278,4 +273,9 @@ public char[] getKeystorePassword() { public char[] getContextSpecificPassword() { return System.console().readPassword("Enter key password (hidden): "); } + + @Override + public void updateBatch() { + // TODO: no usage for this in CLI UI + } } diff --git a/src/main/java/digital/slovensko/autogram/ui/gui/GUI.java b/src/main/java/digital/slovensko/autogram/ui/gui/GUI.java index e589cd351..f6e4addf8 100644 --- a/src/main/java/digital/slovensko/autogram/ui/gui/GUI.java +++ b/src/main/java/digital/slovensko/autogram/ui/gui/GUI.java @@ -18,8 +18,6 @@ import digital.slovensko.autogram.drivers.TokenDriver; import digital.slovensko.autogram.ui.BatchUiResult; import digital.slovensko.autogram.ui.UI; -import digital.slovensko.autogram.util.Logging; -import eu.europa.esig.dss.model.DSSException; import eu.europa.esig.dss.token.DSSPrivateKeyEntry; import javafx.application.HostServices; import javafx.application.Platform; @@ -76,28 +74,7 @@ public void cancelBatch(Batch batch) { enableSigningOnAllJobs(); } - @Override - public void signBatch(SigningJob job, SigningKey key) { - assertOnWorkThread(); - try { - job.signWithKeyAndRespond(key); - Logging.log("GUI: Signing batch job: " + job.hashCode() + " file " + job.getDocument().getName()); - } catch (AutogramException e) { - job.onDocumentSignFailed(e); - if (!e.batchCanContinue()) - throw e; - } catch (DSSException e) { - job.onDocumentSignFailed(AutogramException.createFromDSSException(e)); - } catch (Exception e) { - AutogramException autogramException = new AutogramException("Document signing has failed", "", "", e); - job.onDocumentSignFailed(autogramException); - } - onUIThreadDo(() -> { - updateBatch(); - }); - } - - private void updateBatch() { + public void updateBatch() { if (batchController == null) return; assertOnUIThread(); diff --git a/src/test/java/digital/slovensko/autogram/AutogramTests.java b/src/test/java/digital/slovensko/autogram/AutogramTests.java index 5788130e3..99642314a 100644 --- a/src/test/java/digital/slovensko/autogram/AutogramTests.java +++ b/src/test/java/digital/slovensko/autogram/AutogramTests.java @@ -178,10 +178,6 @@ public void startBatch(Batch batch, Autogram autogram, Consumer call public void cancelBatch(Batch batch) { } - @Override - public void signBatch(SigningJob job, SigningKey key) { - } - @Override public void pickTokenDriverAndThen(List drivers, Consumer callback) { callback.accept(drivers.get(0)); @@ -281,6 +277,11 @@ public void onSignatureValidationCompleted(ValidationReports wrapper) { public void onSignatureCheckCompleted(ValidationReports wrapper) { } + + @Override + public void updateBatch() { + + } } private class TestSettings extends UserSettings {