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

Commit 4b5ca631 authored by Chad Brubaker's avatar Chad Brubaker
Browse files

Log if permission usage requirements are not met

For now this is a WTF, but this will be turned into an install blocking
exception later in Q.

Test: Verified log is present in `atest PermissionUsageTest`
Bug: 111207567
Change-Id: I394c45c77193b15b3a0e483833c65d12d2c5b66b
parent 284f8e25
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ import android.content.pm.SharedLibraryInfo;
import android.content.pm.Signature;
import android.content.pm.SuspendDialogInfo;
import android.content.pm.UserInfo;
import android.content.pm.UsesPermissionInfo;
import android.content.pm.VerifierDeviceIdentity;
import android.content.pm.VerifierInfo;
import android.content.pm.VersionedPackage;
@@ -11242,6 +11243,26 @@ public class PackageManagerService extends IPackageManager.Stub
                    }
                }
            }
            // Check permission usage info requirements.
            if (pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.Q) {
                for (UsesPermissionInfo upi : pkg.usesPermissionInfos) {
                    if (!mPermissionManager.isPermissionUsageInfoRequired(upi.getPermission())) {
                        continue;
                    }
                    if (upi.getDataSentOffDevice() == UsesPermissionInfo.USAGE_UNDEFINED
                            || upi.getDataSharedWithThirdParty()
                                == UsesPermissionInfo.USAGE_UNDEFINED
                            || upi.getDataUsedForMonetization()
                                == UsesPermissionInfo.USAGE_UNDEFINED
                            || upi.getDataRetention() == UsesPermissionInfo.RETENTION_UNDEFINED) {
                        // STOPSHIP: Make this throw
                        Slog.wtf(TAG, "Package " + pkg.packageName + " does not provide usage "
                                + "information for permission " + upi.getPermission()
                                + ". This will be a fatal error in Q.");
                    }
                }
            }
        }
    }
+6 −1
Original line number Diff line number Diff line
@@ -181,4 +181,9 @@ public abstract class PermissionManagerInternal {

    /** HACK HACK methods to allow for partial migration of data to the PermissionManager class */
    public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName);

    /**
     * Returns {@code true} if {@code permName} has {@code usageInfoRequired} set.
     */
    public abstract boolean isPermissionUsageInfoRequired(@NonNull String permName);
}
+7 −0
Original line number Diff line number Diff line
@@ -2644,5 +2644,12 @@ public class PermissionManagerService {
                return mSettings.getPermissionLocked(permName);
            }
        }
        @Override
        public boolean isPermissionUsageInfoRequired(String permName) {
            synchronized (PermissionManagerService.this.mLock) {
                BasePermission bp = mSettings.getPermissionLocked(permName);
                return bp != null && bp.usageInfoRequired;
            }
        }
    }
}