diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModelTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModelTest.kt index fe2bf0607..ac37f59a2 100644 --- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModelTest.kt +++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModelTest.kt @@ -174,7 +174,7 @@ class RecentDocumentsViewModelTest { viewModel.openSignatureDocument(tempFile, true) - verify(sivaRepository).getTimestampedContainer(anyOrNull(), anyOrNull()) + verify(sivaRepository).getTimestampedContainer(anyOrNull(), anyOrNull(), anyOrNull()) } @Test diff --git a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModelTest.kt b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModelTest.kt index d0f4b09a9..422056d29 100644 --- a/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModelTest.kt +++ b/app/src/androidTest/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModelTest.kt @@ -484,9 +484,11 @@ class SigningViewModelTest { ) `when`(sivaRepository.isTimestampedContainer(signedContainer)).thenReturn(true) - `when`(sivaRepository.getTimestampedContainer(context, signedContainer)).thenReturn(timestampedContainer) + `when`( + sivaRepository.getTimestampedContainer(context, signedContainer, true), + ).thenReturn(timestampedContainer) - val tsContainer = viewModel.getTimestampedContainer(context, signedContainer) + val tsContainer = viewModel.getTimestampedContainer(context, signedContainer, true) assertNotNull(tsContainer) } @@ -499,7 +501,7 @@ class SigningViewModelTest { `when`(sivaRepository.isTimestampedContainer(signedContainer)).thenReturn(false) - val container = viewModel.getTimestampedContainer(context, signedContainer) + val container = viewModel.getTimestampedContainer(context, signedContainer, false) assertNotNull(container) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepository.kt b/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepository.kt index 722cca302..f15c98758 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepository.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepository.kt @@ -36,5 +36,6 @@ interface SivaRepository { suspend fun getTimestampedContainer( context: Context, parentContainer: SignedContainer, + isSivaConfirmed: Boolean, ): SignedContainer } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepositoryImpl.kt b/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepositoryImpl.kt index ee53df159..73116e51f 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepositoryImpl.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/domain/repository/siva/SivaRepositoryImpl.kt @@ -45,5 +45,6 @@ class SivaRepositoryImpl override suspend fun getTimestampedContainer( context: Context, parentContainer: SignedContainer, - ): SignedContainer = sivaService.getTimestampedContainer(context, parentContainer) + isSivaConfirmed: Boolean, + ): SignedContainer = sivaService.getTimestampedContainer(context, parentContainer, isSivaConfirmed) } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaService.kt b/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaService.kt index 58e82e3e2..2b1a39dce 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaService.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaService.kt @@ -36,5 +36,6 @@ interface SivaService { suspend fun getTimestampedContainer( context: Context, parentContainer: SignedContainer, + isSivaConfirmed: Boolean, ): SignedContainer } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaServiceImpl.kt b/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaServiceImpl.kt index d7d139593..ff0c85bd1 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaServiceImpl.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/domain/service/siva/SivaServiceImpl.kt @@ -69,9 +69,10 @@ class SivaServiceImpl override suspend fun getTimestampedContainer( context: Context, parentContainer: SignedContainer, + isSivaConfirmed: Boolean, ): SignedContainer { try { - val nestedContainer = parentContainer.getNestedTimestampedContainer() + val nestedContainer = parentContainer.getNestedTimestampedContainer(isSivaConfirmed) return SignedContainer( context, nestedContainer?.rawContainer(), diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt index 4518ab7b2..b565934a5 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/crypto/EncryptNavigation.kt @@ -121,6 +121,7 @@ import ee.ria.DigiDoc.utils.snackbar.SnackBarManager.showMessage import ee.ria.DigiDoc.utilsLib.container.ContainerUtil.createContainerAction import ee.ria.DigiDoc.utilsLib.container.ContainerUtil.removeExtensionFromContainerFilename import ee.ria.DigiDoc.utilsLib.extensions.isContainer +import ee.ria.DigiDoc.utilsLib.extensions.isSignedPDF import ee.ria.DigiDoc.utilsLib.extensions.mimeType import ee.ria.DigiDoc.utilsLib.file.FileUtil.sanitizeString import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog @@ -277,7 +278,8 @@ fun EncryptNavigation( { nestedContainer, isSivaConfirmed -> scope.launch(IO) { try { - val isSigningContainer = nestedContainer.isContainer(context) + val isSigningContainer = + nestedContainer.isContainer(context) || nestedContainer.isSignedPDF(context) if (isSigningContainer) { signingViewModel.openNestedContainer( @@ -321,7 +323,7 @@ fun EncryptNavigation( val handleSivaCancel: () -> Unit = { showSivaDialog.value = false nestedFile.value?.let { file -> - if (DDOC_MIMETYPE != file.mimeType(context)) { + if (DDOC_MIMETYPE != file.mimeType(context) && !file.isSignedPDF(context)) { openNestedContainer(file, false) } } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt index a14bcd1b8..9e0ee7652 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/ui/component/signing/SigningNavigation.kt @@ -352,7 +352,7 @@ fun SigningNavigation( showSivaDialog.value = false isSivaConfirmed = false nestedFile.value?.let { file -> - if (DDOC_MIMETYPE != file.mimeType(context)) { + if (DDOC_MIMETYPE != file.mimeType(context) && !file.isSignedPDF(context)) { openNestedContainer(file, false) } } diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/EncryptViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/EncryptViewModel.kt index 426cb116c..32a3891f9 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/EncryptViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/EncryptViewModel.kt @@ -153,11 +153,12 @@ class EncryptViewModel suspend fun getTimestampedContainer( context: Context, signedContainer: SignedContainer, + isSivaConfirmed: Boolean, ): SignedContainer { if (sivaRepository.isTimestampedContainer(signedContainer) && !signedContainer.isXades() ) { - return sivaRepository.getTimestampedContainer(context, signedContainer) + return sivaRepository.getTimestampedContainer(context, signedContainer, isSivaConfirmed) } return signedContainer diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt index 131b00a04..b8a908928 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/FileOpeningViewModel.kt @@ -236,6 +236,7 @@ class FileOpeningViewModel sivaRepository.getTimestampedContainer( context, signedContainer, + isSivaConfirmed, ) _signedContainer.postValue(nestedTimestampedContainer) } else { diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModel.kt index 5a4964ce2..3216f8f9e 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/RecentDocumentsViewModel.kt @@ -115,7 +115,7 @@ class RecentDocumentsViewModel if (sivaRepository.isTimestampedContainer(signedContainer) && !signedContainer.isXades() ) { - return sivaRepository.getTimestampedContainer(context, signedContainer) + return sivaRepository.getTimestampedContainer(context, signedContainer, isSivaConfirmed) } return SignedContainer.openOrCreate(context, document, listOf(document), isSivaConfirmed) diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModel.kt index 98dc6ff08..5be67d0c3 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/SigningViewModel.kt @@ -205,7 +205,7 @@ class SigningViewModel if (ASICS_MIMETYPE == nestedFile.mimeType(context)) { val timestampedNestedContainer = - getTimestampedContainer(context, nestedContainer) + getTimestampedContainer(context, nestedContainer, isSivaConfirmed) sharedContainerViewModel.setSignedContainer(timestampedNestedContainer) } else { sharedContainerViewModel.setSignedContainer(nestedContainer) @@ -230,9 +230,10 @@ class SigningViewModel suspend fun getTimestampedContainer( context: Context, signedContainer: SignedContainer, + isSivaConfirmed: Boolean, ): SignedContainer { if (isTimestampedContainer(signedContainer)) { - return sivaRepository.getTimestampedContainer(context, signedContainer) + return sivaRepository.getTimestampedContainer(context, signedContainer, isSivaConfirmed) } return signedContainer diff --git a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt index 22d8de192..42b4f210f 100644 --- a/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt +++ b/app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/shared/SharedContainerViewModel.kt @@ -33,6 +33,7 @@ import androidx.lifecycle.ViewModel import com.google.common.io.ByteStreams import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import ee.ria.DigiDoc.common.Constant.PDF_MIMETYPE import ee.ria.DigiDoc.common.Constant.SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES import ee.ria.DigiDoc.common.container.Container import ee.ria.DigiDoc.cryptolib.Addressee @@ -45,9 +46,11 @@ import ee.ria.DigiDoc.libdigidoclib.domain.model.SignatureInterface import ee.ria.DigiDoc.network.mid.dto.response.MobileCreateSignatureProcessStatus import ee.ria.DigiDoc.network.sid.dto.response.SessionStatusResponseProcessStatus import ee.ria.DigiDoc.utilsLib.container.ContainerUtil +import ee.ria.DigiDoc.utilsLib.extensions.isCades import ee.ria.DigiDoc.utilsLib.extensions.isContainer import ee.ria.DigiDoc.utilsLib.extensions.isCryptoContainer import ee.ria.DigiDoc.utilsLib.extensions.isSignedPDF +import ee.ria.DigiDoc.utilsLib.extensions.isXades import ee.ria.DigiDoc.utilsLib.extensions.mimeType import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog import kotlinx.coroutines.delay @@ -220,7 +223,13 @@ class SharedContainerViewModel val mimetype = containerDataFile.mimeType(context) ContainerFileOpeningResult.OpenNestedFile( file = containerDataFile, - needsSivaDialog = SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES.contains(mimetype), + needsSivaDialog = + ( + SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES.contains(mimetype) && + !containerDataFile.isXades(context) + ) || + (PDF_MIMETYPE == mimetype && containerDataFile.isSignedPDF(context)) || + containerDataFile.isCades(context), ) } else { ContainerFileOpeningResult.OpenWithFile(containerDataFile) @@ -255,7 +264,13 @@ class SharedContainerViewModel val mimetype = containerDataFile.mimeType(context) ContainerFileOpeningResult.OpenNestedFile( file = containerDataFile, - needsSivaDialog = SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES.contains(mimetype), + needsSivaDialog = + ( + SEND_SIVA_CONTAINER_NOTIFICATION_MIMETYPES.contains(mimetype) && + !containerDataFile.isXades(context) + ) || + (PDF_MIMETYPE == mimetype && containerDataFile.isSignedPDF(context)) || + containerDataFile.isCades(context), ) } else { ContainerFileOpeningResult.OpenWithFile(containerDataFile) diff --git a/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt b/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt index 4b294a613..732740f1d 100644 --- a/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt +++ b/libdigidoc-lib/src/androidTest/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainerTest.kt @@ -286,7 +286,7 @@ class SignedContainerTest { runTest { val signedContainer = openOrCreate(context, container, listOf(container), true) - val result = signedContainer.getNestedTimestampedContainer() + val result = signedContainer.getNestedTimestampedContainer(true) assertNull(result) } diff --git a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainer.kt b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainer.kt index f9a240596..0dcf5db0f 100644 --- a/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainer.kt +++ b/libdigidoc-lib/src/main/kotlin/ee/ria/DigiDoc/libdigidoclib/SignedContainer.kt @@ -82,7 +82,7 @@ class SignedContainer } @Throws(Exception::class) - suspend fun getNestedTimestampedContainer(): SignedContainer? { + suspend fun getNestedTimestampedContainer(isSivaConfirmed: Boolean): SignedContainer? { if ((containerMimetype().equals(ASICS_MIMETYPE, ignoreCase = true) && getDataFiles().size == 1) || isCades() && !isXades() @@ -97,7 +97,7 @@ class SignedContainer return nestedTimestampedFile?.let { SignedContainer( context = context, - container = open(context, it, true).rawContainer(), + container = open(context, it, isSivaConfirmed).rawContainer(), containerFile = it, isExistingContainer = true, )