Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ buildscript {
ext.preferenceVersion = '1.2.0'
ext.recyclerviewVersion = '1.3.2'
ext.webkitVersion = '1.10.0'
ext.workVersion = '2.7.0'

ext.slf4jVersion = '1.7.36'
ext.volleyVersion = '1.2.1'
Expand Down
2 changes: 2 additions & 0 deletions play-services-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ dependencies {

implementation "androidx.lifecycle:lifecycle-service:$lifecycleVersion"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"

implementation "androidx.work:work-runtime-ktx:$workVersion"
}

android {
Expand Down
3 changes: 1 addition & 2 deletions play-services-core/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -412,8 +412,7 @@
</receiver>

<receiver
android:name="org.microg.gms.gcm.UnregisterReceiver"
android:process=":persistent">
android:name="org.microg.gms.common.PersistentTrustedReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import org.microg.gms.auth.signin.scopeUris
import org.microg.gms.common.Constants
import org.microg.gms.common.GmsService
import org.microg.gms.common.PackageUtils
import java.util.concurrent.atomic.AtomicInteger

private const val TAG = "AuthorizationService"

Expand All @@ -60,17 +61,16 @@ class AuthorizationService : BaseService(TAG, GmsService.AUTHORIZATION) {

class AuthorizationServiceImpl(val context: Context, val packageName: String, override val lifecycle: Lifecycle) : IAuthorizationService.Stub(), LifecycleOwner {

companion object{
private val nextRequestCode = AtomicInteger(0)
}

override fun authorize(callback: IAuthorizationCallback?, request: AuthorizationRequest?) {
Log.d(TAG, "Method: authorize called, request:$request")
lifecycleScope.launchWhenStarted {
val account = request?.account ?: SignInConfigurationService.getDefaultAccount(context, packageName)
if (account == null) {
Log.d(TAG, "Method: authorize called, but account is null")
callback?.onAuthorized(Status.CANCELED, null)
return@launchWhenStarted
}
val googleSignInOptions = GoogleSignInOptions.Builder().apply {
setAccountName(account.name)
account?.name?.let { setAccountName(it) }
request?.requestedScopes?.forEach { requestScopes(it) }
if (request?.idTokenRequested == true && request.serverClientId != null) requestIdToken(request.serverClientId)
if (request?.serverAuthCodeRequested == true && request.serverClientId != null) requestServerAuthCode(request.serverClientId, request.forceCodeForRefreshToken)
Expand All @@ -79,15 +79,15 @@ class AuthorizationServiceImpl(val context: Context, val packageName: String, ov
`package` = Constants.GMS_PACKAGE_NAME
putExtra("config", SignInConfiguration(packageName, googleSignInOptions))
}
val signInAccount = performSignIn(context, packageName, googleSignInOptions, account, false)
val signInAccount = account?.let { performSignIn(context, packageName, googleSignInOptions, account, false) }
callback?.onAuthorized(Status.SUCCESS,
AuthorizationResult(
signInAccount?.serverAuthCode,
signInAccount?.idToken,
signInAccount?.idToken,
signInAccount?.grantedScopes?.toList().orEmpty().map { it.scopeUri },
signInAccount,
PendingIntent.getActivity(context, account.hashCode(), intent, FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE)
PendingIntent.getActivity(context, nextRequestCode.incrementAndGet(), intent, FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE)
).also { Log.d(TAG, "authorize: result:$it") })
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

package org.microg.gms.auth.credentials.identity

import android.accounts.AccountManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
Expand All @@ -14,6 +13,9 @@ import android.util.Base64
import android.util.Log
import androidx.core.app.PendingIntentCompat
import androidx.core.os.bundleOf
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.google.android.gms.auth.api.identity.BeginSignInRequest
import com.google.android.gms.auth.api.identity.BeginSignInResult
import com.google.android.gms.auth.api.identity.GetPhoneNumberHintIntentRequest
Expand All @@ -34,16 +36,17 @@ import com.google.android.gms.fido.common.Transport
import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialDescriptor
import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialRequestOptions
import com.google.android.gms.fido.fido2.api.common.UserVerificationRequirement
import kotlinx.coroutines.launch
import org.json.JSONArray
import org.json.JSONObject
import org.microg.gms.BaseService
import org.microg.gms.auth.AuthConstants
import org.microg.gms.auth.signin.ACTION_ASSISTED_SIGN_IN
import org.microg.gms.auth.signin.BEGIN_SIGN_IN_REQUEST
import org.microg.gms.auth.signin.GET_SIGN_IN_INTENT_REQUEST
import org.microg.gms.auth.credentials.FEATURES
import org.microg.gms.auth.signin.CLIENT_PACKAGE_NAME
import org.microg.gms.auth.signin.GOOGLE_SIGN_IN_OPTIONS
import org.microg.gms.auth.signin.SignInConfigurationService
import org.microg.gms.auth.signin.performSignOut
import org.microg.gms.common.GmsService
import org.microg.gms.fido.core.Database
Expand All @@ -61,13 +64,13 @@ class IdentitySignInService : BaseService(TAG, GmsService.IDENTITY_SIGN_IN) {
val connectionInfo = ConnectionInfo()
connectionInfo.features = FEATURES
callback.onPostInitCompleteWithConnectionInfo(
ConnectionResult.SUCCESS, IdentitySignInServiceImpl(this, request.packageName).asBinder(), connectionInfo
ConnectionResult.SUCCESS, IdentitySignInServiceImpl(this, request.packageName, lifecycle).asBinder(), connectionInfo
)
}
}

class IdentitySignInServiceImpl(private val context: Context, private val clientPackageName: String) :
ISignInService.Stub() {
class IdentitySignInServiceImpl(private val context: Context, private val clientPackageName: String, override val lifecycle: Lifecycle) :
ISignInService.Stub(), LifecycleOwner {

private val requestMap = mutableMapOf<String, GoogleSignInOptions>()

Expand Down Expand Up @@ -130,10 +133,13 @@ class IdentitySignInServiceImpl(private val context: Context, private val client

override fun signOut(callback: IStatusCallback, requestTag: String) {
Log.d(TAG, "method signOut called, requestTag=$requestTag")
if (requestMap.containsKey(requestTag)) {
val accounts = AccountManager.get(context).getAccountsByType(AuthConstants.DEFAULT_ACCOUNT_TYPE)
if (accounts.isNotEmpty()) {
accounts.forEach { performSignOut(context, clientPackageName, requestMap[requestTag], it) }
lifecycleScope.launch {
val signInAccount = SignInConfigurationService.getDefaultAccount(context, clientPackageName)
val authOptions = SignInConfigurationService.getAuthOptions(context, clientPackageName).plus(requestMap[requestTag])
if (signInAccount != null && authOptions.isNotEmpty()) {
authOptions.forEach {
performSignOut(context, clientPackageName, it, signInAccount)
}
}
}
callback.onResult(Status.SUCCESS)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package org.microg.gms.auth.signin

import android.accounts.Account
import android.accounts.AccountManager
import android.content.Context
import android.os.Bundle
import android.os.Parcel
Expand All @@ -39,7 +38,6 @@ import com.google.android.gms.common.internal.ConnectionInfo
import com.google.android.gms.common.internal.GetServiceRequest
import com.google.android.gms.common.internal.IGmsCallbacks
import org.microg.gms.BaseService
import org.microg.gms.auth.AuthConstants
import org.microg.gms.auth.AuthPrefs
import org.microg.gms.common.GmsService
import org.microg.gms.common.PackageUtils
Expand Down Expand Up @@ -122,14 +120,15 @@ class AuthSignInServiceImpl(
try {
val account = account ?: options?.account ?: SignInConfigurationService.getDefaultAccount(context, packageName)
if (account != null) {
val defaultOptions = SignInConfigurationService.getDefaultOptions(context, packageName)
Log.d(TAG, "$packageName:signOut defaultOptions:($defaultOptions)")
performSignOut(context, packageName, defaultOptions ?: options, account)
SignInConfigurationService.getAuthOptions(context, packageName).forEach {
Log.d(TAG, "$packageName:signOut authOption:($it)")
performSignOut(context, packageName, it, account)
}
}
if (options?.scopes?.any { it.scopeUri.contains(Scopes.GAMES) } == true) {
GamesConfigurationService.setDefaultAccount(context, packageName, null)
}
SignInConfigurationService.setDefaultSignInInfo(context, packageName, null, null)
SignInConfigurationService.setAuthInfo(context, packageName, null, null)
runCatching { callbacks.onSignOut(Status.SUCCESS) }
} catch (e: Exception) {
Log.w(TAG, e)
Expand Down Expand Up @@ -162,7 +161,7 @@ class AuthSignInServiceImpl(
authManager.invalidateAuthToken(token)
authManager.isPermitted = false
}
SignInConfigurationService.setDefaultSignInInfo(context, packageName, account, options?.toJson())
SignInConfigurationService.setAuthInfo(context, packageName, account, options?.toJson())
runCatching { callbacks.onRevokeAccess(Status.SUCCESS) }
} catch (e: Exception) {
Log.w(TAG, e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class SignInConfigurationService : Service() {
val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME)
val account = msg.data?.getParcelable<Account>(MSG_DATA_ACCOUNT)
val googleSignInOptions = msg.data?.getString(MSG_DATA_SIGN_IN_OPTIONS)
packageName?.let { setDefaultSignInInfo(it, account, googleSignInOptions) }
packageName?.let { setAuthInfo(it, account, googleSignInOptions) }
bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account,
Expand All @@ -64,10 +64,10 @@ class SignInConfigurationService : Service() {

MSG_GET_DEFAULT_OPTIONS -> {
val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME)
val googleSignInOptions = packageName?.let { getDefaultOptions(it) }
val googleSignInOptions = packageName?.let { getAuthOptions(it) }
bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_SIGN_IN_OPTIONS to googleSignInOptions
MSG_DATA_SIGN_IN_OPTIONS to googleSignInOptions?.toTypedArray()
)
}

Expand Down Expand Up @@ -95,23 +95,27 @@ class SignInConfigurationService : Service() {
return null
}

private fun getDefaultOptions(packageName: String): String? {
val data = preferences.getString(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName), null)
if (data.isNullOrBlank()) return null
private fun getAuthOptions(packageName: String): Set<String>? {
val data = preferences.getStringSet(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName), null)
if (data.isNullOrEmpty()) return null
return data
}

private fun setDefaultSignInInfo(packageName: String, account: Account?, optionsJson: String?) {
private fun setAuthInfo(packageName: String, account: Account?, optionsJson: String?) {
val editor: SharedPreferences.Editor = preferences.edit()
val accountPrefix = DEFAULT_ACCOUNT_PREFIX + getPackageNameSuffix(packageName)
val optionsPrefix = DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName)
if (account == null || account.name == AuthConstants.DEFAULT_ACCOUNT) {
editor.remove(DEFAULT_ACCOUNT_PREFIX + getPackageNameSuffix(packageName))
editor.remove(accountPrefix)
editor.remove(optionsPrefix)
} else {
editor.putString(DEFAULT_ACCOUNT_PREFIX + getPackageNameSuffix(packageName), account.name)
editor.putString(accountPrefix, account.name)
}
if (optionsJson == null) {
editor.remove(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName))
} else {
editor.putString(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName), optionsJson)
if (optionsJson != null) {
val savedOptions = preferences.getStringSet(optionsPrefix, emptySet()) ?: emptySet()
val newSet = HashSet(savedOptions)
newSet.add(optionsJson)
editor.putStringSet(optionsPrefix, newSet)
}
editor.apply()
}
Expand Down Expand Up @@ -156,16 +160,16 @@ class SignInConfigurationService : Service() {
}).data?.getParcelable(MSG_DATA_ACCOUNT)
}

suspend fun getDefaultOptions(context: Context, packageName: String): GoogleSignInOptions? {
suspend fun getAuthOptions(context: Context, packageName: String): Set<GoogleSignInOptions> {
return singleRequest(context, Message.obtain().apply {
what = MSG_GET_DEFAULT_OPTIONS
data = bundleOf(
MSG_DATA_PACKAGE_NAME to packageName
)
}).data?.getString(MSG_DATA_SIGN_IN_OPTIONS)?.let { GoogleSignInOptions.fromJson(it) }
}).data?.getStringArray(MSG_DATA_SIGN_IN_OPTIONS)?.map { GoogleSignInOptions.fromJson(it) }?.toSet() ?: emptySet()
}

suspend fun setDefaultSignInInfo(context: Context, packageName: String, account: Account?, optionsJson: String?) {
suspend fun setAuthInfo(context: Context, packageName: String, account: Account?, optionsJson: String?) {
singleRequest(context, Message.obtain().apply {
what = MSG_SET_DEFAULT_SIGN_IN_INFO
data = bundleOf(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ suspend fun performSignIn(context: Context, packageName: String, options: Google
if (options?.includeGame == true) {
GamesConfigurationService.setDefaultAccount(context, packageName, account)
}
SignInConfigurationService.setDefaultSignInInfo(context, packageName, account, options?.toJson())
SignInConfigurationService.setAuthInfo(context, packageName, account, options?.toJson())
return GoogleSignInAccount(
id,
tokenId,
Expand Down
Loading
Loading