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