diff options
| author | 2021-02-03 23:41:39 +0800 | |
|---|---|---|
| committer | 2021-02-04 19:28:57 +0800 | |
| commit | b4fc12eda732c9a7f55a2ec8fb4f5f90b17a69ac (patch) | |
| tree | fe5654a7e6219348ddf25b1f8956ff0f7d733602 | |
| parent | be75db951ad4ddb93ccca256793faa13d098e414 (diff) | |
Replace NPMI#isUidNetworkingBlocked()
ConnectivityService is going to become a mainline module which
will not able to access hidden APIs. NetworkPolicyManagerInternal
is a internal serivce that CS can't be access after be a mainline
module. Thus, create NPM#checkUidNetworkingBlocked to replace it.
Bug: 170598012
Test: atest FrameworksNetTests
Test: atest CtsNetTestCases
Test: atest CtsHostsideNetworkTests
Test: atest FrameworksCoreTests:NetworkPolicyManagerTest
Test: atest FrameworksServicesTests:NetworkPolicyManagerServiceTest
Change-Id: I7bee37522dc5c55c255b159fda9481eff663655a
7 files changed, 62 insertions, 42 deletions
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl index 29a3fdf59e8b..cff27751264e 100644 --- a/core/java/android/net/INetworkPolicyManager.aidl +++ b/core/java/android/net/INetworkPolicyManager.aidl @@ -82,4 +82,5 @@ interface INetworkPolicyManager {      boolean isUidNetworkingBlocked(int uid, boolean meteredNetwork);      boolean isUidRestrictedOnMeteredNetworks(int uid); +    boolean checkUidNetworkingBlocked(int uid, int uidRules, boolean isNetworkMetered, boolean isBackgroundRestricted);  } diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index 82b035b08428..e4148fec59b4 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -460,6 +460,31 @@ public class NetworkPolicyManager {      }      /** +     * Figure out if networking is blocked for a given set of conditions. +     * +     * This is used by ConnectivityService via passing stale copies of conditions, so it must not +     * take any locks. +     * +     * @param uid The target uid. +     * @param uidRules The uid rules which are obtained from NetworkPolicyManagerService. +     * @param isNetworkMetered True if the network is metered. +     * @param isBackgroundRestricted True if data saver is enabled. +     * +     * @return true if networking is blocked for the UID under the specified conditions. +     * +     * @hide +     */ +    public boolean checkUidNetworkingBlocked(int uid, int uidRules, +            boolean isNetworkMetered, boolean isBackgroundRestricted) { +        try { +            return mService.checkUidNetworkingBlocked(uid, uidRules, isNetworkMetered, +                    isBackgroundRestricted); +        } catch (RemoteException e) { +            throw e.rethrowFromSystemServer(); +        } +    } + +    /**       * Check that the given uid is restricted from doing networking on metered networks.       *       * @param uid The target uid. diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index f2e192065ed1..ff0509fa5135 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2119,8 +2119,8 @@ public class ConnectivityService extends IConnectivityManager.Stub      private boolean isUidBlockedByRules(int uid, int uidRules, boolean isNetworkMetered,              boolean isBackgroundRestricted) { -        return NetworkPolicyManagerInternal.isUidNetworkingBlocked(uid, uidRules, -                isNetworkMetered, isBackgroundRestricted); +        return mPolicyManager.checkUidNetworkingBlocked(uid, uidRules, isNetworkMetered, +                isBackgroundRestricted);      }      /** diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java index f92f3dcd77ef..39ed7e8b1e1a 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerInternal.java @@ -16,8 +16,6 @@  package com.android.server.net; -import static com.android.server.net.NetworkPolicyManagerService.isUidNetworkingBlockedInternal; -  import android.annotation.NonNull;  import android.net.Network;  import android.net.NetworkTemplate; @@ -39,28 +37,6 @@ public abstract class NetworkPolicyManagerInternal {      public abstract void resetUserState(int userId);      /** -     * Figure out if networking is blocked for a given set of conditions. -     * -     * This is used by ConnectivityService via passing stale copies of conditions, so it must not -     * take any locks. -     * -     * @param uid The target uid. -     * @param uidRules The uid rules which are obtained from NetworkPolicyManagerService. -     * @param isNetworkMetered True if the network is metered. -     * @param isBackgroundRestricted True if data saver is enabled. -     * -     * @return true if networking is blocked for the UID under the specified conditions. -     */ -    public static boolean isUidNetworkingBlocked(int uid, int uidRules, boolean isNetworkMetered, -            boolean isBackgroundRestricted) { -        // Log of invoking internal function is disabled because it will be called very -        // frequently. And metrics are unlikely needed on this method because the callers are -        // external and this method doesn't take any locks or perform expensive operations. -        return isUidNetworkingBlockedInternal(uid, uidRules, isNetworkMetered, -                isBackgroundRestricted, null); -    } - -    /**       * Informs that an appId has been added or removed from the temp-powersave-allowlist so that       * that network rules for that appId can be updated.       * diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index f4296db06f8a..8d97c7d1f02d 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -5380,6 +5380,17 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      }      @Override +    public boolean checkUidNetworkingBlocked(int uid, int uidRules, +            boolean isNetworkMetered, boolean isBackgroundRestricted) { +        mContext.enforceCallingOrSelfPermission(OBSERVE_NETWORK_POLICY, TAG); +        // Log of invoking this function is disabled because it will be called very frequently. And +        // metrics are unlikely needed on this method because the callers are external and this +        // method doesn't take any locks or perform expensive operations. +        return isUidNetworkingBlockedInternal(uid, uidRules, isNetworkMetered, +                isBackgroundRestricted, null); +    } + +    @Override      public boolean isUidRestrictedOnMeteredNetworks(int uid) {          mContext.enforceCallingOrSelfPermission(OBSERVE_NETWORK_POLICY, TAG);          final int uidRules; @@ -5388,9 +5399,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {              uidRules = mUidRules.get(uid, RULE_ALLOW_ALL);              isBackgroundRestricted = mRestrictBackground;          } -        //TODO(b/177490332): The logic here might not be correct because it doesn't consider -        // RULE_REJECT_METERED condition. And it could be replaced by -        // isUidNetworkingBlockedInternal(). +        // TODO(b/177490332): The logic here might not be correct because it doesn't consider +        //  RULE_REJECT_METERED condition. And it could be replaced by +        //  isUidNetworkingBlockedInternal().          return isBackgroundRestricted                  && !hasRule(uidRules, RULE_ALLOW_METERED)                  && !hasRule(uidRules, RULE_TEMPORARY_ALLOW_METERED); diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index df19aeb13707..58ba90726b80 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -1829,11 +1829,11 @@ public class NetworkPolicyManagerServiceTest {      }      /** -     * Exhaustively test isUidNetworkingBlocked to output the expected results based on external +     * Exhaustively test checkUidNetworkingBlocked to output the expected results based on external       * conditions.       */      @Test -    public void testIsUidNetworkingBlocked() { +    public void testCheckUidNetworkingBlocked() {          final ArrayList<Pair<Boolean, Integer>> expectedBlockedStates = new ArrayList<>();          // Metered network. Data saver on. @@ -1877,17 +1877,16 @@ public class NetworkPolicyManagerServiceTest {      private void verifyNetworkBlockedState(boolean metered, boolean backgroundRestricted,              ArrayList<Pair<Boolean, Integer>> expectedBlockedStateForRules) { -        final NetworkPolicyManagerInternal npmi = LocalServices -                .getService(NetworkPolicyManagerInternal.class);          for (Pair<Boolean, Integer> pair : expectedBlockedStateForRules) {              final boolean expectedResult = pair.first;              final int rule = pair.second;              assertEquals(formatBlockedStateError(UID_A, rule, metered, backgroundRestricted), -                    expectedResult, -                    npmi.isUidNetworkingBlocked(UID_A, rule, metered, backgroundRestricted)); +                    expectedResult, mService.checkUidNetworkingBlocked(UID_A, rule, +                            metered, backgroundRestricted));              assertFalse(formatBlockedStateError(SYSTEM_UID, rule, metered, backgroundRestricted), -                    npmi.isUidNetworkingBlocked(SYSTEM_UID, rule, metered, backgroundRestricted)); +                    mService.checkUidNetworkingBlocked(SYSTEM_UID, rule, metered, +                            backgroundRestricted));          }      } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index b0cc7f1361f6..bdacca56eadc 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1262,22 +1262,28 @@ public class ConnectivityServiceTest {          }      } -    private void updateUidNetworkingBlocked() { -        doAnswer(i -> NetworkPolicyManagerInternal.isUidNetworkingBlocked( -                i.getArgument(0) /* uid */, mUidRules, i.getArgument(1) /* metered */, -                mRestrictBackground) +    private void mockUidNetworkingBlocked() { +        doAnswer(i -> mContext.getSystemService(NetworkPolicyManager.class) +                .checkUidNetworkingBlocked(i.getArgument(0) /* uid */, mUidRules, +                        i.getArgument(1) /* metered */, mRestrictBackground)          ).when(mNetworkPolicyManager).isUidNetworkingBlocked(anyInt(), anyBoolean()); + +        doAnswer(inv -> mContext.getSystemService(NetworkPolicyManager.class) +                .checkUidNetworkingBlocked(inv.getArgument(0) /* uid */, +                        inv.getArgument(1) /* uidRules */, +                        inv.getArgument(2) /* isNetworkMetered */, +                        inv.getArgument(3) /* isBackgroundRestricted */) +        ).when(mNetworkPolicyManager).checkUidNetworkingBlocked( +                anyInt(), anyInt(), anyBoolean(), anyBoolean());      }      private void setUidRulesChanged(int uidRules) throws RemoteException {          mUidRules = uidRules; -        updateUidNetworkingBlocked();          mPolicyListener.onUidRulesChanged(Process.myUid(), mUidRules);      }      private void setRestrictBackgroundChanged(boolean restrictBackground) throws RemoteException {          mRestrictBackground = restrictBackground; -        updateUidNetworkingBlocked();          mPolicyListener.onRestrictBackgroundChanged(mRestrictBackground);      } @@ -6809,6 +6815,7 @@ public class ConnectivityServiceTest {                  .addTransportType(TRANSPORT_CELLULAR)                  .build();          mCm.registerNetworkCallback(cellRequest, cellNetworkCallback); +        mockUidNetworkingBlocked();          mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);          mCellNetworkAgent.connect(true); @@ -6891,6 +6898,7 @@ public class ConnectivityServiceTest {      public void testNetworkBlockedStatusBeforeAndAfterConnect() throws Exception {          final TestNetworkCallback defaultCallback = new TestNetworkCallback();          mCm.registerDefaultNetworkCallback(defaultCallback); +        mockUidNetworkingBlocked();          // No Networkcallbacks invoked before any network is active.          setUidRulesChanged(RULE_REJECT_ALL);  |