Kill uid when REQUEST_INSTALL_PACKAGES is denied am: 732edc3e39
am: 4929001e70
Change-Id: Id759c1c02118401c6213f43cd21134267fc10740
This commit is contained in:
@@ -18,6 +18,7 @@ package com.android.settings.applications.appinfo;
|
|||||||
import static android.app.Activity.RESULT_CANCELED;
|
import static android.app.Activity.RESULT_CANCELED;
|
||||||
import static android.app.Activity.RESULT_OK;
|
import static android.app.Activity.RESULT_OK;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.app.AppOpsManager;
|
import android.app.AppOpsManager;
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -29,6 +30,7 @@ import androidx.appcompat.app.AlertDialog;
|
|||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.Preference.OnPreferenceChangeListener;
|
import androidx.preference.Preference.OnPreferenceChangeListener;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Settings;
|
import com.android.settings.Settings;
|
||||||
import com.android.settings.applications.AppInfoWithHeader;
|
import com.android.settings.applications.AppInfoWithHeader;
|
||||||
@@ -44,6 +46,7 @@ public class ExternalSourcesDetails extends AppInfoWithHeader
|
|||||||
|
|
||||||
private AppStateInstallAppsBridge mAppBridge;
|
private AppStateInstallAppsBridge mAppBridge;
|
||||||
private AppOpsManager mAppOpsManager;
|
private AppOpsManager mAppOpsManager;
|
||||||
|
private ActivityManager mActivityManager;
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
private RestrictedSwitchPreference mSwitchPref;
|
private RestrictedSwitchPreference mSwitchPref;
|
||||||
private InstallAppsState mInstallAppsState;
|
private InstallAppsState mInstallAppsState;
|
||||||
@@ -55,6 +58,7 @@ public class ExternalSourcesDetails extends AppInfoWithHeader
|
|||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
mAppBridge = new AppStateInstallAppsBridge(context, mState, null);
|
mAppBridge = new AppStateInstallAppsBridge(context, mState, null);
|
||||||
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
||||||
|
mActivityManager = context.getSystemService(ActivityManager.class);
|
||||||
mUserManager = UserManager.get(context);
|
mUserManager = UserManager.get(context);
|
||||||
|
|
||||||
addPreferencesFromResource(R.xml.external_sources_details);
|
addPreferencesFromResource(R.xml.external_sources_details);
|
||||||
@@ -99,10 +103,21 @@ public class ExternalSourcesDetails extends AppInfoWithHeader
|
|||||||
: R.string.app_permission_summary_not_allowed);
|
: R.string.app_permission_summary_not_allowed);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setCanInstallApps(boolean newState) {
|
@VisibleForTesting
|
||||||
|
void setCanInstallApps(boolean newState) {
|
||||||
mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,
|
mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,
|
||||||
mPackageInfo.applicationInfo.uid, mPackageName,
|
mPackageInfo.applicationInfo.uid, mPackageName,
|
||||||
newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
|
newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
|
||||||
|
if (!newState) {
|
||||||
|
killApp(mPackageInfo.applicationInfo.uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void killApp(int uid) {
|
||||||
|
if (UserHandle.isCore(uid)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mActivityManager.killUid(uid, "User denied OP_REQUEST_INSTALL_PACKAGES");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -19,11 +19,17 @@ package com.android.settings.applications.appinfo;
|
|||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.ArgumentMatchers.nullable;
|
import static org.mockito.ArgumentMatchers.nullable;
|
||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
|
import android.app.AppOpsManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.ContextWrapper;
|
import android.content.ContextWrapper;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
@@ -55,6 +61,10 @@ public class ExternalSourcesDetailsTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private UserManager mUserManager;
|
private UserManager mUserManager;
|
||||||
@Mock
|
@Mock
|
||||||
|
private ActivityManager mActivityManager;
|
||||||
|
@Mock
|
||||||
|
private AppOpsManager mAppOpsManager;
|
||||||
|
@Mock
|
||||||
private RestrictedSwitchPreference mSwitchPref;
|
private RestrictedSwitchPreference mSwitchPref;
|
||||||
@Mock
|
@Mock
|
||||||
private RestrictedPreferenceHelper mHelper;
|
private RestrictedPreferenceHelper mHelper;
|
||||||
@@ -69,9 +79,46 @@ public class ExternalSourcesDetailsTest {
|
|||||||
|
|
||||||
mFragment = new ExternalSourcesDetails();
|
mFragment = new ExternalSourcesDetails();
|
||||||
ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
|
ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager);
|
||||||
|
ReflectionHelpers.setField(mFragment, "mActivityManager", mActivityManager);
|
||||||
|
ReflectionHelpers.setField(mFragment, "mAppOpsManager", mAppOpsManager);
|
||||||
ReflectionHelpers.setField(mFragment, "mSwitchPref", mSwitchPref);
|
ReflectionHelpers.setField(mFragment, "mSwitchPref", mSwitchPref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setCanInstallApps_false_shouldKillNonCoreUid() {
|
||||||
|
int mockUid = 23456;
|
||||||
|
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
|
||||||
|
|
||||||
|
mPackageInfo.applicationInfo = new ApplicationInfo();
|
||||||
|
mPackageInfo.applicationInfo.uid = mockUid;
|
||||||
|
assertThat(UserHandle.isCore(mockUid)).isFalse();
|
||||||
|
mFragment.setCanInstallApps(false);
|
||||||
|
verify(mActivityManager).killUid(eq(mockUid), anyString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setCanInstallApps_false_shouldNotKillCoreUid() {
|
||||||
|
int mockUid = 1234;
|
||||||
|
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
|
||||||
|
|
||||||
|
mPackageInfo.applicationInfo = new ApplicationInfo();
|
||||||
|
mPackageInfo.applicationInfo.uid = mockUid;
|
||||||
|
assertThat(UserHandle.isCore(mockUid)).isTrue();
|
||||||
|
mFragment.setCanInstallApps(false);
|
||||||
|
verify(mActivityManager, never()).killUid(eq(mockUid), anyString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setCanInstallApps_true_shouldNotKillUid() {
|
||||||
|
int mockUid = 23456;
|
||||||
|
ReflectionHelpers.setField(mFragment, "mPackageInfo", mPackageInfo);
|
||||||
|
|
||||||
|
mPackageInfo.applicationInfo = new ApplicationInfo();
|
||||||
|
mPackageInfo.applicationInfo.uid = mockUid;
|
||||||
|
mFragment.setCanInstallApps(true);
|
||||||
|
verify(mActivityManager, never()).killUid(eq(mockUid), anyString());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void refreshUi_noPackageInfo_shouldReturnFalseAndNoCrash() {
|
public void refreshUi_noPackageInfo_shouldReturnFalseAndNoCrash() {
|
||||||
mFragment.refreshUi();
|
mFragment.refreshUi();
|
||||||
|
Reference in New Issue
Block a user