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

Commit 86be7fd5 authored by Yan Zhu's avatar Yan Zhu
Browse files

Add new message to package.proto for granted permissions for users

Bug: 167454361
Test: atest PackageIncidentTest
Change-Id: I8ab4ecf821af31cd4abe6a5a39109a878effc797
Exempt-From-Owner-Approval: Already has Owner-Review vote but TH/Gerrit
is not recognizing
parent d1554849
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -129,6 +129,16 @@ message PackageProto {
        optional bool is_loading = 2;
    }

    // TODO (b/170263003) refactor to permissiongr
    // Runtime permission state that are granted for users.
    message UserPermissionsProto {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;
        // User id.
        optional int32 id = 1;
        // Pre-granted Android permissions.
        repeated string granted_permissions = 2;
    }

    // Name of package. e.g. "com.android.providers.telephony".
    optional string name = 1;
    // UID for this package as assigned by Android OS.
@@ -152,4 +162,6 @@ message PackageProto {
    optional InstallSourceProto install_source = 10;
    // Whether the package is startable or is still loading
    optional StatesProto states = 11;
    // Granted runtime permissions for users.
    repeated UserPermissionsProto user_permissions = 12;
}
+28 −1
Original line number Diff line number Diff line
@@ -28,11 +28,13 @@ import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.permission.LegacyPermissionDataProvider;
import com.android.server.pm.permission.LegacyPermissionState;
import com.android.server.pm.pkg.PackageStateUnserialized;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -300,7 +302,8 @@ public class PackageSetting extends PackageSettingBase {
        return mimeGroups != null ? mimeGroups.get(mimeGroup) : null;
    }

    public void dumpDebug(ProtoOutputStream proto, long fieldId, List<UserInfo> users) {
    public void dumpDebug(ProtoOutputStream proto, long fieldId, List<UserInfo> users,
            LegacyPermissionDataProvider dataProvider) {
        final long packageToken = proto.start(fieldId);
        proto.write(PackageProto.NAME, (realName != null ? realName : name));
        proto.write(PackageProto.UID, appId);
@@ -337,9 +340,33 @@ public class PackageSetting extends PackageSettingBase {
        proto.write(PackageProto.StatesProto.IS_STARTABLE, incrementalStates.isStartable());
        proto.write(PackageProto.StatesProto.IS_LOADING, incrementalStates.isLoading());
        writeUsersInfoToProto(proto, PackageProto.USERS);
        writePackageUserPermissionsProto(proto, PackageProto.USER_PERMISSIONS, users, dataProvider);
        proto.end(packageToken);
    }

    /**
     * TODO (b/170263003) refactor to dump to permissiongr proto
     * Dumps the permissions that are granted to users for this package.
     */
    void writePackageUserPermissionsProto(ProtoOutputStream proto, long fieldId,
            List<UserInfo> users, LegacyPermissionDataProvider dataProvider) {
        Collection<LegacyPermissionState.PermissionState> runtimePermissionStates;
        for (UserInfo user : users) {
            final long permissionsToken = proto.start(PackageProto.USER_PERMISSIONS);
            proto.write(PackageProto.UserPermissionsProto.ID, user.id);

            runtimePermissionStates = dataProvider.getLegacyPermissionState(appId)
                    .getRuntimePermissionStates(user.id);
            for (LegacyPermissionState.PermissionState permission : runtimePermissionStates) {
                if (permission.isGranted()) {
                    proto.write(PackageProto.UserPermissionsProto.GRANTED_PERMISSIONS,
                            permission.getName());
                }
            }
            proto.end(permissionsToken);
        }
    }

    /** Updates all fields in the current setting from another. */
    public void updateFrom(PackageSetting other) {
        super.updateFrom(other);
+1 −1
Original line number Diff line number Diff line
@@ -5018,7 +5018,7 @@ public final class Settings {
        final int count = mPackages.size();
        for (int i = 0; i < count; i++) {
            final PackageSetting ps = mPackages.valueAt(i);
            ps.dumpDebug(proto, PackageServiceDumpProto.PACKAGES, users);
            ps.dumpDebug(proto, PackageServiceDumpProto.PACKAGES, users, mPermissionDataProvider);
        }
    }