From 3d5934fae7d391224bfcf2a1ba2ea6658c268c8e Mon Sep 17 00:00:00 2001 From: Damir Seit Date: Thu, 14 Apr 2022 12:57:37 +0600 Subject: [PATCH 1/3] Refactoring Tan Verification (Abstract Factory) with style fixes --- NOTICE | 1 + .../controller/ExternalTanController.java | 32 ++++++------------- .../tan/verifier/HashedGuidTanVerifier.java | 28 ++++++++++++++++ .../factories/tan/verifier/TanVerifier.java | 13 ++++++++ .../tan/verifier/TanVerifierFactory.java | 7 ++++ .../tan/verifier/TanVerifierFactoryImpl.java | 17 ++++++++++ .../tan/verifier/TeletanTanVerifier.java | 17 ++++++++++ .../tan/verifier/UnknownTanVerifier.java | 20 ++++++++++++ 8 files changed, 113 insertions(+), 22 deletions(-) create mode 100644 src/main/java/app/coronawarn/verification/factories/tan/verifier/HashedGuidTanVerifier.java create mode 100644 src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifier.java create mode 100644 src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactory.java create mode 100644 src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java create mode 100644 src/main/java/app/coronawarn/verification/factories/tan/verifier/TeletanTanVerifier.java create mode 100644 src/main/java/app/coronawarn/verification/factories/tan/verifier/UnknownTanVerifier.java diff --git a/NOTICE b/NOTICE index 447c1f1a..274e6614 100644 --- a/NOTICE +++ b/NOTICE @@ -16,3 +16,4 @@ Michael Schulte [mschulte-tsi], T-Systems International GmbH Lars Stelzner [lstelzne-tech], T-Systems International GmbH Andreas Mandel [amandel], T-Systems International GmbH Martin Scheffler [martinschefflerTSI] T-Systems International GmbH +Damir Seit [damirseit], Nazarbayev University diff --git a/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java b/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java index 6469340c..80f8cb84 100644 --- a/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java +++ b/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java @@ -25,13 +25,13 @@ import app.coronawarn.verification.config.VerificationApplicationConfig; import app.coronawarn.verification.domain.VerificationAppSession; import app.coronawarn.verification.exception.VerificationServerException; +import app.coronawarn.verification.factories.tan.verifier.TanVerifier; +import app.coronawarn.verification.factories.tan.verifier.TanVerifierFactory; +import app.coronawarn.verification.factories.tan.verifier.TanVerifierFactoryImpl; import app.coronawarn.verification.model.AppSessionSourceOfTrust; -import app.coronawarn.verification.model.HashedGuid; -import app.coronawarn.verification.model.LabTestResult; import app.coronawarn.verification.model.RegistrationToken; import app.coronawarn.verification.model.Tan; import app.coronawarn.verification.model.TanSourceOfTrust; -import app.coronawarn.verification.model.TestResult; import app.coronawarn.verification.service.AppSessionService; import app.coronawarn.verification.service.FakeDelayService; import app.coronawarn.verification.service.FakeRequestService; @@ -133,25 +133,13 @@ public DeferredResult> generateTan(@Valid @RequestBody Regis if (appSession.getTanCounter() < tancountermax) { AppSessionSourceOfTrust appSessionSourceOfTrust = appSession.getSourceOfTrust(); TanSourceOfTrust tanSourceOfTrust = TanSourceOfTrust.CONNECTED_LAB; - switch (appSessionSourceOfTrust) { - case HASHED_GUID: - TestResult covidTestResult = testResultServerService.result(new HashedGuid(appSession.getHashedGuid())); - if (covidTestResult.getTestResult() != LabTestResult.POSITIVE.getTestResult() - && covidTestResult.getTestResult() != LabTestResult.QUICK_POSITIVE.getTestResult() - ) { - stopWatch.stop(); - throw new VerificationServerException(HttpStatus.BAD_REQUEST, - "Tan cannot be created, caused by the non positive result of the labserver"); - } - break; - case TELETAN: - tanSourceOfTrust = TanSourceOfTrust.TELETAN; - break; - default: - stopWatch.stop(); - throw new VerificationServerException(HttpStatus.BAD_REQUEST, - "Unknown source of trust inside the appsession for the registration token"); - } + + TanVerifierFactory tanVerifierFactory = new TanVerifierFactoryImpl(); + + TanVerifier tanVerifier = tanVerifierFactory.makeTanVerifier(appSessionSourceOfTrust); + + tanVerifier.generateTan(appSession, testResultServerService, stopWatch, tanSourceOfTrust); + appSession.incrementTanCounter(); appSession.setUpdatedAt(LocalDateTime.now()); diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/HashedGuidTanVerifier.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/HashedGuidTanVerifier.java new file mode 100644 index 00000000..f2ebd7dd --- /dev/null +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/HashedGuidTanVerifier.java @@ -0,0 +1,28 @@ +package app.coronawarn.verification.factories.tan.verifier; + +import app.coronawarn.verification.domain.VerificationAppSession; +import app.coronawarn.verification.exception.VerificationServerException; +import app.coronawarn.verification.model.HashedGuid; +import app.coronawarn.verification.model.LabTestResult; +import app.coronawarn.verification.model.TanSourceOfTrust; +import app.coronawarn.verification.model.TestResult; +import app.coronawarn.verification.service.TestResultServerService; +import org.springframework.http.HttpStatus; +import org.springframework.util.StopWatch; + +public class HashedGuidTanVerifier extends TanVerifier { + @Override + public void generateTan(VerificationAppSession appSession, + TestResultServerService testResultServerService, + StopWatch stopWatch, + TanSourceOfTrust tanSourceOfTrust) { + TestResult covidTestResult = testResultServerService.result(new HashedGuid(appSession.getHashedGuid())); + if (covidTestResult.getTestResult() != LabTestResult.POSITIVE.getTestResult() + && covidTestResult.getTestResult() != LabTestResult.QUICK_POSITIVE.getTestResult() + ) { + stopWatch.stop(); + throw new VerificationServerException(HttpStatus.BAD_REQUEST, + "Tan cannot be created, caused by the non positive result of the labserver"); + } + } +} diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifier.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifier.java new file mode 100644 index 00000000..5eae5f80 --- /dev/null +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifier.java @@ -0,0 +1,13 @@ +package app.coronawarn.verification.factories.tan.verifier; + +import app.coronawarn.verification.domain.VerificationAppSession; +import app.coronawarn.verification.model.TanSourceOfTrust; +import app.coronawarn.verification.service.TestResultServerService; +import org.springframework.util.StopWatch; + +public abstract class TanVerifier { + public abstract void generateTan(VerificationAppSession appSession, + TestResultServerService testResultServerService, + StopWatch stopWatch, + TanSourceOfTrust tanSourceOfTrust); +} diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactory.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactory.java new file mode 100644 index 00000000..99a805d5 --- /dev/null +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactory.java @@ -0,0 +1,7 @@ +package app.coronawarn.verification.factories.tan.verifier; + +import app.coronawarn.verification.model.AppSessionSourceOfTrust; + +public interface TanVerifierFactory { + public TanVerifier makeTanVerifier(AppSessionSourceOfTrust appSessionSourceOfTrust); +} diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java new file mode 100644 index 00000000..fd093bd2 --- /dev/null +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java @@ -0,0 +1,17 @@ +package app.coronawarn.verification.factories.tan.verifier; + +import app.coronawarn.verification.model.AppSessionSourceOfTrust; + +public class TanVerifierFactoryImpl implements TanVerifierFactory { + @Override + public TanVerifier makeTanVerifier(AppSessionSourceOfTrust appSessionSourceOfTrust) { + switch (appSessionSourceOfTrust) { + case HASHED_GUID: + return null; + case TELETAN: + return null; + default: + return null; + } + } +} diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/TeletanTanVerifier.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TeletanTanVerifier.java new file mode 100644 index 00000000..ea183ba3 --- /dev/null +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TeletanTanVerifier.java @@ -0,0 +1,17 @@ +package app.coronawarn.verification.factories.tan.verifier; + +import app.coronawarn.verification.domain.VerificationAppSession; +import app.coronawarn.verification.model.TanSourceOfTrust; +import app.coronawarn.verification.service.TestResultServerService; +import org.springframework.util.StopWatch; + +public class TeletanTanVerifier extends TanVerifier { + + @Override + public void generateTan(VerificationAppSession appSession, + TestResultServerService testResultServerService, + StopWatch stopWatch, + TanSourceOfTrust tanSourceOfTrust) { + tanSourceOfTrust = TanSourceOfTrust.TELETAN; + } +} diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/UnknownTanVerifier.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/UnknownTanVerifier.java new file mode 100644 index 00000000..a542ddc3 --- /dev/null +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/UnknownTanVerifier.java @@ -0,0 +1,20 @@ +package app.coronawarn.verification.factories.tan.verifier; + +import app.coronawarn.verification.domain.VerificationAppSession; +import app.coronawarn.verification.exception.VerificationServerException; +import app.coronawarn.verification.model.TanSourceOfTrust; +import app.coronawarn.verification.service.TestResultServerService; +import org.springframework.http.HttpStatus; +import org.springframework.util.StopWatch; + +public class UnknownTanVerifier extends TanVerifier { + @Override + public void generateTan(VerificationAppSession appSession, + TestResultServerService testResultServerService, + StopWatch stopWatch, + TanSourceOfTrust tanSourceOfTrust) { + stopWatch.stop(); + throw new VerificationServerException(HttpStatus.BAD_REQUEST, + "Unknown source of trust inside the appsession for the registration token"); + } +} From 864935026a886fb5444681188e171c71bb7876c8 Mon Sep 17 00:00:00 2001 From: Damir Seit Date: Thu, 14 Apr 2022 16:49:23 +0600 Subject: [PATCH 2/3] Tan verifier factory type fix --- .../factories/tan/verifier/TanVerifierFactoryImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java index fd093bd2..a52ea3d9 100644 --- a/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java +++ b/src/main/java/app/coronawarn/verification/factories/tan/verifier/TanVerifierFactoryImpl.java @@ -7,11 +7,11 @@ public class TanVerifierFactoryImpl implements TanVerifierFactory { public TanVerifier makeTanVerifier(AppSessionSourceOfTrust appSessionSourceOfTrust) { switch (appSessionSourceOfTrust) { case HASHED_GUID: - return null; + return new HashedGuidTanVerifier(); case TELETAN: - return null; + return new TeletanTanVerifier(); default: - return null; + return new UnknownTanVerifier(); } } } From 497f7ebbfa5e21564e53b18bfed8bec625d6376c Mon Sep 17 00:00:00 2001 From: Damir Seit Date: Fri, 15 Apr 2022 18:04:47 +0600 Subject: [PATCH 3/3] Spring Dependency Injection for Tan Verifier Factory --- .../verification/controller/ExternalTanController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java b/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java index 80f8cb84..32ca3fb0 100644 --- a/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java +++ b/src/main/java/app/coronawarn/verification/controller/ExternalTanController.java @@ -98,6 +98,9 @@ public class ExternalTanController { @NonNull private final FakeRequestService fakeRequestService; + @NonNull + private final TanVerifierFactory tanVerifierFactory; + /** * This method generates a transaction number by a Registration Token, if the state of the COVID-19 lab-test is * positive. @@ -134,8 +137,6 @@ public DeferredResult> generateTan(@Valid @RequestBody Regis AppSessionSourceOfTrust appSessionSourceOfTrust = appSession.getSourceOfTrust(); TanSourceOfTrust tanSourceOfTrust = TanSourceOfTrust.CONNECTED_LAB; - TanVerifierFactory tanVerifierFactory = new TanVerifierFactoryImpl(); - TanVerifier tanVerifier = tanVerifierFactory.makeTanVerifier(appSessionSourceOfTrust); tanVerifier.generateTan(appSession, testResultServerService, stopWatch, tanSourceOfTrust);