From 1a8c2542d5a6456d2e14f0b154fcfecbfa593ead Mon Sep 17 00:00:00 2001 From: chris-cwa <69595386+chris-cwa@users.noreply.github.com> Date: Mon, 22 Feb 2021 15:22:22 +0100 Subject: [PATCH] Use last OTP auth result to check month on client side (EXPOSUREAPP-5246) (#2429) * keep otp auth result to check month later on * modified unit test for survey settings --- .../datadonation/OTPAuthorizationResult.kt | 9 +++++++-- .../datadonation/survey/SurveySettings.kt | 1 + .../coronawarnapp/datadonation/survey/Surveys.kt | 14 ++++++++++---- .../datadonation/storage/OTPRepositoryTest.kt | 6 ++++-- .../datadonation/survey/SurveySettingsTest.kt | 9 ++++++--- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OTPAuthorizationResult.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OTPAuthorizationResult.kt index 4cf442782..49dc05c9c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OTPAuthorizationResult.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/OTPAuthorizationResult.kt @@ -12,5 +12,10 @@ data class OTPAuthorizationResult( @SerializedName("authorized") val authorized: Boolean, @SerializedName("redeemedAt") - val redeemedAt: Instant -) + val redeemedAt: Instant, + @SerializedName("invalidated") + val invalidated: Boolean +) { + + fun toInvalidatedInstance() = OTPAuthorizationResult(uuid, authorized, redeemedAt, true) +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/SurveySettings.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/SurveySettings.kt index 228b75aa9..bf804128e 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/SurveySettings.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/SurveySettings.kt @@ -52,6 +52,7 @@ class SurveySettings @Inject constructor( requireNotNull(result.uuid) requireNotNull(result.authorized) requireNotNull(result.redeemedAt) + requireNotNull(result.invalidated) return result } return null diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/Surveys.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/Surveys.kt index 4034bbc3e..6914f0d81 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/Surveys.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/datadonation/survey/Surveys.kt @@ -60,7 +60,12 @@ class Surveys @Inject constructor( // request validation from server val errorCode = surveyServer.authOTP(oneTimePassword, attestationResult).errorCode - val result = OTPAuthorizationResult(oneTimePassword.uuid, errorCode == null, now) + val result = OTPAuthorizationResult( + uuid = oneTimePassword.uuid, + authorized = errorCode == null, + redeemedAt = now, + invalidated = false + ) oneTimePasswordRepo.otpAuthorizationResult = result if (result.authorized) { @@ -74,9 +79,10 @@ class Surveys @Inject constructor( } fun resetSurvey(type: Type) { - if (type == Type.HIGH_RISK_ENCOUNTER) { - Timber.d("Discarding one time password for survey about previous high-risk state.") - oneTimePasswordRepo.clear() + val authResult = oneTimePasswordRepo.otpAuthorizationResult + if (type == Type.HIGH_RISK_ENCOUNTER && authResult != null) { + Timber.d("Invalidating one time password for survey about previous high-risk state.") + oneTimePasswordRepo.otpAuthorizationResult = authResult.toInvalidatedInstance() } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/storage/OTPRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/storage/OTPRepositoryTest.kt index 63d916e3d..b9908423a 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/storage/OTPRepositoryTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/storage/OTPRepositoryTest.kt @@ -69,7 +69,8 @@ class OTPRepositoryTest : BaseTest() { settings.otpAuthorizationResult = OTPAuthorizationResult( UUID.randomUUID(), true, - Instant.now() + Instant.now(), + false ) settings.otpAuthorizationResult shouldNotBe null @@ -87,7 +88,8 @@ class OTPRepositoryTest : BaseTest() { OTPRepository(settings).otpAuthorizationResult = OTPAuthorizationResult( UUID.randomUUID(), true, - Instant.now() + Instant.now(), + false ) settings.oneTimePassword shouldBe null } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveySettingsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveySettingsTest.kt index ba9894c5f..6fd1b7161 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveySettingsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/datadonation/survey/SurveySettingsTest.kt @@ -101,7 +101,8 @@ class SurveySettingsTest : BaseTest() { { "uuid":"e103c755-0975-4588-a639-d0cd1ba421a1", "authorized": true, - "redeemedAt": 1612381217443 + "redeemedAt": 1612381217443, + "invalidated": true } """.trimIndent() ).apply() @@ -111,6 +112,7 @@ class SurveySettingsTest : BaseTest() { value!!.uuid.toString() shouldBe "e103c755-0975-4588-a639-d0cd1ba421a1" value.authorized shouldBe true value.redeemedAt.millis shouldBe 1612381217443 + value.invalidated shouldBe true } @Test @@ -133,14 +135,15 @@ class SurveySettingsTest : BaseTest() { val redeemedAt = Instant.ofEpochMilli(1612381217445) val instance = SurveySettings(context, baseGson) - instance.otpAuthorizationResult = OTPAuthorizationResult(uuid, authorized, redeemedAt) + instance.otpAuthorizationResult = OTPAuthorizationResult(uuid, authorized, redeemedAt, false) val value = preferences.getString("otp_result", null) value shouldBe """ { "uuid": "e103c755-0975-4588-a639-d0cd1ba421a0", "authorized": false, - "redeemedAt": 1612381217445 + "redeemedAt": 1612381217445, + "invalidated": false } """.trimIndent() } -- GitLab