diff options
author | alk3pInjection <webmaster@raspii.tech> | 2021-10-12 16:30:00 +0800 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2021-10-12 16:30:00 +0800 |
commit | 527899f232cfcfa020f3768038e8b3ab19da157b (patch) | |
tree | 5327f66065122e27bca9775bf93389106dc3fb49 | |
parent | b97599ecb181a28412be612d5cb70666e9718428 (diff) | |
parent | e77d8257dbab3d5b0c9b094c3288bf8715e77719 (diff) |
Merge remote-tracking branch 'upstream/lineage-18.1' into lineage-18.1lineage-18.1
* upstream/lineage-18.1:
[DO NOT MERGE] Add SafetyNet logging
[DO NOT MERGE] Add permission checking to WifiDialogActivity
Add comment to AndroidManifest
Change-Id: Ib202fed95fe217499b8e7d7d5d075c3beabc95d3
-rw-r--r-- | AndroidManifest.xml | 4 | ||||
-rw-r--r-- | src/com/android/settings/wifi/WifiDialogActivity.java | 65 | ||||
-rw-r--r-- | tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java | 147 |
3 files changed, 207 insertions, 9 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5b098b4c74..fe5ab39b17 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2729,6 +2729,10 @@ </intent-filter> </activity> + <!-- + The Wi-Fi result data will only be returned from WifiDialogActivity if the calling + package has ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission. (see b/185126813) + --> <activity android:name=".wifi.WifiDialogActivity" android:label="" diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java index 7782786763..53c941e9c2 100644 --- a/src/com/android/settings/wifi/WifiDialogActivity.java +++ b/src/com/android/settings/wifi/WifiDialogActivity.java @@ -16,14 +16,19 @@ package com.android.settings.wifi; +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; + import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.NetworkInfo; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.net.wifi.WifiManager.ActionListener; import android.os.Bundle; +import android.util.EventLog; import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -53,10 +58,12 @@ public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialo public static final String KEY_WIFI_CONFIGURATION = "wifi_configuration"; - private static final int RESULT_CONNECTED = RESULT_FIRST_USER; + @VisibleForTesting + static final int RESULT_CONNECTED = RESULT_FIRST_USER; private static final int RESULT_FORGET = RESULT_FIRST_USER + 1; - private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0; + @VisibleForTesting + static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0; private WifiDialog mDialog; @@ -156,17 +163,22 @@ public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialo } } - Intent resultData = new Intent(); + Intent resultData = hasPermissionForResult() ? createResultData(config, accessPoint) : null; + setResult(RESULT_CONNECTED, resultData); + finish(); + } + + protected Intent createResultData(WifiConfiguration config, AccessPoint accessPoint) { + Intent result = new Intent(); if (accessPoint != null) { Bundle accessPointState = new Bundle(); accessPoint.saveWifiState(accessPointState); - resultData.putExtra(KEY_ACCESS_POINT_STATE, accessPointState); + result.putExtra(KEY_ACCESS_POINT_STATE, accessPointState); } if (config != null) { - resultData.putExtra(KEY_WIFI_CONFIGURATION, config); + result.putExtra(KEY_WIFI_CONFIGURATION, config); } - setResult(RESULT_CONNECTED, resultData); - finish(); + return result; } @Override @@ -192,9 +204,44 @@ public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialo if (resultCode != RESULT_OK) { return; } - - setResult(RESULT_CONNECTED, data); + if (hasPermissionForResult()) { + setResult(RESULT_CONNECTED, data); + } else { + setResult(RESULT_CONNECTED); + } finish(); } } + + protected boolean hasPermissionForResult() { + final String callingPackage = getCallingPackage(); + if (callingPackage == null) { + Log.d(TAG, "Failed to get the calling package, don't return the result."); + EventLog.writeEvent(0x534e4554, "185126813", -1 /* UID */, "no calling package"); + return false; + } + + if (getPackageManager().checkPermission(ACCESS_COARSE_LOCATION, callingPackage) + == PackageManager.PERMISSION_GRANTED) { + Log.d(TAG, "The calling package has ACCESS_COARSE_LOCATION permission for result."); + return true; + } + + if (getPackageManager().checkPermission(ACCESS_FINE_LOCATION, callingPackage) + == PackageManager.PERMISSION_GRANTED) { + Log.d(TAG, "The calling package has ACCESS_FINE_LOCATION permission for result."); + return true; + } + + Log.d(TAG, "The calling package does not have the necessary permissions for result."); + try { + EventLog.writeEvent(0x534e4554, "185126813", + getPackageManager().getPackageUid(callingPackage, 0 /* flags */), + "no permission"); + } catch (PackageManager.NameNotFoundException e) { + EventLog.writeEvent(0x534e4554, "185126813", -1 /* UID */, "no permission"); + Log.w(TAG, "Cannot find the UID, calling package: " + callingPackage, e); + } + return false; + } } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java index 41d1bbe4f3..1a6de550e5 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java @@ -16,17 +16,31 @@ package com.android.settings.wifi; +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; + +import static com.android.settings.wifi.WifiDialogActivity.REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER; +import static com.android.settings.wifi.WifiDialogActivity.RESULT_CONNECTED; +import static com.android.settings.wifi.WifiDialogActivity.RESULT_OK; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; import com.android.settings.R; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowConnectivityManager; import com.android.settings.testutils.shadow.ShadowWifiManager; +import com.android.settingslib.wifi.AccessPoint; import com.google.android.setupcompat.util.WizardManagerHelper; @@ -48,13 +62,30 @@ import org.robolectric.util.ReflectionHelpers; }) public class WifiDialogActivityTest { + private static final String CALLING_PACKAGE = "calling_package"; private static final String AP1_SSID = "\"ap1\""; + + @Mock + PackageManager mPackageManager; + @Mock + WifiManager mWifiManager; + @Mock + WifiDialog mWifiDialog; + @Mock + WifiConfiguration mWifiConfiguration; + @Mock + AccessPoint mAccessPoint; + @Mock + Intent mResultData; @Mock private WifiConfigController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); + when(mWifiDialog.getController()).thenReturn(mController); + when(mController.getConfig()).thenReturn(mWifiConfiguration); + when(mController.getAccessPoint()).thenReturn(mAccessPoint); WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = AP1_SSID; @@ -75,6 +106,29 @@ public class WifiDialogActivityTest { } @Test + public void onSubmit_noPermissionForResult_setResultWithoutData() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.hasPermissionForResult()).thenReturn(false); + when(activity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); + + activity.onSubmit(mWifiDialog); + + verify(activity).setResult(RESULT_CONNECTED, null); + } + + @Test + public void onSubmit_hasPermissionForResult_setResultWithData() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.hasPermissionForResult()).thenReturn(true); + when(activity.createResultData(any(), any())).thenReturn(mResultData); + when(activity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); + + activity.onSubmit(mWifiDialog); + + verify(activity).setResult(RESULT_CONNECTED, mResultData); + } + + @Test public void onSubmit_whenConnectForCallerIsFalse_shouldNotConnectToNetwork() { WifiDialogActivity activity = Robolectric.buildActivity( @@ -111,4 +165,97 @@ public class WifiDialogActivityTest { assertThat(dialog.getContext().getThemeResId()) .isEqualTo(R.style.SuwAlertDialogThemeCompat_Light); } + + @Test + public void onActivityResult_noPermissionForResult_setResultWithoutData() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.hasPermissionForResult()).thenReturn(false); + final Intent data = new Intent(); + + activity.onActivityResult(REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER, RESULT_OK, + data); + + verify(activity).setResult(RESULT_CONNECTED); + } + + @Test + public void onActivityResult_hasPermissionForResult_setResultWithData() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.hasPermissionForResult()).thenReturn(true); + final Intent data = new Intent(); + + activity.onActivityResult(REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER, RESULT_OK, + data); + + verify(activity).setResult(RESULT_CONNECTED, data); + } + + @Test + public void hasPermissionForResult_noCallingPackage_returnFalse() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.getCallingPackage()).thenReturn(null); + + final boolean result = activity.hasPermissionForResult(); + + assertThat(result).isFalse(); + } + + @Test + public void hasPermissionForResult_noPermission_returnFalse() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.getCallingPackage()).thenReturn(null); + when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_DENIED); + when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_DENIED); + + final boolean result = activity.hasPermissionForResult(); + + assertThat(result).isFalse(); + } + + @Test + public void hasPermissionForResult_hasCoarseLocationPermission_returnTrue() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.getCallingPackage()).thenReturn(CALLING_PACKAGE); + when(activity.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_GRANTED); + when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_DENIED); + + final boolean result = activity.hasPermissionForResult(); + + assertThat(result).isTrue(); + } + + @Test + public void hasPermissionForResult_hasFineLocationPermission_returnTrue() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.getCallingPackage()).thenReturn(CALLING_PACKAGE); + when(activity.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_DENIED); + when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_GRANTED); + + final boolean result = activity.hasPermissionForResult(); + + assertThat(result).isTrue(); + } + + @Test + public void hasPermissionForResult_haveBothLocationPermissions_returnTrue() { + WifiDialogActivity activity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); + when(activity.getCallingPackage()).thenReturn(CALLING_PACKAGE); + when(activity.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManager.checkPermission(ACCESS_COARSE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_GRANTED); + when(mPackageManager.checkPermission(ACCESS_FINE_LOCATION, CALLING_PACKAGE)) + .thenReturn(PackageManager.PERMISSION_GRANTED); + + final boolean result = activity.hasPermissionForResult(); + + assertThat(result).isTrue(); + } } |