blob: 164af38be5a672355410826dd83e1793fc22da46 [file] [log] [blame]
Todd Kennedy82b08422017-09-28 13:32:05 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.pm.permission;
18
Jeff Sharkey0095a822018-02-15 13:06:53 -070019import static android.os.Process.FIRST_APPLICATION_UID;
Todd Kennedy7c4c55d2017-11-02 10:01:39 -070020
Todd Kennedy82b08422017-09-28 13:32:05 -070021import android.Manifest;
22import android.annotation.NonNull;
Todd Kennedy0eb97382017-10-03 16:57:22 -070023import android.annotation.Nullable;
Todd Kennedy82b08422017-09-28 13:32:05 -070024import android.app.ActivityManager;
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -070025import android.app.AppOpsManager;
Todd Kennedy82b08422017-09-28 13:32:05 -070026import android.app.DownloadManager;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000027import android.app.SearchManager;
Todd Kennedy82b08422017-09-28 13:32:05 -070028import android.app.admin.DevicePolicyManager;
29import android.companion.CompanionDeviceManager;
30import android.content.Context;
31import android.content.Intent;
Todd Kennedy82b08422017-09-28 13:32:05 -070032import android.content.pm.ApplicationInfo;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000033import android.content.pm.PackageInfo;
Todd Kennedy82b08422017-09-28 13:32:05 -070034import android.content.pm.PackageManager;
Jeff Sharkey7a807602018-10-18 13:21:55 -060035import android.content.pm.PackageManager.NameNotFoundException;
Todd Kennedy82b08422017-09-28 13:32:05 -070036import android.content.pm.PackageManagerInternal;
Jeff Sharkey0095a822018-02-15 13:06:53 -070037import android.content.pm.PackageManagerInternal.PackagesProvider;
38import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
Jeff Sharkey7a807602018-10-18 13:21:55 -060039import android.content.pm.PermissionInfo;
Todd Kennedy82b08422017-09-28 13:32:05 -070040import android.content.pm.ProviderInfo;
41import android.content.pm.ResolveInfo;
42import android.media.RingtoneManager;
43import android.net.Uri;
Todd Kennedy82b08422017-09-28 13:32:05 -070044import android.os.Build;
45import android.os.Environment;
46import android.os.Handler;
47import android.os.Looper;
48import android.os.Message;
49import android.os.UserHandle;
50import android.os.storage.StorageManager;
Philip P. Moltmann039678e2018-09-18 13:04:38 -070051import android.permission.PermissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -070052import android.print.PrintManager;
53import android.provider.CalendarContract;
54import android.provider.ContactsContract;
55import android.provider.MediaStore;
56import android.provider.Telephony.Sms.Intents;
Todd Kennedy82b08422017-09-28 13:32:05 -070057import android.security.Credentials;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000058import android.speech.RecognitionService;
Jeff Sharkey0095a822018-02-15 13:06:53 -070059import android.telephony.TelephonyManager;
Ye Wen8e8b2d52018-03-14 11:48:24 -070060import android.text.TextUtils;
Todd Kennedy82b08422017-09-28 13:32:05 -070061import android.util.ArrayMap;
62import android.util.ArraySet;
63import android.util.Log;
64import android.util.Slog;
65import android.util.Xml;
Jeff Sharkey0095a822018-02-15 13:06:53 -070066
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000067import com.android.internal.util.ArrayUtils;
Todd Kennedy82b08422017-09-28 13:32:05 -070068import com.android.internal.util.XmlUtils;
69import com.android.server.LocalServices;
Todd Kennedy82b08422017-09-28 13:32:05 -070070
71import org.xmlpull.v1.XmlPullParser;
72import org.xmlpull.v1.XmlPullParserException;
73
74import java.io.BufferedInputStream;
75import java.io.File;
76import java.io.FileInputStream;
77import java.io.IOException;
78import java.io.InputStream;
79import java.util.ArrayList;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000080import java.util.Arrays;
Todd Kennedy82b08422017-09-28 13:32:05 -070081import java.util.Collections;
82import java.util.List;
83import java.util.Map;
84import java.util.Set;
85
Todd Kennedy82b08422017-09-28 13:32:05 -070086/**
87 * This class is the policy for granting runtime permissions to
88 * platform components and default handlers in the system such
89 * that the device is usable out-of-the-box. For example, the
90 * shell UID is a part of the system and the Phone app should
91 * have phone related permission by default.
92 * <p>
93 * NOTE: This class is at the wrong abstraction level. It is a part of the package manager
94 * service but knows about lots of higher level subsystems. The correct way to do this is
95 * to have an interface defined in the package manager but have the impl next to other
96 * policy stuff like PhoneWindowManager
97 */
98public final class DefaultPermissionGrantPolicy {
99 private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
100 private static final boolean DEBUG = false;
101
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000102 @PackageManager.ResolveInfoFlags
103 private static final int DEFAULT_INTENT_QUERY_FLAGS =
Todd Kennedy82b08422017-09-28 13:32:05 -0700104 PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
105 | PackageManager.MATCH_UNINSTALLED_PACKAGES;
106
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000107 @PackageManager.PackageInfoFlags
108 private static final int DEFAULT_PACKAGE_INFO_QUERY_FLAGS =
109 PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.GET_PERMISSIONS;
110
Todd Kennedy82b08422017-09-28 13:32:05 -0700111 private static final String AUDIO_MIME_TYPE = "audio/mpeg";
112
113 private static final String TAG_EXCEPTIONS = "exceptions";
114 private static final String TAG_EXCEPTION = "exception";
115 private static final String TAG_PERMISSION = "permission";
116 private static final String ATTR_PACKAGE = "package";
117 private static final String ATTR_NAME = "name";
118 private static final String ATTR_FIXED = "fixed";
119
120 private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000121
122
Todd Kennedy82b08422017-09-28 13:32:05 -0700123 static {
124 PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
125 PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
126 PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
127 PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
128 PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
129 PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
130 PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
131 }
132
133 private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>();
134 static {
135 CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
136 CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
137 CONTACTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
138 }
139
140 private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>();
141 static {
142 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
143 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
144 }
145
Calvin On5eda9dd2018-12-12 15:43:28 -0800146 private static final Set<String> ALWAYS_LOCATION_PERMISSIONS = new ArraySet<>();
147 static {
148 ALWAYS_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
149 ALWAYS_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
150 ALWAYS_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
151 }
152
Zimuzo5ac1eb92018-11-29 12:51:14 +0000153 private static final Set<String> ACTIVITY_RECOGNITION_PERMISSIONS = new ArraySet<>();
154 static {
155 ACTIVITY_RECOGNITION_PERMISSIONS.add(Manifest.permission.ACTIVITY_RECOGNITION);
156 }
157
Eric Enslen1e423b92017-12-18 11:30:21 -0800158 private static final Set<String> COARSE_LOCATION_PERMISSIONS = new ArraySet<>();
159 static {
160 COARSE_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
161 }
162
Todd Kennedy82b08422017-09-28 13:32:05 -0700163 private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
164 static {
165 CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
166 CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR);
167 }
168
169 private static final Set<String> SMS_PERMISSIONS = new ArraySet<>();
170 static {
171 SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS);
172 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS);
173 SMS_PERMISSIONS.add(Manifest.permission.READ_SMS);
174 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH);
175 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS);
176 SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS);
177 }
178
179 private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>();
180 static {
181 MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
182 }
183
184 private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>();
185 static {
186 CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA);
187 }
188
189 private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>();
190 static {
191 SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
192 }
193
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600194 @Deprecated
Todd Kennedy82b08422017-09-28 13:32:05 -0700195 private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
196 static {
Jeff Sharkeyb1629092018-08-24 10:33:12 -0600197 // STOPSHIP(b/112545973): remove once feature enabled by default
Jeff Sharkey10ec9d82018-11-28 14:52:45 -0700198 if (!StorageManager.hasIsolatedStorage()) {
Jeff Sharkeyb1629092018-08-24 10:33:12 -0600199 STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
200 STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
201 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700202 }
203
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600204 private static final Set<String> MEDIA_AURAL_PERMISSIONS = new ArraySet<>();
205 static {
206 // STOPSHIP(b/112545973): remove once feature enabled by default
Jeff Sharkey10ec9d82018-11-28 14:52:45 -0700207 if (StorageManager.hasIsolatedStorage()) {
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600208 MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO);
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600209 }
210 }
211
212 private static final Set<String> MEDIA_VISUAL_PERMISSIONS = new ArraySet<>();
213 static {
214 // STOPSHIP(b/112545973): remove once feature enabled by default
Jeff Sharkey10ec9d82018-11-28 14:52:45 -0700215 if (StorageManager.hasIsolatedStorage()) {
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600216 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO);
Jeff Sharkey9787a9452018-11-18 17:53:02 -0700217 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES);
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600218 }
219 }
220
Todd Kennedy82b08422017-09-28 13:32:05 -0700221 private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
222
223 private static final String ACTION_TRACK = "com.android.fitness.TRACK";
224
225 private final Handler mHandler;
226
227 private PackagesProvider mLocationPackagesProvider;
228 private PackagesProvider mVoiceInteractionPackagesProvider;
229 private PackagesProvider mSmsAppPackagesProvider;
230 private PackagesProvider mDialerAppPackagesProvider;
231 private PackagesProvider mSimCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800232 private PackagesProvider mUseOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700233 private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
234
235 private ArrayMap<String, List<DefaultPermissionGrant>> mGrantExceptions;
236 private final Context mContext;
237 private final Object mLock = new Object();
238 private final PackageManagerInternal mServiceInternal;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700239 private final PermissionManagerService mPermissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -0700240 private final DefaultPermissionGrantedCallback mPermissionGrantedCallback;
241 public interface DefaultPermissionGrantedCallback {
242 /** Callback when permissions have been granted */
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000243 void onDefaultRuntimePermissionsGranted(int userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700244 }
245
246 public DefaultPermissionGrantPolicy(Context context, Looper looper,
Todd Kennedy0eb97382017-10-03 16:57:22 -0700247 @Nullable DefaultPermissionGrantedCallback callback,
248 @NonNull PermissionManagerService permissionManager) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700249 mContext = context;
250 mHandler = new Handler(looper) {
251 @Override
252 public void handleMessage(Message msg) {
253 if (msg.what == MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS) {
254 synchronized (mLock) {
255 if (mGrantExceptions == null) {
256 mGrantExceptions = readDefaultPermissionExceptionsLocked();
257 }
258 }
259 }
260 }
261 };
262 mPermissionGrantedCallback = callback;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700263 mPermissionManager = permissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -0700264 mServiceInternal = LocalServices.getService(PackageManagerInternal.class);
265 }
266
267 public void setLocationPackagesProvider(PackagesProvider provider) {
268 synchronized (mLock) {
269 mLocationPackagesProvider = provider;
270 }
271 }
272
273 public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
274 synchronized (mLock) {
275 mVoiceInteractionPackagesProvider = provider;
276 }
277 }
278
279 public void setSmsAppPackagesProvider(PackagesProvider provider) {
280 synchronized (mLock) {
281 mSmsAppPackagesProvider = provider;
282 }
283 }
284
285 public void setDialerAppPackagesProvider(PackagesProvider provider) {
286 synchronized (mLock) {
287 mDialerAppPackagesProvider = provider;
288 }
289 }
290
291 public void setSimCallManagerPackagesProvider(PackagesProvider provider) {
292 synchronized (mLock) {
293 mSimCallManagerPackagesProvider = provider;
294 }
295 }
296
Eric Enslen1e423b92017-12-18 11:30:21 -0800297 public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
298 synchronized (mLock) {
299 mUseOpenWifiAppPackagesProvider = provider;
300 }
301 }
302
Todd Kennedy82b08422017-09-28 13:32:05 -0700303 public void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider) {
304 synchronized (mLock) {
305 mSyncAdapterPackagesProvider = provider;
306 }
307 }
308
Todd Kennedy42d61602017-12-12 14:44:19 -0800309 public void grantDefaultPermissions(int userId) {
Ralph Nathanbd111582018-03-21 14:53:23 -0700310 grantPermissionsToSysComponentsAndPrivApps(userId);
311 grantDefaultSystemHandlerPermissions(userId);
312 grantDefaultPermissionExceptions(userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700313 }
314
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000315 private void grantRuntimePermissionsForSystemPackage(int userId, PackageInfo pkg) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700316 Set<String> permissions = new ArraySet<>();
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000317 for (String permission : pkg.requestedPermissions) {
Todd Kennedy0eb97382017-10-03 16:57:22 -0700318 final BasePermission bp = mPermissionManager.getPermission(permission);
319 if (bp == null) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700320 continue;
321 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700322 if (bp.isRuntime()) {
323 permissions.add(permission);
324 }
325 }
326 if (!permissions.isEmpty()) {
327 grantRuntimePermissions(pkg, permissions, true, userId);
328 }
329 }
330
Todd Kennedy82b08422017-09-28 13:32:05 -0700331 public void scheduleReadDefaultPermissionExceptions() {
332 mHandler.sendEmptyMessage(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
333 }
334
Todd Kennedy42d61602017-12-12 14:44:19 -0800335 private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700336 Log.i(TAG, "Granting permissions to platform components for user " + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000337 List<PackageInfo> packages = mContext.getPackageManager().getInstalledPackagesAsUser(
338 DEFAULT_PACKAGE_INFO_QUERY_FLAGS, UserHandle.USER_SYSTEM);
339 for (PackageInfo pkg : packages) {
Todd Kennedy42d61602017-12-12 14:44:19 -0800340 if (pkg == null) {
341 continue;
342 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700343 if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg)
344 || !doesPackageSupportRuntimePermissions(pkg)
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000345 || ArrayUtils.isEmpty(pkg.requestedPermissions)) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700346 continue;
347 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000348 grantRuntimePermissionsForSystemPackage(userId, pkg);
349 }
350 }
351
352 @SafeVarargs
353 private final void grantIgnoringSystemPackage(String packageName, int userId,
354 Set<String>... permissionGroups) {
Eugene Suslae4240e72018-11-02 10:58:11 -0700355 grantPermissionsToPackage(
356 packageName, userId, true /* ignoreSystemPackage */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000357 }
358
359 @SafeVarargs
360 private final void grantSystemFixedPermissionsToSystemPackage(String packageName, int userId,
361 Set<String>... permissionGroups) {
Eugene Suslae4240e72018-11-02 10:58:11 -0700362 grantPermissionsToSystemPackage(
363 packageName, userId, true /* systemFixed */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000364 }
365
366 @SafeVarargs
367 private final void grantPermissionsToSystemPackage(
368 String packageName, int userId, Set<String>... permissionGroups) {
Eugene Suslae4240e72018-11-02 10:58:11 -0700369 grantPermissionsToSystemPackage(
370 packageName, userId, false /* systemFixed */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000371 }
372
373 @SafeVarargs
374 private final void grantPermissionsToSystemPackage(String packageName, int userId,
Eugene Suslae4240e72018-11-02 10:58:11 -0700375 boolean systemFixed, Set<String>... permissionGroups) {
376 if (!isSystemPackage(packageName)) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000377 return;
378 }
Eugene Suslae4240e72018-11-02 10:58:11 -0700379 grantPermissionsToPackage(getSystemPackageInfo(packageName),
380 userId, systemFixed, false /* ignoreSystemPackage */, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000381 }
382
383 @SafeVarargs
Eugene Suslae4240e72018-11-02 10:58:11 -0700384 private final void grantPermissionsToPackage(String packageName, int userId,
385 boolean ignoreSystemPackage, Set<String>... permissionGroups) {
386 grantPermissionsToPackage(getPackageInfo(packageName),
387 userId, false /* systemFixed */, ignoreSystemPackage, permissionGroups);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000388 }
389
390 @SafeVarargs
Eugene Suslae4240e72018-11-02 10:58:11 -0700391 private final void grantPermissionsToPackage(PackageInfo packageName, int userId,
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000392 boolean systemFixed, boolean ignoreSystemPackage, Set<String>... permissionGroups) {
393 if (packageName == null) return;
394 if (doesPackageSupportRuntimePermissions(packageName)) {
395 for (Set<String> permissionGroup : permissionGroups) {
396 grantRuntimePermissions(packageName, permissionGroup, systemFixed,
397 ignoreSystemPackage, userId);
398 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700399 }
400 }
401
402 private void grantDefaultSystemHandlerPermissions(int userId) {
403 Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
404
405 final PackagesProvider locationPackagesProvider;
406 final PackagesProvider voiceInteractionPackagesProvider;
407 final PackagesProvider smsAppPackagesProvider;
408 final PackagesProvider dialerAppPackagesProvider;
409 final PackagesProvider simCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800410 final PackagesProvider useOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700411 final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
412
413 synchronized (mLock) {
414 locationPackagesProvider = mLocationPackagesProvider;
415 voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
416 smsAppPackagesProvider = mSmsAppPackagesProvider;
417 dialerAppPackagesProvider = mDialerAppPackagesProvider;
418 simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800419 useOpenWifiAppPackagesProvider = mUseOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700420 syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
421 }
422
423 String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
424 ? voiceInteractionPackagesProvider.getPackages(userId) : null;
425 String[] locationPackageNames = (locationPackagesProvider != null)
426 ? locationPackagesProvider.getPackages(userId) : null;
427 String[] smsAppPackageNames = (smsAppPackagesProvider != null)
428 ? smsAppPackagesProvider.getPackages(userId) : null;
429 String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
430 ? dialerAppPackagesProvider.getPackages(userId) : null;
431 String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
432 ? simCallManagerPackagesProvider.getPackages(userId) : null;
Eric Enslen1e423b92017-12-18 11:30:21 -0800433 String[] useOpenWifiAppPackageNames = (useOpenWifiAppPackagesProvider != null)
434 ? useOpenWifiAppPackagesProvider.getPackages(userId) : null;
Todd Kennedy82b08422017-09-28 13:32:05 -0700435 String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
436 syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
437 String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
438 syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
439
440 // Installer
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000441 grantSystemFixedPermissionsToSystemPackage(
442 getKnownPackage(PackageManagerInternal.PACKAGE_INSTALLER, userId),
443 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700444
445 // Verifier
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000446 final String verifier = getKnownPackage(PackageManagerInternal.PACKAGE_VERIFIER, userId);
447 grantSystemFixedPermissionsToSystemPackage(verifier, userId, STORAGE_PERMISSIONS);
448 grantPermissionsToSystemPackage(verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700449
450 // SetupWizard
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000451 grantPermissionsToSystemPackage(
452 getKnownPackage(PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId), userId,
453 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, LOCATION_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700454
455 // Camera
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000456 grantPermissionsToSystemPackage(
457 getDefaultSystemHandlerActivityPackage(MediaStore.ACTION_IMAGE_CAPTURE, userId),
458 userId, CAMERA_PERMISSIONS, MICROPHONE_PERMISSIONS, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700459
460 // Media provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000461 grantSystemFixedPermissionsToSystemPackage(
462 getDefaultProviderAuthorityPackage(MediaStore.AUTHORITY, userId), userId,
463 STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS, MEDIA_VISUAL_PERMISSIONS,
464 PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700465
466 // Downloads provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000467 grantSystemFixedPermissionsToSystemPackage(
468 getDefaultProviderAuthorityPackage("downloads", userId), userId,
469 STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700470
471 // Downloads UI
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000472 grantSystemFixedPermissionsToSystemPackage(
473 getDefaultSystemHandlerActivityPackage(
474 DownloadManager.ACTION_VIEW_DOWNLOADS, userId),
475 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700476
477 // Storage provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000478 grantSystemFixedPermissionsToSystemPackage(
479 getDefaultProviderAuthorityPackage("com.android.externalstorage.documents", userId),
480 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700481
482 // CertInstaller
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000483 grantSystemFixedPermissionsToSystemPackage(
484 getDefaultSystemHandlerActivityPackage(Credentials.INSTALL_ACTION, userId), userId,
485 STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700486
487 // Dialer
488 if (dialerAppPackageNames == null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000489 String dialerPackage =
490 getDefaultSystemHandlerActivityPackage(Intent.ACTION_DIAL, userId);
491 grantDefaultPermissionsToDefaultSystemDialerApp(dialerPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700492 } else {
493 for (String dialerAppPackageName : dialerAppPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000494 grantDefaultPermissionsToDefaultSystemDialerApp(dialerAppPackageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700495 }
496 }
497
498 // Sim call manager
499 if (simCallManagerPackageNames != null) {
500 for (String simCallManagerPackageName : simCallManagerPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000501 grantDefaultPermissionsToDefaultSystemSimCallManager(
502 simCallManagerPackageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700503 }
504 }
505
Eric Enslen1e423b92017-12-18 11:30:21 -0800506 // Use Open Wifi
507 if (useOpenWifiAppPackageNames != null) {
508 for (String useOpenWifiPackageName : useOpenWifiAppPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000509 grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(
510 useOpenWifiPackageName, userId);
Eric Enslen1e423b92017-12-18 11:30:21 -0800511 }
512 }
513
Todd Kennedy82b08422017-09-28 13:32:05 -0700514 // SMS
515 if (smsAppPackageNames == null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000516 String smsPackage = getDefaultSystemHandlerActivityPackageForCategory(
517 Intent.CATEGORY_APP_MESSAGING, userId);
518 grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700519 } else {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000520 for (String smsPackage : smsAppPackageNames) {
521 grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700522 }
523 }
524
525 // Cell Broadcast Receiver
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000526 grantPermissionsToSystemPackage(
527 getDefaultSystemHandlerActivityPackage(Intents.SMS_CB_RECEIVED_ACTION, userId),
528 userId, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700529
530 // Carrier Provisioning Service
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000531 grantPermissionsToSystemPackage(
532 getDefaultSystemHandlerServicePackage(Intents.SMS_CARRIER_PROVISION_ACTION, userId),
533 userId, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700534
535 // Calendar
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000536 grantPermissionsToSystemPackage(
537 getDefaultSystemHandlerActivityPackageForCategory(
538 Intent.CATEGORY_APP_CALENDAR, userId),
539 userId, CALENDAR_PERMISSIONS, CONTACTS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700540
541 // Calendar provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000542 String calendarProvider =
543 getDefaultProviderAuthorityPackage(CalendarContract.AUTHORITY, userId);
544 grantPermissionsToSystemPackage(calendarProvider, userId,
545 CONTACTS_PERMISSIONS, STORAGE_PERMISSIONS);
546 grantSystemFixedPermissionsToSystemPackage(calendarProvider, userId, CALENDAR_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700547
548 // Calendar provider sync adapters
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000549 grantPermissionToEachSystemPackage(
550 getHeadlessSyncAdapterPackages(calendarSyncAdapterPackages, userId),
551 userId, CALENDAR_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000552
553 // Contacts
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000554 grantPermissionsToSystemPackage(
555 getDefaultSystemHandlerActivityPackageForCategory(
556 Intent.CATEGORY_APP_CONTACTS, userId),
557 userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000558
559 // Contacts provider sync adapters
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000560 grantPermissionToEachSystemPackage(
561 getHeadlessSyncAdapterPackages(contactsSyncAdapterPackages, userId),
562 userId, CONTACTS_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000563
564 // Contacts provider
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000565 String contactsProviderPackage =
566 getDefaultProviderAuthorityPackage(ContactsContract.AUTHORITY, userId);
567 grantSystemFixedPermissionsToSystemPackage(contactsProviderPackage, userId,
568 CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
569 grantPermissionsToSystemPackage(contactsProviderPackage, userId, STORAGE_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000570
571 // Device provisioning
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000572 grantPermissionsToSystemPackage(
573 getDefaultSystemHandlerActivityPackage(
574 DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, userId),
575 userId, CONTACTS_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000576
577 // Maps
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000578 grantPermissionsToSystemPackage(
579 getDefaultSystemHandlerActivityPackageForCategory(Intent.CATEGORY_APP_MAPS, userId),
580 userId, LOCATION_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000581
582 // Gallery
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000583 grantPermissionsToSystemPackage(
584 getDefaultSystemHandlerActivityPackageForCategory(
585 Intent.CATEGORY_APP_GALLERY, userId),
586 userId, STORAGE_PERMISSIONS, MEDIA_VISUAL_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000587
588 // Email
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000589 grantPermissionsToSystemPackage(
590 getDefaultSystemHandlerActivityPackageForCategory(
591 Intent.CATEGORY_APP_EMAIL, userId),
592 userId, CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000593
594 // Browser
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000595 String browserPackage = getKnownPackage(PackageManagerInternal.PACKAGE_BROWSER, userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000596 if (browserPackage == null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000597 browserPackage = getDefaultSystemHandlerActivityPackageForCategory(
598 Intent.CATEGORY_APP_BROWSER, userId);
599 if (!isSystemPackage(browserPackage)) {
600 browserPackage = null;
601 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000602 }
Eugene Suslae4240e72018-11-02 10:58:11 -0700603 grantPermissionsToPackage(browserPackage, userId,
604 false /* ignoreSystemPackage */, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700605
606 // Voice interaction
607 if (voiceInteractPackageNames != null) {
608 for (String voiceInteractPackageName : voiceInteractPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000609 grantPermissionsToSystemPackage(voiceInteractPackageName, userId,
610 CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS,
611 PHONE_PERMISSIONS, SMS_PERMISSIONS, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700612 }
613 }
614
615 if (ActivityManager.isLowRamDeviceStatic()) {
616 // Allow voice search on low-ram devices
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000617 grantPermissionsToSystemPackage(
618 getDefaultSystemHandlerActivityPackage(
619 SearchManager.INTENT_ACTION_GLOBAL_SEARCH, userId),
620 userId, MICROPHONE_PERMISSIONS, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700621 }
622
623 // Voice recognition
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000624 Intent voiceRecoIntent = new Intent(RecognitionService.SERVICE_INTERFACE)
625 .addCategory(Intent.CATEGORY_DEFAULT);
626 grantPermissionsToSystemPackage(
627 getDefaultSystemHandlerServicePackage(voiceRecoIntent, userId), userId,
628 MICROPHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700629
630 // Location
631 if (locationPackageNames != null) {
632 for (String packageName : locationPackageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000633 grantPermissionsToSystemPackage(packageName, userId,
634 CONTACTS_PERMISSIONS, CALENDAR_PERMISSIONS, MICROPHONE_PERMISSIONS,
635 PHONE_PERMISSIONS, SMS_PERMISSIONS, CAMERA_PERMISSIONS,
636 SENSORS_PERMISSIONS, STORAGE_PERMISSIONS);
637 grantSystemFixedPermissionsToSystemPackage(packageName, userId,
Zimuzo5ac1eb92018-11-29 12:51:14 +0000638 LOCATION_PERMISSIONS, ACTIVITY_RECOGNITION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700639 }
640 }
641
642 // Music
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000643 Intent musicIntent = new Intent(Intent.ACTION_VIEW)
644 .addCategory(Intent.CATEGORY_DEFAULT)
645 .setDataAndType(Uri.fromFile(new File("foo.mp3")), AUDIO_MIME_TYPE);
646 grantPermissionsToSystemPackage(
647 getDefaultSystemHandlerActivityPackage(musicIntent, userId), userId,
648 STORAGE_PERMISSIONS, MEDIA_AURAL_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700649
650 // Home
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000651 Intent homeIntent = new Intent(Intent.ACTION_MAIN)
652 .addCategory(Intent.CATEGORY_HOME)
653 .addCategory(Intent.CATEGORY_LAUNCHER_APP);
654 grantPermissionsToSystemPackage(
655 getDefaultSystemHandlerActivityPackage(homeIntent, userId), userId,
656 LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700657
658 // Watches
659 if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) {
660 // Home application on watches
Todd Kennedy82b08422017-09-28 13:32:05 -0700661
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000662 String wearPackage = getDefaultSystemHandlerActivityPackageForCategory(
663 Intent.CATEGORY_HOME_MAIN, userId);
664 grantPermissionsToSystemPackage(wearPackage, userId,
665 CONTACTS_PERMISSIONS, MICROPHONE_PERMISSIONS, LOCATION_PERMISSIONS);
666 grantSystemFixedPermissionsToSystemPackage(wearPackage, userId, PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700667
668 // Fitness tracking on watches
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000669 grantPermissionsToSystemPackage(
670 getDefaultSystemHandlerActivityPackage(ACTION_TRACK, userId), userId,
671 SENSORS_PERMISSIONS, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700672 }
673
674 // Print Spooler
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000675 grantSystemFixedPermissionsToSystemPackage(PrintManager.PRINT_SPOOLER_PACKAGE_NAME, userId,
676 LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700677
678 // EmergencyInfo
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000679 grantSystemFixedPermissionsToSystemPackage(
680 getDefaultSystemHandlerActivityPackage(
681 TelephonyManager.ACTION_EMERGENCY_ASSISTANCE, userId),
682 userId, CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700683
684 // NFC Tag viewer
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000685 Intent nfcTagIntent = new Intent(Intent.ACTION_VIEW)
686 .setType("vnd.android.cursor.item/ndef_msg");
687 grantPermissionsToSystemPackage(
688 getDefaultSystemHandlerActivityPackage(nfcTagIntent, userId), userId,
689 CONTACTS_PERMISSIONS, PHONE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700690
691 // Storage Manager
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000692 grantSystemFixedPermissionsToSystemPackage(
693 getDefaultSystemHandlerActivityPackage(
694 StorageManager.ACTION_MANAGE_STORAGE, userId),
695 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700696
697 // Companion devices
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000698 grantSystemFixedPermissionsToSystemPackage(
699 CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME, userId,
Calvin On5eda9dd2018-12-12 15:43:28 -0800700 ALWAYS_LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700701
702 // Ringtone Picker
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000703 grantSystemFixedPermissionsToSystemPackage(
704 getDefaultSystemHandlerActivityPackage(
705 RingtoneManager.ACTION_RINGTONE_PICKER, userId),
706 userId, STORAGE_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700707
Abodunrinwa Toki2c01b6c2018-02-13 17:47:48 +0000708 // TextClassifier Service
Ye Wen8e8b2d52018-03-14 11:48:24 -0700709 String textClassifierPackageName =
710 mContext.getPackageManager().getSystemTextClassifierPackageName();
711 if (!TextUtils.isEmpty(textClassifierPackageName)) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000712 grantPermissionsToSystemPackage(textClassifierPackageName, userId,
713 PHONE_PERMISSIONS, SMS_PERMISSIONS, CALENDAR_PERMISSIONS,
714 LOCATION_PERMISSIONS, CONTACTS_PERMISSIONS);
Abodunrinwa Toki2c01b6c2018-02-13 17:47:48 +0000715 }
716
Anton Philippov4b3a1f52018-05-04 14:46:44 +0100717 // There is no real "marker" interface to identify the shared storage backup, it is
718 // hardcoded in BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE.
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000719 grantSystemFixedPermissionsToSystemPackage("com.android.sharedstoragebackup", userId,
720 STORAGE_PERMISSIONS);
Anton Philippov4b3a1f52018-05-04 14:46:44 +0100721
Todd Kennedy0eb97382017-10-03 16:57:22 -0700722 if (mPermissionGrantedCallback != null) {
723 mPermissionGrantedCallback.onDefaultRuntimePermissionsGranted(userId);
724 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700725 }
726
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000727 private String getDefaultSystemHandlerActivityPackageForCategory(String category, int userId) {
728 return getDefaultSystemHandlerActivityPackage(
729 new Intent(Intent.ACTION_MAIN).addCategory(category), userId);
730 }
731
732 @SafeVarargs
733 private final void grantPermissionToEachSystemPackage(
734 ArrayList<String> packages, int userId, Set<String>... permissions) {
735 if (packages == null) return;
736 final int count = packages.size();
737 for (int i = 0; i < count; i++) {
738 grantPermissionsToSystemPackage(packages.get(i), userId, permissions);
Todd Kennedy82b08422017-09-28 13:32:05 -0700739 }
Eugene Susla47e88202018-07-02 18:48:55 -0700740 }
741
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000742 private String getKnownPackage(int knownPkgId, int userId) {
743 return mServiceInternal.getKnownPackageName(knownPkgId, userId);
744 }
745
746 private void grantDefaultPermissionsToDefaultSystemDialerApp(
747 String dialerPackage, int userId) {
748 if (dialerPackage == null) {
749 return;
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000750 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000751 boolean isPhonePermFixed =
752 mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0);
753 if (isPhonePermFixed) {
754 grantSystemFixedPermissionsToSystemPackage(dialerPackage, userId, PHONE_PERMISSIONS);
755 } else {
756 grantPermissionsToSystemPackage(dialerPackage, userId, PHONE_PERMISSIONS);
757 }
758 grantPermissionsToSystemPackage(dialerPackage, userId,
759 CONTACTS_PERMISSIONS, SMS_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
760 }
761
762 private void grantDefaultPermissionsToDefaultSystemSmsApp(String smsPackage, int userId) {
763 grantPermissionsToSystemPackage(smsPackage, userId,
764 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS,
765 STORAGE_PERMISSIONS, MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700766 }
767
Eric Enslen1e423b92017-12-18 11:30:21 -0800768 private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000769 String useOpenWifiPackage, int userId) {
770 grantPermissionsToSystemPackage(
771 useOpenWifiPackage, userId, COARSE_LOCATION_PERMISSIONS);
Eric Enslen1e423b92017-12-18 11:30:21 -0800772 }
773
Todd Kennedy82b08422017-09-28 13:32:05 -0700774 public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) {
775 Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000776 grantIgnoringSystemPackage(packageName, userId,
777 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS, STORAGE_PERMISSIONS,
778 MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700779 }
780
781 public void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000782 mServiceInternal.onDefaultDialerAppChanged(packageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700783 Log.i(TAG, "Granting permissions to default dialer app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000784 grantIgnoringSystemPackage(packageName, userId,
785 PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, SMS_PERMISSIONS,
786 MICROPHONE_PERMISSIONS, CAMERA_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700787 }
788
Eric Enslen1e423b92017-12-18 11:30:21 -0800789 public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
790 Log.i(TAG, "Granting permissions to default Use Open WiFi app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000791 grantIgnoringSystemPackage(packageName, userId, COARSE_LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700792 }
793
794 public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) {
795 if (packageName == null) {
796 return;
797 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000798 Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
Eugene Suslae4240e72018-11-02 10:58:11 -0700799 grantPermissionsToPackage(packageName, userId, false /* ignoreSystemPackage */,
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000800 PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS);
801 }
802
803 private void grantDefaultPermissionsToDefaultSystemSimCallManager(
804 String packageName, int userId) {
805 if (isSystemPackage(packageName)) {
806 grantDefaultPermissionsToDefaultSimCallManager(packageName, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700807 }
808 }
809
810 public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
811 Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
812 if (packageNames == null) {
813 return;
814 }
815 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000816 grantPermissionsToSystemPackage(packageName, userId,
817 PHONE_PERMISSIONS, LOCATION_PERMISSIONS, SMS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700818 }
819 }
820
821 public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
822 Log.i(TAG, "Granting permissions to enabled ImsServices for user:" + userId);
823 if (packageNames == null) {
824 return;
825 }
826 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000827 grantPermissionsToSystemPackage(packageName, userId,
828 PHONE_PERMISSIONS, MICROPHONE_PERMISSIONS, LOCATION_PERMISSIONS,
829 CAMERA_PERMISSIONS, CONTACTS_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700830 }
831 }
832
Nathan Harold76ad1a32018-02-20 14:31:09 -0800833 public void grantDefaultPermissionsToEnabledTelephonyDataServices(
834 String[] packageNames, int userId) {
835 Log.i(TAG, "Granting permissions to enabled data services for user:" + userId);
836 if (packageNames == null) {
837 return;
838 }
839 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000840 // Grant these permissions as system-fixed, so that nobody can accidentally
841 // break cellular data.
842 grantSystemFixedPermissionsToSystemPackage(packageName, userId,
843 PHONE_PERMISSIONS, LOCATION_PERMISSIONS);
Nathan Harold76ad1a32018-02-20 14:31:09 -0800844 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000845
Nathan Harold76ad1a32018-02-20 14:31:09 -0800846 }
847
848 public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
849 String[] packageNames, int userId) {
850 Log.i(TAG, "Revoking permissions from disabled data services for user:" + userId);
851 if (packageNames == null) {
852 return;
853 }
854 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000855 PackageInfo pkg = getSystemPackageInfo(packageName);
856 if (isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) {
857 revokeRuntimePermissions(packageName, PHONE_PERMISSIONS, true, userId);
858 revokeRuntimePermissions(packageName, LOCATION_PERMISSIONS, true, userId);
Nathan Harold76ad1a32018-02-20 14:31:09 -0800859 }
860 }
861 }
862
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -0700863 public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
864 Log.i(TAG, "Granting permissions to active LUI app for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000865 grantSystemFixedPermissionsToSystemPackage(packageName, userId, CAMERA_PERMISSIONS);
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -0700866 }
867
868 public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
869 Log.i(TAG, "Revoke permissions from LUI apps for user:" + userId);
870 if (packageNames == null) {
871 return;
872 }
873 for (String packageName : packageNames) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000874 PackageInfo pkg = getSystemPackageInfo(packageName);
875 if (isSystemPackage(pkg) && doesPackageSupportRuntimePermissions(pkg)) {
876 revokeRuntimePermissions(packageName, CAMERA_PERMISSIONS, true, userId);
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -0700877 }
878 }
879 }
880
Todd Kennedy82b08422017-09-28 13:32:05 -0700881 public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) {
882 Log.i(TAG, "Granting permissions to default browser for user:" + userId);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000883 grantPermissionsToSystemPackage(packageName, userId, LOCATION_PERMISSIONS);
Todd Kennedy82b08422017-09-28 13:32:05 -0700884 }
885
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000886 private String getDefaultSystemHandlerActivityPackage(String intentAction, int userId) {
887 return getDefaultSystemHandlerActivityPackage(new Intent(intentAction), userId);
888 }
889
890 private String getDefaultSystemHandlerActivityPackage(Intent intent, int userId) {
Eugene Susla4abd2e62018-11-02 17:35:07 -0700891 ResolveInfo handler = mContext.getPackageManager().resolveActivityAsUser(
892 intent, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700893 if (handler == null || handler.activityInfo == null) {
894 return null;
895 }
896 if (mServiceInternal.isResolveActivityComponent(handler.activityInfo)) {
897 return null;
898 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000899 String packageName = handler.activityInfo.packageName;
900 return isSystemPackage(packageName) ? packageName : null;
Todd Kennedy82b08422017-09-28 13:32:05 -0700901 }
902
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000903 private String getDefaultSystemHandlerServicePackage(String intentAction, int userId) {
904 return getDefaultSystemHandlerServicePackage(new Intent(intentAction), userId);
905 }
906
907 private String getDefaultSystemHandlerServicePackage(
Todd Kennedy82b08422017-09-28 13:32:05 -0700908 Intent intent, int userId) {
Eugene Susla4abd2e62018-11-02 17:35:07 -0700909 List<ResolveInfo> handlers = mContext.getPackageManager().queryIntentServicesAsUser(
910 intent, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700911 if (handlers == null) {
912 return null;
913 }
914 final int handlerCount = handlers.size();
915 for (int i = 0; i < handlerCount; i++) {
916 ResolveInfo handler = handlers.get(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000917 String handlerPackage = handler.serviceInfo.packageName;
918 if (isSystemPackage(handlerPackage)) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700919 return handlerPackage;
920 }
921 }
922 return null;
923 }
924
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000925 private ArrayList<String> getHeadlessSyncAdapterPackages(
Todd Kennedy82b08422017-09-28 13:32:05 -0700926 String[] syncAdapterPackageNames, int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000927 ArrayList<String> syncAdapterPackages = new ArrayList<>();
Todd Kennedy82b08422017-09-28 13:32:05 -0700928
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000929 Intent homeIntent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER);
Todd Kennedy82b08422017-09-28 13:32:05 -0700930
931 for (String syncAdapterPackageName : syncAdapterPackageNames) {
932 homeIntent.setPackage(syncAdapterPackageName);
933
Eugene Susla4abd2e62018-11-02 17:35:07 -0700934 ResolveInfo homeActivity = mContext.getPackageManager().resolveActivityAsUser(
935 homeIntent, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700936 if (homeActivity != null) {
937 continue;
938 }
939
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000940 if (isSystemPackage(syncAdapterPackageName)) {
941 syncAdapterPackages.add(syncAdapterPackageName);
Todd Kennedy82b08422017-09-28 13:32:05 -0700942 }
943 }
944
945 return syncAdapterPackages;
946 }
947
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000948 private String getDefaultProviderAuthorityPackage(String authority, int userId) {
Eugene Susla4abd2e62018-11-02 17:35:07 -0700949 ProviderInfo provider = mContext.getPackageManager().resolveContentProviderAsUser(
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000950 authority, DEFAULT_INTENT_QUERY_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700951 if (provider != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000952 return provider.packageName;
Todd Kennedy82b08422017-09-28 13:32:05 -0700953 }
954 return null;
955 }
956
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000957 private boolean isSystemPackage(String packageName) {
Philip P. Moltmannc701e7e2018-09-18 16:22:54 -0700958 return isSystemPackage(getPackageInfo(packageName));
Todd Kennedy82b08422017-09-28 13:32:05 -0700959 }
960
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000961 private boolean isSystemPackage(PackageInfo pkg) {
962 if (pkg == null) {
963 return false;
Todd Kennedy82b08422017-09-28 13:32:05 -0700964 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000965 return pkg.applicationInfo.isSystemApp()
966 && !isSysComponentOrPersistentPlatformSignedPrivApp(pkg);
Todd Kennedy82b08422017-09-28 13:32:05 -0700967 }
968
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000969 private void grantRuntimePermissions(PackageInfo pkg, Set<String> permissions,
Todd Kennedy82b08422017-09-28 13:32:05 -0700970 boolean systemFixed, int userId) {
971 grantRuntimePermissions(pkg, permissions, systemFixed, false, userId);
972 }
973
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000974 private void revokeRuntimePermissions(String packageName, Set<String> permissions,
Nathan Haroldd66b9f32018-03-14 19:55:38 -0700975 boolean systemFixed, int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000976 PackageInfo pkg = getSystemPackageInfo(packageName);
977 if (ArrayUtils.isEmpty(pkg.requestedPermissions)) {
Nathan Haroldd66b9f32018-03-14 19:55:38 -0700978 return;
979 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000980 Set<String> revokablePermissions = new ArraySet<>(Arrays.asList(pkg.requestedPermissions));
Nathan Haroldd66b9f32018-03-14 19:55:38 -0700981
982 for (String permission : permissions) {
983 // We can't revoke what wasn't requested.
984 if (!revokablePermissions.contains(permission)) {
985 continue;
986 }
987
Eugene Susla4abd2e62018-11-02 17:35:07 -0700988 UserHandle user = UserHandle.of(userId);
989 final int flags = mContext.getPackageManager()
990 .getPermissionFlags(permission, packageName, user);
Nathan Haroldd66b9f32018-03-14 19:55:38 -0700991
992 // We didn't get this through the default grant policy. Move along.
993 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) == 0) {
994 continue;
995 }
996 // We aren't going to clobber device policy with a DefaultGrant.
997 if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
998 continue;
999 }
1000 // Do not revoke system fixed permissions unless caller set them that way;
1001 // there is no refcount for the number of sources of this, so there
1002 // should be at most one grantor doing SYSTEM_FIXED for any given package.
1003 if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && !systemFixed) {
1004 continue;
1005 }
Eugene Susla4abd2e62018-11-02 17:35:07 -07001006 mContext.getPackageManager().revokeRuntimePermission(packageName, permission, user);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001007
1008 if (DEBUG) {
1009 Log.i(TAG, "revoked " + (systemFixed ? "fixed " : "not fixed ")
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001010 + permission + " to " + packageName);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001011 }
1012
1013 // Remove the GRANTED_BY_DEFAULT flag without touching the others.
1014 // Note that we do not revoke FLAG_PERMISSION_SYSTEM_FIXED. That bit remains
1015 // sticky once set.
Eugene Susla4abd2e62018-11-02 17:35:07 -07001016 mContext.getPackageManager().updatePermissionFlags(permission, packageName,
1017 PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, user);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001018 }
1019 }
1020
Philip P. Moltmann17f65af2018-10-18 15:32:29 -07001021 /**
1022 * Check if a permission is already fixed or is set by the user.
1023 *
1024 * <p>A permission should not be set by the default policy if the user or other policies already
1025 * set the permission.
1026 *
1027 * @param flags The flags of the permission
1028 *
1029 * @return {@code true} iff the permission can be set without violating a policy of the users
1030 * intention
1031 */
1032 private boolean isFixedOrUserSet(int flags) {
1033 return (flags & (PackageManager.FLAG_PERMISSION_USER_SET
1034 | PackageManager.FLAG_PERMISSION_USER_FIXED
1035 | PackageManager.FLAG_PERMISSION_POLICY_FIXED
1036 | PackageManager.FLAG_PERMISSION_SYSTEM_FIXED)) != 0;
1037 }
1038
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001039 /**
1040 * Return the background permission for a permission.
1041 *
1042 * @param permission The name of the foreground permission
1043 *
1044 * @return The name of the background permission or {@code null} if the permission has no
1045 * background permission
1046 */
1047 private @Nullable String getBackgroundPermission(@NonNull String permission) {
1048 try {
1049 return mContext.getPackageManager().getPermissionInfo(permission,
1050 0).backgroundPermission;
1051 } catch (NameNotFoundException e) {
1052 return null;
1053 }
1054 }
1055
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001056 private void grantRuntimePermissions(PackageInfo pkg,
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001057 Set<String> permissionsWithoutSplits, boolean systemFixed, boolean ignoreSystemPackage,
1058 int userId) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001059 if (pkg == null) {
1060 return;
1061 }
1062
1063 String[] requestedPermissions = pkg.requestedPermissions;
1064 if (ArrayUtils.isEmpty(requestedPermissions)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001065 return;
1066 }
1067
Eugene Susla31c9cd12018-12-03 15:41:31 -08001068 // Intersect the requestedPermissions for a factory image with that of its current update
1069 // in case the latter one removed a <uses-permission>
1070 String[] requestedByNonSystemPackage = getPackageInfo(pkg.packageName).requestedPermissions;
1071 int size = requestedPermissions.length;
1072 for (int i = 0; i < size; i++) {
1073 if (!ArrayUtils.contains(requestedByNonSystemPackage, requestedPermissions[i])) {
1074 requestedPermissions[i] = null;
1075 }
1076 }
1077 requestedPermissions = ArrayUtils.filterNotNull(requestedPermissions, String[]::new);
1078
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001079 PackageManager pm = mContext.getPackageManager();
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001080 final ArraySet<String> permissions = new ArraySet<>(permissionsWithoutSplits);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001081 ApplicationInfo applicationInfo = pkg.applicationInfo;
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001082
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001083 int newFlags = PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
1084 if (systemFixed) {
1085 newFlags |= PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
1086 }
1087
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001088 // Automatically attempt to grant split permissions to older APKs
Philip P. Moltmann039678e2018-09-18 13:04:38 -07001089 final List<PermissionManager.SplitPermissionInfo> splitPermissions =
1090 mContext.getSystemService(PermissionManager.class).getSplitPermissions();
1091 final int numSplitPerms = splitPermissions.size();
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001092 for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
Philip P. Moltmann039678e2018-09-18 13:04:38 -07001093 final PermissionManager.SplitPermissionInfo splitPerm =
1094 splitPermissions.get(splitPermNum);
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001095
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001096 if (applicationInfo != null
Philip P. Moltmann039678e2018-09-18 13:04:38 -07001097 && applicationInfo.targetSdkVersion < splitPerm.getTargetSdk()
Philip P. Moltmanna3ba4d92018-10-08 11:50:07 -07001098 && permissionsWithoutSplits.contains(splitPerm.getSplitPermission())) {
1099 permissions.addAll(splitPerm.getNewPermissions());
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001100 }
1101 }
1102
Todd Kennedy82b08422017-09-28 13:32:05 -07001103 Set<String> grantablePermissions = null;
1104
Eric Enslen1e423b92017-12-18 11:30:21 -08001105 // In some cases, like for the Phone or SMS app, we grant permissions regardless
1106 // of if the version on the system image declares the permission as used since
1107 // selecting the app as the default for that function the user makes a deliberate
Todd Kennedy82b08422017-09-28 13:32:05 -07001108 // choice to grant this app the permissions needed to function. For all other
1109 // apps, (default grants on first boot and user creation) we don't grant default
1110 // permissions if the version on the system image does not declare them.
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001111 if (!ignoreSystemPackage
1112 && applicationInfo != null
1113 && applicationInfo.isUpdatedSystemApp()) {
1114 final PackageInfo disabledPkg = getSystemPackageInfo(
1115 mServiceInternal.getDisabledSystemPackageName(pkg.packageName));
Todd Kennedy82b08422017-09-28 13:32:05 -07001116 if (disabledPkg != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001117 if (ArrayUtils.isEmpty(disabledPkg.requestedPermissions)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001118 return;
1119 }
1120 if (!requestedPermissions.equals(disabledPkg.requestedPermissions)) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001121 grantablePermissions = new ArraySet<>(Arrays.asList(requestedPermissions));
Todd Kennedy82b08422017-09-28 13:32:05 -07001122 requestedPermissions = disabledPkg.requestedPermissions;
1123 }
1124 }
1125 }
1126
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001127 final int numRequestedPermissions = requestedPermissions.length;
1128
1129 // Sort requested permissions so that all permissions that are a foreground permission (i.e.
1130 // permisions that have background permission) are before their background permissions.
1131 final String[] sortedRequestedPermissions = new String[numRequestedPermissions];
1132 int numForeground = 0;
1133 int numOther = 0;
1134 for (int i = 0; i < numRequestedPermissions; i++) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001135 String permission = requestedPermissions[i];
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001136 if (getBackgroundPermission(permission) != null) {
1137 sortedRequestedPermissions[numForeground] = permission;
1138 numForeground++;
1139 } else {
1140 sortedRequestedPermissions[numRequestedPermissions - 1 - numOther] =
1141 permission;
1142 numOther++;
1143 }
1144 }
1145
1146 for (int requestedPermissionNum = 0; requestedPermissionNum < numRequestedPermissions;
1147 requestedPermissionNum++) {
1148 String permission = requestedPermissions[requestedPermissionNum];
Todd Kennedy82b08422017-09-28 13:32:05 -07001149
1150 // If there is a disabled system app it may request a permission the updated
1151 // version ot the data partition doesn't, In this case skip the permission.
1152 if (grantablePermissions != null && !grantablePermissions.contains(permission)) {
1153 continue;
1154 }
1155
1156 if (permissions.contains(permission)) {
Eugene Susla4abd2e62018-11-02 17:35:07 -07001157 UserHandle user = UserHandle.of(userId);
1158 final int flags = mContext.getPackageManager().getPermissionFlags(
1159 permission, pkg.packageName, user);
Todd Kennedy82b08422017-09-28 13:32:05 -07001160
Philip P. Moltmann17f65af2018-10-18 15:32:29 -07001161 // Certain flags imply that the permission's current state by the system or
1162 // device/profile owner or the user. In these cases we do not want to clobber the
1163 // current state.
1164 //
Todd Kennedy82b08422017-09-28 13:32:05 -07001165 // Unless the caller wants to override user choices. The override is
1166 // to make sure we can grant the needed permission to the default
1167 // sms and phone apps after the user chooses this in the UI.
Philip P. Moltmann17f65af2018-10-18 15:32:29 -07001168 if (!isFixedOrUserSet(flags) || ignoreSystemPackage) {
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001169 // Never clobber policy fixed permissions.
1170 // We must allow the grant of a system-fixed permission because
1171 // system-fixed is sticky, but the permission itself may be revoked.
1172 if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001173 continue;
1174 }
1175
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001176 int uid = UserHandle.getUid(userId,
1177 UserHandle.getAppId(pkg.applicationInfo.uid));
1178 String op = AppOpsManager.permissionToOp(permission);
1179
Eugene Susla4abd2e62018-11-02 17:35:07 -07001180 mContext.getPackageManager()
1181 .grantRuntimePermission(pkg.packageName, permission, user);
Philip P. Moltmann12d0ee02018-10-30 14:47:33 -07001182
1183 mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
1184 newFlags, newFlags, user);
1185
1186 List<String> fgPerms = mPermissionManager.getBackgroundPermissions()
1187 .get(permission);
1188 if (fgPerms != null) {
1189 int numFgPerms = fgPerms.size();
1190 for (int fgPermNum = 0; fgPermNum < numFgPerms; fgPermNum++) {
1191 String fgPerm = fgPerms.get(fgPermNum);
1192
1193 if (pm.checkPermission(fgPerm, pkg.packageName)
1194 == PackageManager.PERMISSION_GRANTED) {
1195 // Upgrade the app-op state of the fg permission to allow bg access
1196 mContext.getSystemService(AppOpsManager.class).setMode(
1197 AppOpsManager.permissionToOp(fgPerm), uid,
1198 pkg.packageName, AppOpsManager.MODE_ALLOWED);
1199
1200 break;
1201 }
1202 }
1203 }
1204
1205 String bgPerm = getBackgroundPermission(permission);
1206 if (bgPerm == null) {
1207 if (op != null) {
1208 mContext.getSystemService(AppOpsManager.class).setMode(op, uid,
1209 pkg.packageName, AppOpsManager.MODE_ALLOWED);
1210 }
1211 } else {
1212 int mode;
1213 if (pm.checkPermission(bgPerm, pkg.packageName)
1214 == PackageManager.PERMISSION_GRANTED) {
1215 mode = AppOpsManager.MODE_ALLOWED;
1216 } else {
1217 mode = AppOpsManager.MODE_FOREGROUND;
1218 }
1219
1220 mContext.getSystemService(AppOpsManager.class).setMode(op, uid,
1221 pkg.packageName, mode);
1222 }
1223
Todd Kennedy82b08422017-09-28 13:32:05 -07001224 if (DEBUG) {
1225 Log.i(TAG, "Granted " + (systemFixed ? "fixed " : "not fixed ")
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001226 + permission + " to default handler " + pkg);
Eugene Suslae4ee2c22018-11-05 12:23:30 -08001227
1228 int appOp = AppOpsManager.permissionToOpCode(permission);
1229 if (appOp != AppOpsManager.OP_NONE
1230 && AppOpsManager.opToDefaultMode(appOp)
1231 != AppOpsManager.MODE_ALLOWED) {
1232 // Permission has a corresponding appop which is not allowed by default
1233 // We must allow it as well, as it's usually checked alongside the
1234 // permission
1235 if (DEBUG) {
1236 Log.i(TAG, "Granting OP_" + AppOpsManager.opToName(appOp)
1237 + " to " + pkg.packageName);
1238 }
1239 mContext.getSystemService(AppOpsManager.class).setUidMode(
1240 appOp, pkg.applicationInfo.uid, AppOpsManager.MODE_ALLOWED);
1241 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001242 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001243 }
1244
1245 // If a component gets a permission for being the default handler A
1246 // and also default handler B, we grant the weaker grant form.
1247 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0
1248 && (flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0
1249 && !systemFixed) {
1250 if (DEBUG) {
1251 Log.i(TAG, "Granted not fixed " + permission + " to default handler "
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001252 + pkg);
Todd Kennedy82b08422017-09-28 13:32:05 -07001253 }
Eugene Susla4abd2e62018-11-02 17:35:07 -07001254 mContext.getPackageManager().updatePermissionFlags(permission, pkg.packageName,
1255 PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, 0, user);
Todd Kennedy82b08422017-09-28 13:32:05 -07001256 }
1257 }
1258 }
1259 }
1260
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001261 private PackageInfo getSystemPackageInfo(String pkg) {
1262 //TODO not MATCH_SYSTEM_ONLY?
1263 return getPackageInfo(pkg, PackageManager.MATCH_FACTORY_ONLY);
1264 }
1265
1266 private PackageInfo getPackageInfo(String pkg) {
1267 return getPackageInfo(pkg, 0 /* extraFlags */);
1268 }
1269
1270 private PackageInfo getPackageInfo(String pkg,
1271 @PackageManager.PackageInfoFlags int extraFlags) {
Eugene Susla4abd2e62018-11-02 17:35:07 -07001272 try {
1273 return mContext.getPackageManager().getPackageInfo(pkg,
1274 DEFAULT_PACKAGE_INFO_QUERY_FLAGS | extraFlags);
1275 } catch (NameNotFoundException e) {
1276 return null;
1277 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001278 }
1279
1280 private boolean isSysComponentOrPersistentPlatformSignedPrivApp(PackageInfo pkg) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001281 if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) {
1282 return true;
1283 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001284 if (!pkg.applicationInfo.isPrivilegedApp()) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001285 return false;
1286 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001287 final PackageInfo disabledPkg = getSystemPackageInfo(
1288 mServiceInternal.getDisabledSystemPackageName(pkg.applicationInfo.packageName));
Todd Kennedy82b08422017-09-28 13:32:05 -07001289 if (disabledPkg != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001290 ApplicationInfo disabledPackageAppInfo = disabledPkg.applicationInfo;
1291 if (disabledPackageAppInfo != null
1292 && (disabledPackageAppInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001293 return false;
1294 }
1295 } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
1296 return false;
1297 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001298 return mServiceInternal.isPlatformSigned(pkg.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001299 }
1300
1301 private void grantDefaultPermissionExceptions(int userId) {
1302 mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
1303
1304 synchronized (mLock) {
1305 // mGrantExceptions is null only before the first read and then
1306 // it serves as a cache of the default grants that should be
1307 // performed for every user. If there is an entry then the app
1308 // is on the system image and supports runtime permissions.
1309 if (mGrantExceptions == null) {
1310 mGrantExceptions = readDefaultPermissionExceptionsLocked();
1311 }
1312 }
1313
1314 Set<String> permissions = null;
1315 final int exceptionCount = mGrantExceptions.size();
1316 for (int i = 0; i < exceptionCount; i++) {
1317 String packageName = mGrantExceptions.keyAt(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001318 PackageInfo pkg = getSystemPackageInfo(packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001319 List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i);
1320 final int permissionGrantCount = permissionGrants.size();
1321 for (int j = 0; j < permissionGrantCount; j++) {
1322 DefaultPermissionGrant permissionGrant = permissionGrants.get(j);
Jeff Sharkey7a807602018-10-18 13:21:55 -06001323 if (!isPermissionDangerous(permissionGrant.name)) {
1324 Log.w(TAG, "Ignoring permission " + permissionGrant.name
1325 + " which isn't dangerous");
1326 continue;
1327 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001328 if (permissions == null) {
1329 permissions = new ArraySet<>();
1330 } else {
1331 permissions.clear();
1332 }
Jeff Sharkey9d4654c2018-10-25 09:52:57 -06001333 permissions.add(permissionGrant.name);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001334 grantRuntimePermissions(pkg, permissions, permissionGrant.fixed, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -07001335 }
1336 }
1337 }
1338
1339 private File[] getDefaultPermissionFiles() {
1340 ArrayList<File> ret = new ArrayList<File>();
1341 File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
1342 if (dir.isDirectory() && dir.canRead()) {
1343 Collections.addAll(ret, dir.listFiles());
1344 }
1345 dir = new File(Environment.getVendorDirectory(), "etc/default-permissions");
1346 if (dir.isDirectory() && dir.canRead()) {
1347 Collections.addAll(ret, dir.listFiles());
1348 }
Jiyong Park0989e382018-03-13 10:26:47 +09001349 dir = new File(Environment.getOdmDirectory(), "etc/default-permissions");
1350 if (dir.isDirectory() && dir.canRead()) {
1351 Collections.addAll(ret, dir.listFiles());
1352 }
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09001353 dir = new File(Environment.getProductDirectory(), "etc/default-permissions");
1354 if (dir.isDirectory() && dir.canRead()) {
1355 Collections.addAll(ret, dir.listFiles());
1356 }
Dario Freni1ae46d72018-08-17 15:56:43 +01001357 dir = new File(Environment.getProductServicesDirectory(),
1358 "etc/default-permissions");
1359 if (dir.isDirectory() && dir.canRead()) {
1360 Collections.addAll(ret, dir.listFiles());
1361 }
Ralph Nathanbd111582018-03-21 14:53:23 -07001362 // For IoT devices, we check the oem partition for default permissions for each app.
1363 if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
1364 dir = new File(Environment.getOemDirectory(), "etc/default-permissions");
1365 if (dir.isDirectory() && dir.canRead()) {
1366 Collections.addAll(ret, dir.listFiles());
1367 }
1368 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001369 return ret.isEmpty() ? null : ret.toArray(new File[0]);
1370 }
1371
1372 private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
1373 readDefaultPermissionExceptionsLocked() {
1374 File[] files = getDefaultPermissionFiles();
1375 if (files == null) {
1376 return new ArrayMap<>(0);
1377 }
1378
1379 ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>();
1380
1381 // Iterate over the files in the directory and scan .xml files
1382 for (File file : files) {
1383 if (!file.getPath().endsWith(".xml")) {
1384 Slog.i(TAG, "Non-xml file " + file
1385 + " in " + file.getParent() + " directory, ignoring");
1386 continue;
1387 }
1388 if (!file.canRead()) {
1389 Slog.w(TAG, "Default permissions file " + file + " cannot be read");
1390 continue;
1391 }
1392 try (
1393 InputStream str = new BufferedInputStream(new FileInputStream(file))
1394 ) {
1395 XmlPullParser parser = Xml.newPullParser();
1396 parser.setInput(str, null);
1397 parse(parser, grantExceptions);
1398 } catch (XmlPullParserException | IOException e) {
1399 Slog.w(TAG, "Error reading default permissions file " + file, e);
1400 }
1401 }
1402
1403 return grantExceptions;
1404 }
1405
1406 private void parse(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1407 outGrantExceptions) throws IOException, XmlPullParserException {
1408 final int outerDepth = parser.getDepth();
1409 int type;
1410 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1411 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1412 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1413 continue;
1414 }
1415 if (TAG_EXCEPTIONS.equals(parser.getName())) {
1416 parseExceptions(parser, outGrantExceptions);
1417 } else {
1418 Log.e(TAG, "Unknown tag " + parser.getName());
1419 }
1420 }
1421 }
1422
1423 private void parseExceptions(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1424 outGrantExceptions) throws IOException, XmlPullParserException {
1425 final int outerDepth = parser.getDepth();
1426 int type;
1427 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1428 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1429 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1430 continue;
1431 }
1432 if (TAG_EXCEPTION.equals(parser.getName())) {
1433 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
1434
1435 List<DefaultPermissionGrant> packageExceptions =
1436 outGrantExceptions.get(packageName);
1437 if (packageExceptions == null) {
1438 // The package must be on the system image
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001439 if (!isSystemPackage(packageName)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001440 Log.w(TAG, "Unknown package:" + packageName);
1441 XmlUtils.skipCurrentTag(parser);
1442 continue;
1443 }
1444
1445 // The package must support runtime permissions
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001446 if (!doesPackageSupportRuntimePermissions(getSystemPackageInfo(packageName))) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001447 Log.w(TAG, "Skipping non supporting runtime permissions package:"
1448 + packageName);
1449 XmlUtils.skipCurrentTag(parser);
1450 continue;
1451 }
1452 packageExceptions = new ArrayList<>();
1453 outGrantExceptions.put(packageName, packageExceptions);
1454 }
1455
1456 parsePermission(parser, packageExceptions);
1457 } else {
1458 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exceptions>");
1459 }
1460 }
1461 }
1462
1463 private void parsePermission(XmlPullParser parser, List<DefaultPermissionGrant>
1464 outPackageExceptions) throws IOException, XmlPullParserException {
1465 final int outerDepth = parser.getDepth();
1466 int type;
1467 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1468 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1469 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1470 continue;
1471 }
1472
1473 if (TAG_PERMISSION.contains(parser.getName())) {
1474 String name = parser.getAttributeValue(null, ATTR_NAME);
1475 if (name == null) {
1476 Log.w(TAG, "Mandatory name attribute missing for permission tag");
1477 XmlUtils.skipCurrentTag(parser);
1478 continue;
1479 }
1480
1481 final boolean fixed = XmlUtils.readBooleanAttribute(parser, ATTR_FIXED);
1482
1483 DefaultPermissionGrant exception = new DefaultPermissionGrant(name, fixed);
1484 outPackageExceptions.add(exception);
1485 } else {
1486 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exception>");
1487 }
1488 }
1489 }
1490
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +00001491 private static boolean doesPackageSupportRuntimePermissions(PackageInfo pkg) {
1492 return pkg.applicationInfo != null
1493 && pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
Todd Kennedy82b08422017-09-28 13:32:05 -07001494 }
1495
Jeff Sharkey7a807602018-10-18 13:21:55 -06001496 private boolean isPermissionDangerous(String name) {
1497 try {
1498 final PermissionInfo pi = mContext.getPackageManager().getPermissionInfo(name, 0);
Jeff Sharkey9d4654c2018-10-25 09:52:57 -06001499 return (pi.getProtection() == PermissionInfo.PROTECTION_DANGEROUS);
Jeff Sharkey7a807602018-10-18 13:21:55 -06001500 } catch (NameNotFoundException e) {
1501 // When unknown assume it's dangerous to be on the safe side
1502 return true;
1503 }
1504 }
1505
Todd Kennedy82b08422017-09-28 13:32:05 -07001506 private static final class DefaultPermissionGrant {
1507 final String name;
1508 final boolean fixed;
1509
1510 public DefaultPermissionGrant(String name, boolean fixed) {
1511 this.name = name;
1512 this.fixed = fixed;
1513 }
1514 }
1515}