From 1f0689f73ce1e1d266a35bc3cdfaf72a442048f6 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Thu, 2 Jun 2022 04:50:33 +0800 Subject: [PATCH] Restrict network preferences settings - Show a restriction message if the malware enforces the network preference settings - Remove settings search index if the network preference settings is restricted Bug: 231987122 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=ConfigureWifiSettingsTest Change-Id: I998aa084d47d556d1eeddcec8c6bb5f1d9a8f6e7 --- .../settings/wifi/ConfigureWifiSettings.java | 71 ++++++--- .../wifi/ConfigureWifiSettingsTest.java | 149 +++++++++++++++++- 2 files changed, 195 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java index 6bb4389bddb..33f2827d7f8 100644 --- a/src/com/android/settings/wifi/ConfigureWifiSettings.java +++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java @@ -15,19 +15,21 @@ */ package com.android.settings.wifi; -import static android.content.Context.WIFI_SERVICE; - +import android.annotation.Nullable; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager; import android.os.Bundle; -import android.util.FeatureFlagUtils; +import android.os.UserManager; +import android.util.EventLog; import android.util.Log; +import android.view.View; +import android.widget.TextView; +import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -43,7 +45,8 @@ import java.util.List; public class ConfigureWifiSettings extends DashboardFragment { private static final String TAG = "ConfigureWifiSettings"; - private static final String KEY_INSTALL_CREDENTIALS = "install_credentials"; + @VisibleForTesting + static final String KEY_INSTALL_CREDENTIALS = "install_credentials"; private static final String ACTION_INSTALL_CERTS = "android.credentials.INSTALL"; private static final String PACKAGE_INSTALL_CERTS = "com.android.certinstaller"; private static final String CLASS_INSTALL_CERTS = "com.android.certinstaller.CertInstallerMain"; @@ -53,16 +56,26 @@ public class ConfigureWifiSettings extends DashboardFragment { public static final int WIFI_WAKEUP_REQUEST_CODE = 600; private WifiWakeupPreferenceController mWifiWakeupPreferenceController; - private Preference mCertinstallerPreference; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (isGuestUser(context)) return; + + mWifiWakeupPreferenceController = use(WifiWakeupPreferenceController.class); + mWifiWakeupPreferenceController.setFragment(this); + } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); getActivity().setTitle(R.string.network_and_internet_preferences_title); - mCertinstallerPreference = findPreference(KEY_INSTALL_CREDENTIALS); - if (mCertinstallerPreference != null) { - mCertinstallerPreference.setOnPreferenceClickListener(preference -> { + if (isGuestUser(getContext())) return; + + final Preference installCredentialsPref = findPreference(KEY_INSTALL_CREDENTIALS); + if (installCredentialsPref != null) { + installCredentialsPref.setOnPreferenceClickListener(preference -> { Intent intent = new Intent(ACTION_INSTALL_CERTS); intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK); @@ -77,6 +90,23 @@ public class ConfigureWifiSettings extends DashboardFragment { } } + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (!isGuestUser(getContext())) return; + + Log.w(TAG, "Displays the restricted UI because the user is a guest."); + EventLog.writeEvent(0x534e4554, "231987122", -1 /* UID */, "User is a guest"); + + // Restricted UI + final TextView emptyView = getActivity().findViewById(android.R.id.empty); + if (emptyView != null) { + emptyView.setVisibility(View.VISIBLE); + emptyView.setText(R.string.wifi_empty_list_user_restricted); + } + getPreferenceScreen().removeAll(); + } + @Override public int getMetricsCategory() { return SettingsEnums.CONFIGURE_WIFI; @@ -94,25 +124,18 @@ public class ConfigureWifiSettings extends DashboardFragment { @Override protected List createPreferenceControllers(Context context) { - final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); + if (isGuestUser(context)) return null; + + final WifiManager wifiManager = getSystemService(WifiManager.class); final List controllers = new ArrayList<>(); controllers.add(new WifiP2pPreferenceController(context, getSettingsLifecycle(), wifiManager)); return controllers; } - @Override - public void onAttach(Context context) { - super.onAttach(context); - - - mWifiWakeupPreferenceController = use(WifiWakeupPreferenceController.class); - mWifiWakeupPreferenceController.setFragment(this); - } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == WIFI_WAKEUP_REQUEST_CODE) { + if (mWifiWakeupPreferenceController != null && requestCode == WIFI_WAKEUP_REQUEST_CODE) { mWifiWakeupPreferenceController.onActivityResult(requestCode, resultCode); return; } @@ -122,8 +145,16 @@ public class ConfigureWifiSettings extends DashboardFragment { public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.wifi_configure_settings) { protected boolean isPageSearchEnabled(Context context) { + if (isGuestUser(context)) return false; return context.getResources() .getBoolean(R.bool.config_show_wifi_settings); } }; + + private static boolean isGuestUser(Context context) { + if (context == null) return false; + final UserManager userManager = context.getSystemService(UserManager.class); + if (userManager == null) return false; + return userManager.isGuestUser(); + } } diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java index 89df035c8d5..5e3d7150bb5 100644 --- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiSettingsTest.java @@ -1,41 +1,180 @@ package com.android.settings.wifi; +import static com.android.settings.wifi.ConfigureWifiSettings.KEY_INSTALL_CREDENTIALS; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.annotation.Nullable; import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.os.UserManager; +import android.view.View; +import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.XmlTestUtils; +import com.android.settingslib.core.AbstractPreferenceController; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; import java.util.List; @RunWith(RobolectricTestRunner.class) public class ConfigureWifiSettingsTest { - private Context mContext; + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + Context mContext = ApplicationProvider.getApplicationContext(); + @Mock + UserManager mUserManager; + @Mock + WifiManager mWifiManager; + @Mock + FragmentActivity mActivity; + @Mock + WifiWakeupPreferenceController mWifiWakeupPreferenceController; + @Mock + Preference mInstallCredentialsPref; + @Mock + PreferenceScreen mPreferenceScreen; + @Mock + TextView mEmptyView; + + TestConfigureWifiSettings mSettings; @Before public void setUp() { - mContext = spy(RuntimeEnvironment.application); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); + when(mUserManager.isGuestUser()).thenReturn(false); + when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); + + mSettings = spy(new TestConfigureWifiSettings()); + when(mSettings.getContext()).thenReturn(mContext); + when(mSettings.getActivity()).thenReturn(mActivity); + when(mSettings.use(WifiWakeupPreferenceController.class)) + .thenReturn(mWifiWakeupPreferenceController); + when(mSettings.findPreference(KEY_INSTALL_CREDENTIALS)).thenReturn(mInstallCredentialsPref); + } + + @Test + public void onAttach_isNotGuestUser_setupController() { + when(mUserManager.isGuestUser()).thenReturn(false); + + mSettings.onAttach(mContext); + + verify(mWifiWakeupPreferenceController).setFragment(any()); + } + + @Test + public void onAttach_isGuestUser_doNotSetupController() { + when(mUserManager.isGuestUser()).thenReturn(true); + + mSettings.onAttach(mContext); + + verify(mWifiWakeupPreferenceController, never()).setFragment(any()); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onCreate_isNotGuestUser_setupPreference() { + when(mUserManager.isGuestUser()).thenReturn(false); + + mSettings.onCreate(null); + + verify(mInstallCredentialsPref).setOnPreferenceClickListener(any()); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onCreate_isGuestUser_doNotSetupPreference() { + when(mUserManager.isGuestUser()).thenReturn(true); + + mSettings.onCreate(null); + + verify(mInstallCredentialsPref, never()).setOnPreferenceClickListener(any()); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onViewCreated_isNotGuestUser_doNotRestrictUi() { + when(mUserManager.isGuestUser()).thenReturn(false); + when(mActivity.findViewById(android.R.id.empty)).thenReturn(mEmptyView); + doReturn(mPreferenceScreen).when(mSettings).getPreferenceScreen(); + + mSettings.onViewCreated(mock(View.class), null); + + verify(mEmptyView, never()).setVisibility(View.VISIBLE); + verify(mPreferenceScreen, never()).removeAll(); + } + + @Test + @Config(shadows = ShadowDashboardFragment.class) + public void onViewCreated_isGuestUser_restrictUi() { + when(mUserManager.isGuestUser()).thenReturn(true); + when(mActivity.findViewById(android.R.id.empty)).thenReturn(mEmptyView); + doReturn(mPreferenceScreen).when(mSettings).getPreferenceScreen(); + + mSettings.onViewCreated(mock(View.class), null); + + verify(mEmptyView).setVisibility(View.VISIBLE); + verify(mPreferenceScreen).removeAll(); } @Test @Config(qualifiers = "mcc999") - public void testNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() { + public void getNonIndexableKeys_ifPageDisabled_shouldNotIndexResource() { final List niks = ConfigureWifiSettings.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(mContext); - final int xmlId = new ConfigureWifiSettings().getPreferenceScreenResId(); + final int xmlId = mSettings.getPreferenceScreenResId(); final List keys = XmlTestUtils.getKeysFromPreferenceXml(mContext, xmlId); assertThat(keys).isNotNull(); assertThat(niks).containsAtLeastElementsIn(keys); } + + public static class TestConfigureWifiSettings extends ConfigureWifiSettings { + @Override + public T use(Class clazz) { + return super.use(clazz); + } + } + + @Implements(DashboardFragment.class) + public static class ShadowDashboardFragment { + @Implementation + public void onCreate(Bundle icicle) { + // do nothing + } + + @Implementation + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + // do nothing + } + } }