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..32ca3fb0 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; @@ -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. @@ -133,25 +136,11 @@ 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"); - } + + 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..a52ea3d9 --- /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 new HashedGuidTanVerifier(); + case TELETAN: + return new TeletanTanVerifier(); + default: + return new UnknownTanVerifier(); + } + } +} 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"); + } +}