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

Commit c73c9ea6 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Clean up permissions when system app fails to scan" into rvc-dev am:...

Merge "Clean up permissions when system app fails to scan" into rvc-dev am: 410ddb91 am: 2f6ff6d5 am: f6e16606

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

Change-Id: I1c74fee970efca285a4377ff1a92e48397f5b0cd
parents b56dd10e f6e16606
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3175,6 +3175,10 @@ public class PackageManagerService extends IPackageManager.Stub
                        psit.remove();
                        logCriticalInfo(Log.WARN, "System package " + ps.name
                                + " no longer exists; it's data will be wiped");
                        // Assume package is truly gone and wipe residual permissions.
                        mPermissionManager.updatePermissions(ps.name, null);
                        // Actual deletion of code and data will be handled by later
                        // reconciliation step
                    } else {
+8 −0
Original line number Diff line number Diff line
@@ -28,6 +28,14 @@ java_test_host {
        ":PackageManagerDummyAppVersion1",
        ":PackageManagerDummyAppVersion2",
        ":PackageManagerDummyAppVersion3",
        ":PackageManagerDummyAppVersion4",
        ":PackageManagerDummyAppOriginalOverride",
        ":PackageManagerServiceHostTestsResources",
    ]
}

filegroup {
    name: "PackageManagerServiceHostTestsResources",
    srcs: [ "resources/*" ],
    path: "resources/"
}
+10 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.pm.test
import com.android.internal.util.test.SystemPreparer
import com.android.tradefed.device.ITestDevice
import java.io.File
import java.io.FileOutputStream

internal fun SystemPreparer.pushApk(file: String, partition: Partition) =
        pushResourceFile(file, HostUtils.makePathForApk(file, partition))
@@ -43,4 +44,13 @@ internal object HostUtils {
                    .resolve(file.nameWithoutExtension)
                    .resolve(file.name)
                    .toString()

    fun copyResourceToHostFile(javaResourceName: String, file: File): File {
        javaClass.classLoader!!.getResource(javaResourceName).openStream().use { input ->
            FileOutputStream(file).use { output ->
                input.copyTo(output)
            }
        }
        return file
    }
}
+83 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.pm.test

import com.android.internal.util.test.SystemPreparer
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.ClassRule
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
import org.junit.rules.TemporaryFolder
import org.junit.runner.RunWith

@RunWith(DeviceJUnit4ClassRunner::class)
class InvalidNewSystemAppTest : BaseHostJUnit4Test() {

    companion object {
        private const val TEST_PKG_NAME = "com.android.server.pm.test.dummy_app"
        private const val VERSION_ONE = "PackageManagerDummyAppVersion1.apk"
        private const val VERSION_TWO = "PackageManagerDummyAppVersion2.apk"
        private const val VERSION_THREE_INVALID = "PackageManagerDummyAppVersion3Invalid.apk"
        private const val VERSION_FOUR = "PackageManagerDummyAppVersion4.apk"

        @get:ClassRule
        val deviceRebootRule = SystemPreparer.TestRuleDelegate(true)
    }

    private val tempFolder = TemporaryFolder()
    private val preparer: SystemPreparer = SystemPreparer(tempFolder,
            SystemPreparer.RebootStrategy.START_STOP, deviceRebootRule) { this.device }

    @get:Rule
    val rules = RuleChain.outerRule(tempFolder).around(preparer)!!

    @Before
    @After
    fun uninstallDataPackage() {
        device.uninstallPackage(TEST_PKG_NAME)
    }

    @Test
    fun verify() {
        // First, push a system app to the device and then update it so there's a data variant
        val filePath = HostUtils.makePathForApk("PackageManagerDummyApp.apk", Partition.PRODUCT)

        preparer.pushResourceFile(VERSION_ONE, filePath)
                .reboot()

        val versionTwoFile = HostUtils.copyResourceToHostFile(VERSION_TWO, tempFolder.newFile())

        assertThat(device.installPackage(versionTwoFile, true)).isNull()

        // Then push a bad update to the system, overwriting the existing file as if an OTA occurred
        preparer.deleteFile(filePath)
                .pushResourceFile(VERSION_THREE_INVALID, filePath)
                .reboot()

        // This will remove the package from the device, which is expected
        assertThat(device.getAppPackageInfo(TEST_PKG_NAME)).isNull()

        // Then check that a user would still be able to install the application manually
        val versionFourFile = HostUtils.copyResourceToHostFile(VERSION_FOUR, tempFolder.newFile())
        assertThat(device.installPackage(versionFourFile, true)).isNull()
    }
}
Loading