Skip to content

Commit cfbfafe

Browse files
author
Dianne Hackborn
committed
Work on issue #22303510: Additional permissions aren't properly...
...disabled after toggling them off Keep track of whether a permission that has been declared by an app was able to actually be installed in the system, along with an API to find this information so that system UI can tell whether that permission is of interest. Also clean up some of the permission debug output. Change-Id: If4541bedb857789b255bb18f03cad155dcda0b95
1 parent 673ccfd commit cfbfafe

5 files changed

Lines changed: 70 additions & 23 deletions

File tree

api/current.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9445,6 +9445,7 @@ package android.content.pm {
94459445
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
94469446
field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
94479447
field public static final int FLAG_COSTS_MONEY = 1; // 0x1
9448+
field public static final int FLAG_INSTALLED = 1073741824; // 0x40000000
94489449
field public static final int PROTECTION_DANGEROUS = 1; // 0x1
94499450
field public static final int PROTECTION_FLAG_APPOP = 64; // 0x40
94509451
field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20

api/system-current.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9783,6 +9783,7 @@ package android.content.pm {
97839783
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
97849784
field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
97859785
field public static final int FLAG_COSTS_MONEY = 1; // 0x1
9786+
field public static final int FLAG_INSTALLED = 1073741824; // 0x40000000
97869787
field public static final int PROTECTION_DANGEROUS = 1; // 0x1
97879788
field public static final int PROTECTION_FLAG_APPOP = 64; // 0x40
97889789
field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20

core/java/android/content/pm/PermissionInfo.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,10 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable {
145145
public static final int FLAG_COSTS_MONEY = 1<<0;
146146

147147
/**
148-
* Flag for {@link #protectionLevel}, corresponding
149-
* to the <code>hide</code> value of
150-
* {@link android.R.attr#permissionFlags}.
151-
* @hide
148+
* Flag for {@link #flags}, indicating that this permission has been
149+
* installed into the system's globally defined permissions.
152150
*/
153-
public static final int PROTECTION_FLAG_HIDE = 1<<1;
151+
public static final int FLAG_INSTALLED = 1<<30;
154152

155153
/**
156154
* Additional flags about this permission as given by
@@ -210,6 +208,15 @@ public static String protectionToString(int level) {
210208
if ((level&PermissionInfo.PROTECTION_FLAG_PRE23) != 0) {
211209
protLevel += "|pre23";
212210
}
211+
if ((level&PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0) {
212+
protLevel += "|installer";
213+
}
214+
if ((level&PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0) {
215+
protLevel += "|verifier";
216+
}
217+
if ((level&PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0) {
218+
protLevel += "|preinstalled";
219+
}
213220
return protLevel;
214221
}
215222

services/core/java/com/android/server/pm/PackageManagerService.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7321,6 +7321,9 @@ private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, int
73217321
for (i=0; i<N; i++) {
73227322
PackageParser.Permission p = pkg.permissions.get(i);
73237323

7324+
// Assume by default that we did not install this permission into the system.
7325+
p.info.flags &= ~PermissionInfo.FLAG_INSTALLED;
7326+
73247327
// Now that permission groups have a special meaning, we ignore permission
73257328
// groups for legacy apps to prevent unexpected behavior. In particular,
73267329
// permissions for one app being granted to someone just becuase they happen
@@ -7350,6 +7353,7 @@ private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, int
73507353
bp.perm = p;
73517354
bp.uid = pkg.applicationInfo.uid;
73527355
bp.sourcePackage = p.info.packageName;
7356+
p.info.flags |= PermissionInfo.FLAG_INSTALLED;
73537357
} else if (!currentOwnerIsSystem) {
73547358
String msg = "New decl " + p.owner + " of permission "
73557359
+ p.info.name + " is system; overriding " + bp.sourcePackage;
@@ -7375,6 +7379,7 @@ private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, int
73757379
bp.perm = p;
73767380
bp.uid = pkg.applicationInfo.uid;
73777381
bp.sourcePackage = p.info.packageName;
7382+
p.info.flags |= PermissionInfo.FLAG_INSTALLED;
73787383
if ((parseFlags&PackageParser.PARSE_CHATTY) != 0) {
73797384
if (r == null) {
73807385
r = new StringBuilder(256);
@@ -14688,12 +14693,12 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
1468814693
pw.println(" s[hared-users]: dump shared user IDs");
1468914694
pw.println(" m[essages]: print collected runtime messages");
1469014695
pw.println(" v[erifiers]: print package verifier info");
14696+
pw.println(" d[omain-preferred-apps]: print domains preferred apps");
14697+
pw.println(" i[ntent-filter-verifiers]|ifv: print intent filter verifier info");
1469114698
pw.println(" version: print database version info");
1469214699
pw.println(" write: write current settings now");
14693-
pw.println(" <package.name>: info about given package");
1469414700
pw.println(" installs: details about install sessions");
14695-
pw.println(" d[omain-preferred-apps]: print domains preferred apps");
14696-
pw.println(" i[ntent-filter-verifiers]|ifv: print intent filter verifier info");
14701+
pw.println(" <package.name>: info about given package");
1469714702
return;
1469814703
} else if ("--checkin".equals(opt)) {
1469914704
checkin = true;

services/core/java/com/android/server/pm/Settings.java

Lines changed: 48 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4120,6 +4120,28 @@ void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
41204120
pw.print(prefix); pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
41214121
pw.println();
41224122

4123+
if (ps.pkg != null && ps.pkg.permissions != null && ps.pkg.permissions.size() > 0) {
4124+
final ArrayList<PackageParser.Permission> perms = ps.pkg.permissions;
4125+
pw.print(prefix); pw.println(" declared permissions:");
4126+
for (int i=0; i<perms.size(); i++) {
4127+
PackageParser.Permission perm = perms.get(i);
4128+
if (permissionNames != null
4129+
&& !permissionNames.contains(perm.info.name)) {
4130+
continue;
4131+
}
4132+
pw.print(prefix); pw.print(" "); pw.print(perm.info.name);
4133+
pw.print(": prot=");
4134+
pw.print(PermissionInfo.protectionToString(perm.info.protectionLevel));
4135+
if ((perm.info.flags&PermissionInfo.FLAG_COSTS_MONEY) != 0) {
4136+
pw.print(", COSTS_MONEY");
4137+
}
4138+
if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
4139+
pw.print(", INSTALLED");
4140+
}
4141+
pw.println();
4142+
}
4143+
}
4144+
41234145
if (ps.sharedUser == null || permissionNames != null) {
41244146
PermissionsState permissionsState = ps.getPermissionsState();
41254147
dumpInstallPermissionsLPr(pw, prefix + " ", permissionNames, permissionsState);
@@ -4155,14 +4177,14 @@ void dumpPackageLPr(PrintWriter pw, String prefix, String checkinTag,
41554177
if (cmp != null && cmp.size() > 0) {
41564178
pw.print(prefix); pw.println(" disabledComponents:");
41574179
for (String s : cmp) {
4158-
pw.print(prefix); pw.print(" "); pw.println(s);
4180+
pw.print(prefix); pw.print(" "); pw.println(s);
41594181
}
41604182
}
41614183
cmp = ps.getEnabledComponents(user.id);
41624184
if (cmp != null && cmp.size() > 0) {
41634185
pw.print(prefix); pw.println(" enabledComponents:");
41644186
for (String s : cmp) {
4165-
pw.print(prefix); pw.print(" "); pw.println(s);
4187+
pw.print(prefix); pw.print(" "); pw.println(s);
41664188
}
41674189
}
41684190
}
@@ -4267,11 +4289,14 @@ void dumpPermissionsLPr(PrintWriter pw, String packageName, ArraySet<String> per
42674289
pw.print(" type="); pw.print(p.type);
42684290
pw.print(" prot=");
42694291
pw.println(PermissionInfo.protectionToString(p.protectionLevel));
4270-
if (p.packageSetting != null) {
4271-
pw.print(" packageSetting="); pw.println(p.packageSetting);
4272-
}
42734292
if (p.perm != null) {
42744293
pw.print(" perm="); pw.println(p.perm);
4294+
if (p.perm.info.flags != PermissionInfo.FLAG_INSTALLED) {
4295+
pw.print(" flags=0x"); pw.println(Integer.toHexString(p.perm.info.flags));
4296+
}
4297+
}
4298+
if (p.packageSetting != null) {
4299+
pw.print(" packageSetting="); pw.println(p.packageSetting);
42754300
}
42764301
if (READ_EXTERNAL_STORAGE.equals(p.name)) {
42774302
pw.print(" enforced=");
@@ -4372,24 +4397,32 @@ void dumpRuntimePermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> p
43724397
continue;
43734398
}
43744399
pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
4375-
pw.print(", granted="); pw.print(permissionState.isGranted());
4376-
pw.print(", flags="); pw.println(permissionFlagsToString(
4377-
permissionState.getFlags()));
4400+
pw.print(": granted="); pw.print(permissionState.isGranted());
4401+
pw.println(permissionFlagsToString(", flags=",
4402+
permissionState.getFlags()));
43784403
}
43794404
}
43804405
}
43814406

4382-
private static String permissionFlagsToString(int flags) {
4383-
StringBuilder flagsString = new StringBuilder();
4384-
flagsString.append("[ ");
4407+
private static String permissionFlagsToString(String prefix, int flags) {
4408+
StringBuilder flagsString = null;
43854409
while (flags != 0) {
4410+
if (flagsString == null) {
4411+
flagsString = new StringBuilder();
4412+
flagsString.append(prefix);
4413+
flagsString.append("[ ");
4414+
}
43864415
final int flag = 1 << Integer.numberOfTrailingZeros(flags);
43874416
flags &= ~flag;
43884417
flagsString.append(PackageManager.permissionFlagToString(flag));
43894418
flagsString.append(' ');
43904419
}
4391-
flagsString.append(']');
4392-
return flagsString.toString();
4420+
if (flagsString != null) {
4421+
flagsString.append(']');
4422+
return flagsString.toString();
4423+
} else {
4424+
return "";
4425+
}
43934426
}
43944427

43954428
void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> permissionNames,
@@ -4403,8 +4436,8 @@ void dumpInstallPermissionsLPr(PrintWriter pw, String prefix, ArraySet<String> p
44034436
continue;
44044437
}
44054438
pw.print(prefix); pw.print(" "); pw.print(permissionState.getName());
4406-
pw.print(", granted="); pw.print(permissionState.isGranted());
4407-
pw.print(", flags="); pw.println(permissionFlagsToString(
4439+
pw.print(": granted="); pw.print(permissionState.isGranted());
4440+
pw.println(permissionFlagsToString(", flags=",
44084441
permissionState.getFlags()));
44094442
}
44104443
}

0 commit comments

Comments
 (0)