Merge change 520 into donut

* changes:
  Enforce permissions for PhoneStateListener events.
This commit is contained in:
Android (Google) Code Review
2009-05-29 11:48:34 -07:00
3 changed files with 56 additions and 30 deletions

View File

@@ -74,10 +74,12 @@ public class PackageParser {
* added to older SDKs appearing before those added to newer SDKs. * added to older SDKs appearing before those added to newer SDKs.
* @hide * @hide
*/ */
public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = new PackageParser.NewPermissionInfo[] { public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] =
new PackageParser.NewPermissionInfo[] {
new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD, new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD,
android.os.Build.VERSION_CODES.DONUT, android.os.Build.VERSION_CODES.DONUT, 0),
0) new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
android.os.Build.VERSION_CODES.DONUT, 0)
}; };
private String mArchiveSourcePath; private String mArchiveSourcePath;

View File

@@ -92,6 +92,13 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
private Bundle mCellLocation = new Bundle(); private Bundle mCellLocation = new Bundle();
static final int PHONE_STATE_PERMISSION_MASK =
PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR |
PhoneStateListener.LISTEN_CALL_STATE |
PhoneStateListener.LISTEN_DATA_ACTIVITY |
PhoneStateListener.LISTEN_DATA_CONNECTION_STATE |
PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR;
// we keep a copy of all of the state so we can send it out when folks // we keep a copy of all of the state so we can send it out when folks
// register for it // register for it
// //
@@ -110,16 +117,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
// Log.d(TAG, "listen pkg=" + pkgForDebug + " events=0x" + // Log.d(TAG, "listen pkg=" + pkgForDebug + " events=0x" +
// Integer.toHexString(events)); // Integer.toHexString(events));
if (events != 0) { if (events != 0) {
// check permissions /* Checks permission and throws Security exception */
if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { checkListenerPermission(events);
// ACCESS_FINE_LOCATION implies ACCESS_COARSE_LOCATION
if (mContext.checkCallingPermission(
android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
}
}
synchronized (mRecords) { synchronized (mRecords) {
// register // register
@@ -219,7 +218,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyCallState(int state, String incomingNumber) { public void notifyCallState(int state, String incomingNumber) {
if (!checkPhoneStatePermission("notifyCallState()")) { if (!checkNotifyPermission("notifyCallState()")) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -240,7 +239,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyServiceState(ServiceState state) { public void notifyServiceState(ServiceState state) {
if (!checkPhoneStatePermission("notifyServiceState()")) { if (!checkNotifyPermission("notifyServiceState()")){
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -256,7 +255,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifySignalStrength(SignalStrength signalStrength) { public void notifySignalStrength(SignalStrength signalStrength) {
if (!checkPhoneStatePermission("notifySignalStrength()")) { if (!checkNotifyPermission("notifySignalStrength()")) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -281,7 +280,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyMessageWaitingChanged(boolean mwi) { public void notifyMessageWaitingChanged(boolean mwi) {
if (!checkPhoneStatePermission("notifyMessageWaitingChanged()")) { if (!checkNotifyPermission("notifyMessageWaitingChanged()")) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -300,7 +299,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyCallForwardingChanged(boolean cfi) { public void notifyCallForwardingChanged(boolean cfi) {
if (!checkPhoneStatePermission("notifyCallForwardingChanged()")) { if (!checkNotifyPermission("notifyCallForwardingChanged()")) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -319,7 +318,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyDataActivity(int state) { public void notifyDataActivity(int state) {
if (!checkPhoneStatePermission("notifyDataActivity()")) { if (!checkNotifyPermission("notifyDataActivity()" )) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -337,9 +336,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
} }
public void notifyDataConnection(int state, boolean isDataConnectivityPossible, String reason, public void notifyDataConnection(int state, boolean isDataConnectivityPossible,
String apn, String interfaceName) { String reason, String apn, String interfaceName) {
if (!checkPhoneStatePermission("notifyDataConnection()")) { if (!checkNotifyPermission("notifyDataConnection()" )) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -364,7 +363,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyDataConnectionFailed(String reason) { public void notifyDataConnectionFailed(String reason) {
if (!checkPhoneStatePermission("notifyDataConnectionFailed()")) { if (!checkNotifyPermission("notifyDataConnectionFailed()")) {
return; return;
} }
/* /*
@@ -385,7 +384,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
} }
public void notifyCellLocation(Bundle cellLocation) { public void notifyCellLocation(Bundle cellLocation) {
if (!checkPhoneStatePermission("notifyCellLocation()")) { if (!checkNotifyPermission("notifyCellLocation()")) {
return; return;
} }
synchronized (mRecords) { synchronized (mRecords) {
@@ -402,7 +401,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
/** /**
* Copy the service state object so they can't mess it up in the local calls * Copy the service state object so they can't mess it up in the local calls
*/ */
private void sendServiceState(Record r, ServiceState state) { public void sendServiceState(Record r, ServiceState state) {
try { try {
r.callback.onServiceStateChanged(new ServiceState(state)); r.callback.onServiceStateChanged(new ServiceState(state));
} catch (RemoteException ex) { } catch (RemoteException ex) {
@@ -533,7 +532,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
mContext.sendStickyBroadcast(intent); mContext.sendStickyBroadcast(intent);
} }
private boolean checkPhoneStatePermission(String method) { private boolean checkNotifyPermission(String method) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE) if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
== PackageManager.PERMISSION_GRANTED) { == PackageManager.PERMISSION_GRANTED) {
return true; return true;
@@ -543,4 +542,17 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub {
Log.w(TAG, msg); Log.w(TAG, msg);
return false; return false;
} }
private void checkListenerPermission(int events) {
if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
}
if ((events & PHONE_STATE_PERMISSION_MASK) != 0) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PHONE_STATE, null);
}
}
} }

View File

@@ -42,6 +42,9 @@ public class PhoneStateListener {
/** /**
* Listen for changes to the network signal strength (cellular). * Listen for changes to the network signal strength (cellular).
* {@more}
* Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
* <p> * <p>
* *
* @see #onSignalStrengthChanged * @see #onSignalStrengthChanged
@@ -52,6 +55,9 @@ public class PhoneStateListener {
/** /**
* Listen for changes to the message-waiting indicator. * Listen for changes to the message-waiting indicator.
* {@more}
* Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
* <p> * <p>
* Example: The status bar uses this to determine when to display the * Example: The status bar uses this to determine when to display the
* voicemail icon. * voicemail icon.
@@ -62,7 +68,9 @@ public class PhoneStateListener {
/** /**
* Listen for changes to the call-forwarding indicator. * Listen for changes to the call-forwarding indicator.
* * {@more}
* Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
* @see #onCallForwardingIndicatorChanged * @see #onCallForwardingIndicatorChanged
*/ */
public static final int LISTEN_CALL_FORWARDING_INDICATOR = 0x00000008; public static final int LISTEN_CALL_FORWARDING_INDICATOR = 0x00000008;
@@ -85,7 +93,9 @@ public class PhoneStateListener {
/** /**
* Listen for changes to the device call state. * Listen for changes to the device call state.
* * {@more}
* Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
* @see #onCallStateChanged * @see #onCallStateChanged
*/ */
public static final int LISTEN_CALL_STATE = 0x00000020; public static final int LISTEN_CALL_STATE = 0x00000020;
@@ -100,7 +110,9 @@ public class PhoneStateListener {
/** /**
* Listen for changes to the direction of data traffic on the data * Listen for changes to the direction of data traffic on the data
* connection (cellular). * connection (cellular).
* * {@more}
* Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE
* READ_PHONE_STATE}
* Example: The status bar uses this to display the appropriate * Example: The status bar uses this to display the appropriate
* data-traffic icon. * data-traffic icon.
* *