diff options
| author | 2012-05-04 12:52:49 -0700 | |
|---|---|---|
| committer | 2012-05-04 12:52:49 -0700 | |
| commit | 15a5a87e374c26c2502c8b38ca00f80a34f3675f (patch) | |
| tree | 6ace43c49811769a5ba3808f20275a1db7eb4135 | |
| parent | a2c213080d26c08235f11829fb2bbcf07cdfdd46 (diff) | |
| parent | 5f4dafb48e065d07f01ee83a6b54aa4bd4b25fc4 (diff) | |
Merge "Block metered APNs when app is restricted." into jb-dev
| -rw-r--r-- | services/java/com/android/server/ConnectivityService.java | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index dd650bf229d3..e396a6970362 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -884,22 +884,25 @@ private NetworkStateTracker makeWimaxStateTracker() { @Override public boolean isActiveNetworkMetered() { enforceAccessPermission(); - final long token = Binder.clearCallingIdentity(); try { - final NetworkState state = getNetworkStateUnchecked(mActiveDefaultNetwork); - if (state != null) { - try { - return mPolicyManager.isNetworkMetered(state); - } catch (RemoteException e) { - } - } - return false; + return isNetworkMeteredUnchecked(mActiveDefaultNetwork); } finally { Binder.restoreCallingIdentity(token); } } + private boolean isNetworkMeteredUnchecked(int networkType) { + final NetworkState state = getNetworkStateUnchecked(networkType); + if (state != null) { + try { + return mPolicyManager.isNetworkMetered(state); + } catch (RemoteException e) { + } + } + return false; + } + public boolean setRadios(boolean turnOn) { boolean result = true; enforceChangePermission(); @@ -993,7 +996,8 @@ private NetworkStateTracker makeWimaxStateTracker() { public int startUsingNetworkFeature(int networkType, String feature, IBinder binder) { if (VDBG) { - log("startUsingNetworkFeature for net " + networkType + ": " + feature); + log("startUsingNetworkFeature for net " + networkType + ": " + feature + ", uid=" + + Binder.getCallingUid()); } enforceChangePermission(); if (!ConnectivityManager.isNetworkTypeValid(networkType) || @@ -1010,6 +1014,16 @@ private NetworkStateTracker makeWimaxStateTracker() { enforceConnectivityInternalPermission(); } + // if UID is restricted, don't allow them to bring up metered APNs + final boolean networkMetered = isNetworkMeteredUnchecked(usedNetworkType); + final int uidRules; + synchronized (mRulesLock) { + uidRules = mUidRules.get(Binder.getCallingUid(), RULE_ALLOW_ALL); + } + if (networkMetered && (uidRules & RULE_REJECT_METERED) != 0) { + return Phone.APN_REQUEST_FAILED; + } + NetworkStateTracker network = mNetTrackers[usedNetworkType]; if (network != null) { Integer currentPid = new Integer(getCallingPid()); @@ -1432,7 +1446,6 @@ private NetworkStateTracker makeWimaxStateTracker() { mUidRules.put(uid, uidRules); } - // TODO: dispatch into NMS to push rules towards kernel module // TODO: notify UID when it has requested targeted updates } |