diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java b/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java index 2c09c829..cd767fb8 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java @@ -30,8 +30,6 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; -import com.google.android.gms.R; - import org.microg.gms.common.PackageUtils; import java.util.Arrays; @@ -52,7 +50,12 @@ public class AccountContentProvider extends ContentProvider { @Nullable @Override public Bundle call(String method, String arg, Bundle extras) { - String packageName = PackageUtils.packageFromProcessId(getContext(), Binder.getCallingPid()); + String suggestedPackageName = null; + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { + suggestedPackageName = getCallingPackage(); + } + String packageName = PackageUtils.getAndCheckCallingPackage(getContext(), suggestedPackageName); + Log.d(TAG, "Call from " + packageName); if (!PackageUtils.callerHasExtendedAccess(getContext())) { String[] packagesForUid = getContext().getPackageManager().getPackagesForUid(Binder.getCallingUid()); if (packagesForUid != null && packagesForUid.length != 0) @@ -64,7 +67,14 @@ public class AccountContentProvider extends ContentProvider { if (PROVIDER_METHOD_GET_ACCOUNTS.equals(method) && AuthConstants.DEFAULT_ACCOUNT_TYPE.equals(arg)) { Bundle result = new Bundle(); AccountManager am = AccountManager.get(getContext()); - result.putParcelableArray(PROVIDER_EXTRA_ACCOUNTS, Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 ? am.getAccountsByTypeForPackage(arg, packageName) : am.getAccountsByType(arg)); + Account[] accounts = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + accounts = am.getAccountsByTypeForPackage(arg, packageName); + } + if (accounts == null || accounts.length == 0) { + accounts = am.getAccountsByType(arg); + } + result.putParcelableArray(PROVIDER_EXTRA_ACCOUNTS, accounts); return result; } else if (PROVIDER_METHOD_CLEAR_PASSWORD.equals(method)) { Account a = extras.getParcelable(PROVIDER_EXTRA_CLEAR_PASSWORD); diff --git a/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java b/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java index 2be84d65..2cab68bc 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java +++ b/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java @@ -110,6 +110,16 @@ public class PackageUtils { return null; } + @Nullable + public static String getCallingPackage(Context context) { + int callingUid = Binder.getCallingUid(), callingPid = Binder.getCallingPid(); + String packageName = packageFromProcessId(context, callingPid); + if (packageName == null) { + packageName = firstPackageFromUserId(context, callingUid); + } + return packageName; + } + @Nullable public static String getAndCheckCallingPackage(Context context, String suggestedPackageName) { return getAndCheckCallingPackage(context, suggestedPackageName, 0); @@ -152,10 +162,12 @@ public class PackageUtils { packageName = packagesForUid[0]; } else if (Arrays.asList(packagesForUid).contains(suggestedPackageName)) { packageName = suggestedPackageName; + } else if (suggestedPackageName == null) { + packageName = packagesForUid[0]; } } } - if (packageName != null && !packageName.equals(suggestedPackageName)) { + if (packageName != null && suggestedPackageName != null && !packageName.equals(suggestedPackageName)) { throw new SecurityException("UID [" + callingUid + "] is not related to packageName [" + packageName + "]"); } return packageName; @@ -172,6 +184,15 @@ public class PackageUtils { return null; } + @Nullable + public static String firstPackageFromUserId(Context context, int uid) { + String[] packagesForUid = context.getPackageManager().getPackagesForUid(uid); + if (packagesForUid != null && packagesForUid.length != 0) { + return packagesForUid[0]; + } + return null; + } + @SuppressWarnings("deprecation") public static String packageFromPendingIntent(PendingIntent pi) { if (pi == null) return null;