Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35255d3e authored by Iavor-Valentin Iftime's avatar Iavor-Valentin Iftime Committed by Automerger Merge Worker
Browse files

Merge "Check for NLS service intent filter when rebinding services" into...

Merge "Check for NLS service intent filter when rebinding services" into sc-dev am: ac23a586 am: b1a035a8 am: b1f9d1aa am: 93d6b4f3

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/28750179



Change-Id: I6ccaffecc8c39e12a7f557c4ba49501eb7cfc60b
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 30ee8b3b 93d6b4f3
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -907,7 +907,7 @@ abstract public class ManagedServices {
                || isPackageOrComponentAllowed(component.getPackageName(), userId))) {
            return false;
        }
        return componentHasBindPermission(component, userId);
        return isValidService(component, userId);
    }

    private boolean componentHasBindPermission(ComponentName component, int userId) {
@@ -1252,11 +1252,12 @@ abstract public class ManagedServices {
                    if (TextUtils.equals(getPackageName(approvedPackageOrComponent), packageName)) {
                        final ComponentName component = ComponentName.unflattenFromString(
                                approvedPackageOrComponent);
                        if (component != null && !componentHasBindPermission(component, userId)) {
                        if (component != null && !isValidService(component, userId)) {
                            approved.removeAt(j);
                            if (DEBUG) {
                                Slog.v(TAG, "Removing " + approvedPackageOrComponent
                                        + " from approved list; no bind permission found "
                                        + " from approved list; no bind permission or "
                                        + "service interface filter found "
                                        + mConfig.bindPermission);
                            }
                        }
@@ -1275,6 +1276,11 @@ abstract public class ManagedServices {
        }
    }

    protected boolean isValidService(ComponentName component, int userId) {
        return componentHasBindPermission(component, userId) && queryPackageForServices(
                component.getPackageName(), userId).contains(component);
    }

    protected boolean isValidEntry(String packageOrComponent, int userId) {
        return hasMatchingServices(packageOrComponent, userId);
    }
+74 −0
Original line number Diff line number Diff line
@@ -1012,6 +1012,80 @@ public class ManagedServicesTest extends UiServiceTestCase {
        assertTrue(service.isComponentEnabledForCurrentProfiles(approvedComponent));
    }

    @Test
    public void testUpgradeAppNoIntentFilterNoRebind() throws Exception {
        Context context = spy(getContext());
        doReturn(true).when(context).bindServiceAsUser(any(), any(), anyInt(), any());

        ManagedServices service = new TestManagedServices(context, mLock, mUserProfiles,
                mIpm, APPROVAL_BY_COMPONENT);

        List<String> packages = new ArrayList<>();
        packages.add("package");
        addExpectedServices(service, packages, 0);

        final ComponentName unapprovedComponent = ComponentName.unflattenFromString("package/C1");
        final ComponentName approvedComponent = ComponentName.unflattenFromString("package/C2");

        // Both components are approved initially
        mExpectedPrimaryComponentNames.clear();
        mExpectedPrimaryPackages.clear();
        mExpectedPrimaryComponentNames.put(0, "package/C1:package/C2");
        mExpectedSecondaryComponentNames.clear();
        mExpectedSecondaryPackages.clear();

        loadXml(service);

        //Components keep bind permission
        when(mIpm.getServiceInfo(any(), anyInt(), anyInt())).thenAnswer(
                (Answer<ServiceInfo>) invocation -> {
                    ComponentName invocationCn = invocation.getArgument(0);
                    if (invocationCn != null) {
                        ServiceInfo serviceInfo = new ServiceInfo();
                        serviceInfo.packageName = invocationCn.getPackageName();
                        serviceInfo.name = invocationCn.getClassName();
                        serviceInfo.permission = service.getConfig().bindPermission;
                        serviceInfo.metaData = null;
                        return serviceInfo;
                    }
                    return null;
                }
        );

        //Component package/C1 loses serviceInterface intent filter
        ManagedServices.Config config = service.getConfig();
        when(mPm.queryIntentServicesAsUser(any(), anyInt(), anyInt())).
            thenAnswer(new Answer<List<ResolveInfo>>() {
                @Override
                public List<ResolveInfo> answer(InvocationOnMock invocationOnMock)
                    throws Throwable {
                    Object[] args = invocationOnMock.getArguments();
                    Intent invocationIntent = (Intent) args[0];
                    if (invocationIntent != null) {
                        if (invocationIntent.getAction().equals(config.serviceInterface)
                            && packages.contains(invocationIntent.getPackage())) {
                            List<ResolveInfo> dummyServices = new ArrayList<>();
                            ResolveInfo resolveInfo = new ResolveInfo();
                            ServiceInfo serviceInfo = new ServiceInfo();
                            serviceInfo.packageName = invocationIntent.getPackage();
                            serviceInfo.name = approvedComponent.getClassName();
                            serviceInfo.permission = service.getConfig().bindPermission;
                            resolveInfo.serviceInfo = serviceInfo;
                            dummyServices.add(resolveInfo);
                            return dummyServices;
                        }
                    }
                    return new ArrayList<>();
                }
            });

        // Trigger package update
        service.onPackagesChanged(false, new String[]{"package"}, new int[]{0});

        assertFalse(service.isComponentEnabledForCurrentProfiles(unapprovedComponent));
        assertTrue(service.isComponentEnabledForCurrentProfiles(approvedComponent));
    }

    @Test
    public void testSetPackageOrComponentEnabled() throws Exception {
        for (int approvalLevel : new int[] {APPROVAL_BY_COMPONENT, APPROVAL_BY_PACKAGE}) {