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

Commit 680fd1ab authored by Sumedh Sen's avatar Sumedh Sen
Browse files

Ensure correct installer name is shown in UpdateOwnership dialog

If an APK is being sideloaded, the update ownership dialog must show the
name of the app installing the APK, and not the Package Installer

Bug: 319319384
Test: Manual. Follow repro steps from the bug
Test: atest CtsPackageInstallTestCases:UpdateOwnershipEnforcementTest
Change-Id: I1bb040b946dc912e886aaf72a6e4efedaf214b71
parent 8445077b
Loading
Loading
Loading
Loading
+19 −9
Original line number Diff line number Diff line
@@ -81,6 +81,12 @@ public class InstallStart extends Activity {
        String callingPackage = getCallingPackage();
        String callingAttributionTag = null;

        // Uid of the source package, coming from ActivityManager
        int callingUid = getLaunchedFromUid();
        if (callingUid == Process.INVALID_UID) {
            Log.w(TAG, "Could not determine the launching uid.");
        }

        final boolean isSessionInstall =
                PackageInstaller.ACTION_CONFIRM_PRE_APPROVAL.equals(intent.getAction())
                        || PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction());
@@ -90,24 +96,24 @@ public class InstallStart extends Activity {
        final int sessionId = (isSessionInstall
                ? intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1)
                : -1);
        int originatingUidFromSession = callingUid;
        if (callingPackage == null && sessionId != -1) {
            PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
            PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId);
            callingPackage = (sessionInfo != null) ? sessionInfo.getInstallerPackageName() : null;
            callingAttributionTag =
                    (sessionInfo != null) ? sessionInfo.getInstallerAttributionTag() : null;
            if (sessionInfo != null) {
                callingPackage = sessionInfo.getInstallerPackageName();
                callingAttributionTag = sessionInfo.getInstallerAttributionTag();
                originatingUidFromSession = sessionInfo.getOriginatingUid();
            }
        }

        final ApplicationInfo sourceInfo = getSourceInfo(callingPackage);
        // Uid of the source package, coming from ActivityManager
        int callingUid = getLaunchedFromUid();
        if (callingUid == Process.INVALID_UID) {
            Log.e(TAG, "Could not determine the launching uid.");
        }

        // Uid of the source package, with a preference to uid from ApplicationInfo
        final int originatingUid = sourceInfo != null ? sourceInfo.uid : callingUid;

        if (callingUid == Process.INVALID_UID && sourceInfo == null) {
            Log.e(TAG, "Cannot determine caller since UID is invalid and sourceInfo is null");
            mAbortInstall = true;
        }

@@ -127,7 +133,7 @@ public class InstallStart extends Activity {
                && originatingUid != Process.INVALID_UID) {
            final int targetSdkVersion = getMaxTargetSdkVersionForUid(this, originatingUid);
            if (targetSdkVersion < 0) {
                Log.w(TAG, "Cannot get target sdk version for uid " + originatingUid);
                Log.e(TAG, "Cannot get target sdk version for uid " + originatingUid);
                // Invalid originating uid supplied. Abort install.
                mAbortInstall = true;
            } else if (targetSdkVersion >= Build.VERSION_CODES.O && !isUidRequestingPermission(
@@ -139,6 +145,8 @@ public class InstallStart extends Activity {
        }

        if (sessionId != -1 && !isCallerSessionOwner(originatingUid, sessionId)) {
            Log.e(TAG, "UID " + originatingUid + " is not the owner of session " +
                sessionId);
            mAbortInstall = true;
        }

@@ -178,6 +186,8 @@ public class InstallStart extends Activity {
                callingAttributionTag);
        nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINAL_SOURCE_INFO, sourceInfo);
        nextActivity.putExtra(Intent.EXTRA_ORIGINATING_UID, originatingUid);
        nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINATING_UID_FROM_SESSION_INFO,
            originatingUidFromSession);

        if (isSessionInstall) {
            nextActivity.setClass(this, PackageInstallerActivity.class);
+17 −2
Original line number Diff line number Diff line
@@ -83,6 +83,8 @@ public class PackageInstallerActivity extends Activity {
    static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO";
    static final String EXTRA_STAGED_SESSION_ID = "EXTRA_STAGED_SESSION_ID";
    static final String EXTRA_APP_SNIPPET = "EXTRA_APP_SNIPPET";
    static final String EXTRA_ORIGINATING_UID_FROM_SESSION_INFO =
        "EXTRA_ORIGINATING_UID_FROM_SESSION_INFO";
    private static final String ALLOW_UNKNOWN_SOURCES_KEY =
            PackageInstallerActivity.class.getName() + "ALLOW_UNKNOWN_SOURCES_KEY";

@@ -91,7 +93,14 @@ public class PackageInstallerActivity extends Activity {
    private Uri mOriginatingURI;
    private Uri mReferrerURI;
    private int mOriginatingUid = Process.INVALID_UID;
    private String mOriginatingPackage; // The package name corresponding to #mOriginatingUid
    /**
     * The package name corresponding to #mOriginatingUid
     */
    private String mOriginatingPackage;
    /**
     * The package name corresponding to the app updater in the update-ownership confirmation dialog
     */
    private String mOriginatingPackageFromSessionInfo;
    private int mActivityResultCode = Activity.RESULT_CANCELED;
    private int mPendingUserActionReason = -1;

@@ -144,7 +153,8 @@ public class PackageInstallerActivity extends Activity {
            viewToEnable = mDialog.requireViewById(R.id.install_confirm_question_update);

            final CharSequence existingUpdateOwnerLabel = getExistingUpdateOwnerLabel();
            final CharSequence requestedUpdateOwnerLabel = getApplicationLabel(mCallingPackage);
            final CharSequence requestedUpdateOwnerLabel =
                getApplicationLabel(mOriginatingPackageFromSessionInfo);
            if (!TextUtils.isEmpty(existingUpdateOwnerLabel)
                    && mPendingUserActionReason == PackageInstaller.REASON_REMIND_OWNERSHIP) {
                String updateOwnerString =
@@ -376,6 +386,11 @@ public class PackageInstallerActivity extends Activity {
                Process.INVALID_UID);
        mOriginatingPackage = (mOriginatingUid != Process.INVALID_UID)
                ? getPackageNameForUid(mOriginatingUid) : null;
        int originatingUidFromSessionInfo =
            intent.getIntExtra(EXTRA_ORIGINATING_UID_FROM_SESSION_INFO, Process.INVALID_UID);
        mOriginatingPackageFromSessionInfo = (originatingUidFromSessionInfo != Process.INVALID_UID)
            ? getPackageNameForUid(originatingUidFromSessionInfo) : mCallingPackage;


        final Object packageSource;
        if (PackageInstaller.ACTION_CONFIRM_INSTALL.equals(action)) {