Skip to content

Commit f70561a

Browse files
NFC-83 Use StateFlow instead of LiveData. Centralize PIN clearing. Remove padding for remember me.
1 parent b739641 commit f70561a

File tree

4 files changed

+21
-32
lines changed

4 files changed

+21
-32
lines changed

app/src/main/kotlin/ee/ria/DigiDoc/fragment/screen/WebEidScreen.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ import androidx.compose.ui.text.style.TextOverflow
7373
import androidx.compose.ui.tooling.preview.Preview
7474
import androidx.compose.ui.unit.dp
7575
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
76-
import androidx.lifecycle.asFlow
7776
import androidx.navigation.NavHostController
7877
import androidx.navigation.compose.rememberNavController
7978
import ee.ria.DigiDoc.R
@@ -126,7 +125,7 @@ fun WebEidScreen(
126125
val snackBarHostState = remember { SnackbarHostState() }
127126
val snackBarScope = rememberCoroutineScope()
128127
val messages by SnackBarManager.messages.collectAsState(emptyList())
129-
val dialogError by viewModel.dialogError.asFlow().collectAsState(0)
128+
val dialogError by viewModel.dialogError.collectAsState()
130129
var rememberMe by rememberSaveable { mutableStateOf(true) }
131130
val hasStoredCanNumber = sharedSettingsViewModel.dataStore.getCanNumber().isNotEmpty()
132131

@@ -303,8 +302,6 @@ fun WebEidScreen(
303302
)
304303

305304
if (!isWebEidAuthenticating) {
306-
Spacer(modifier = Modifier.height(SPadding))
307-
308305
WebEidRememberMe(
309306
rememberMe = rememberMe,
310307
onRememberMeChange = { rememberMe = it },
@@ -356,8 +353,6 @@ fun WebEidScreen(
356353
)
357354

358355
if (!isWebEidAuthenticating) {
359-
Spacer(modifier = Modifier.height(SPadding))
360-
361356
WebEidRememberMe(
362357
rememberMe = rememberMe,
363358
onRememberMeChange = { rememberMe = it },

app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/NFCViewModel.kt

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import ee.ria.DigiDoc.smartcardreader.SmartCardReaderException
5454
import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager
5555
import ee.ria.DigiDoc.smartcardreader.nfc.NfcSmartCardReaderManager.NfcStatus
5656
import ee.ria.DigiDoc.utils.pin.PinCodeUtil.isPINLengthValid
57+
import ee.ria.DigiDoc.utilsLib.extensions.clearSensitive
5758
import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.debugLog
5859
import ee.ria.DigiDoc.utilsLib.logging.LoggingUtil.Companion.errorLog
5960
import ee.ria.libdigidocpp.ExternalSigner
@@ -275,9 +276,7 @@ class NFCViewModel
275276

276277
val signatureArray =
277278
card.calculateSignature(pin2Code, dataToSignBytes, true)
278-
if (null != pin2Code && pin2Code.isNotEmpty()) {
279-
Arrays.fill(pin2Code, 0.toByte())
280-
}
279+
pin2Code.clearSensitive()
281280
debugLog(logTag, "Signature: " + Hex.toHexString(signatureArray))
282281

283282
containerWrapper.finalizeSignature(
@@ -374,9 +373,7 @@ class NFCViewModel
374373

375374
errorLog(logTag, "Exception: " + ex.message, ex)
376375
} finally {
377-
if (null != pin2Code && pin2Code.isNotEmpty()) {
378-
Arrays.fill(pin2Code, 0.toByte())
379-
}
376+
pin2Code.clearSensitive()
380377
nfcSmartCardReaderManager.disableNfcReaderMode()
381378
activity.requestedOrientation =
382379
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
@@ -437,9 +434,7 @@ class NFCViewModel
437434
cdoc2Settings,
438435
configurationRepository,
439436
)
440-
if (pin1Code.isNotEmpty()) {
441-
Arrays.fill(pin1Code, 0.toByte())
442-
}
437+
pin1Code.clearSensitive()
443438
CoroutineScope(Main).launch {
444439
_shouldResetPIN.postValue(true)
445440
_decryptStatus.postValue(true)
@@ -531,9 +526,7 @@ class NFCViewModel
531526

532527
errorLog(logTag, "Exception: " + ex.message, ex)
533528
} finally {
534-
if (pin1Code.isNotEmpty()) {
535-
Arrays.fill(pin1Code, 0.toByte())
536-
}
529+
pin1Code.clearSensitive()
537530
nfcSmartCardReaderManager.disableNfcReaderMode()
538531
activity.requestedOrientation =
539532
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
@@ -649,9 +642,7 @@ class NFCViewModel
649642
challenge = challenge,
650643
)
651644

652-
if (pin1Code.isNotEmpty()) {
653-
Arrays.fill(pin1Code, 0.toByte())
654-
}
645+
pin1Code.clearSensitive()
655646
debugLog(logTag, "Auth certificate: " + Base64.getEncoder().encodeToString(authCert))
656647
debugLog(logTag, "Auth signature: " + Hex.toHexString(signatureArray))
657648

@@ -946,9 +937,7 @@ class NFCViewModel
946937

947938
errorLog(logTag, "Exception: " + ex.message, ex)
948939
} finally {
949-
if (null != pin2Code && pin2Code.isNotEmpty()) {
950-
Arrays.fill(pin2Code, 0.toByte())
951-
}
940+
pin2Code.clearSensitive()
952941
nfcSmartCardReaderManager.disableNfcReaderMode()
953942
activity.requestedOrientation =
954943
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED

app/src/main/kotlin/ee/ria/DigiDoc/viewmodel/WebEidViewModel.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
package ee.ria.DigiDoc.viewmodel
2323

2424
import android.net.Uri
25-
import androidx.lifecycle.LiveData
26-
import androidx.lifecycle.MutableLiveData
2725
import androidx.lifecycle.ViewModel
2826
import dagger.hilt.android.lifecycle.HiltViewModel
2927
import ee.ria.DigiDoc.R
@@ -59,8 +57,8 @@ class WebEidViewModel
5957
val signRequest: StateFlow<WebEidSignRequest?> = _signRequest.asStateFlow()
6058
private val _relyingPartyResponseEvents = MutableSharedFlow<Uri>()
6159
val relyingPartyResponseEvents: SharedFlow<Uri> = _relyingPartyResponseEvents.asSharedFlow()
62-
private val _dialogError = MutableLiveData<Int>(null)
63-
val dialogError: LiveData<Int> = _dialogError
60+
private val _dialogError = MutableStateFlow(0)
61+
val dialogError: StateFlow<Int> = _dialogError
6462

6563
suspend fun handleAuth(uri: Uri) {
6664
try {
@@ -72,7 +70,7 @@ class WebEidViewModel
7270
_relyingPartyResponseEvents.emit(responseUri)
7371
} catch (e: Exception) {
7472
errorLog(logTag, "Unable parse Web eID authentication request: $uri", e)
75-
_dialogError.postValue(R.string.web_eid_invalid_auth_request_error)
73+
_dialogError.value = R.string.web_eid_invalid_auth_request_error
7674
}
7775
}
7876

@@ -81,7 +79,7 @@ class WebEidViewModel
8179
_signRequest.value = WebEidRequestParser.parseCertificateUri(uri)
8280
} catch (e: Exception) {
8381
errorLog(logTag, "Unable parse Web eID certificate request: $uri", e)
84-
_dialogError.postValue(R.string.web_eid_invalid_sign_request_error)
82+
_dialogError.value = R.string.web_eid_invalid_sign_request_error
8583
}
8684
}
8785

@@ -95,13 +93,13 @@ class WebEidViewModel
9593
_relyingPartyResponseEvents.emit(responseUri)
9694
} catch (e: Exception) {
9795
errorLog(logTag, "Unable parse Web eID signing request: $uri", e)
98-
_dialogError.postValue(R.string.web_eid_invalid_sign_request_error)
96+
_dialogError.value = R.string.web_eid_invalid_sign_request_error
9997
}
10098
}
10199

102100
fun handleUnknown(uri: Uri) {
103101
errorLog(logTag, "Unable parse Web eID request: $uri")
104-
_dialogError.postValue(R.string.web_eid_invalid_sign_request_error)
102+
_dialogError.value = R.string.web_eid_invalid_sign_request_error
105103
}
106104

107105
suspend fun handleWebEidAuthResult(

utils-lib/src/main/kotlin/ee/ria/DigiDoc/utilsLib/extensions/ByteArrayExtensions.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import java.io.ByteArrayInputStream
2727
import java.security.cert.CertificateException
2828
import java.security.cert.CertificateFactory
2929
import java.security.cert.X509Certificate
30+
import java.util.Arrays
3031

3132
fun ByteArray.hexString(): String {
3233
val hexString = Hex.toHexString(this)
@@ -43,3 +44,9 @@ fun ByteArray.x509Certificate(): X509Certificate? =
4344
} catch (ce: CertificateException) {
4445
null
4546
}
47+
48+
fun ByteArray?.clearSensitive() {
49+
if (this != null && this.isNotEmpty()) {
50+
Arrays.fill(this, 0.toByte())
51+
}
52+
}

0 commit comments

Comments
 (0)