diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/InvalidQRCodeExcpetion.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/InvalidQRCodeExcpetion.kt deleted file mode 100644 index 28d4aeb35dbfe3fc9de6220fe584333465776e6a..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/InvalidQRCodeExcpetion.kt +++ /dev/null @@ -1,3 +0,0 @@ -package de.rki.coronawarnapp.exception - -class InvalidQRCodeExcpetion : Exception("the supplied QR code does not match the patter") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt index 7798f280359645341682943a18e32d1d45f92992..6edc4ce1bfc13a6d94b5924234ad29e1a46a0e0c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionConstants.kt @@ -19,7 +19,4 @@ object SubmissionConstants { val REGISTRATION_TOKEN_URL = "$VERSIONED_VERIFICATION_CDN_URL/$REGISTRATION_TOKEN" val TEST_RESULT_URL = "$VERSIONED_VERIFICATION_CDN_URL/$TEST_RESULT" val TAN_REQUEST_URL = "$VERSIONED_VERIFICATION_CDN_URL/$TAN" - - val QR_CODE_VALIDATION_REGEX = - "[0-9A-Fa-f]{6}-[0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12}".toRegex() } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt index 77f4d57c139bd54349221890e6e41a87f50f045a..ad23d8a0d3bcfdb5929ce91e24f9385117ab069b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/service/submission/SubmissionService.kt @@ -1,11 +1,9 @@ package de.rki.coronawarnapp.service.submission -import de.rki.coronawarnapp.exception.InvalidQRCodeExcpetion import de.rki.coronawarnapp.exception.NoGUIDOrTANSetException import de.rki.coronawarnapp.exception.NoRegistrationTokenSetException import de.rki.coronawarnapp.http.WebRequestBuilder import de.rki.coronawarnapp.service.submission.SubmissionConstants.QR_CODE_KEY_TYPE -import de.rki.coronawarnapp.service.submission.SubmissionConstants.QR_CODE_VALIDATION_REGEX import de.rki.coronawarnapp.service.submission.SubmissionConstants.REGISTRATION_TOKEN_URL import de.rki.coronawarnapp.service.submission.SubmissionConstants.TAN_REQUEST_URL import de.rki.coronawarnapp.service.submission.SubmissionConstants.TELE_TAN_KEY_TYPE @@ -63,11 +61,19 @@ object SubmissionService { SubmitDiagnosisKeysTransaction.start(registrationToken) } - fun validateAndStoreTestGUID(testGUID: String) { - val regexMatch = QR_CODE_VALIDATION_REGEX.find(testGUID) ?: throw InvalidQRCodeExcpetion() - LocalData.testGUID(regexMatch.value) + /** + * extracts the GUID from [scanResult]. Returns null if it does not match the required pattern + */ + fun extractGUID(scanResult: String): String? { + val potentialGUID = scanResult.substringAfterLast("?", "") + return if (potentialGUID.isEmpty()) + null + else + potentialGUID } + fun storeTestGUID(guid: String) = LocalData.testGUID(guid) + fun deleteTestGUID() { LocalData.testGUID(null) } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt index e1fda8bb4e794f61c1bc300aa34974c0871168e4..d32a610016700b02aad518d8cffbc67a1ad3c8fa 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/viewmodel/SubmissionViewModel.kt @@ -5,7 +5,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import de.rki.coronawarnapp.exception.ExceptionCategory -import de.rki.coronawarnapp.exception.InvalidQRCodeExcpetion import de.rki.coronawarnapp.exception.report import de.rki.coronawarnapp.service.submission.SubmissionService import de.rki.coronawarnapp.storage.LocalData @@ -44,11 +43,12 @@ class SubmissionViewModel : ViewModel() { fun refreshTestResult() = executeRequestWithState(SubmissionRepository::refreshTestResult, _testResultState) - fun validateAndStoreTestGUID(testGUID: String) { - try { - SubmissionService.validateAndStoreTestGUID(testGUID) + fun validateAndStoreTestGUID(scanResult: String) { + val guid = SubmissionService.extractGUID(scanResult) + if (guid != null) { + SubmissionService.storeTestGUID(guid) _scanStatus.value = ScanStatus.SUCCESS - } catch (ex: InvalidQRCodeExcpetion) { + } else { _scanStatus.value = ScanStatus.INVALID } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..95728584cf11d5fc99dac735a44d9d0d9a3053f7 --- /dev/null +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/service/submission/SubmissionServiceTest.kt @@ -0,0 +1,25 @@ +package de.rki.coronawarnapp.service.submission + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.CoreMatchers.nullValue +import org.hamcrest.MatcherAssert.assertThat +import org.junit.Test + +class SubmissionServiceTest { + + @Test + fun extractGUID() { + // valid + val guid = "123456-12345678-1234-4DA7-B166-B86D85475064" + assertThat( + SubmissionService.extractGUID("https://bs-sd.de/covid-19/?$guid"), + equalTo(guid) + ) + + // invalid + assertThat( + SubmissionService.extractGUID("https://no-guid-here"), + nullValue() + ) + } +} \ No newline at end of file