Skip to content
Snippets Groups Projects
Unverified Commit d182923e authored by Matthias Urhahn's avatar Matthias Urhahn Committed by GitHub
Browse files

Merge pull request #1495 from corona-warn-app/fix/1.5.x-into-1.6.x

1.5.x into 1.6.x
parents 0f6b440a fef8016a
No related branches found
No related tags found
No related merge requests found
......@@ -81,7 +81,7 @@ class HomeFragment : Fragment(R.layout.fragment_home), AutoInject {
HomeFragmentEvents.ShowErrorResetDialog -> {
RecoveryByResetDialogFactory(this).showDialog(
detailsLink = R.string.errors_generic_text_catastrophic_error_encryption_failure,
onDismiss = { vm.errorResetDialogDismissed() }
onPositive = { vm.errorResetDialogDismissed() }
)
}
HomeFragmentEvents.ShowDeleteTestDialog -> {
......
......@@ -14,17 +14,20 @@ class RecoveryByResetDialogFactory(private val fragment: Fragment) {
fun showDialog(
@StringRes detailsLink: Int,
onDismiss: () -> Unit
onPositive: () -> Unit
) {
AlertDialog.Builder(context)
val dialog = AlertDialog.Builder(context)
.setTitle(R.string.errors_generic_headline)
.setMessage(R.string.errors_generic_text_catastrophic_error_recovery_via_reset)
.setCancelable(false)
.setOnDismissListener { onDismiss() }
.setNeutralButton(R.string.errors_generic_button_negative) { _, _ ->
ExternalActionHelper.openUrl(fragment, context.getString(detailsLink))
.setNeutralButton(R.string.errors_generic_button_negative, null)
.setPositiveButton(R.string.errors_generic_button_positive) { _, _ ->
onPositive()
}
.setPositiveButton(R.string.errors_generic_button_positive) { _, _ -> }
.show()
.create()
dialog.show()
dialog.getButton(AlertDialog.BUTTON_NEUTRAL)?.setOnClickListener {
ExternalActionHelper.openUrl(fragment, context.getString(detailsLink))
}
}
}
......@@ -74,8 +74,8 @@ class EncryptionErrorResetTool @Inject constructor(
}
isResetWindowConsumed = true
val keyException = error.causes().singleOrNull { it is GeneralSecurityException }
if (keyException == null) {
val keyException = error.causes().lastOrNull()
if (keyException == null || keyException !is GeneralSecurityException) {
Timber.v("Error has no GeneralSecurityException as cause -> no reset.")
return false
}
......
......@@ -16,7 +16,9 @@ import org.junit.jupiter.api.Test
import testhelpers.BaseIOTest
import testhelpers.preferences.MockSharedPreferences
import java.io.File
import java.io.IOException
import java.security.GeneralSecurityException
import java.security.KeyException
import java.security.KeyStoreException
class EncryptionResetToolTest : BaseIOTest() {
......@@ -199,6 +201,86 @@ class EncryptionResetToolTest : BaseIOTest() {
}
}
@Test
fun `nested exception may have the same base exception type, ie GeneralSecurityException`() {
// https://github.com/corona-warn-app/cwa-app-android/issues/642#issuecomment-712188157
createMockFiles()
createInstance().tryResetIfNecessary(
KeyException( // subclass of GeneralSecurityException
"Permantly failed to instantiate encrypted preferences",
SecurityException(
"Could not decrypt key. decryption failed",
GeneralSecurityException("decryption failed")
)
)
) shouldBe true
encryptedPrefsFile.exists() shouldBe false
encryptedDatabaseFile.exists() shouldBe false
mockPreferences.dataMapPeek.apply {
this["ea1851.reset.performedAt"] shouldBe 1234567890L
this["ea1851.reset.windowconsumed.160"] shouldBe true
this["ea1851.reset.shownotice"] shouldBe true
}
}
@Test
fun `exception check does not care about the first exception type`() {
createMockFiles()
createInstance().tryResetIfNecessary(
CwaSecurityException(
KeyException( // subclass of GeneralSecurityException
"Permantly failed to instantiate encrypted preferences",
SecurityException(
"Could not decrypt key. decryption failed",
GeneralSecurityException("decryption failed")
)
)
)
) shouldBe true
encryptedPrefsFile.exists() shouldBe false
encryptedDatabaseFile.exists() shouldBe false
mockPreferences.dataMapPeek.apply {
this["ea1851.reset.performedAt"] shouldBe 1234567890L
this["ea1851.reset.windowconsumed.160"] shouldBe true
this["ea1851.reset.shownotice"] shouldBe true
}
}
@Test
fun `exception check DOES care about the most nested exception`() {
createMockFiles()
createInstance().tryResetIfNecessary(
CwaSecurityException(
KeyException( // subclass of GeneralSecurityException
"Permantly failed to instantiate encrypted preferences",
SecurityException(
"Could not decrypt key. decryption failed",
GeneralSecurityException(
"decryption failed",
IOException("I am unexpeted")
)
)
)
)
) shouldBe false
encryptedPrefsFile.exists() shouldBe true
encryptedDatabaseFile.exists() shouldBe true
mockPreferences.dataMapPeek.apply {
this["ea1851.reset.performedAt"] shouldBe null
this["ea1851.reset.windowconsumed.160"] shouldBe true
this["ea1851.reset.shownotice"] shouldBe null
}
}
@Test
fun `we want only a specific type of GeneralSecurityException`() {
createMockFiles()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment