Skip to content

Commit 43afe7b

Browse files
SanderKondratjevNortalaarmam
authored andcommitted
NFC-50 Display parsed Web EID auth payload in WebEidScreen after URI handling
1 parent 70b28b4 commit 43afe7b

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed

app/src/main/kotlin/ee/ria/DigiDoc/RIADigiDocAppNavigation.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ fun RIADigiDocAppScreen(externalFileUris: List<Uri>, webEidUri: Uri? = null) {
381381
WebEidFragment(
382382
modifier = Modifier.safeDrawingPadding(),
383383
navController = navController,
384+
webEidUri = webEidUri,
384385
)
385386
}
386387
}

app/src/main/kotlin/ee/ria/DigiDoc/fragment/WebEidFragment.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
package ee.ria.DigiDoc.fragment
44

55
import android.content.res.Configuration
6+
import android.net.Uri
67
import androidx.compose.foundation.background
78
import androidx.compose.foundation.layout.fillMaxSize
89
import androidx.compose.material3.MaterialTheme
910
import androidx.compose.material3.Surface
1011
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.LaunchedEffect
1113
import androidx.compose.ui.ExperimentalComposeUiApi
1214
import androidx.compose.ui.Modifier
1315
import androidx.compose.ui.platform.testTag
@@ -26,8 +28,14 @@ import ee.ria.DigiDoc.viewmodel.WebEidViewModel
2628
fun WebEidFragment(
2729
modifier: Modifier = Modifier,
2830
navController: NavHostController,
31+
webEidUri: Uri?,
2932
viewModel: WebEidViewModel = hiltViewModel(),
3033
) {
34+
LaunchedEffect(webEidUri) {
35+
println("DEBUG: WebEidFragment got URI = $webEidUri")
36+
webEidUri?.let { viewModel.handleAuth(it) }
37+
}
38+
3139
Surface(
3240
modifier =
3341
modifier
@@ -52,6 +60,7 @@ fun WebEidFragmentPreview() {
5260
RIADigiDocTheme {
5361
WebEidFragment(
5462
navController = rememberNavController(),
63+
webEidUri = null
5564
)
5665
}
5766
}

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,22 @@ package ee.ria.DigiDoc.fragment.screen
44

55
import android.content.res.Configuration
66
import androidx.compose.foundation.background
7+
import androidx.compose.foundation.layout.Arrangement
78
import androidx.compose.foundation.layout.Box
9+
import androidx.compose.foundation.layout.Column
810
import androidx.compose.foundation.layout.fillMaxSize
11+
import androidx.compose.foundation.layout.padding
912
import androidx.compose.material3.MaterialTheme
1013
import androidx.compose.material3.Surface
1114
import androidx.compose.material3.Text
1215
import androidx.compose.runtime.Composable
16+
import androidx.compose.runtime.collectAsState
1317
import androidx.compose.ui.Modifier
1418
import androidx.compose.ui.platform.testTag
1519
import androidx.compose.ui.semantics.semantics
1620
import androidx.compose.ui.semantics.testTagsAsResourceId
1721
import androidx.compose.ui.tooling.preview.Preview
22+
import androidx.compose.ui.unit.dp
1823
import androidx.hilt.navigation.compose.hiltViewModel
1924
import androidx.navigation.NavHostController
2025
import androidx.navigation.compose.rememberNavController
@@ -27,6 +32,8 @@ fun WebEidScreen(
2732
navController: NavHostController,
2833
viewModel: WebEidViewModel,
2934
) {
35+
val auth = viewModel.authPayload.collectAsState().value
36+
3037
Surface(
3138
modifier =
3239
modifier
@@ -36,8 +43,16 @@ fun WebEidScreen(
3643
.testTag("webEidScreen"),
3744
color = MaterialTheme.colorScheme.background,
3845
) {
39-
Box(modifier = Modifier.fillMaxSize()) {
40-
Text("Web eID Screen placeholder")
46+
Box(modifier = Modifier.fillMaxSize().padding(16.dp)) {
47+
if (auth != null) {
48+
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
49+
Text("Challenge: ${auth.challenge}")
50+
Text("Login URI: ${auth.loginUri}")
51+
Text("Get Signing Cert: ${auth.getSigningCertificate}")
52+
}
53+
} else {
54+
Text("No auth payload received.")
55+
}
4156
}
4257
}
4358
}

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,50 @@
22

33
package ee.ria.DigiDoc.viewmodel
44

5+
import android.net.Uri
56
import androidx.lifecycle.ViewModel
67
import dagger.hilt.android.lifecycle.HiltViewModel
8+
import kotlinx.coroutines.flow.MutableStateFlow
9+
import kotlinx.coroutines.flow.StateFlow
10+
import org.json.JSONObject
11+
import java.util.Base64
712
import javax.inject.Inject
813

914
@HiltViewModel
1015
class WebEidViewModel
1116
@Inject
1217
constructor() : ViewModel() {
1318

19+
private val _authPayload = MutableStateFlow<AuthRequest?>(null)
20+
val authPayload: StateFlow<AuthRequest?> = _authPayload
21+
22+
fun handleAuth(uri: Uri) {
23+
try {
24+
val fragment = uri.fragment ?: return
25+
val decoded = decodeBase64(fragment)
26+
val json = JSONObject(decoded)
27+
28+
val challenge = json.getString("challenge")
29+
val loginUri = json.getString("login_uri")
30+
val getSigningCertificate = json.optBoolean("get_signing_certificate", false)
31+
32+
_authPayload.value = AuthRequest(
33+
challenge = challenge,
34+
loginUri = loginUri,
35+
getSigningCertificate = getSigningCertificate
36+
)
37+
} catch (e: Exception) {
38+
_authPayload.value = null
39+
}
40+
}
41+
42+
private fun decodeBase64(encoded: String): String {
43+
return String(Base64.getDecoder().decode(encoded))
44+
}
45+
46+
data class AuthRequest(
47+
val challenge: String,
48+
val loginUri: String,
49+
val getSigningCertificate: Boolean = false
50+
)
1451
}

0 commit comments

Comments
 (0)