diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 68ad8b35d..3a43cb928 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -60,7 +60,7 @@ jobs: -dname "CN=Android Debug,O=Android,C=US" echo "Generated debug.keystore at ${{ github.workspace }}/app/src/main/assets/keystore/debug.keystore" - name: Set up Android SDK - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 - name: Run fetch default configuration run: | ./gradlew fetchAndPackageDefaultConfiguration @@ -147,7 +147,7 @@ jobs: - name: Set up Android SDK if: matrix.build-mode == 'manual' - uses: android-actions/setup-android@v3 + uses: android-actions/setup-android@v4 - name: Setup Gradle if: matrix.build-mode == 'manual' diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModelTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModelTest.kt index bb8f55255..7e5fda736 100644 --- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModelTest.kt +++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModelTest.kt @@ -21,12 +21,18 @@ import ee.ria.DigiDoc.domain.model.IdCardData import ee.ria.DigiDoc.domain.preferences.DataStore import ee.ria.DigiDoc.domain.service.IdCardService import ee.ria.DigiDoc.exceptions.NFCError +import ee.ria.DigiDoc.idcard.CodeNotActivatedException import ee.ria.DigiDoc.idcard.CodeType +import ee.ria.DigiDoc.idcard.CodeVerificationException +import ee.ria.DigiDoc.idcard.PaceTunnelException import ee.ria.DigiDoc.libdigidoclib.SignedContainer import ee.ria.DigiDoc.libdigidoclib.domain.model.ContainerWrapper import ee.ria.DigiDoc.libdigidoclib.domain.model.ContainerWrapperImpl import ee.ria.DigiDoc.libdigidoclib.init.Initialization import ee.ria.DigiDoc.libdigidoclib.init.LibdigidocLibraryLoader +import ee.ria.DigiDoc.smartcardreader.ApduResponseException +import ee.ria.DigiDoc.smartcardreader.CardConnectionLostException +import ee.ria.DigiDoc.smartcardreader.SmartCardReaderException import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager.NfcStatus import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -54,6 +60,7 @@ import org.mockito.MockitoAnnotations import org.mockito.junit.MockitoJUnitRunner import org.mockito.kotlin.atLeastOnce import java.io.File +import java.io.IOException @RunWith(MockitoJUnitRunner::class) class NFCViewModelTest { @@ -536,4 +543,116 @@ class NFCViewModelTest { viewModel.userData.removeObserver(userDataObserver) } + + private fun handleException( + ex: SmartCardReaderException, + codeType: CodeType = CodeType.PIN2, + ) = viewModel.handleSmartCardReaderException(ex, codeType, codeType.name) + + @Test + fun nfcViewModel_handleSmartCardReaderException_cardConnectionLostReportsTagLost() = + runTest { + handleException(CardConnectionLostException(IOException("tag left the field"))) + assertEquals( + NFCError.TagLost(R.string.signature_update_nfc_tag_lost), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_codeNotActivatedShowsDialogWhenSigning() = + runTest { + handleException(CodeNotActivatedException(CodeType.PIN2)) + assertEquals(R.string.sign_blocked_pin2_unchanged_message, viewModel.dialogError.value) + assertNull(viewModel.errorState.value) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_codeNotActivatedIsTechnicalErrorWhenNotSigning() = + runTest { + handleException(CodeNotActivatedException(CodeType.PIN2), CodeType.PIN1) + assertEquals( + NFCError.TechnicalError(R.string.signature_update_nfc_technical_error), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_twoRetriesLeftReportsWrongPin() = + runTest { + handleException(CodeVerificationException(CodeType.PIN2, 2)) + assertEquals( + NFCError.WrongPin("PIN2", 2, R.string.id_card_sign_pin_invalid), + viewModel.errorState.value, + ) + assertTrue(viewModel.shouldResetPIN.value == true) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_oneRetryLeftReportsFinalAttempt() = + runTest { + handleException(CodeVerificationException(CodeType.PIN2, 1)) + assertEquals( + NFCError.WrongPin("PIN2", 1, R.string.id_card_sign_pin_invalid_final), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_noRetriesLeftReportsPinBlocked() = + runTest { + handleException(CodeVerificationException(CodeType.PIN2, 0)) + assertEquals( + NFCError.PinBlocked("PIN2", R.string.id_card_sign_pin_locked), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_pin1FlowReportsItsOwnRetryCount() = + runTest { + handleException(CodeVerificationException(CodeType.PIN1, 1), CodeType.PIN1) + assertEquals( + NFCError.WrongPin("PIN1", 1, R.string.id_card_sign_pin_invalid_final), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_codeTypeMismatchFallsThroughToTechnicalError() = + runTest { + handleException(CodeVerificationException(CodeType.PUK, 2)) + assertEquals( + NFCError.TechnicalError(R.string.signature_update_nfc_technical_error), + viewModel.errorState.value, + ) + assertFalse(viewModel.shouldResetPIN.value == true) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_apduResponseReportsTechnicalError() = + runTest { + handleException(ApduResponseException(0x6A.toByte(), 0x88.toByte())) + assertEquals( + NFCError.ApduResponse(R.string.signature_update_nfc_technical_error), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_paceTunnelReportsWrongCan() = + runTest { + handleException(PaceTunnelException(IOException("wrong CAN"))) + assertEquals( + NFCError.WrongCan(R.string.signature_update_nfc_wrong_can), + viewModel.errorState.value, + ) + } + + @Test + fun nfcViewModel_handleSmartCardReaderException_signingFailureClearsSignStatus() = + runTest { + handleException(CardConnectionLostException(IOException())) + assertFalse(viewModel.signStatus.value == true) + } } diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModelTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModelTest.kt index 669eddaea..f2caedec1 100644 --- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModelTest.kt +++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModelTest.kt @@ -14,7 +14,6 @@ import ee.ria.DigiDoc.CertificateCreator import ee.ria.DigiDoc.IdCardDataCreator.Companion.createMockIdCardData import ee.ria.DigiDoc.MainActivity import ee.ria.DigiDoc.R -import ee.ria.DigiDoc.common.Constant import ee.ria.DigiDoc.domain.model.IdCardData import ee.ria.DigiDoc.domain.model.pin.PinChangeVariant import ee.ria.DigiDoc.domain.preferences.DataStore @@ -327,19 +326,19 @@ class SharedMyEidViewModelTest { @Test fun sharedMyEidViewModel_isPinCodeTooEasy_returnsCorrectMinimumLengthForPIN1() { val result = viewModel.getPinCodeMinimumLength(CodeType.PIN1) - assertEquals(Constant.MyEID.PIN1_MINIMUM_LENGTH, result) + assertEquals(4, result) } @Test fun sharedMyEidViewModel_isPinCodeTooEasy_returnsCorrectMinimumLengthForPIN2() { val result = viewModel.getPinCodeMinimumLength(CodeType.PIN2) - assertEquals(Constant.MyEID.PIN2_MINIMUM_LENGTH, result) + assertEquals(5, result) } @Test fun sharedMyEidViewModel_isPinCodeTooEasy_returnsCorrectMinimumLengthForPUK() { val result = viewModel.getPinCodeMinimumLength(CodeType.PUK) - assertEquals(Constant.MyEID.PUK_MINIMUM_LENGTH, result) + assertEquals(8, result) } @Test diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinScreen.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinScreen.kt index d13973581..9f579eec1 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinScreen.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/myeid/pinandcertificate/MyEidPinScreen.kt @@ -58,10 +58,10 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.asFlow import androidx.navigation.NavHostController import ee.ria.DigiDoc.R -import ee.ria.DigiDoc.common.Constant import ee.ria.DigiDoc.idcard.CodeType import ee.ria.DigiDoc.idcard.PaceTunnelException import ee.ria.DigiDoc.smartcardreader.ApduResponseException +import ee.ria.DigiDoc.smartcardreader.CardConnectionLostException import ee.ria.DigiDoc.ui.component.menu.SettingsMenuBottomSheet import ee.ria.DigiDoc.ui.component.shared.PrimaryOutlinedButton import ee.ria.DigiDoc.ui.component.shared.SecurePinTextField @@ -152,7 +152,7 @@ fun MyEidPinScreen( sharedMyEidViewModel.getPinCodeMinimumLength( currentPinCodeType, ), - Constant.MyEID.PIN_MAXIMUM_LENGTH, + currentPinCodeType.maxLength, )}. ${if (isForgottenPin && showCurrentPinField.value) { stringResource(R.string.myeid_puk_info) } else { @@ -438,14 +438,15 @@ fun MyEidPinScreen( } } } else { - if (exc?.message?.contains("TagLostException") == true) { - showMessage(context, R.string.signature_update_nfc_tag_lost) - } else if (exc is ApduResponseException) { - showMessage(context, R.string.signature_update_nfc_technical_error) - } else if (exc is PaceTunnelException) { - showMessage(context, R.string.signature_update_nfc_wrong_can) - } else { - showMessage(context, R.string.signature_update_nfc_technical_error) + when (exc) { + is CardConnectionLostException -> + showMessage(context, R.string.signature_update_nfc_tag_lost) + is ApduResponseException -> + showMessage(context, R.string.signature_update_nfc_technical_error) + is PaceTunnelException -> + showMessage(context, R.string.signature_update_nfc_wrong_can) + else -> + showMessage(context, R.string.signature_update_nfc_technical_error) } showNFCScreen.value = false } @@ -469,14 +470,15 @@ fun MyEidPinScreen( } } } else { - if (exc?.message?.contains("TagLostException") == true) { - showMessage(context, R.string.signature_update_nfc_tag_lost) - } else if (exc is ApduResponseException) { - showMessage(context, R.string.signature_update_nfc_technical_error) - } else if (exc is PaceTunnelException) { - showMessage(context, R.string.signature_update_nfc_wrong_can) - } else { - showMessage(context, R.string.signature_update_nfc_technical_error) + when (exc) { + is CardConnectionLostException -> + showMessage(context, R.string.signature_update_nfc_tag_lost) + is ApduResponseException -> + showMessage(context, R.string.signature_update_nfc_technical_error) + is PaceTunnelException -> + showMessage(context, R.string.signature_update_nfc_wrong_can) + else -> + showMessage(context, R.string.signature_update_nfc_technical_error) } showNFCScreen.value = false } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt index 9760ab8ad..897da59de 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/NFCView.kt @@ -66,14 +66,11 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.asFlow import androidx.lifecycle.compose.collectAsStateWithLifecycle import ee.ria.DigiDoc.R -import ee.ria.DigiDoc.common.Constant.NFCConstants.CAN_LENGTH -import ee.ria.DigiDoc.common.Constant.NFCConstants.PIN1_MIN_LENGTH -import ee.ria.DigiDoc.common.Constant.NFCConstants.PIN2_MIN_LENGTH -import ee.ria.DigiDoc.common.Constant.NFCConstants.PIN_MAX_LENGTH import ee.ria.DigiDoc.domain.model.IdCardData import ee.ria.DigiDoc.domain.model.IdentityAction import ee.ria.DigiDoc.exceptions.NFCError import ee.ria.DigiDoc.idcard.CodeType +import ee.ria.DigiDoc.idcard.TokenWithPace.CAN_LENGTH import ee.ria.DigiDoc.libdigidoclib.domain.model.RoleData import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager.NfcStatus import ee.ria.DigiDoc.ui.component.shared.CancelAndOkButtonRow @@ -235,13 +232,6 @@ fun NFCView( val pinCodeLabel = stringResource(id = R.string.signature_update_nfc_pin, pinType) - val pinMinLength = - if (identityAction == IdentityAction.SIGN) { - PIN2_MIN_LENGTH - } else { - PIN1_MIN_LENGTH - } - val codeType = if (identityAction == IdentityAction.SIGN) { CodeType.PIN2 @@ -249,6 +239,8 @@ fun NFCView( CodeType.PIN1 } + val pinMinLength = codeType.minLength + val webEidAuth = webEidViewModel?.authRequest?.collectAsState()?.value val originString = webEidAuth?.origin ?: "" val challengeString = webEidAuth?.challenge ?: "" @@ -925,7 +917,7 @@ fun NFCView( stringResource(id = R.string.id_card_sign_pin_invalid_length), pinType, pinMinLength, - PIN_MAX_LENGTH.toString(), + codeType.maxLength.toString(), ) } else { "" diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtil.kt b/app/src/main/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtil.kt index a18577c09..d330365df 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtil.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtil.kt @@ -5,10 +5,6 @@ package ee.ria.DigiDoc.utils.pin -import ee.ria.DigiDoc.common.Constant.NFCConstants.PIN1_MIN_LENGTH -import ee.ria.DigiDoc.common.Constant.NFCConstants.PIN2_MIN_LENGTH -import ee.ria.DigiDoc.common.Constant.NFCConstants.PIN_MAX_LENGTH -import ee.ria.DigiDoc.common.Constant.NFCConstants.PUK_MIN_LENGTH import ee.ria.DigiDoc.idcard.CodeType object PinCodeUtil { @@ -20,10 +16,5 @@ object PinCodeUtil { fun isPINLengthValid( pinCode: ByteArray, codeType: CodeType, - ): Boolean = - when (codeType) { - CodeType.PIN1 -> pinCode.size in PIN1_MIN_LENGTH..PIN_MAX_LENGTH - CodeType.PIN2 -> pinCode.size in PIN2_MIN_LENGTH..PIN_MAX_LENGTH - CodeType.PUK -> pinCode.size > PUK_MIN_LENGTH - } + ): Boolean = codeType.isLengthValid(pinCode.size) } 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 3581c2f6a..7139fc668 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt @@ -18,7 +18,6 @@ import androidx.lifecycle.ViewModel import com.google.common.collect.ImmutableMap import dagger.hilt.android.lifecycle.HiltViewModel import ee.ria.DigiDoc.R -import ee.ria.DigiDoc.common.Constant.NFCConstants.CAN_LENGTH import ee.ria.DigiDoc.common.Constant.SignatureRequest.SIGNATURE_PROFILE_TS import ee.ria.DigiDoc.configuration.repository.ConfigurationRepository import ee.ria.DigiDoc.cryptolib.CDOC2Settings @@ -28,9 +27,12 @@ import ee.ria.DigiDoc.domain.preferences.DataStore import ee.ria.DigiDoc.domain.service.IdCardService import ee.ria.DigiDoc.exceptions.NFCError import ee.ria.DigiDoc.idcard.CertificateType +import ee.ria.DigiDoc.idcard.CodeNotActivatedException import ee.ria.DigiDoc.idcard.CodeType +import ee.ria.DigiDoc.idcard.CodeVerificationException import ee.ria.DigiDoc.idcard.PaceTunnelException import ee.ria.DigiDoc.idcard.TokenWithPace +import ee.ria.DigiDoc.idcard.TokenWithPace.CAN_LENGTH import ee.ria.DigiDoc.libdigidoclib.SignedContainer import ee.ria.DigiDoc.libdigidoclib.domain.model.ContainerWrapper import ee.ria.DigiDoc.libdigidoclib.domain.model.RoleData @@ -39,6 +41,7 @@ import ee.ria.DigiDoc.network.sid.dto.response.SessionStatusResponseProcessStatu import ee.ria.DigiDoc.network.utils.SendDiagnostics import ee.ria.DigiDoc.network.utils.UserAgentUtil import ee.ria.DigiDoc.smartcardreader.ApduResponseException +import ee.ria.DigiDoc.smartcardreader.CardConnectionLostException import ee.ria.DigiDoc.smartcardreader.SmartCardReaderException import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager.NfcStatus @@ -477,18 +480,19 @@ class NFCViewModel } catch (e: Exception) { resetIdCardUserData() - if (e.message?.contains("TagLostException") == true) { - _errorState.update { NFCError.TagLost(R.string.signature_update_nfc_tag_lost) } - } else if (e is ApduResponseException) { - _errorState.update { - NFCError.ApduResponse(R.string.signature_update_nfc_technical_error) - } - } else if (e is PaceTunnelException) { - _errorState.update { NFCError.WrongCan(R.string.signature_update_nfc_wrong_can) } - } else { - _errorState.update { - NFCError.TechnicalError(R.string.signature_update_nfc_technical_error) - } + when (e) { + is CardConnectionLostException -> + _errorState.update { NFCError.TagLost(R.string.signature_update_nfc_tag_lost) } + is ApduResponseException -> + _errorState.update { + NFCError.ApduResponse(R.string.signature_update_nfc_technical_error) + } + is PaceTunnelException -> + _errorState.update { NFCError.WrongCan(R.string.signature_update_nfc_wrong_can) } + else -> + _errorState.update { + NFCError.TechnicalError(R.string.signature_update_nfc_technical_error) + } } errorLog( @@ -610,16 +614,16 @@ class NFCViewModel _webEidCertificateResult.postValue(signingCertB64) } catch (ex: SmartCardReaderException) { - if (ex.message?.contains("TagLostException") == true) { - _errorState.update { NFCError.TagLost(R.string.signature_update_nfc_tag_lost) } - } else if (ex is ApduResponseException) { - _errorState.update { - NFCError.ApduResponse(R.string.signature_update_nfc_technical_error) - } - } else if (ex is PaceTunnelException) { - _errorState.update { NFCError.WrongCan(R.string.signature_update_nfc_wrong_can) } - } else { - showTechnicalError(ex) + when (ex) { + is CardConnectionLostException -> + _errorState.update { NFCError.TagLost(R.string.signature_update_nfc_tag_lost) } + is ApduResponseException -> + _errorState.update { + NFCError.ApduResponse(R.string.signature_update_nfc_technical_error) + } + is PaceTunnelException -> + _errorState.update { NFCError.WrongCan(R.string.signature_update_nfc_wrong_can) } + else -> showTechnicalError(ex) } errorLog(logTag, "Exception: " + ex.message, ex) @@ -834,12 +838,11 @@ class NFCViewModel errorLog(logTag, "Unable to perform with NFC: ${e.message}", e) } - private fun handleSmartCardReaderException( + internal fun handleSmartCardReaderException( ex: SmartCardReaderException, codeType: CodeType, pinType: String, ) { - val pinName = codeType.name val isSigning = codeType == CodeType.PIN2 if (isSigning) { @@ -847,30 +850,23 @@ class NFCViewModel } when { - ex.message?.contains("TagLostException") == true -> { + ex is CardConnectionLostException -> { _errorState.update { NFCError.TagLost(R.string.signature_update_nfc_tag_lost) } } - isSigning && ex.message?.contains("PIN2 has not been changed") == true -> { + isSigning && ex is CodeNotActivatedException -> { _dialogError.postValue(R.string.sign_blocked_pin2_unchanged_message) } - ex.message?.contains("$pinName verification failed") == true && - ex.message?.contains("Retries left: 2") == true -> { + ex is CodeVerificationException && ex.type == codeType -> { _shouldResetPIN.postValue(true) - _errorState.update { NFCError.WrongPin(pinType, 2, R.string.id_card_sign_pin_invalid) } - } - - ex.message?.contains("$pinName verification failed") == true && - ex.message?.contains("Retries left: 1") == true -> { - _shouldResetPIN.postValue(true) - _errorState.update { NFCError.WrongPin(pinType, 1, R.string.id_card_sign_pin_invalid_final) } - } - - ex.message?.contains("$pinName verification failed") == true && - ex.message?.contains("Retries left: 0") == true -> { - _shouldResetPIN.postValue(true) - _errorState.update { NFCError.PinBlocked(pinType, R.string.id_card_sign_pin_locked) } + _errorState.update { + when (ex.retries) { + 2 -> NFCError.WrongPin(pinType, 2, R.string.id_card_sign_pin_invalid) + 1 -> NFCError.WrongPin(pinType, 1, R.string.id_card_sign_pin_invalid_final) + else -> NFCError.PinBlocked(pinType, R.string.id_card_sign_pin_locked) + } + } } ex is ApduResponseException -> { diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModel.kt index 1dac4c277..bdff24edf 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedMyEidViewModel.kt @@ -13,7 +13,6 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel import ee.ria.DigiDoc.R -import ee.ria.DigiDoc.common.Constant import ee.ria.DigiDoc.domain.model.IdCardData import ee.ria.DigiDoc.domain.model.pin.PinChangeVariant import ee.ria.DigiDoc.domain.preferences.DataStore @@ -198,25 +197,9 @@ class SharedMyEidViewModel fun isPinCodeLengthValid( codeType: CodeType, pinCode: ByteArray, - ): Boolean = - when (codeType) { - CodeType.PIN1 -> - pinCode.size in - Constant.MyEID.PIN1_MINIMUM_LENGTH..Constant.MyEID.PIN_MAXIMUM_LENGTH - CodeType.PIN2 -> - pinCode.size in - Constant.MyEID.PIN2_MINIMUM_LENGTH..Constant.MyEID.PIN_MAXIMUM_LENGTH - CodeType.PUK -> - pinCode.size in - Constant.MyEID.PUK_MINIMUM_LENGTH..Constant.MyEID.PIN_MAXIMUM_LENGTH - } + ): Boolean = codeType.isLengthValid(pinCode.size) - fun getPinCodeMinimumLength(codeType: CodeType): Int = - when (codeType) { - CodeType.PIN1 -> Constant.MyEID.PIN1_MINIMUM_LENGTH - CodeType.PIN2 -> Constant.MyEID.PIN2_MINIMUM_LENGTH - CodeType.PUK -> Constant.MyEID.PUK_MINIMUM_LENGTH - } + fun getPinCodeMinimumLength(codeType: CodeType): Int = codeType.minLength fun setScreenContent(pinVariant: PinChangeVariant) { resetPinEntryState() diff --git a/app/src/test/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtilTest.kt b/app/src/test/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtilTest.kt index 4384a28e5..1ece14ea7 100644 --- a/app/src/test/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtilTest.kt +++ b/app/src/test/kotlin/ee/ria/DigiDoc/utils/pin/PinCodeUtilTest.kt @@ -120,13 +120,15 @@ class PinCodeUtilTest { @Test fun pinCodeUtil_isPINLengthValid_pukValidLengths() { + assertTrue(PinCodeUtil.isPINLengthValid(ByteArray(8), CodeType.PUK)) assertTrue(PinCodeUtil.isPINLengthValid(ByteArray(9), CodeType.PUK)) - assertTrue(PinCodeUtil.isPINLengthValid(ByteArray(15), CodeType.PUK)) + assertTrue(PinCodeUtil.isPINLengthValid(ByteArray(12), CodeType.PUK)) } @Test fun pinCodeUtil_isPINLengthValid_pukInvalidLengths() { - assertFalse(PinCodeUtil.isPINLengthValid(ByteArray(8), CodeType.PUK)) + assertFalse(PinCodeUtil.isPINLengthValid(ByteArray(7), CodeType.PUK)) + assertFalse(PinCodeUtil.isPINLengthValid(ByteArray(13), CodeType.PUK)) assertFalse(PinCodeUtil.isPINLengthValid(ByteArray(3), CodeType.PUK)) } } diff --git a/commons-lib/src/androidTest/kotlin/ee/ria/DigiDoc/common/ConstantTest.kt b/commons-lib/src/androidTest/kotlin/ee/ria/DigiDoc/common/ConstantTest.kt index 3bdb0d551..a7613942c 100644 --- a/commons-lib/src/androidTest/kotlin/ee/ria/DigiDoc/common/ConstantTest.kt +++ b/commons-lib/src/androidTest/kotlin/ee/ria/DigiDoc/common/ConstantTest.kt @@ -32,11 +32,7 @@ class ConstantTest { @Test fun testNFCConstants() { - assertEquals(4, Constant.NFCConstants.PIN1_MIN_LENGTH) - assertEquals(5, Constant.NFCConstants.PIN2_MIN_LENGTH) - assertEquals(12, Constant.NFCConstants.PIN_MAX_LENGTH) - assertEquals(8, Constant.NFCConstants.PUK_MIN_LENGTH) - assertEquals(6, Constant.NFCConstants.CAN_LENGTH) + assertEquals("DO_NOT_SHOW_WRONG_CAN_DIALOG", Constant.NFCConstants.DO_NOT_SHOW_WRONG_CAN_DIALOG) } @Test @@ -85,10 +81,4 @@ class ConstantTest { fun testThemeSettingKey() { assertEquals("THEME_SETTING", Constant.Theme.THEME_SETTING) } - - @Test - fun testMyEIDPinLimits() { - assertEquals(4, Constant.MyEID.PIN1_MINIMUM_LENGTH) - assertEquals(12, Constant.MyEID.PIN_MAXIMUM_LENGTH) - } } diff --git a/commons-lib/src/main/kotlin/ee/ria/DigiDoc/common/Constant.kt b/commons-lib/src/main/kotlin/ee/ria/DigiDoc/common/Constant.kt index 863450df5..f3e3c3f59 100644 --- a/commons-lib/src/main/kotlin/ee/ria/DigiDoc/common/Constant.kt +++ b/commons-lib/src/main/kotlin/ee/ria/DigiDoc/common/Constant.kt @@ -36,12 +36,6 @@ object Constant { } object NFCConstants { - const val PIN1_MIN_LENGTH: Int = 4 - const val PIN2_MIN_LENGTH: Int = 5 - const val PIN_MAX_LENGTH: Int = 12 - const val PUK_MIN_LENGTH: Int = 8 - const val CAN_LENGTH: Int = 6 - const val DO_NOT_SHOW_WRONG_CAN_DIALOG: String = "DO_NOT_SHOW_WRONG_CAN_DIALOG" } @@ -203,13 +197,6 @@ object Constant { const val THEME_SETTING = "THEME_SETTING" } - object MyEID { - const val PIN1_MINIMUM_LENGTH = 4 - const val PIN2_MINIMUM_LENGTH = 5 - const val PUK_MINIMUM_LENGTH = 8 - const val PIN_MAXIMUM_LENGTH = 12 - } - object Crypto { const val PASSWORD_MINIMUM_LENGTH = 20 const val PASSWORD_MAXIMUM_LENGTH = 64 diff --git a/id-card-lib/id-lib/id-card-lib-debug.aar b/id-card-lib/id-lib/id-card-lib-debug.aar index 74738850e..4629f42d2 100644 Binary files a/id-card-lib/id-lib/id-card-lib-debug.aar and b/id-card-lib/id-lib/id-card-lib-debug.aar differ diff --git a/id-card-lib/id-lib/id-card-lib-release.aar b/id-card-lib/id-lib/id-card-lib-release.aar index fb6de8e05..9687baa8a 100644 Binary files a/id-card-lib/id-lib/id-card-lib-release.aar and b/id-card-lib/id-lib/id-card-lib-release.aar differ diff --git a/id-card-lib/smart-lib/smart-card-reader-lib-debug.aar b/id-card-lib/smart-lib/smart-card-reader-lib-debug.aar index eb63dc4d3..39f12abe0 100644 Binary files a/id-card-lib/smart-lib/smart-card-reader-lib-debug.aar and b/id-card-lib/smart-lib/smart-card-reader-lib-debug.aar differ diff --git a/id-card-lib/smart-lib/smart-card-reader-lib-release.aar b/id-card-lib/smart-lib/smart-card-reader-lib-release.aar index f0c86dce4..7bea573e0 100644 Binary files a/id-card-lib/smart-lib/smart-card-reader-lib-release.aar and b/id-card-lib/smart-lib/smart-card-reader-lib-release.aar differ