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

Commit 007d120c authored by Dmitry Dementyev's avatar Dmitry Dementyev Committed by Android (Google) Code Review
Browse files

Merge "Add permission check to Intents used by Authenticator Settings."

parents e2de8d5e 03e250bb
Loading
Loading
Loading
Loading
+18 −6
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.UserHandle;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import android.support.v7.preference.PreferenceScreen;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;
@@ -448,15 +449,18 @@ public class ManageAccountsSettings extends AccountPreferenceBase
    }
    }


    /**
    /**
     * Filters through the preference list provided by GoogleLoginService.
     * Recursively filters through the preference list provided by GoogleLoginService.
     *
     *
     * This method removes all the invalid intent from the list, adds account name as extra into the
     * This method removes all the invalid intent from the list, adds account name as extra into the
     * intent, and hack the location settings to start it as a fragment.
     * intent, and hack the location settings to start it as a fragment.
     */
     */
    private void updatePreferenceIntents(PreferenceScreen prefs) {
    private void updatePreferenceIntents(PreferenceGroup prefs) {
        final PackageManager pm = getActivity().getPackageManager();
        final PackageManager pm = getActivity().getPackageManager();
        for (int i = 0; i < prefs.getPreferenceCount(); ) {
        for (int i = 0; i < prefs.getPreferenceCount(); ) {
            Preference pref = prefs.getPreference(i);
            Preference pref = prefs.getPreference(i);
            if (pref instanceof PreferenceGroup) {
                updatePreferenceIntents((PreferenceGroup) pref);
            }
            Intent intent = pref.getIntent();
            Intent intent = pref.getIntent();
            if (intent != null) {
            if (intent != null) {
                // Hack. Launch "Location" as fragment instead of as activity.
                // Hack. Launch "Location" as fragment instead of as activity.
@@ -526,16 +530,24 @@ public class ManageAccountsSettings extends AccountPreferenceBase
    private boolean isSafeIntent(PackageManager pm, Intent intent) {
    private boolean isSafeIntent(PackageManager pm, Intent intent) {
        AuthenticatorDescription authDesc =
        AuthenticatorDescription authDesc =
                mAuthenticatorHelper.getAccountTypeDescription(mAccountType);
                mAuthenticatorHelper.getAccountTypeDescription(mAccountType);
        ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
        ResolveInfo resolveInfo =
            pm.resolveActivityAsUser(intent, 0, mUserHandle.getIdentifier());
        if (resolveInfo == null) {
        if (resolveInfo == null) {
            return false;
            return false;
        }
        }
        ActivityInfo resolvedActivityInfo = resolveInfo.activityInfo;
        ActivityInfo resolvedActivityInfo = resolveInfo.activityInfo;
        ApplicationInfo resolvedAppInfo = resolvedActivityInfo.applicationInfo;
        ApplicationInfo resolvedAppInfo = resolvedActivityInfo.applicationInfo;
        try {
        try {
            if (resolvedActivityInfo.exported) {
                if (resolvedActivityInfo.permission == null) {
                    return true; // exported activity without permission.
                } else if (pm.checkPermission(resolvedActivityInfo.permission,
                        authDesc.packageName) == PackageManager.PERMISSION_GRANTED) {
                    return true;
                }
            }
            ApplicationInfo authenticatorAppInf = pm.getApplicationInfo(authDesc.packageName, 0);
            ApplicationInfo authenticatorAppInf = pm.getApplicationInfo(authDesc.packageName, 0);
            return resolvedActivityInfo.exported
            return  resolvedAppInfo.uid == authenticatorAppInf.uid;
                    || resolvedAppInfo.uid == authenticatorAppInf.uid;
        } catch (NameNotFoundException e) {
        } catch (NameNotFoundException e) {
            Log.e(TAG,
            Log.e(TAG,
                    "Intent considered unsafe due to exception.",
                    "Intent considered unsafe due to exception.",