Merge change 520 into donut
* changes: Enforce permissions for PhoneStateListener events.
This commit is contained in:
@@ -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(android.Manifest.permission.WRITE_SDCARD,
|
new PackageParser.NewPermissionInfo[] {
|
||||||
android.os.Build.VERSION_CODES.DONUT,
|
new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD,
|
||||||
0)
|
android.os.Build.VERSION_CODES.DONUT, 0),
|
||||||
|
new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE,
|
||||||
|
android.os.Build.VERSION_CODES.DONUT, 0)
|
||||||
};
|
};
|
||||||
|
|
||||||
private String mArchiveSourcePath;
|
private String mArchiveSourcePath;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user