summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorSvet Ganov <svetoslavganov@google.com>2015-04-17 21:34:02 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-04-17 21:34:04 +0000
commitd3c1ddb892f2ef8ae1b8eb0e4c50dfef302c0beb (patch)
tree5abd54a3da632d215a5ac1f1bad5b189852ef048 /services
parentf2004061505cdcb2a37072b430104586ca848df2 (diff)
parent16a16899505ec0a9ede5b76650bfb8817b3227c7 (diff)
downloadframeworks_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.java51
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java17
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) {