Skip to content

Commit edc84ee

Browse files
committed
Selective enforcement of READ_EXTERNAL_STORAGE.
Store enforcement state of specific permissions, allowing them to be selectively enforced. Currently supports READ_EXTERNAL_STORAGE, which by default isn't enforced, but enforcement can be enabled at runtime. Bug: 6131916 Change-Id: I4bcc215a2eb5e6507d6257b577311cbd13c77acf
1 parent 80a6b33 commit edc84ee

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

core/java/android/content/pm/IPackageManager.aidl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,4 +370,7 @@ interface IPackageManager {
370370
boolean isFirstBoot();
371371

372372
List<UserInfo> getUsers();
373+
374+
void setPermissionEnforcement(String permission, int enforcement);
375+
int getPermissionEnforcement(String permission);
373376
}

core/java/android/content/pm/PackageManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,6 +1090,11 @@ public NameNotFoundException(String name) {
10901090
public static final String EXTRA_VERIFICATION_INSTALL_FLAGS
10911091
= "android.content.pm.extra.VERIFICATION_INSTALL_FLAGS";
10921092

1093+
/** {@hide} */
1094+
public static final int ENFORCEMENT_DEFAULT = 0;
1095+
/** {@hide} */
1096+
public static final int ENFORCEMENT_YES = 1;
1097+
10931098
/**
10941099
* Retrieve overall information about an application package that is
10951100
* installed on the system.

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
2121
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
2222
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
23+
import static android.content.pm.PackageManager.ENFORCEMENT_DEFAULT;
24+
import static android.content.pm.PackageManager.ENFORCEMENT_YES;
25+
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
26+
import static android.Manifest.permission.GRANT_REVOKE_PERMISSIONS;
2327
import static libcore.io.OsConstants.S_ISLNK;
2428

2529
import com.android.internal.app.IMediaContainerService;
@@ -1872,6 +1876,9 @@ public int checkPermission(String permName, String pkgName) {
18721876
return PackageManager.PERMISSION_GRANTED;
18731877
}
18741878
}
1879+
if (!isPermissionEnforcedLocked(permName)) {
1880+
return PackageManager.PERMISSION_GRANTED;
1881+
}
18751882
}
18761883
return PackageManager.PERMISSION_DENIED;
18771884
}
@@ -1890,6 +1897,9 @@ public int checkUidPermission(String permName, int uid) {
18901897
return PackageManager.PERMISSION_GRANTED;
18911898
}
18921899
}
1900+
if (!isPermissionEnforcedLocked(permName)) {
1901+
return PackageManager.PERMISSION_GRANTED;
1902+
}
18931903
}
18941904
return PackageManager.PERMISSION_DENIED;
18951905
}
@@ -8835,4 +8845,44 @@ public VerifierDeviceIdentity getVerifierDeviceIdentity() throws RemoteException
88358845
public List<UserInfo> getUsers() {
88368846
return mUserManager.getUsers();
88378847
}
8848+
8849+
@Override
8850+
public void setPermissionEnforcement(String permission, int enforcement) {
8851+
mContext.enforceCallingOrSelfPermission(GRANT_REVOKE_PERMISSIONS, null);
8852+
if (READ_EXTERNAL_STORAGE.equals(permission)) {
8853+
synchronized (mPackages) {
8854+
if (mSettings.mReadExternalStorageEnforcement != enforcement) {
8855+
mSettings.mReadExternalStorageEnforcement = enforcement;
8856+
mSettings.writeLPr();
8857+
}
8858+
}
8859+
} else {
8860+
throw new IllegalArgumentException("No selective enforcement for " + permission);
8861+
}
8862+
}
8863+
8864+
@Override
8865+
public int getPermissionEnforcement(String permission) {
8866+
mContext.enforceCallingOrSelfPermission(GRANT_REVOKE_PERMISSIONS, null);
8867+
if (READ_EXTERNAL_STORAGE.equals(permission)) {
8868+
synchronized (mPackages) {
8869+
return mSettings.mReadExternalStorageEnforcement;
8870+
}
8871+
} else {
8872+
throw new IllegalArgumentException("No selective enforcement for " + permission);
8873+
}
8874+
}
8875+
8876+
private boolean isPermissionEnforcedLocked(String permission) {
8877+
if (READ_EXTERNAL_STORAGE.equals(permission)) {
8878+
switch (mSettings.mReadExternalStorageEnforcement) {
8879+
case ENFORCEMENT_DEFAULT:
8880+
return false;
8881+
case ENFORCEMENT_YES:
8882+
return true;
8883+
}
8884+
}
8885+
8886+
return true;
8887+
}
88388888
}

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
2121
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
2222
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
23+
import static android.content.pm.PackageManager.ENFORCEMENT_DEFAULT;
2324

2425
import com.android.internal.util.FastXmlSerializer;
2526
import com.android.internal.util.JournaledFile;
@@ -74,6 +75,9 @@ final class Settings {
7475

7576
private static final boolean DEBUG_STOPPED = false;
7677

78+
private static final String TAG_READ_EXTERNAL_STORAGE = "read-external-storage";
79+
private static final String ATTR_ENFORCEMENT = "enforcement";
80+
7781
private final File mSettingsFilename;
7882
private final File mBackupSettingsFilename;
7983
private final File mPackageListFilename;
@@ -91,6 +95,8 @@ final class Settings {
9195
int mInternalSdkPlatform;
9296
int mExternalSdkPlatform;
9397

98+
int mReadExternalStorageEnforcement = ENFORCEMENT_DEFAULT;
99+
94100
/** Device identity for the purpose of package verification. */
95101
private VerifierDeviceIdentity mVerifierDeviceIdentity;
96102

@@ -864,13 +870,20 @@ void writeLPr() {
864870
serializer.attribute(null, "internal", Integer.toString(mInternalSdkPlatform));
865871
serializer.attribute(null, "external", Integer.toString(mExternalSdkPlatform));
866872
serializer.endTag(null, "last-platform-version");
867-
873+
868874
if (mVerifierDeviceIdentity != null) {
869875
serializer.startTag(null, "verifier");
870876
serializer.attribute(null, "device", mVerifierDeviceIdentity.toString());
871877
serializer.endTag(null, "verifier");
872878
}
873879

880+
if (mReadExternalStorageEnforcement != ENFORCEMENT_DEFAULT) {
881+
serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
882+
serializer.attribute(
883+
null, ATTR_ENFORCEMENT, Integer.toString(mReadExternalStorageEnforcement));
884+
serializer.endTag(null, TAG_READ_EXTERNAL_STORAGE);
885+
}
886+
874887
serializer.startTag(null, "permission-trees");
875888
for (BasePermission bp : mPermissionTrees.values()) {
876889
writePermissionLPr(serializer, bp);
@@ -1291,6 +1304,12 @@ boolean readLPw() {
12911304
Slog.w(PackageManagerService.TAG, "Discard invalid verifier device id: "
12921305
+ e.getMessage());
12931306
}
1307+
} else if (TAG_READ_EXTERNAL_STORAGE.equals(tagName)) {
1308+
final String enforcement = parser.getAttributeValue(null, ATTR_ENFORCEMENT);
1309+
try {
1310+
mReadExternalStorageEnforcement = Integer.parseInt(enforcement);
1311+
} catch (NumberFormatException e) {
1312+
}
12941313
} else {
12951314
Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
12961315
+ parser.getName());

0 commit comments

Comments
 (0)