Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class FileOpeningRepositoryImplTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class SivaServiceTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ class DiagnosticsViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class FileOpeningViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
CryptoInitialization().init()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ class MobileIdViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class RecentDocumentsViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class SigningViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ class SmartIdViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class SharedContainerViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class SharedSettingsViewModelTest {
ConfigurationPropertiesImpl(),
ConfigurationSignatureVerifierImpl(),
)
configurationRepository = ConfigurationRepositoryImpl(context, configurationLoader)
configurationRepository = ConfigurationRepositoryImpl(configurationLoader)
LibdigidocLibraryLoader().init(context)
Initialization(configurationRepository).init(context)
} catch (_: Exception) {
Expand Down
27 changes: 18 additions & 9 deletions app/src/main/kotlin/ee/ria/DigiDoc/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import ee.ria.DigiDoc.utilsLib.file.FileUtil.getExternalFileUris
import ee.ria.DigiDoc.utilsLib.file.FileUtil.getLogsDirectory
import ee.ria.DigiDoc.utilsLib.locale.LocaleUtil.getLocale
import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.launch
import java.util.logging.Logger
import javax.inject.Inject
Expand Down Expand Up @@ -88,6 +89,8 @@ class MainActivity :
@Inject
lateinit var secureUtil: SecureUtil

private val logTag = "MainActivity"

private var isAppReady = false

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -160,15 +163,21 @@ class MainActivity :
)
val isLoggingEnabled = isDebug || (isDiagnosticsLoggingEnabled && isDiagnosticsLoggingRunning)
lifecycleScope.launch {
LoggingUtil.initialize(
applicationContext,
Logger.getLogger(MainActivity::class.java.name),
isLoggingEnabled,
)
fileTypeSetup.initializeApplicationFileTypesAssociation(componentClassName)
librarySetup.setupLibraries(applicationContext, isLoggingEnabled)

isAppReady = true
try {
LoggingUtil.initialize(
applicationContext,
Logger.getLogger(MainActivity::class.java.name),
isLoggingEnabled,
)
fileTypeSetup.initializeApplicationFileTypesAssociation(componentClassName)
librarySetup.setupLibraries(applicationContext, isLoggingEnabled)
} catch (ce: CancellationException) {
throw ce
} catch (t: Throwable) {
LoggingUtil.errorLog(logTag, "Unable to complete application setup", t)
} finally {
isAppReady = true
}

setContent {
RIADigiDocTheme(darkTheme = useDarkMode) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import ee.ria.DigiDoc.BuildConfig
import ee.ria.DigiDoc.R
import ee.ria.DigiDoc.configuration.exception.ConfigurationSignatureValidationException
import ee.ria.DigiDoc.configuration.exception.PublicKeyNotFoundException
import ee.ria.DigiDoc.ui.component.menu.SettingsMenuBottomSheet
import ee.ria.DigiDoc.ui.component.settings.SettingsSwitchItem
import ee.ria.DigiDoc.ui.component.shared.CancelAndOkButtonRow
Expand All @@ -91,6 +93,7 @@ import ee.ria.DigiDoc.utilsLib.file.FileUtil.sanitizeString
import ee.ria.DigiDoc.viewmodel.DiagnosticsViewModel
import ee.ria.DigiDoc.viewmodel.shared.SharedMenuViewModel
import ee.ria.DigiDoc.viewmodel.shared.SharedSettingsViewModel
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
Expand Down Expand Up @@ -219,6 +222,12 @@ fun DiagnosticsScreen(
diagnosticsViewModel.updateConfiguration(context)
}
showMessage(context, R.string.configuration_update_success, SnackbarType.SUCCESS)
} catch (_: ConfigurationSignatureValidationException) {
showMessage(context, R.string.configuration_update_validation_failed)
} catch (_: PublicKeyNotFoundException) {
showMessage(context, R.string.configuration_initialization_failed)
} catch (ce: CancellationException) {
throw ce
} catch (_: Exception) {
showMessage(context, R.string.configuration_update_failed)
}
Expand Down
119 changes: 86 additions & 33 deletions app/src/main/kotlin/ee/ria/DigiDoc/init/LibrarySetup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,24 @@ package ee.ria.DigiDoc.init
import android.content.Context
import android.widget.Toast
import ee.ria.DigiDoc.R
import ee.ria.DigiDoc.configuration.exception.ConfigurationSignatureValidationException
import ee.ria.DigiDoc.configuration.exception.PublicKeyNotFoundException
import ee.ria.DigiDoc.configuration.loader.ConfigurationLoader
import ee.ria.DigiDoc.configuration.utils.TSLUtil
import ee.ria.DigiDoc.cryptolib.init.CryptoInitialization
import ee.ria.DigiDoc.domain.preferences.DataStore
import ee.ria.DigiDoc.libdigidoclib.exceptions.AlreadyInitializedException
import ee.ria.DigiDoc.libdigidoclib.init.Initialization
import ee.ria.DigiDoc.libdigidoclib.init.LibdigidocLibraryLoader
import ee.ria.DigiDoc.utils.locale.LocaleUtil
import ee.ria.DigiDoc.utils.snackbar.SnackBarManager
import ee.ria.DigiDoc.utilsLib.locale.LocaleUtil.getLocale
import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import java.io.InterruptedIOException
import java.net.SocketTimeoutException
Expand All @@ -51,61 +58,107 @@ class LibrarySetup
private val configurationLoader: ConfigurationLoader,
private val dataStore: DataStore,
private val libdigidocLibraryLoader: LibdigidocLibraryLoader,
private val localeUtil: LocaleUtil,
) {
private val logTag = "LibrarySetup"

private val setupMutex = Mutex()
private var isConfigured = false

suspend fun setupLibraries(
context: Context,
isLoggingEnabled: Boolean,
) {
val localizedContext = localeUtil.updateLocale(context, dataStore.getLocale() ?: getLocale("en"))

libdigidocLibraryLoader.init(context)

cryptoInitialization.init(isLoggingEnabled)

if (!isConfigured) {
withContext(IO) {
try {
TSLUtil.setupTSLFiles(context)
configurationLoader.initConfiguration(
context,
dataStore.getProxySetting(),
dataStore.getManualProxySettings(),
)
isConfigured = true
} catch (ex: Exception) {
if (ex !is UnknownHostException &&
ex !is SocketTimeoutException &&
ex !is InterruptedIOException
) {
errorLog(
logTag,
"Unable to initialize configuration: ",
ex,
setupMutex.withLock {
if (!isConfigured) {
withContext(IO) {
try {
TSLUtil.setupTSLFiles(context)
configurationLoader.initConfiguration(
context,
dataStore.getProxySetting(),
dataStore.getManualProxySettings(),
)
isConfigured = true
} catch (ex: ConfigurationSignatureValidationException) {
errorLog(logTag, "Configuration signature validation failed", ex)

val hasConfiguration = configurationLoader.getConfigurationFlow().value != null
isConfigured = hasConfiguration

withContext(Main) {
SnackBarManager.showMessage(
localizedContext,
if (hasConfiguration) {
R.string.configuration_update_validation_failed
} else {
R.string.configuration_initialization_failed
},
)
}
} catch (ex: PublicKeyNotFoundException) {
errorLog(logTag, "Bundled signing key unavailable", ex)

withContext(Main) {
SnackBarManager.showMessage(
context,
localizedContext,
R.string.configuration_initialization_failed,
)
}
} catch (ce: CancellationException) {
throw ce
} catch (ex: Exception) {
if (ex !is UnknownHostException &&
ex !is SocketTimeoutException &&
ex !is InterruptedIOException
) {
errorLog(
logTag,
"Unable to initialize configuration: ",
ex,
)
withContext(Main) {
SnackBarManager.showMessage(
localizedContext,
R.string.configuration_initialization_failed,
)
}
}
}

if (configurationLoader.getConfigurationFlow().value == null) {
try {
configurationLoader.loadLocalConfiguration(context)
} catch (ce: CancellationException) {
throw ce
} catch (fallbackFailure: Exception) {
errorLog(logTag, "Unable to load local configuration", fallbackFailure)
}
}
}
}
}

try {
initialization.init(context, isLoggingEnabled)
} catch (e: Exception) {
if (e !is AlreadyInitializedException) {
errorLog(logTag, "Unable to initialize libdigidocpp", e)
withContext(Main) {
Toast
.makeText(
context,
R.string.libdigidocpp_initialization_failed,
Toast.LENGTH_LONG,
).show()
try {
initialization.init(context, isLoggingEnabled)
} catch (ce: CancellationException) {
throw ce
} catch (e: Exception) {
if (e !is AlreadyInitializedException) {
errorLog(logTag, "Unable to initialize libdigidocpp", e)
withContext(Main) {
Toast
.makeText(
localizedContext,
R.string.libdigidocpp_initialization_failed,
Toast.LENGTH_LONG,
).show()
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values-et/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,7 @@
<string name="configuration_updated">Konfiguratsioon uuendatud</string>
<string name="configuration_update_success">RIA DigiDoci konfiguratsiooni värskendamine õnnestus</string>
<string name="configuration_update_failed">Palun kontrolli internetiühendust ja võrgu sätteid</string>
<string name="configuration_update_validation_failed">Serveris olev konfiguratsioonifail ei valideeru</string>
<string name="language_changed">Keel muudetud</string>
<string name="theme_changed">Teema muudetud</string>
<string name="setting_value_changed">Seade väärtus muudetud</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,7 @@
<string name="configuration_updated">Configuration updated</string>
<string name="configuration_update_success">RIA DigiDoc configuration update was successful</string>
<string name="configuration_update_failed">Please check your internet connection and network settings</string>
<string name="configuration_update_validation_failed">The configuration file located on the server cannot be validated</string>
<string name="language_changed">Language changed</string>
<string name="theme_changed">Theme changed</string>
<string name="setting_value_changed">Setting value changed</string>
Expand Down
Loading
Loading