From 79b55d3ec76344e76c06445f3bdf782488b2c35d Mon Sep 17 00:00:00 2001 From: hasibprince Date: Tue, 2 May 2023 19:17:52 +0600 Subject: [PATCH 1/3] introduced auth validation before update process --- .../e/apps/login/AuthDataValidator.kt | 8 ++++++++ .../foundation/e/apps/login/LoginSourceGPlay.kt | 17 ++++++++++++++++- .../e/apps/login/LoginSourceRepository.kt | 7 +++++++ .../e/apps/updates/manager/UpdatesWorker.kt | 5 ++++- 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt 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 000000000..7afcb0d72 --- /dev/null +++ b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt @@ -0,0 +1,8 @@ +package foundation.e.apps.login + +import com.aurora.gplayapi.data.models.AuthData +import foundation.e.apps.api.ResultSupreme + +interface AuthDataValidator { + suspend fun fetchValidatedAuthData(): 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 b77c57a8b..ab2ff5bc9 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -19,9 +19,11 @@ package foundation.e.apps.login import android.content.Context import com.aurora.gplayapi.data.models.AuthData +import com.aurora.gplayapi.helpers.AuthValidator import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.api.ResultSupreme +import foundation.e.apps.api.gplay.utils.GPlayHttpClient import foundation.e.apps.login.api.GPlayApiFactory import foundation.e.apps.login.api.GPlayLoginInterface import foundation.e.apps.login.api.GoogleLoginApi @@ -44,11 +46,14 @@ 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 + @Inject + lateinit var gPlayHttpClient: GPlayHttpClient + private val user: User get() = loginDataStore.getUserType() @@ -251,4 +256,14 @@ class LoginSourceGPlay @Inject constructor( ) } } + + override suspend fun fetchValidatedAuthData(): ResultSupreme { + val savedAuth = getSavedAuthData() + val isValid = AuthValidator(savedAuth!!).using(gPlayHttpClient).isValid() + if (!isValid) { + return generateAuthData() + } + + return ResultSupreme.create(ResultStatus.OK, savedAuth) + } } 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 ddc4bb392..75051bb9a 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.fetchValidatedAuthData() + } } 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 0ac61c893..306e4b214 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( -- GitLab From 3685137b9095bbf7a4fcebd742eeb0bec8408ee1 Mon Sep 17 00:00:00 2001 From: hasibprince Date: Thu, 4 May 2023 01:43:59 +0600 Subject: [PATCH 2/3] refactor: reused validation code --- .../e/apps/login/AuthDataValidator.kt | 2 +- .../e/apps/login/LoginSourceGPlay.kt | 48 ++++++++++--------- .../e/apps/login/LoginSourceRepository.kt | 2 +- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt index 7afcb0d72..88710cc64 100644 --- a/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt +++ b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt @@ -4,5 +4,5 @@ import com.aurora.gplayapi.data.models.AuthData import foundation.e.apps.api.ResultSupreme interface AuthDataValidator { - suspend fun fetchValidatedAuthData(): ResultSupreme + suspend fun fetchAuthData(): 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 ab2ff5bc9..6e739625d 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -19,11 +19,9 @@ package foundation.e.apps.login import android.content.Context import com.aurora.gplayapi.data.models.AuthData -import com.aurora.gplayapi.helpers.AuthValidator import com.google.gson.Gson import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.api.ResultSupreme -import foundation.e.apps.api.gplay.utils.GPlayHttpClient import foundation.e.apps.login.api.GPlayApiFactory import foundation.e.apps.login.api.GPlayLoginInterface import foundation.e.apps.login.api.GoogleLoginApi @@ -31,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 @@ -51,9 +50,6 @@ class LoginSourceGPlay @Inject constructor( @Inject lateinit var gPlayApiFactory: GPlayApiFactory - @Inject - lateinit var gPlayHttpClient: GPlayHttpClient - private val user: User get() = loginDataStore.getUserType() @@ -83,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 @@ -243,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, @@ -257,13 +253,21 @@ class LoginSourceGPlay @Inject constructor( } } - override suspend fun fetchValidatedAuthData(): ResultSupreme { + override suspend fun fetchAuthData(): ResultSupreme { val savedAuth = getSavedAuthData() - val isValid = AuthValidator(savedAuth!!).using(gPlayHttpClient).isValid() - if (!isValid) { - return generateAuthData() + 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 75051bb9a..266c34145 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt @@ -63,6 +63,6 @@ class LoginSourceRepository @Inject constructor( suspend fun getValidatedAuthData(): ResultSupreme { val authDataValidator = (sources.find { it is AuthDataValidator } as AuthDataValidator) - return authDataValidator.fetchValidatedAuthData() + return authDataValidator.fetchAuthData() } } -- GitLab From 699cad48c0ffc27ba4ac979795e4bb5ec1aab146 Mon Sep 17 00:00:00 2001 From: hasibprince Date: Mon, 8 May 2023 14:24:33 +0600 Subject: [PATCH 3/3] copyright text is added --- .../e/apps/login/AuthDataValidator.kt | 20 ++++++++++++++++++- .../e/apps/login/LoginSourceGPlay.kt | 2 +- .../e/apps/login/LoginSourceRepository.kt | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt index 88710cc64..32bcc7bd7 100644 --- a/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt +++ b/app/src/main/java/foundation/e/apps/login/AuthDataValidator.kt @@ -1,8 +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 fetchAuthData(): ResultSupreme + 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 6e739625d..323ae6e82 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceGPlay.kt @@ -253,7 +253,7 @@ class LoginSourceGPlay @Inject constructor( } } - override suspend fun fetchAuthData(): ResultSupreme { + override suspend fun validateAuthData(): ResultSupreme { val savedAuth = getSavedAuthData() if (!isAuthDataValid(savedAuth)) { Timber.i("Validating AuthData...") 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 266c34145..86fc92279 100644 --- a/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt +++ b/app/src/main/java/foundation/e/apps/login/LoginSourceRepository.kt @@ -63,6 +63,6 @@ class LoginSourceRepository @Inject constructor( suspend fun getValidatedAuthData(): ResultSupreme { val authDataValidator = (sources.find { it is AuthDataValidator } as AuthDataValidator) - return authDataValidator.fetchAuthData() + return authDataValidator.validateAuthData() } } -- GitLab