Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7d344f4 authored by Hasib Prince's avatar Hasib Prince
Browse files

added google login components

parent e9a0d6dc
Loading
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
package app.lounge.gplay

class GplayException(var errorCode: Int, message: String) : Exception(message)
 No newline at end of file
+24 −5
Original line number Diff line number Diff line
@@ -5,8 +5,10 @@ import com.aurora.gplayapi.network.IHttpClient
import okhttp3.Headers.Companion.toHeaders
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import timber.log.Timber
import java.net.SocketTimeoutException
@@ -58,7 +60,17 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt
    }

    override fun post(url: String, headers: Map<String, String>, body: ByteArray): PlayResponse {
        TODO("Not yet implemented")
        val requestBody = body.toRequestBody(
            "application/x-protobuf".toMediaType(),
            0,
            body.size
        )
        val request = Request.Builder()
            .url(url)
            .headers(headers.toHeaders())
            .method(POST, requestBody)
            .build()
        return processRequest(request)
    }

    override fun post(
@@ -66,7 +78,12 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt
        headers: Map<String, String>,
        params: Map<String, String>
    ): PlayResponse {
        TODO("Not yet implemented")
        val request = Request.Builder()
            .url(buildUrlWithQueryParameters(url, params))
            .headers(headers.toHeaders())
            .method(POST, "".toRequestBody(null))
            .build()
        return processRequest(request)
    }

    override fun postAuth(url: String, body: ByteArray): PlayResponse {
@@ -91,6 +108,7 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt
                is SocketTimeoutException -> handleExceptionOnGooglePlayRequest(e)
                else -> handleExceptionOnGooglePlayRequest(e)
            }
            throw e
        }
    }

@@ -108,8 +126,8 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt

            Timber.d("Url: ${response.request.url}\nStatus: $code")

            if (code == 401) {
                // TODO Handle the case of Unauthorized user
            if (code != 200) {
                throw GplayException(code, response.message)
            }

            if (response.body != null) {
@@ -122,3 +140,4 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt
        }
    }
}
+46 −0
Original line number Diff line number Diff line
package app.lounge.login.google

import app.lounge.gplay.GplayHttpClient
import com.aurora.gplayapi.data.models.PlayResponse
import java.util.Locale
import javax.inject.Inject

class AuthTokenFetchApi @Inject constructor(private val gplayHttpClient: GplayHttpClient) {
    companion object {
        private const val TOKEN_AUTH_URL = "https://android.clients.google.com/auth"
        private const val BUILD_VERSION_SDK = 28
        private const val PLAY_SERVICES_VERSION_CODE = 19629032
    }

    fun getAuthTokenPlayResponse(email: String?, oAuthToken: String?): PlayResponse {
        if (email == null || oAuthToken == null)
            return PlayResponse()

        val params: MutableMap<String, Any> = hashMapOf()
        params["lang"] = Locale.getDefault().toString().replace("_", "-")
        params["google_play_services_version"] = PLAY_SERVICES_VERSION_CODE
        params["sdk_version"] = BUILD_VERSION_SDK
        params["device_country"] = Locale.getDefault().country.lowercase(Locale.US)
        params["Email"] = email
        params["service"] = "ac2dm"
        params["get_accountid"] = 1
        params["ACCESS_TOKEN"] = 1
        params["callerPkg"] = "com.google.android.gms"
        params["add_account"] = 1
        params["Token"] = oAuthToken
        params["callerSig"] = "38918a453d07199354f8b19af05ec6562ced5788"

        val body = params.map { "${it.key}=${it.value}" }.joinToString(separator = "&")
        val header = mapOf(
            "app" to "com.google.android.gms",
            "User-Agent" to "",
            "Content-Type" to "application/x-www-form-urlencoded"
        )

        /*
         * Returning PlayResponse instead of map so that we can get the network response code.
         * Issue: https://gitlab.e.foundation/e/backlog/-/issues/5709
         */
        return gplayHttpClient.post(TOKEN_AUTH_URL, header, body.toByteArray())
    }
}
 No newline at end of file
+11 −0
Original line number Diff line number Diff line
package app.lounge.login.google

import app.lounge.model.GoogleAuthDataRequestBody
import app.lounge.networking.NetworkResult
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.PlayResponse

interface GoogleLoginApi {
    suspend fun getAuthTokenPlayResponse(email: String, oauthToken: String): NetworkResult<PlayResponse>
    suspend fun validate(authData: AuthData): NetworkResult<Boolean>
}
 No newline at end of file
+32 −0
Original line number Diff line number Diff line
package app.lounge.login.google

import app.lounge.gplay.GplayHttpClient
import app.lounge.networking.fetchPlayResponse
import app.lounge.networking.NetworkResult
import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.data.models.PlayResponse
import com.aurora.gplayapi.helpers.AuthValidator
import javax.inject.Inject

class GoogleLoginApiImpl @Inject constructor(
    private val gplayHttpClient: GplayHttpClient,
    private val authTokenFetchApi: AuthTokenFetchApi
) : GoogleLoginApi {

    override suspend fun getAuthTokenPlayResponse(
        email: String,
        oauthToken: String
    ): NetworkResult<PlayResponse> {
        return fetchPlayResponse {
            authTokenFetchApi.getAuthTokenPlayResponse(email, oauthToken)
        }
    }

    override suspend fun validate(authData: AuthData): NetworkResult<Boolean> {
        return fetchPlayResponse {
            val authValidator = AuthValidator(authData).using(gplayHttpClient)
            authValidator.isValid()
        }
    }

}
 No newline at end of file
Loading