diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/domain/preferences/DataStoreTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/domain/preferences/DataStoreTest.kt
index 7800c631..221659f8 100644
--- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/domain/preferences/DataStoreTest.kt
+++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/domain/preferences/DataStoreTest.kt
@@ -40,7 +40,6 @@ import ee.ria.DigiDoc.network.siva.SivaSetting
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
-import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.BeforeClass
diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModelTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModelTest.kt
index badbc4fc..d118f580 100644
--- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModelTest.kt
+++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModelTest.kt
@@ -25,9 +25,7 @@ import android.net.Uri
import android.util.Base64.URL_SAFE
import android.util.Base64.decode
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
-import androidx.test.platform.app.InstrumentationRegistry
import ee.ria.DigiDoc.R
-import ee.ria.DigiDoc.domain.preferences.DataStore
import ee.ria.DigiDoc.webEid.WebEidAuthService
import ee.ria.DigiDoc.webEid.WebEidSignService
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -60,8 +58,6 @@ class WebEidViewModelTest {
@Mock
private lateinit var signService: WebEidSignService
- private lateinit var dataStore: DataStore
-
private lateinit var viewModel: WebEidViewModel
private val signingCertBase64Raw =
@@ -86,9 +82,7 @@ class WebEidViewModelTest {
@Before
fun setup() {
MockitoAnnotations.openMocks(this)
- val context = InstrumentationRegistry.getInstrumentation().targetContext
- dataStore = DataStore(context)
- viewModel = WebEidViewModel(authService, signService, dataStore)
+ viewModel = WebEidViewModel(authService, signService)
}
@Test
diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/MainActivity.kt b/app/src/main/kotlin/ee/ria/DigiDoc/MainActivity.kt
index 07a41876..98ecdeac 100644
--- a/app/src/main/kotlin/ee/ria/DigiDoc/MainActivity.kt
+++ b/app/src/main/kotlin/ee/ria/DigiDoc/MainActivity.kt
@@ -29,6 +29,7 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.core.app.ActivityCompat
+import androidx.core.net.toUri
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
@@ -58,7 +59,6 @@ import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil
import kotlinx.coroutines.launch
import java.util.logging.Logger
import javax.inject.Inject
-import androidx.core.net.toUri
@AndroidEntryPoint
class MainActivity :
@@ -204,14 +204,17 @@ class MainActivity :
private fun isDarkModeEnabled(dataStore: DataStore): Boolean = dataStore.getThemeSetting() == ThemeSetting.DARK
private fun resolveBrowserPackage(intent: Intent): String? =
- (intent
- .getStringExtra("com.android.browser.application_id")
- ?.takeIf { it.isNotEmpty() }
- ?: ActivityCompat.getReferrer(this)?.host) // TODO: This needs testing with App Link
+ (
+ intent
+ .getStringExtra("com.android.browser.application_id")
+ ?.takeIf { it.isNotEmpty() }
+ ?: ActivityCompat.getReferrer(this)?.host
+ ) // TODO: This needs testing with App Link
?.takeIf { pkg ->
- val browseIntent = Intent(Intent.ACTION_VIEW, "https://".toUri()).apply {
- setPackage(pkg)
- }
+ val browseIntent =
+ Intent(Intent.ACTION_VIEW, "https://".toUri()).apply {
+ setPackage(pkg)
+ }
@Suppress("QueryPermissionsNeeded")
packageManager.resolveActivity(browseIntent, PackageManager.MATCH_DEFAULT_ONLY) != null
}
diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/utils/WebEidUriUtil.kt b/app/src/main/kotlin/ee/ria/DigiDoc/utils/WebEidUriUtil.kt
index 1df7a055..b1bd4f36 100644
--- a/app/src/main/kotlin/ee/ria/DigiDoc/utils/WebEidUriUtil.kt
+++ b/app/src/main/kotlin/ee/ria/DigiDoc/utils/WebEidUriUtil.kt
@@ -23,14 +23,16 @@ package ee.ria.DigiDoc.utils
import android.net.Uri
-enum class WebEidOperation(val operation: String) {
+enum class WebEidOperation(
+ val operation: String,
+) {
AUTH("auth"),
CERT("cert"),
- SIGN("sign");
+ SIGN("sign"),
+ ;
companion object {
- fun fromOperation(operation: String): WebEidOperation? =
- entries.find { it.operation == operation }
+ fun fromOperation(operation: String): WebEidOperation? = entries.find { it.operation == operation }
}
}
diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt
index 61290acf..8e14b03e 100644
--- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt
+++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt
@@ -657,7 +657,9 @@ class NFCViewModel
if (!expectedCert.contentEquals(signerCert)) {
_certMismatch.postValue(true)
- throw IllegalStateException("Web eID signing certificate mismatch")
+ throw IllegalStateException(
+ "Web eID card does not match the card used for authentication",
+ )
}
}
@@ -773,6 +775,15 @@ class NFCViewModel
)
}
+ private fun showWebEidAuthenticationCardMismatchError(e: Exception) {
+ _errorState.postValue(Triple(R.string.web_eid_signing_card_mismatch, null, null))
+ errorLog(
+ logTag,
+ "Web eID signing failed - selected ID card does not match the card used for authentication",
+ e,
+ )
+ }
+
private fun showTechnicalError(e: Exception) {
_errorState.postValue(Triple(R.string.signature_update_nfc_technical_error, null, null))
errorLog(logTag, "Unable to perform with NFC: ${e.message}", e)
@@ -863,6 +874,11 @@ class NFCViewModel
true
}
+ message.contains("Web eID card does not match the card used for authentication") -> {
+ showWebEidAuthenticationCardMismatchError(ex)
+ true
+ }
+
else -> false
}.also {
errorLog(logTag, "Exception: ${ex.message}", ex)
diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModel.kt
index 6def7a26..edc6ed3b 100644
--- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModel.kt
+++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModel.kt
@@ -25,7 +25,6 @@ import android.net.Uri
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import ee.ria.DigiDoc.R
-import ee.ria.DigiDoc.domain.preferences.DataStore
import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog
import ee.ria.DigiDoc.webEid.WebEidAuthService
import ee.ria.DigiDoc.webEid.WebEidSignService
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 60f390a0..6baf43e9 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -683,4 +683,5 @@
Päringu viga
Vigane autentimispäring
Kaarti ei tuvastatud. Palun alusta uuesti.
+ Valitud ID-kaart ei ühti autentimisel kasutatud kaardiga. Palun kasuta sama ID-kaarti.
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0d220f85..efa25e5a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -683,4 +683,5 @@
Request error
Invalid authentication request
Card not detected. Please start again.
+ The selected ID card does not match the card used for authentication. Please use the same ID card.
\ No newline at end of file
diff --git a/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/file/FileUtil.kt b/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/file/FileUtil.kt
index 98a86828..29280f60 100644
--- a/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/file/FileUtil.kt
+++ b/utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/file/FileUtil.kt
@@ -475,7 +475,12 @@ object FileUtil {
intent.data?.takeIf { it.scheme in ALLOWED_FILE_SCHEMES }?.let { externalFileUris.add(it) }
intent.clipData?.let { clipData ->
for (i in 0 until clipData.itemCount) {
- clipData.getItemAt(i)?.uri?.takeIf { it.scheme in ALLOWED_FILE_SCHEMES }?.let { externalFileUris.add(it) }
+ clipData
+ .getItemAt(
+ i,
+ )?.uri
+ ?.takeIf { it.scheme in ALLOWED_FILE_SCHEMES }
+ ?.let { externalFileUris.add(it) }
}
}
return externalFileUris