diff --git a/app/src/main/java/com/aurora/store/compose/ui/accounts/GoogleLoginScreen.kt b/app/src/main/java/com/aurora/store/compose/ui/accounts/GoogleLoginScreen.kt index 7dbdb7131..ff20573bf 100644 --- a/app/src/main/java/com/aurora/store/compose/ui/accounts/GoogleLoginScreen.kt +++ b/app/src/main/java/com/aurora/store/compose/ui/accounts/GoogleLoginScreen.kt @@ -40,8 +40,16 @@ import com.aurora.store.viewmodel.auth.AuthViewModel private const val EMBEDDED_SETUP_URL = "https://accounts.google.com/EmbeddedSetup" private const val AUTH_TOKEN = "oauth_token" -private const val JS_PROFILE_EMAIL = - "(function() { return document.getElementById('profileIdentifier').innerHTML; })();" + +// Google's EmbeddedSetup post-login page renders the account as e.g. +//
...
; +// the legacy id="profileIdentifier" selector no longer matches. +private const val JS_PROFILE_EMAIL = """ + (function() { + var el = document.querySelector('[data-profile-identifier][data-email]'); + return el ? el.getAttribute('data-email') : null; + })(); +""" @Composable fun GoogleLoginScreen( @@ -120,16 +128,12 @@ fun GoogleLoginScreen( webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView, url: String) { - val cookies = CookieManager.getInstance().getCookie(url) - if (cookies != null) { - val cookieMap = AC2DMUtil.parseCookieString(cookies) - if (cookieMap.isNotEmpty() && cookieMap[AUTH_TOKEN] != null) { - val oauthToken = cookieMap[AUTH_TOKEN] - view.evaluateJavascript(JS_PROFILE_EMAIL) { result -> - val email = result.replace("\"", "") - viewModel.buildAuthData(view.context, email, oauthToken) - } - } + val cookies = CookieManager.getInstance().getCookie(url) ?: return + val cookieMap = AC2DMUtil.parseCookieString(cookies) + val oauthToken = cookieMap[AUTH_TOKEN] ?: return + view.evaluateJavascript(JS_PROFILE_EMAIL) { result -> + val email = result.trim('"') + viewModel.buildAuthData(view.context, email, oauthToken) } } } diff --git a/app/src/main/java/com/aurora/store/util/AC2DMTask.kt b/app/src/main/java/com/aurora/store/util/AC2DMTask.kt index d5415a728..a5099ca16 100644 --- a/app/src/main/java/com/aurora/store/util/AC2DMTask.kt +++ b/app/src/main/java/com/aurora/store/util/AC2DMTask.kt @@ -27,11 +27,7 @@ import okhttp3.RequestBody.Companion.toRequestBody class AC2DMTask @Inject constructor(private val httpClient: HttpClient) { @Throws(Exception::class) - fun getAC2DMResponse(email: String?, oAuthToken: String?): Map { - if (email == null || oAuthToken == null) { - return mapOf() - } - + fun getAC2DMResponse(email: String, oAuthToken: String): Map { val params: MutableMap = hashMapOf() params["lang"] = Locale.getDefault().toString().replace("_", "-") params["google_play_services_version"] = PLAY_SERVICES_VERSION_CODE @@ -60,7 +56,7 @@ class AC2DMTask @Inject constructor(private val httpClient: HttpClient) { return if (response.isSuccessful) { AC2DMUtil.parseResponse(String(response.responseBytes)) } else { - mapOf() + emptyMap() } } diff --git a/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt index 428ca10b9..b2e36496e 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/auth/AuthViewModel.kt @@ -39,13 +39,13 @@ import com.aurora.store.util.PackageUtil import com.aurora.store.util.Preferences import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext -import java.net.ConnectException -import java.net.UnknownHostException -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import java.net.ConnectException +import java.net.UnknownHostException +import javax.inject.Inject @HiltViewModel class AuthViewModel @Inject constructor( @@ -92,16 +92,19 @@ class AuthViewModel @Inject constructor( } } - fun buildAuthData(context: Context, email: String, oauthToken: String?) { + fun buildAuthData(context: Context, email: String, oauthToken: String) { viewModelScope.launch(Dispatchers.IO) { try { val response = aC2DMTask.getAC2DMResponse(email, oauthToken) if (response.isNotEmpty()) { val aasToken = response["Token"] if (aasToken != null) { - Preferences.putString(context, Constants.ACCOUNT_EMAIL_PLAIN, email) + val accountEmail = response["Email"]?.takeIf { it.isNotBlank() } ?: email + Preferences.putString(context, Constants.ACCOUNT_EMAIL_PLAIN, accountEmail) Preferences.putString(context, Constants.ACCOUNT_AAS_PLAIN, aasToken) - AuroraApp.events.send(AuthEvent.GoogleLogin(true, email, aasToken)) + AuroraApp.events.send( + AuthEvent.GoogleLogin(true, accountEmail, aasToken) + ) } else { Preferences.putString(context, Constants.ACCOUNT_EMAIL_PLAIN, "") Preferences.putString(context, Constants.ACCOUNT_AAS_PLAIN, "") @@ -191,8 +194,8 @@ class AuthViewModel @Inject constructor( context, Preferences.PREFERENCE_AUTH_VIA_MICROG, accountType == AccountType.GOOGLE && - tokenType == AuthHelper.Token.AUTH && - PackageUtil.hasSupportedMicroGVariant(context) + tokenType == AuthHelper.Token.AUTH && + PackageUtil.hasSupportedMicroGVariant(context) ) _authState.value = AuthState.SignedIn } else {