Merge "Fix check for caller being the active network scorer" into mnc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
027e3b7f51
@ -23,6 +23,7 @@ import android.app.AppOpsManager;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
@ -54,6 +55,9 @@ public final class NetworkScorerAppManager {
|
|||||||
/** Package name of this scorer app. */
|
/** Package name of this scorer app. */
|
||||||
public final String mPackageName;
|
public final String mPackageName;
|
||||||
|
|
||||||
|
/** UID of the scorer app. */
|
||||||
|
public final int mPackageUid;
|
||||||
|
|
||||||
/** Name of this scorer app for display. */
|
/** Name of this scorer app for display. */
|
||||||
public final CharSequence mScorerName;
|
public final CharSequence mScorerName;
|
||||||
|
|
||||||
@ -64,10 +68,11 @@ public final class NetworkScorerAppManager {
|
|||||||
*/
|
*/
|
||||||
public final String mConfigurationActivityClassName;
|
public final String mConfigurationActivityClassName;
|
||||||
|
|
||||||
public NetworkScorerAppData(String packageName, CharSequence scorerName,
|
public NetworkScorerAppData(String packageName, int packageUid, CharSequence scorerName,
|
||||||
@Nullable String configurationActivityClassName) {
|
@Nullable String configurationActivityClassName) {
|
||||||
mScorerName = scorerName;
|
mScorerName = scorerName;
|
||||||
mPackageName = packageName;
|
mPackageName = packageName;
|
||||||
|
mPackageUid = packageUid;
|
||||||
mConfigurationActivityClassName = configurationActivityClassName;
|
mConfigurationActivityClassName = configurationActivityClassName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,7 +130,8 @@ public final class NetworkScorerAppManager {
|
|||||||
// NOTE: loadLabel will attempt to load the receiver's label and fall back to the app
|
// NOTE: loadLabel will attempt to load the receiver's label and fall back to the app
|
||||||
// label if none is present.
|
// label if none is present.
|
||||||
scorers.add(new NetworkScorerAppData(receiverInfo.packageName,
|
scorers.add(new NetworkScorerAppData(receiverInfo.packageName,
|
||||||
receiverInfo.loadLabel(pm), configurationActivityClassName));
|
receiverInfo.applicationInfo.uid, receiverInfo.loadLabel(pm),
|
||||||
|
configurationActivityClassName));
|
||||||
}
|
}
|
||||||
|
|
||||||
return scorers;
|
return scorers;
|
||||||
@ -187,13 +193,9 @@ public final class NetworkScorerAppManager {
|
|||||||
if (defaultApp == null) {
|
if (defaultApp == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
if (callingUid != defaultApp.mPackageUid) {
|
||||||
try {
|
|
||||||
appOpsMgr.checkPackage(callingUid, defaultApp.mPackageName);
|
|
||||||
} catch (SecurityException e) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// To be extra safe, ensure the caller holds the SCORE_NETWORKS permission. It always
|
// To be extra safe, ensure the caller holds the SCORE_NETWORKS permission. It always
|
||||||
// should, since it couldn't become the active scorer otherwise, but this can't hurt.
|
// should, since it couldn't become the active scorer otherwise, but this can't hurt.
|
||||||
return context.checkCallingPermission(Manifest.permission.SCORE_NETWORKS) ==
|
return context.checkCallingPermission(Manifest.permission.SCORE_NETWORKS) ==
|
||||||
|
@ -57,16 +57,19 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
|
|||||||
|
|
||||||
public void testGetAllValidScorers() throws Exception {
|
public void testGetAllValidScorers() throws Exception {
|
||||||
// Package 1 - Valid scorer.
|
// Package 1 - Valid scorer.
|
||||||
Pair<ResolveInfo, ResolveInfo> package1 = buildResolveInfo("package1", true, true, false);
|
Pair<ResolveInfo, ResolveInfo> package1 = buildResolveInfo("package1", 1, true, true,
|
||||||
|
false);
|
||||||
|
|
||||||
// Package 2 - Receiver does not have BROADCAST_NETWORK_PRIVILEGED permission.
|
// Package 2 - Receiver does not have BROADCAST_NETWORK_PRIVILEGED permission.
|
||||||
Pair<ResolveInfo, ResolveInfo> package2 = buildResolveInfo("package2", false, true, false);
|
Pair<ResolveInfo, ResolveInfo> package2 = buildResolveInfo("package2", 2, false, true,
|
||||||
|
false);
|
||||||
|
|
||||||
// Package 3 - App does not have SCORE_NETWORKS permission.
|
// Package 3 - App does not have SCORE_NETWORKS permission.
|
||||||
Pair<ResolveInfo, ResolveInfo> package3 = buildResolveInfo("package3", true, false, false);
|
Pair<ResolveInfo, ResolveInfo> package3 = buildResolveInfo("package3", 3, true, false,
|
||||||
|
false);
|
||||||
|
|
||||||
// Package 4 - Valid scorer w/ optional config activity.
|
// Package 4 - Valid scorer w/ optional config activity.
|
||||||
Pair<ResolveInfo, ResolveInfo> package4 = buildResolveInfo("package4", true, true, true);
|
Pair<ResolveInfo, ResolveInfo> package4 = buildResolveInfo("package4", 4, true, true, true);
|
||||||
|
|
||||||
List<Pair<ResolveInfo, ResolveInfo>> scorers = new ArrayList<>();
|
List<Pair<ResolveInfo, ResolveInfo>> scorers = new ArrayList<>();
|
||||||
scorers.add(package1);
|
scorers.add(package1);
|
||||||
@ -81,11 +84,13 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
|
|||||||
assertTrue(result.hasNext());
|
assertTrue(result.hasNext());
|
||||||
NetworkScorerAppData next = result.next();
|
NetworkScorerAppData next = result.next();
|
||||||
assertEquals("package1", next.mPackageName);
|
assertEquals("package1", next.mPackageName);
|
||||||
|
assertEquals(1, next.mPackageUid);
|
||||||
assertNull(next.mConfigurationActivityClassName);
|
assertNull(next.mConfigurationActivityClassName);
|
||||||
|
|
||||||
assertTrue(result.hasNext());
|
assertTrue(result.hasNext());
|
||||||
next = result.next();
|
next = result.next();
|
||||||
assertEquals("package4", next.mPackageName);
|
assertEquals("package4", next.mPackageName);
|
||||||
|
assertEquals(4, next.mPackageUid);
|
||||||
assertEquals(".ConfigActivity", next.mConfigurationActivityClassName);
|
assertEquals(".ConfigActivity", next.mConfigurationActivityClassName);
|
||||||
|
|
||||||
assertFalse(result.hasNext());
|
assertFalse(result.hasNext());
|
||||||
@ -122,7 +127,7 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
|
|||||||
.thenReturn(receivers);
|
.thenReturn(receivers);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Pair<ResolveInfo, ResolveInfo> buildResolveInfo(String packageName,
|
private Pair<ResolveInfo, ResolveInfo> buildResolveInfo(String packageName, int packageUid,
|
||||||
boolean hasReceiverPermission, boolean hasScorePermission, boolean hasConfigActivity)
|
boolean hasReceiverPermission, boolean hasScorePermission, boolean hasConfigActivity)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Mockito.when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
|
Mockito.when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
|
||||||
@ -133,6 +138,7 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
|
|||||||
resolveInfo.activityInfo = new ActivityInfo();
|
resolveInfo.activityInfo = new ActivityInfo();
|
||||||
resolveInfo.activityInfo.packageName = packageName;
|
resolveInfo.activityInfo.packageName = packageName;
|
||||||
resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
|
resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
|
||||||
|
resolveInfo.activityInfo.applicationInfo.uid = packageUid;
|
||||||
if (hasReceiverPermission) {
|
if (hasReceiverPermission) {
|
||||||
resolveInfo.activityInfo.permission = permission.BROADCAST_NETWORK_PRIVILEGED;
|
resolveInfo.activityInfo.permission = permission.BROADCAST_NETWORK_PRIVILEGED;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user