From b4e4facff4478dab07dd8d0b334ce0356396c01d Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 7 Jul 2023 19:52:04 +0800 Subject: [PATCH 1/4] Restrict ApnEditor settings - Finish ApnEditor settings if user is not an admin - Finish ApnEditor settings if user has DISALLOW_CONFIG_MOBILE_NETWORKS restriction Bug: 279902472 Test: manual test atest -c ApnEditorTest (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:4e18e7414c674a1c5bc69961c03499849b4aefd2) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5a17d39db7af7cea46763bfcdb50380bf0da92e3) Merged-In: Iecdbbff7e21dfb11e3ba385858747a220cfd3e04 Change-Id: Iecdbbff7e21dfb11e3ba385858747a220cfd3e04 --- .../settings/network/apn/ApnEditor.java | 23 +++++++++++++++ .../settings/network/apn/ApnEditorTest.java | 28 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/com/android/settings/network/apn/ApnEditor.java b/src/com/android/settings/network/apn/ApnEditor.java index 25d8e841a9c..7a80cd78c5b 100644 --- a/src/com/android/settings/network/apn/ApnEditor.java +++ b/src/com/android/settings/network/apn/ApnEditor.java @@ -25,6 +25,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.PersistableBundle; +import android.os.UserManager; import android.provider.Telephony; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; @@ -281,6 +282,11 @@ public class ApnEditor extends SettingsPreferenceFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + if (isUserRestricted()) { + Log.e(TAG, "This setting isn't available due to user restriction."); + finish(); + return; + } setLifecycleForAllControllers(); @@ -1453,6 +1459,23 @@ public class ApnEditor extends SettingsPreferenceFragment return apnData; } + @VisibleForTesting + boolean isUserRestricted() { + UserManager userManager = getContext().getSystemService(UserManager.class); + if (userManager == null) { + return false; + } + if (!userManager.isAdminUser()) { + Log.e(TAG, "User is not an admin"); + return true; + } + if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) { + Log.e(TAG, "User is not allowed to configure mobile network"); + return true; + } + return false; + } + @VisibleForTesting static class ApnData { /** diff --git a/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java b/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java index f03b6d8cad3..5fd465232d0 100644 --- a/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java +++ b/tests/robotests/src/com/android/settings/network/apn/ApnEditorTest.java @@ -36,6 +36,7 @@ import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.os.PersistableBundle; +import android.os.UserManager; import android.telephony.CarrierConfigManager; import android.view.KeyEvent; import android.view.Menu; @@ -102,6 +103,8 @@ public class ApnEditorTest { @Mock private FragmentActivity mActivity; @Mock + private UserManager mUserManager; + @Mock private ProxySubscriptionManager mProxySubscriptionMgr; @Mock private CarrierConfigManager mCarrierConfigManager; @@ -129,6 +132,10 @@ public class ApnEditorTest { doReturn(mContext.getTheme()).when(mActivity).getTheme(); doReturn(mContext.getContentResolver()).when(mActivity).getContentResolver(); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(true).when(mUserManager).isAdminUser(); + doReturn(false).when(mUserManager) + .hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); doReturn(mCarrierConfigManager).when(mContext) .getSystemService(Context.CARRIER_CONFIG_SERVICE); doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt()); @@ -471,6 +478,27 @@ public class ApnEditorTest { assertThat(ApnEditor.formatInteger("not an int")).isEqualTo("not an int"); } + @Test + @Config(shadows = ShadowFragment.class) + public void onCreate_notAdminUser_shouldFinish() { + doReturn(false).when(mUserManager).isAdminUser(); + + mApnEditorUT.onCreate(null); + + verify(mApnEditorUT).finish(); + } + + @Test + @Config(shadows = ShadowFragment.class) + public void onCreate_hasUserRestriction_shouldFinish() { + doReturn(true).when(mUserManager) + .hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); + + mApnEditorUT.onCreate(null); + + verify(mApnEditorUT).finish(); + } + @Test @Config(shadows = ShadowFragment.class) public void onCreate_noAction_shouldFinishAndNoCrash() { From fc5e4e45761ff4ca1da48fd64fe17c5eef70a2aa Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Thu, 27 Jul 2023 21:45:05 +0000 Subject: [PATCH 2/4] RESTRICT AUTOMERGE: Catch exceptions from setLockCredential() When LockPatternUtils#setLockCredential() fails, it can either return false or throw an exception. Catch the exception and treat it the same way as a false return value, to prevent crashing com.android.settings. Bug: 253043065 Test: Tried setting lockscreen credential while in secure FRP mode using smartlock setup activity launched by intent via adb. Verified that com.android.settings no longer crashes due to the exception from LockPatternUtils#setLockCredential(). (cherry picked from commit 05f1eff1c9c3f82797f1a0f92ff7665b9f463488) (moved change into ChooseLockPassword.java and ChooseLockPattern.java, which are merged into SaveAndFinishWorker.java on udc-qpr-dev and main) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:8f3ca8daeb583b8d46ad0d1045c2b953b83f5903) Merged-In: I48b9119c19fb6378b1f88d36433ee4f4c8501d76 Change-Id: I48b9119c19fb6378b1f88d36433ee4f4c8501d76 --- .../android/settings/password/ChooseLockPassword.java | 9 +++++++-- src/com/android/settings/password/ChooseLockPattern.java | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index 16c4f5bb1ab..deab9f2f9a7 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -1103,8 +1103,13 @@ public class ChooseLockPassword extends SettingsActivity { @Override protected Pair saveAndVerifyInBackground() { - final boolean success = mUtils.setLockCredential( - mChosenPassword, mCurrentCredential, mUserId); + boolean success; + try { + success = mUtils.setLockCredential(mChosenPassword, mCurrentCredential, mUserId); + } catch (RuntimeException e) { + Log.e(TAG, "Failed to set lockscreen credential", e); + success = false; + } if (success) { unifyProfileCredentialIfRequested(); } diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index dc36220afef..785407685f4 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -898,8 +898,13 @@ public class ChooseLockPattern extends SettingsActivity { @Override protected Pair saveAndVerifyInBackground() { final int userId = mUserId; - final boolean success = mUtils.setLockCredential(mChosenPattern, mCurrentCredential, - userId); + boolean success; + try { + success = mUtils.setLockCredential(mChosenPattern, mCurrentCredential, userId); + } catch (RuntimeException e) { + Log.e(TAG, "Failed to set lockscreen credential", e); + success = false; + } if (success) { unifyProfileCredentialIfRequested(); } From bf389dcc0e72e3b6ec61e3990432648503aeb7c1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 3 Aug 2023 11:04:31 -0700 Subject: [PATCH 3/4] Import translations. DO NOT MERGE ANYWHERE BUG:291684185 Auto-generated-cl: translation import (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c52abcd3fa262f5a08797d4e411bb5d88b303246) Merged-In: Ia444bb69cc499bd8d4a5ffc8c72babdda213c385 Change-Id: Ia444bb69cc499bd8d4a5ffc8c72babdda213c385 --- res/values-ja/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index c9f4a75152b..88ffa5a0745 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -240,10 +240,10 @@ "標準時間" "地域で選択" "UTC オフセットで選択" - "画面消灯後からロックまでの時間" + "画面が自動的に消灯してからロックまでの時間" "タイムアウトから %1$s" "画面消灯の直後にロック(%1$s がロック解除を管理している場合を除く)" - "画面消灯後から%1$s後にロック(%2$s がロック解除を管理している場合を除く)" + "画面が自動的に消灯してから%1$s後にロック(%2$s がロック解除を管理している場合を除く)" "ロック画面にテキストを追加" "なし" "例: 佐藤のAndroid" From 3926192b45f39732eac6957a77dbf99b0f3688b1 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 18 Aug 2023 12:17:43 -0700 Subject: [PATCH 4/4] Import translations. DO NOT MERGE ANYWHERE BUG:291684185 Auto-generated-cl: translation import (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:75987a1856344623922cbcfefe6e314d7ca8d0f7) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:16f891cd2ac3fc444b5939fc5df406b149e0c418) Merged-In: I74cde8ebf8214b314a89452e73b834eac7ae8b1e Change-Id: I74cde8ebf8214b314a89452e73b834eac7ae8b1e --- res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 88ffa5a0745..0ce2cc78305 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -240,7 +240,7 @@ "標準時間" "地域で選択" "UTC オフセットで選択" - "画面が自動的に消灯してからロックまでの時間" + "画面が自動消灯してからロックまでの時間" "タイムアウトから %1$s" "画面消灯の直後にロック(%1$s がロック解除を管理している場合を除く)" "画面が自動的に消灯してから%1$s後にロック(%2$s がロック解除を管理している場合を除く)"