diff --git a/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt new file mode 100644 index 0000000000000000000000000000000000000000..32bcc7bd7604d7d9c8a8fcf9055323494eafccea --- /dev/null +++ b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt @@ -0,0 +1,26 @@ +/* + * Copyright MURENA SAS 2023 + * Apps Quickly and easily install Android apps onto your device! + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package foundation.e.apps.login + +import com.aurora.gplayapi.data.models.AuthData +import foundation.e.apps.api.ResultSupreme + +interface AuthDataValidator { + suspend fun validateAuthData(): ResultSupreme +} \ No newline at end of file diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt index b77c57a8b23c28acc641f67b61edf045403e6d38..323ae6e823f124f64df4b8249aeb2a94974c0f46 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -29,6 +29,7 @@ import foundation.e.apps.login.api.LoginApiRepository import foundation.e.apps.utils.enums.ResultStatus import foundation.e.apps.utils.enums.User import foundation.e.apps.utils.exceptions.GPlayValidationException +import timber.log.Timber import java.util.Locale import javax.inject.Inject import javax.inject.Singleton @@ -44,7 +45,7 @@ class LoginSourceGPlay @Inject constructor( @ApplicationContext private val context: Context, private val gson: Gson, private val loginDataStore: LoginDataStore, -) : LoginSourceInterface { +) : LoginSourceInterface, AuthDataValidator { @Inject lateinit var gPlayApiFactory: GPlayApiFactory @@ -78,14 +79,14 @@ class LoginSourceGPlay @Inject constructor( val savedAuth = getSavedAuthData() val authData = ( - savedAuth ?: run { - // if no saved data, then generate new auth data. - generateAuthData().let { - if (it.isSuccess()) it.data!! - else return AuthObject.GPlayAuth(it, user) + savedAuth ?: run { + // if no saved data, then generate new auth data. + generateAuthData().let { + if (it.isSuccess()) it.data!! + else return AuthObject.GPlayAuth(it, user) + } } - } - ) + ) val formattedAuthData = formatAuthData(authData) formattedAuthData.locale = locale @@ -238,12 +239,12 @@ class LoginSourceGPlay @Inject constructor( } else { val message = "Validating AuthData failed.\n" + - "Network code: ${playResponse?.code}\n" + - "Success: ${playResponse?.isSuccessful}" + - playResponse?.errorString?.run { - if (isNotBlank()) "\nError message: $this" - else "" - } + "Network code: ${playResponse?.code}\n" + + "Success: ${playResponse?.isSuccessful}" + + playResponse?.errorString?.run { + if (isNotBlank()) "\nError message: $this" + else "" + } ResultSupreme.Error( message, @@ -251,4 +252,22 @@ class LoginSourceGPlay @Inject constructor( ) } } + + override suspend fun validateAuthData(): ResultSupreme { + val savedAuth = getSavedAuthData() + if (!isAuthDataValid(savedAuth)) { + Timber.i("Validating AuthData...") + val authData = generateAuthData() + authData.data?.let { + saveAuthData(it) + return authData + } + return ResultSupreme.create(ResultStatus.UNKNOWN) + } + + return ResultSupreme.create(ResultStatus.OK, savedAuth) + } + + private suspend fun isAuthDataValid(savedAuth: AuthData?) = + savedAuth != null && loginApiRepository.login(savedAuth).exception == null } diff --git a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt index ddc4bb392f7e478cef09cbdb36ad7ad4de5dfc7f..86fc9227967ae8b2c47722ef7ec753afc51b9a4f 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt @@ -17,6 +17,8 @@ package foundation.e.apps.login +import com.aurora.gplayapi.data.models.AuthData +import foundation.e.apps.api.ResultSupreme import foundation.e.apps.utils.enums.User import javax.inject.Inject import javax.inject.Singleton @@ -58,4 +60,9 @@ class LoginSourceRepository @Inject constructor( suspend fun logout() { loginCommon.logout() } + + suspend fun getValidatedAuthData(): ResultSupreme { + val authDataValidator = (sources.find { it is AuthDataValidator } as AuthDataValidator) + return authDataValidator.validateAuthData() + } } diff --git a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt index 0ac61c8933eb10937e93bc0716fa6b42edcd2fe6..306e4b2149703041e0cb756f5d5a6608a731ed37 100644 --- a/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt +++ b/app/src/main/java/foundation/e/apps/updates/manager/UpdatesWorker.kt @@ -23,6 +23,7 @@ import foundation.e.apps.api.ResultSupreme import foundation.e.apps.api.cleanapk.CleanAPKInterface import foundation.e.apps.api.fused.FusedAPIRepository import foundation.e.apps.api.fused.data.FusedApp +import foundation.e.apps.login.LoginSourceRepository import foundation.e.apps.manager.database.fusedDownload.FusedDownload import foundation.e.apps.manager.fused.FusedManagerRepository import foundation.e.apps.manager.workmanager.InstallWorkManager @@ -49,6 +50,7 @@ class UpdatesWorker @AssistedInject constructor( private val fusedAPIRepository: FusedAPIRepository, private val fusedManagerRepository: FusedManagerRepository, private val dataStoreManager: DataStoreManager, + private val loginSourceRepository: LoginSourceRepository, private val gson: Gson, ) : CoroutineWorker(context, params) { @@ -110,7 +112,7 @@ class UpdatesWorker @AssistedInject constructor( val isConnectedToUnmeteredNetwork = isConnectedToUnmeteredNetwork(applicationContext) val appsNeededToUpdate = mutableListOf() val user = getUser() - val authData = getAuthData() + val authData = loginSourceRepository.getValidatedAuthData().data val resultStatus: ResultStatus if (user in listOf(User.ANONYMOUS, User.GOOGLE) && authData != null) { @@ -225,6 +227,7 @@ class UpdatesWorker @AssistedInject constructor( if (!fusedApp.isFree && authData.isAnonymous) { return@forEach } + val iconBase64 = getIconImageToBase64(fusedApp) val fusedDownload = FusedDownload(