Skip to content

Commit 86a9704

Browse files
Zoraverthestinger
authored andcommitted
Enforce INTERNET as a runtime permission.
1 parent caca47c commit 86a9704

File tree

1 file changed

+39
-20
lines changed

1 file changed

+39
-20
lines changed

services/core/java/com/android/server/connectivity/PermissionMonitor.java

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static android.os.Process.SYSTEM_UID;
3030

3131
import android.annotation.NonNull;
32+
import android.annotation.UserIdInt;
3233
import android.content.Context;
3334
import android.content.pm.ApplicationInfo;
3435
import android.content.pm.PackageInfo;
@@ -55,6 +56,7 @@
5556
import com.android.internal.util.IndentingPrintWriter;
5657
import com.android.server.LocalServices;
5758
import com.android.server.SystemConfig;
59+
import com.android.server.pm.permission.PermissionManagerServiceInternal;
5860

5961
import java.util.ArrayList;
6062
import java.util.Collection;
@@ -80,6 +82,7 @@ public class PermissionMonitor {
8082
private static final int VERSION_Q = Build.VERSION_CODES.Q;
8183

8284
private final PackageManager mPackageManager;
85+
private final PackageManagerInternal mPackageManagerInternal;
8386
private final UserManager mUserManager;
8487
private final INetd mNetd;
8588

@@ -104,26 +107,6 @@ public class PermissionMonitor {
104107

105108
private class PackageListObserver implements PackageManagerInternal.PackageListObserver {
106109

107-
private int getPermissionForUid(int uid) {
108-
int permission = 0;
109-
// Check all the packages for this UID. The UID has the permission if any of the
110-
// packages in it has the permission.
111-
String[] packages = mPackageManager.getPackagesForUid(uid);
112-
if (packages != null && packages.length > 0) {
113-
for (String name : packages) {
114-
final PackageInfo app = getPackageInfo(name);
115-
if (app != null && app.requestedPermissions != null) {
116-
permission |= getNetdPermissionMask(app.requestedPermissions,
117-
app.requestedPermissionsFlags);
118-
}
119-
}
120-
} else {
121-
// The last package of this uid is removed from device. Clean the package up.
122-
permission = INetd.PERMISSION_UNINSTALLED;
123-
}
124-
return permission;
125-
}
126-
127110
@Override
128111
public void onPackageAdded(String packageName, int uid) {
129112
sendPackagePermissionsForUid(uid, getPermissionForUid(uid));
@@ -135,10 +118,46 @@ public void onPackageRemoved(String packageName, int uid) {
135118
}
136119
}
137120

121+
private int getPermissionForUid(int uid) {
122+
int permission = 0;
123+
// Check all the packages for this UID. The UID has the permission if any of the
124+
// packages in it has the permission.
125+
String[] packages = mPackageManager.getPackagesForUid(uid);
126+
if (packages != null && packages.length > 0) {
127+
for (String name : packages) {
128+
final PackageInfo app = getPackageInfo(name);
129+
if (app != null && app.requestedPermissions != null) {
130+
permission |= getNetdPermissionMask(app.requestedPermissions,
131+
app.requestedPermissionsFlags);
132+
}
133+
}
134+
} else {
135+
// The last package of this uid is removed from device. Clean the package up.
136+
permission = INetd.PERMISSION_UNINSTALLED;
137+
}
138+
return permission;
139+
}
140+
141+
// implements OnRuntimePermissionStateChangedListener
142+
private void enforceINTERNETAsRuntimePermission(@NonNull String packageName,
143+
@UserIdInt int userId) {
144+
// userId is _not_ uid
145+
int uid = mPackageManagerInternal.getPackageUid(packageName, 0, userId);
146+
sendPackagePermissionsForUid(uid, getPermissionForUid(uid));
147+
}
148+
138149
public PermissionMonitor(Context context, INetd netd) {
139150
mPackageManager = context.getPackageManager();
140151
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
141152
mNetd = netd;
153+
154+
mPackageManagerInternal = LocalServices.getService(
155+
PackageManagerInternal.class);
156+
157+
final PermissionManagerServiceInternal permManagerInternal = LocalServices.getService(
158+
PermissionManagerServiceInternal.class);
159+
permManagerInternal.addOnRuntimePermissionStateChangedListener(
160+
this::enforceINTERNETAsRuntimePermission);
142161
}
143162

144163
// Intended to be called only once at startup, after the system is ready. Installs a broadcast

0 commit comments

Comments
 (0)