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 4cf4427828dafc0c9653f0862e2dc6f2fcb18b31..49dc05c9c62752b2f15d3bd314f971045348b9c2 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 228b75aa90a94823144c1946038ef3666e1bd64e..bf804128e1815ec72818c5c59e28707197ea04db 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 4034bbc3e14ee2b00ed91d61809c4b213609b372..6914f0d81106fbe62dfc4fd080e8bf7436185ffc 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 63d916e3d870042c220ad1c6cfe0e38ee34f58c1..b9908423a1f9fccc6be8555b2971c8255fe03120 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 ba9894c5f47557708907931935a218e32e8f2a65..6fd1b7161a4109a3cc916257aa5cac7da5627207 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() }