Loading modules/src/main/java/app/lounge/gplay/GplayException.kt 0 → 100644 +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 modules/src/main/java/app/lounge/gplay/GplayHttpClient.kt +24 −5 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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( Loading @@ -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 { Loading @@ -91,6 +108,7 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt is SocketTimeoutException -> handleExceptionOnGooglePlayRequest(e) else -> handleExceptionOnGooglePlayRequest(e) } throw e } } Loading @@ -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) { Loading @@ -122,3 +140,4 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt } } } modules/src/main/java/app/lounge/login/google/AuthTokenFetchApi.kt 0 → 100644 +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 modules/src/main/java/app/lounge/login/google/GoogeLoginApi.kt 0 → 100644 +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 modules/src/main/java/app/lounge/login/google/GoogleLoginApiImpl.kt 0 → 100644 +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
modules/src/main/java/app/lounge/gplay/GplayException.kt 0 → 100644 +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
modules/src/main/java/app/lounge/gplay/GplayHttpClient.kt +24 −5 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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( Loading @@ -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 { Loading @@ -91,6 +108,7 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt is SocketTimeoutException -> handleExceptionOnGooglePlayRequest(e) else -> handleExceptionOnGooglePlayRequest(e) } throw e } } Loading @@ -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) { Loading @@ -122,3 +140,4 @@ class GplayHttpClient @Inject constructor(@Named("privateOkHttpClient") val okHt } } }
modules/src/main/java/app/lounge/login/google/AuthTokenFetchApi.kt 0 → 100644 +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
modules/src/main/java/app/lounge/login/google/GoogeLoginApi.kt 0 → 100644 +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
modules/src/main/java/app/lounge/login/google/GoogleLoginApiImpl.kt 0 → 100644 +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