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