resolve merge conflicts of 75ae46d035 to lmp-mr1-dev am: e24780ed4c am: 5c4276a258 am: 3a5e567ab9

am: b7e2545217

Change-Id: I40643a3a88c3ec9344604917dd0e765cd9078f29
This commit is contained in:
Dmitry Dementyev
2017-03-08 19:15:40 +00:00
committed by android-build-merger

View File

@@ -36,6 +36,7 @@ import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.preference.Preference; import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener; import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -438,15 +439,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.
@@ -495,8 +499,8 @@ public class ManageAccountsSettings extends AccountPreferenceBase
} else { } else {
Log.e(TAG, Log.e(TAG,
"Refusing to launch authenticator intent because" "Refusing to launch authenticator intent because"
+ "it exploits Settings permissions: " + " it exploits Settings permissions: "
+ prefIntent); + prefIntent);
} }
return true; return true;
} }
@@ -516,20 +520,26 @@ 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.", e);
"Intent considered unsafe due to exception.",
e);
return false; return false;
} }
} }