Skip to content

Commit

Permalink
chore: optimaization of db and rest calls on aap start #8947
Browse files Browse the repository at this point in the history
Signed-off-by: Arnab Dutta <arnab.bdutta@gmail.com>
  • Loading branch information
duttarnab committed Jul 11, 2024
1 parent ea93e5b commit 3131cbd
Show file tree
Hide file tree
Showing 9 changed files with 121 additions and 170 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package io.jans.chip.repository

import android.content.Context
import android.util.Log
import com.nimbusds.jwt.JWTClaimsSet
import io.jans.chip.retrofit.ApiAdapter
import io.jans.chip.utils.AppConfig
import io.jans.chip.AppDatabase
import io.jans.chip.factories.DPoPProofFactory
import io.jans.chip.model.OPConfiguration
import io.jans.chip.model.fido.config.FidoConfiguration
import io.jans.chip.model.fido.config.FidoConfigurationResponse
Expand All @@ -13,75 +15,77 @@ import retrofit2.Response
class FidoConfigurationRepository(context: Context) {
private val TAG = "FidoConfigurationRepository"
private val appDatabase = AppDatabase.getInstance(context);
private var fidoConfigurationResponse: FidoConfigurationResponse? =
FidoConfigurationResponse(null, null, null)
private var fidoConfiguration: FidoConfiguration = FidoConfiguration("", null, null, null, null, null)
var obtainedContext: Context = context

suspend fun fetchFidoConfiguration(configurationUrl: String): FidoConfigurationResponse? {
private suspend fun fetchFidoConfiguration(configurationUrl: String): FidoConfiguration? {
val issuer: String = configurationUrl.replace(AppConfig.FIDO_CONFIG_URL, "")
Log.d(TAG, "Inside fetchFIDOConfiguration :: configurationUrl ::$configurationUrl")
try {
val opConfigurationList: List<OPConfiguration> = appDatabase.opConfigurationDao().getAll()
if (opConfigurationList.isEmpty()) {
fidoConfigurationResponse?.isSuccessful = false
fidoConfigurationResponse?.errorMessage = "OpenID configuration not found in database."
return fidoConfigurationResponse
fidoConfiguration.isSuccessful = false
fidoConfiguration.errorMessage = "OpenID configuration not found in database."
return fidoConfiguration
}
val opConfiguration: OPConfiguration = opConfigurationList[0]

val response: Response<FidoConfigurationResponse> =
ApiAdapter.getInstance(issuer).getFidoConfiguration(configurationUrl)

if (response.code() != 200) {
fidoConfigurationResponse?.isSuccessful = false
fidoConfigurationResponse?.errorMessage =
fidoConfiguration.isSuccessful = false
fidoConfiguration.errorMessage =
"Error in fetching FIDO Configuration. Error message: ${response.message()}"
return fidoConfigurationResponse
return fidoConfiguration
}
fidoConfigurationResponse = response.body()
val fidoConfigurationResponse: FidoConfigurationResponse? = response.body()
if (!response.isSuccessful || fidoConfigurationResponse == null) {
fidoConfigurationResponse?.isSuccessful = false
fidoConfigurationResponse?.errorMessage =
fidoConfiguration.isSuccessful = false
fidoConfiguration.errorMessage =
"Error in fetching FIDO Configuration. Error message: ${response.message()}"
return fidoConfigurationResponse
return fidoConfiguration
}
fidoConfigurationResponse?.isSuccessful = true
val fidoConfigDB = FidoConfiguration(
fidoConfiguration = FidoConfiguration(
AppConfig.DEFAULT_S_NO,
fidoConfigurationResponse?.issuer,
fidoConfigurationResponse?.attestation?.optionsEndpoint,
fidoConfigurationResponse?.attestation?.resultEndpoint,
fidoConfigurationResponse?.assertion?.optionsEndpoint,
fidoConfigurationResponse?.assertion?.resultEndpoint
fidoConfigurationResponse.issuer,
fidoConfigurationResponse.attestation?.optionsEndpoint,
fidoConfigurationResponse.attestation?.resultEndpoint,
fidoConfigurationResponse.assertion?.optionsEndpoint,
fidoConfigurationResponse.assertion?.resultEndpoint
)

fidoConfiguration.isSuccessful = true
Log.d(
TAG,
"Inside fetchOPConfiguration :: opConfiguration :: ${fidoConfigurationResponse?.issuer}"
"Inside fetchOPConfiguration :: ${fidoConfigurationResponse.issuer}"
)
appDatabase.fidoConfigurationDao().deleteAll()
appDatabase.fidoConfigurationDao().insert(fidoConfigDB)
appDatabase.fidoConfigurationDao().insert(fidoConfiguration)

opConfiguration.fidoUrl = configurationUrl
appDatabase.opConfigurationDao().update(opConfiguration)

return fidoConfigurationResponse
return fidoConfiguration
} catch (e: Exception) {
Log.e(TAG, "Error in fetching OP Configuration. ${e.message}".trimIndent())
fidoConfigurationResponse?.isSuccessful = false
fidoConfigurationResponse?.errorMessage =
fidoConfiguration.isSuccessful = false
fidoConfiguration.errorMessage =
"Error in fetching FIDO Configuration. Error message: ${e.message}"
return fidoConfigurationResponse
return fidoConfiguration
}
}

suspend fun getFidoConfigInDatabase(): FidoConfiguration? {
val fidoConfigurationList: List<FidoConfiguration> = appDatabase.fidoConfigurationDao()
.getAll()
suspend fun getFidoConfig(): FidoConfiguration? {
val fidoConfigurationList: List<FidoConfiguration> = appDatabase.fidoConfigurationDao().getAll()
var fidoConfiguration: FidoConfiguration? = null
if(fidoConfigurationList.isNotEmpty()) {
fidoConfiguration = fidoConfigurationList.let { it -> it[0] }
if(!fidoConfigurationList.isNullOrEmpty()) {
fidoConfiguration = fidoConfigurationList[0]
fidoConfiguration.isSuccessful = true
return fidoConfiguration
}
val jwtClaimsSet: JWTClaimsSet = DPoPProofFactory.getClaimsFromSSA()
val issuer: String = jwtClaimsSet.getClaim("iss").toString()
fidoConfiguration = fetchFidoConfiguration(issuer + AppConfig.FIDO_CONFIG_URL)
return fidoConfiguration
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class LoginResponseRepository(context: Context) {
private val appDatabase = AppDatabase.getInstance(context);
var obtainedContext: Context = context
private var loginResponse: LoginResponse? = LoginResponse(null)
suspend fun processlogin(
suspend fun processLogin(
usernameText: String,
passwordText: String?,
authMethod: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,24 @@ package io.jans.chip.repository

import android.content.Context
import android.util.Log
import com.nimbusds.jwt.JWTClaimsSet
import io.jans.chip.model.OPConfiguration
import io.jans.chip.retrofit.ApiAdapter
import io.jans.chip.utils.AppConfig
import io.jans.chip.AppDatabase
import io.jans.chip.factories.DPoPProofFactory
import io.jans.chip.model.OIDCClient
import retrofit2.Response

class OPConfigurationRepository (context: Context){
private val TAG = "OPConfigurationRepository"
private val appDatabase = AppDatabase.getInstance(context);
private var opConfiguration: OPConfiguration? =
OPConfiguration("", null, null, null, null, null, null)
suspend fun fetchOPConfiguration(configurationUrl: String): OPConfiguration? {
private suspend fun fetchOPConfiguration(configurationUrl: String): OPConfiguration? {
try {
val issuer: String = configurationUrl.replace(AppConfig.OP_CONFIG_URL, "")
var response: Response<OPConfiguration> =
val response: Response<OPConfiguration> =
ApiAdapter.getInstance(issuer).getOPConfiguration(configurationUrl)
if (response.code() != 200) {
opConfiguration?.isSuccessful = false
Expand Down Expand Up @@ -57,12 +60,17 @@ class OPConfigurationRepository (context: Context){
return false
}

suspend fun getOPConfigurationInDatabase(): OPConfiguration? {
var opConfigurations: List<OPConfiguration>? = appDatabase.opConfigurationDao().getAll()
suspend fun getOPConfiguration(): OPConfiguration? {
val opConfigurations: List<OPConfiguration>? = appDatabase.opConfigurationDao().getAll()
var opConfiguration: OPConfiguration? = null
if(opConfigurations != null && !opConfigurations.isEmpty()) {
opConfiguration = opConfigurations?.let { it -> it.get(0) }
if(!opConfigurations.isNullOrEmpty()) {
opConfiguration = opConfigurations[0]
opConfiguration.isSuccessful = true
return opConfiguration
}
val jwtClaimsSet: JWTClaimsSet = DPoPProofFactory.getClaimsFromSSA()
val issuer: String = jwtClaimsSet.getClaim("iss").toString()
opConfiguration = fetchOPConfiguration(issuer + AppConfig.OP_CONFIG_URL)
return opConfiguration
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ class PlayIntegrityRepository(context: Context) {
suspend fun getAppIntegrityEntityInDatabase(): AppIntegrityEntity? {
var appIntegrityEntities: List<AppIntegrityEntity>? = appDatabase.appIntegrityDao().getAll()
var appIntegrityEntity: AppIntegrityEntity? = null
if(appIntegrityEntities != null && !appIntegrityEntities.isEmpty()) {
appIntegrityEntity = appIntegrityEntities?.let { it -> it.get(0) }
if(!appIntegrityEntities.isNullOrEmpty()) {
appIntegrityEntity = appIntegrityEntities[0]
}
return appIntegrityEntity
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ fun DashboardScreen(
verticalArrangement = Arrangement.Center,
) {

if (mainViewModel.clientRegistered && (mainViewModel.attestationOptionResponse || mainViewModel.assertionOptionResponse)) {
if (mainViewModel.userIsAuthenticated) {
if (mainViewModel.mainState.isClientRegistered && (mainViewModel.mainState.attestationResultSuccess || mainViewModel.mainState.assertionResultSuccess)) {
if (mainViewModel.mainState.isUserIsAuthenticated) {
TitleText(text = stringResource(id = R.string.dashboard_title_welcome) + " " + mainViewModel.getUsername())
if (mainViewModel.getUserInfoResponse().response != null) {
val userInfo = JSONObject(mainViewModel.getUserInfoResponse().response.toString())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ fun LoginScreen(
CoroutineScope(Dispatchers.Main).launch {
loginState = loginState.copy(isLoading = true)
val fidoConfiguration =
async { mainViewModel.fetchFidoConfiguration() }.await()
async { mainViewModel.getFIDOConfiguration() }.await()
if (fidoConfiguration?.isSuccessful == false) {
shouldShowDialog.value = true
dialogContent.value =
Expand Down Expand Up @@ -273,7 +273,7 @@ fun LoginScreen(

val loginResponse: LoginResponse? =
async {
mainViewModel.processlogin(
mainViewModel.processLogin(
ele.userDisplayName,
null,
"authenticate",
Expand Down Expand Up @@ -325,8 +325,8 @@ fun LoginScreen(
return@launch
}
}
mainViewModel.assertionOptionResponse =
true
mainViewModel.mainState = mainViewModel.mainState.copy(assertionOptionSuccess = true)
mainViewModel.mainState = mainViewModel.mainState.copy(assertionResultSuccess = true)
loginViewModel.onUiEvent(
loginUiEvent = LoginUiEvent.Submit
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import io.jans.chip.model.TokenResponse
import io.jans.chip.model.UserInfoResponse
import io.jans.chip.model.fido.attestation.option.AttestationOptionResponse
import io.jans.chip.model.fido.attestation.result.AttestationResultRequest
import io.jans.chip.model.fido.config.FidoConfiguration
import io.jans.chip.model.fido.config.FidoConfigurationResponse
import io.jans.chip.ui.common.customComposableViews.MediumTitleText
import io.jans.chip.ui.common.customComposableViews.SmallClickableWithIconAndText
Expand Down Expand Up @@ -210,7 +211,7 @@ fun RegistrationScreen(
CoroutineScope(Dispatchers.Main).launch {
registrationState = registrationState.copy(isLoading = true)
val loginResponse: LoginResponse? = async {
mainViewModel.processlogin(
mainViewModel.processLogin(
mainViewModel.getUsername(),
mainViewModel.getPassword(),
"enroll",
Expand Down Expand Up @@ -257,8 +258,8 @@ fun RegistrationScreen(
return@launch
}

val fidoConfiguration: FidoConfigurationResponse? =
async { mainViewModel.fetchFidoConfiguration() }.await()
val fidoConfiguration: FidoConfiguration? =
async { mainViewModel.getFIDOConfiguration() }.await()
if (fidoConfiguration?.isSuccessful == false) {
shouldShowDialog.value = true
dialogContent.value =
Expand Down Expand Up @@ -334,14 +335,12 @@ fun RegistrationScreen(
registrationState.copy(isLoading = false)
return@launch
}
mainViewModel.attestationOptionResponse = true
mainViewModel.mainState = mainViewModel.mainState.copy(attestationOptionSuccess = true)
mainViewModel.mainState = mainViewModel.mainState.copy(attestationResultSuccess = true)

registrationViewModel.onUiEvent(
registrationUiEvent = RegistrationUiEvent.Submit
)
registrationViewModel.onUiEvent(registrationUiEvent = RegistrationUiEvent.Submit)

registrationState =
registrationState.copy(isLoading = false)
registrationState = registrationState.copy(isLoading = false)
}
})
}
Expand All @@ -351,8 +350,7 @@ fun RegistrationScreen(
"Biometric authentication is not available!",
Toast.LENGTH_SHORT
).show()
registrationState =
registrationState.copy(isLoading = false)
registrationState = registrationState.copy(isLoading = false)
}
}
)
Expand Down
Loading

0 comments on commit 3131cbd

Please sign in to comment.