diff options
author | Svet Ganov <svetoslavganov@google.com> | 2015-04-17 21:34:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-04-17 21:34:04 +0000 |
commit | d3c1ddb892f2ef8ae1b8eb0e4c50dfef302c0beb (patch) | |
tree | 5abd54a3da632d215a5ac1f1bad5b189852ef048 /services | |
parent | f2004061505cdcb2a37072b430104586ca848df2 (diff) | |
parent | 16a16899505ec0a9ede5b76650bfb8817b3227c7 (diff) | |
download | frameworks_base-d3c1ddb892f2ef8ae1b8eb0e4c50dfef302c0beb.zip frameworks_base-d3c1ddb892f2ef8ae1b8eb0e4c50dfef302c0beb.tar.gz frameworks_base-d3c1ddb892f2ef8ae1b8eb0e4c50dfef302c0beb.tar.bz2 |
Merge "Add OP_READ_PHONE_STATE app op - framework"
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/TelephonyRegistry.java | 51 | ||||
-rw-r--r-- | services/core/java/com/android/server/net/NetworkPolicyManagerService.java | 17 |
2 files changed, 47 insertions, 21 deletions
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 908ee22..4ee6657 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -17,6 +17,7 @@ package com.android.server; import android.app.ActivityManager; +import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -84,7 +85,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private static final boolean VDBG = false; // STOPSHIP if true private static class Record { - String pkgForDebug; + String callingPackage; IBinder binder; @@ -109,7 +110,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { @Override public String toString() { - return "{pkgForDebug=" + pkgForDebug + " binder=" + binder + " callback=" + callback + return "{callingPackage=" + callingPackage + " binder=" + binder + + " callback=" + callback + " onSubscriptionsChangedListenererCallback=" + onSubscriptionsChangedListenerCallback + " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId @@ -125,6 +127,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private final IBatteryStats mBatteryStats; + private final AppOpsManager mAppOps; + private boolean hasNotifySubscriptionInfoChangedOccurred = false; private int mNumPhones; @@ -327,6 +331,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } mConnectedApns = new ArrayList<String>(); + + mAppOps = mContext.getSystemService(AppOpsManager.class); } public void systemRunning() { @@ -340,18 +346,24 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } @Override - public void addOnSubscriptionsChangedListener(String pkgForDebug, + public void addOnSubscriptionsChangedListener(String callingPackage, IOnSubscriptionsChangedListener callback) { int callerUid = UserHandle.getCallingUserId(); int myUid = UserHandle.myUserId(); if (VDBG) { - log("listen oscl: E pkg=" + pkgForDebug + " myUid=" + myUid + log("listen oscl: E pkg=" + callingPackage + " myUid=" + myUid + " callerUid=" + callerUid + " callback=" + callback + " callback.asBinder=" + callback.asBinder()); } - /* Checks permission and throws Security exception */ - checkOnSubscriptionsChangedListenerPermission(); + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.READ_PHONE_STATE, null); + + if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), + callingPackage) != AppOpsManager.MODE_ALLOWED) { + return; + } + Record r = null; synchronized (mRecords) { @@ -372,7 +384,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } r.onSubscriptionsChangedListenerCallback = callback; - r.pkgForDebug = pkgForDebug; + r.callingPackage = callingPackage; r.callerUid = callerUid; r.events = 0; if (DBG) { @@ -401,12 +413,6 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(callback.asBinder()); } - private void checkOnSubscriptionsChangedListenerPermission() { - mContext.enforceCallingOrSelfPermission( - SubscriptionManager.OnSubscriptionsChangedListener - .PERMISSION_ON_SUBSCRIPTIONS_CHANGED, null); - } - @Override public void notifySubscriptionInfoChanged() { if (VDBG) log("notifySubscriptionInfoChanged:"); @@ -446,12 +452,12 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { listen(pkgForDebug, callback, events, notifyNow, subId); } - private void listen(String pkgForDebug, IPhoneStateListener callback, int events, + private void listen(String callingPackage, IPhoneStateListener callback, int events, boolean notifyNow, int subId) { int callerUid = UserHandle.getCallingUserId(); int myUid = UserHandle.myUserId(); if (VDBG) { - log("listen: E pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events) + log("listen: E pkg=" + callingPackage + " events=0x" + Integer.toHexString(events) + " notifyNow=" + notifyNow + " subId=" + subId + " myUid=" + myUid + " callerUid=" + callerUid); } @@ -459,6 +465,14 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { if (events != PhoneStateListener.LISTEN_NONE) { /* Checks permission and throws Security exception */ checkListenerPermission(events); + + if ((events & PHONE_STATE_PERMISSION_MASK) != 0) { + if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), + callingPackage) != AppOpsManager.MODE_ALLOWED) { + return; + } + } + synchronized (mRecords) { // register Record r = null; @@ -478,7 +492,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } r.callback = callback; - r.pkgForDebug = pkgForDebug; + r.callingPackage = callingPackage; r.callerUid = callerUid; // Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID, // force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID @@ -631,7 +645,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { if (mRecords.get(i).binder == binder) { if (DBG) { Record r = mRecords.get(i); - log("remove: binder=" + binder + "r.pkgForDebug" + r.pkgForDebug + log("remove: binder=" + binder + "r.callingPackage" + r.callingPackage + "r.callback" + r.callback); } mRecords.remove(i); @@ -1380,7 +1394,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); mContext.sendBroadcastAsUser(intent, UserHandle.ALL, - android.Manifest.permission.READ_PHONE_STATE); + android.Manifest.permission.READ_PHONE_STATE, + AppOpsManager.OP_READ_PHONE_STATE); } private void broadcastDataConnectionStateChanged(int state, diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 5de7d42..4e90f97 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -74,6 +74,7 @@ import static org.xmlpull.v1.XmlPullParser.START_TAG; import android.Manifest; import android.app.ActivityManager; import android.app.AppGlobals; +import android.app.AppOpsManager; import android.app.IActivityManager; import android.app.INotificationManager; import android.app.IProcessObserver; @@ -136,6 +137,7 @@ import android.util.SparseIntArray; import android.util.TrustedTime; import android.util.Xml; +import com.android.server.AppOpsService; import libcore.io.IoUtils; import com.android.internal.R; @@ -292,6 +294,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final AtomicFile mPolicyFile; + private final AppOpsManager mAppOps; + // TODO: keep whitelist of system-critical services that should never have // rules enforced, such as system, phone, and radio UIDs. @@ -326,6 +330,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mSuppressDefaultPolicy = suppressDefaultPolicy; mPolicyFile = new AtomicFile(new File(systemDir, "netpolicy.xml")); + + mAppOps = context.getSystemService(AppOpsManager.class); } public void bindConnectivityManager(IConnectivityManager connManager) { @@ -1593,16 +1599,21 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } void addNetworkPolicyLocked(NetworkPolicy policy) { - NetworkPolicy[] policies = getNetworkPolicies(); + NetworkPolicy[] policies = getNetworkPolicies(mContext.getOpPackageName()); policies = ArrayUtils.appendElement(NetworkPolicy.class, policies, policy); setNetworkPolicies(policies); } @Override - public NetworkPolicy[] getNetworkPolicies() { + public NetworkPolicy[] getNetworkPolicies(String callingPackage) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, TAG); + if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), + callingPackage) != AppOpsManager.MODE_ALLOWED) { + return new NetworkPolicy[0]; + } + synchronized (mRulesLock) { final int size = mNetworkPolicy.size(); final NetworkPolicy[] policies = new NetworkPolicy[size]; @@ -1614,7 +1625,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } private void normalizePoliciesLocked() { - normalizePoliciesLocked(getNetworkPolicies()); + normalizePoliciesLocked(getNetworkPolicies(mContext.getOpPackageName())); } private void normalizePoliciesLocked(NetworkPolicy[] policies) { |