blob: 846c7b7a7e0c8165480ebe2a538085219d426344 [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;
25import android.app.DownloadManager;
26import android.app.admin.DevicePolicyManager;
27import android.companion.CompanionDeviceManager;
28import android.content.Context;
29import android.content.Intent;
Todd Kennedy82b08422017-09-28 13:32:05 -070030import android.content.pm.ApplicationInfo;
Philip P. Moltmannfa894222018-09-18 21:24:00 +000031import android.content.pm.PackageList;
Todd Kennedy82b08422017-09-28 13:32:05 -070032import android.content.pm.PackageManager;
33import android.content.pm.PackageManagerInternal;
Jeff Sharkey0095a822018-02-15 13:06:53 -070034import android.content.pm.PackageManagerInternal.PackagesProvider;
35import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -070036import android.content.pm.PackageParser;
37import android.content.pm.ProviderInfo;
38import android.content.pm.ResolveInfo;
39import android.media.RingtoneManager;
40import android.net.Uri;
41import android.os.Binder;
42import android.os.Build;
43import android.os.Environment;
44import android.os.Handler;
45import android.os.Looper;
46import android.os.Message;
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -060047import android.os.SystemProperties;
Todd Kennedy82b08422017-09-28 13:32:05 -070048import android.os.UserHandle;
49import android.os.storage.StorageManager;
50import android.print.PrintManager;
51import android.provider.CalendarContract;
52import android.provider.ContactsContract;
53import android.provider.MediaStore;
54import android.provider.Telephony.Sms.Intents;
Todd Kennedy82b08422017-09-28 13:32:05 -070055import android.security.Credentials;
Jeff Sharkey0095a822018-02-15 13:06:53 -070056import android.telephony.TelephonyManager;
Ye Wen8e8b2d52018-03-14 11:48:24 -070057import android.text.TextUtils;
Todd Kennedy82b08422017-09-28 13:32:05 -070058import android.util.ArrayMap;
59import android.util.ArraySet;
60import android.util.Log;
61import android.util.Slog;
62import android.util.Xml;
Jeff Sharkey0095a822018-02-15 13:06:53 -070063
Todd Kennedy82b08422017-09-28 13:32:05 -070064import com.android.internal.util.XmlUtils;
65import com.android.server.LocalServices;
Todd Kennedy82b08422017-09-28 13:32:05 -070066
67import org.xmlpull.v1.XmlPullParser;
68import org.xmlpull.v1.XmlPullParserException;
69
70import java.io.BufferedInputStream;
71import java.io.File;
72import java.io.FileInputStream;
73import java.io.IOException;
74import java.io.InputStream;
75import java.util.ArrayList;
Todd Kennedy82b08422017-09-28 13:32:05 -070076import java.util.Collections;
77import java.util.List;
78import java.util.Map;
79import java.util.Set;
80
Todd Kennedy82b08422017-09-28 13:32:05 -070081/**
82 * This class is the policy for granting runtime permissions to
83 * platform components and default handlers in the system such
84 * that the device is usable out-of-the-box. For example, the
85 * shell UID is a part of the system and the Phone app should
86 * have phone related permission by default.
87 * <p>
88 * NOTE: This class is at the wrong abstraction level. It is a part of the package manager
89 * service but knows about lots of higher level subsystems. The correct way to do this is
90 * to have an interface defined in the package manager but have the impl next to other
91 * policy stuff like PhoneWindowManager
92 */
93public final class DefaultPermissionGrantPolicy {
94 private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
95 private static final boolean DEBUG = false;
96
Philip P. Moltmannfa894222018-09-18 21:24:00 +000097 private static final int DEFAULT_FLAGS =
Todd Kennedy82b08422017-09-28 13:32:05 -070098 PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
99 | PackageManager.MATCH_UNINSTALLED_PACKAGES;
100
101 private static final String AUDIO_MIME_TYPE = "audio/mpeg";
102
103 private static final String TAG_EXCEPTIONS = "exceptions";
104 private static final String TAG_EXCEPTION = "exception";
105 private static final String TAG_PERMISSION = "permission";
106 private static final String ATTR_PACKAGE = "package";
107 private static final String ATTR_NAME = "name";
108 private static final String ATTR_FIXED = "fixed";
109
110 private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
111 static {
112 PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
113 PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
114 PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
115 PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
116 PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
117 PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
118 PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
119 }
120
121 private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>();
122 static {
123 CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
124 CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
125 CONTACTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
126 }
127
128 private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>();
129 static {
130 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
131 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
132 }
133
Eric Enslen1e423b92017-12-18 11:30:21 -0800134 private static final Set<String> COARSE_LOCATION_PERMISSIONS = new ArraySet<>();
135 static {
136 COARSE_LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
137 }
138
Todd Kennedy82b08422017-09-28 13:32:05 -0700139 private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
140 static {
141 CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
142 CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR);
143 }
144
145 private static final Set<String> SMS_PERMISSIONS = new ArraySet<>();
146 static {
147 SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS);
148 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS);
149 SMS_PERMISSIONS.add(Manifest.permission.READ_SMS);
150 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH);
151 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS);
152 SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS);
153 }
154
155 private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>();
156 static {
157 MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
158 }
159
160 private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>();
161 static {
162 CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA);
163 }
164
165 private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>();
166 static {
167 SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
168 }
169
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600170 @Deprecated
Todd Kennedy82b08422017-09-28 13:32:05 -0700171 private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
172 static {
Jeff Sharkeyb1629092018-08-24 10:33:12 -0600173 // STOPSHIP(b/112545973): remove once feature enabled by default
174 if (!SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
175 STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
176 STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
177 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700178 }
179
Jeff Sharkey4aacd8b2018-07-24 15:24:21 -0600180 private static final Set<String> MEDIA_AURAL_PERMISSIONS = new ArraySet<>();
181 static {
182 // STOPSHIP(b/112545973): remove once feature enabled by default
183 if (SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
184 MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_AUDIO);
185 MEDIA_AURAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_AUDIO);
186 }
187 }
188
189 private static final Set<String> MEDIA_VISUAL_PERMISSIONS = new ArraySet<>();
190 static {
191 // STOPSHIP(b/112545973): remove once feature enabled by default
192 if (SystemProperties.getBoolean(StorageManager.PROP_ISOLATED_STORAGE, false)) {
193 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_IMAGES);
194 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_IMAGES);
195 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.READ_MEDIA_VIDEO);
196 MEDIA_VISUAL_PERMISSIONS.add(Manifest.permission.WRITE_MEDIA_VIDEO);
197 }
198 }
199
Todd Kennedy82b08422017-09-28 13:32:05 -0700200 private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
201
202 private static final String ACTION_TRACK = "com.android.fitness.TRACK";
203
204 private final Handler mHandler;
205
206 private PackagesProvider mLocationPackagesProvider;
207 private PackagesProvider mVoiceInteractionPackagesProvider;
208 private PackagesProvider mSmsAppPackagesProvider;
209 private PackagesProvider mDialerAppPackagesProvider;
210 private PackagesProvider mSimCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800211 private PackagesProvider mUseOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700212 private SyncAdapterPackagesProvider mSyncAdapterPackagesProvider;
213
214 private ArrayMap<String, List<DefaultPermissionGrant>> mGrantExceptions;
215 private final Context mContext;
216 private final Object mLock = new Object();
217 private final PackageManagerInternal mServiceInternal;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700218 private final PermissionManagerService mPermissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -0700219 private final DefaultPermissionGrantedCallback mPermissionGrantedCallback;
220 public interface DefaultPermissionGrantedCallback {
221 /** Callback when permissions have been granted */
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000222 public void onDefaultRuntimePermissionsGranted(int userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700223 }
224
225 public DefaultPermissionGrantPolicy(Context context, Looper looper,
Todd Kennedy0eb97382017-10-03 16:57:22 -0700226 @Nullable DefaultPermissionGrantedCallback callback,
227 @NonNull PermissionManagerService permissionManager) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700228 mContext = context;
229 mHandler = new Handler(looper) {
230 @Override
231 public void handleMessage(Message msg) {
232 if (msg.what == MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS) {
233 synchronized (mLock) {
234 if (mGrantExceptions == null) {
235 mGrantExceptions = readDefaultPermissionExceptionsLocked();
236 }
237 }
238 }
239 }
240 };
241 mPermissionGrantedCallback = callback;
Todd Kennedy0eb97382017-10-03 16:57:22 -0700242 mPermissionManager = permissionManager;
Todd Kennedy82b08422017-09-28 13:32:05 -0700243 mServiceInternal = LocalServices.getService(PackageManagerInternal.class);
244 }
245
246 public void setLocationPackagesProvider(PackagesProvider provider) {
247 synchronized (mLock) {
248 mLocationPackagesProvider = provider;
249 }
250 }
251
252 public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
253 synchronized (mLock) {
254 mVoiceInteractionPackagesProvider = provider;
255 }
256 }
257
258 public void setSmsAppPackagesProvider(PackagesProvider provider) {
259 synchronized (mLock) {
260 mSmsAppPackagesProvider = provider;
261 }
262 }
263
264 public void setDialerAppPackagesProvider(PackagesProvider provider) {
265 synchronized (mLock) {
266 mDialerAppPackagesProvider = provider;
267 }
268 }
269
270 public void setSimCallManagerPackagesProvider(PackagesProvider provider) {
271 synchronized (mLock) {
272 mSimCallManagerPackagesProvider = provider;
273 }
274 }
275
Eric Enslen1e423b92017-12-18 11:30:21 -0800276 public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
277 synchronized (mLock) {
278 mUseOpenWifiAppPackagesProvider = provider;
279 }
280 }
281
Todd Kennedy82b08422017-09-28 13:32:05 -0700282 public void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider) {
283 synchronized (mLock) {
284 mSyncAdapterPackagesProvider = provider;
285 }
286 }
287
Todd Kennedy42d61602017-12-12 14:44:19 -0800288 public void grantDefaultPermissions(int userId) {
Ralph Nathanbd111582018-03-21 14:53:23 -0700289 grantPermissionsToSysComponentsAndPrivApps(userId);
290 grantDefaultSystemHandlerPermissions(userId);
291 grantDefaultPermissionExceptions(userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700292 }
293
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000294 private void grantRuntimePermissionsForPackage(int userId, PackageParser.Package pkg) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700295 Set<String> permissions = new ArraySet<>();
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000296 for (String permission : pkg.requestedPermissions) {
Todd Kennedy0eb97382017-10-03 16:57:22 -0700297 final BasePermission bp = mPermissionManager.getPermission(permission);
298 if (bp == null) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700299 continue;
300 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700301 if (bp.isRuntime()) {
302 permissions.add(permission);
303 }
304 }
305 if (!permissions.isEmpty()) {
306 grantRuntimePermissions(pkg, permissions, true, userId);
307 }
308 }
309
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000310 private void grantAllRuntimePermissions(int userId) {
311 Log.i(TAG, "Granting all runtime permissions for user " + userId);
312 final PackageList packageList = mServiceInternal.getPackageList();
313 for (String packageName : packageList.getPackageNames()) {
314 final PackageParser.Package pkg = mServiceInternal.getPackage(packageName);
315 if (pkg == null) {
316 continue;
317 }
318 grantRuntimePermissionsForPackage(userId, pkg);
319 }
320 }
321
Todd Kennedy82b08422017-09-28 13:32:05 -0700322 public void scheduleReadDefaultPermissionExceptions() {
323 mHandler.sendEmptyMessage(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
324 }
325
Todd Kennedy42d61602017-12-12 14:44:19 -0800326 private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700327 Log.i(TAG, "Granting permissions to platform components for user " + userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000328 final PackageList packageList = mServiceInternal.getPackageList();
329 for (String packageName : packageList.getPackageNames()) {
330 final PackageParser.Package pkg = mServiceInternal.getPackage(packageName);
Todd Kennedy42d61602017-12-12 14:44:19 -0800331 if (pkg == null) {
332 continue;
333 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700334 if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg)
335 || !doesPackageSupportRuntimePermissions(pkg)
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000336 || pkg.requestedPermissions.isEmpty()) {
Todd Kennedy82b08422017-09-28 13:32:05 -0700337 continue;
338 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000339 grantRuntimePermissionsForPackage(userId, pkg);
Todd Kennedy82b08422017-09-28 13:32:05 -0700340 }
341 }
342
343 private void grantDefaultSystemHandlerPermissions(int userId) {
344 Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
345
346 final PackagesProvider locationPackagesProvider;
347 final PackagesProvider voiceInteractionPackagesProvider;
348 final PackagesProvider smsAppPackagesProvider;
349 final PackagesProvider dialerAppPackagesProvider;
350 final PackagesProvider simCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800351 final PackagesProvider useOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700352 final SyncAdapterPackagesProvider syncAdapterPackagesProvider;
353
354 synchronized (mLock) {
355 locationPackagesProvider = mLocationPackagesProvider;
356 voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
357 smsAppPackagesProvider = mSmsAppPackagesProvider;
358 dialerAppPackagesProvider = mDialerAppPackagesProvider;
359 simCallManagerPackagesProvider = mSimCallManagerPackagesProvider;
Eric Enslen1e423b92017-12-18 11:30:21 -0800360 useOpenWifiAppPackagesProvider = mUseOpenWifiAppPackagesProvider;
Todd Kennedy82b08422017-09-28 13:32:05 -0700361 syncAdapterPackagesProvider = mSyncAdapterPackagesProvider;
362 }
363
364 String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
365 ? voiceInteractionPackagesProvider.getPackages(userId) : null;
366 String[] locationPackageNames = (locationPackagesProvider != null)
367 ? locationPackagesProvider.getPackages(userId) : null;
368 String[] smsAppPackageNames = (smsAppPackagesProvider != null)
369 ? smsAppPackagesProvider.getPackages(userId) : null;
370 String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
371 ? dialerAppPackagesProvider.getPackages(userId) : null;
372 String[] simCallManagerPackageNames = (simCallManagerPackagesProvider != null)
373 ? simCallManagerPackagesProvider.getPackages(userId) : null;
Eric Enslen1e423b92017-12-18 11:30:21 -0800374 String[] useOpenWifiAppPackageNames = (useOpenWifiAppPackagesProvider != null)
375 ? useOpenWifiAppPackagesProvider.getPackages(userId) : null;
Todd Kennedy82b08422017-09-28 13:32:05 -0700376 String[] contactsSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
377 syncAdapterPackagesProvider.getPackages(ContactsContract.AUTHORITY, userId) : null;
378 String[] calendarSyncAdapterPackages = (syncAdapterPackagesProvider != null) ?
379 syncAdapterPackagesProvider.getPackages(CalendarContract.AUTHORITY, userId) : null;
380
381 // Installer
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000382 final String installerPackageName = mServiceInternal.getKnownPackageName(
383 PackageManagerInternal.PACKAGE_INSTALLER, userId);
384 PackageParser.Package installerPackage = getSystemPackage(installerPackageName);
385 if (installerPackage != null
386 && doesPackageSupportRuntimePermissions(installerPackage)) {
387 grantRuntimePermissions(installerPackage, STORAGE_PERMISSIONS, true, userId);
388 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700389
390 // Verifier
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000391 final String verifierPackageName = mServiceInternal.getKnownPackageName(
392 PackageManagerInternal.PACKAGE_VERIFIER, userId);
393 PackageParser.Package verifierPackage = getSystemPackage(verifierPackageName);
394 if (verifierPackage != null
395 && doesPackageSupportRuntimePermissions(verifierPackage)) {
396 grantRuntimePermissions(verifierPackage, STORAGE_PERMISSIONS, true, userId);
397 grantRuntimePermissions(verifierPackage, PHONE_PERMISSIONS, false, userId);
398 grantRuntimePermissions(verifierPackage, SMS_PERMISSIONS, false, userId);
399 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700400
401 // SetupWizard
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000402 final String setupWizardPackageName = mServiceInternal.getKnownPackageName(
403 PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId);
404 PackageParser.Package setupPackage = getSystemPackage(setupWizardPackageName);
405 if (setupPackage != null
406 && doesPackageSupportRuntimePermissions(setupPackage)) {
407 grantRuntimePermissions(setupPackage, PHONE_PERMISSIONS, userId);
408 grantRuntimePermissions(setupPackage, CONTACTS_PERMISSIONS, userId);
409 grantRuntimePermissions(setupPackage, LOCATION_PERMISSIONS, userId);
410 grantRuntimePermissions(setupPackage, CAMERA_PERMISSIONS, userId);
411 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700412
413 // Camera
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000414 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
415 PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackage(
416 cameraIntent, userId);
417 if (cameraPackage != null
418 && doesPackageSupportRuntimePermissions(cameraPackage)) {
419 grantRuntimePermissions(cameraPackage, CAMERA_PERMISSIONS, userId);
420 grantRuntimePermissions(cameraPackage, MICROPHONE_PERMISSIONS, userId);
421 grantRuntimePermissions(cameraPackage, STORAGE_PERMISSIONS, userId);
422 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700423
424 // Media provider
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000425 PackageParser.Package mediaStorePackage = getDefaultProviderAuthorityPackage(
426 MediaStore.AUTHORITY, userId);
427 if (mediaStorePackage != null) {
428 grantRuntimePermissions(mediaStorePackage, STORAGE_PERMISSIONS, true, userId);
429 grantRuntimePermissions(mediaStorePackage, MEDIA_AURAL_PERMISSIONS, true, userId);
430 grantRuntimePermissions(mediaStorePackage, MEDIA_VISUAL_PERMISSIONS, true, userId);
431 grantRuntimePermissions(mediaStorePackage, PHONE_PERMISSIONS, true, userId);
432 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700433
434 // Downloads provider
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000435 PackageParser.Package downloadsPackage = getDefaultProviderAuthorityPackage(
436 "downloads", userId);
437 if (downloadsPackage != null) {
438 grantRuntimePermissions(downloadsPackage, STORAGE_PERMISSIONS, true, userId);
439 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700440
441 // Downloads UI
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000442 Intent downloadsUiIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
443 PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActivityPackage(
444 downloadsUiIntent, userId);
445 if (downloadsUiPackage != null
446 && doesPackageSupportRuntimePermissions(downloadsUiPackage)) {
447 grantRuntimePermissions(downloadsUiPackage, STORAGE_PERMISSIONS, true, userId);
448 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700449
450 // Storage provider
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000451 PackageParser.Package storagePackage = getDefaultProviderAuthorityPackage(
452 "com.android.externalstorage.documents", userId);
453 if (storagePackage != null) {
454 grantRuntimePermissions(storagePackage, STORAGE_PERMISSIONS, true, userId);
455 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700456
457 // CertInstaller
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000458 Intent certInstallerIntent = new Intent(Credentials.INSTALL_ACTION);
459 PackageParser.Package certInstallerPackage = getDefaultSystemHandlerActivityPackage(
460 certInstallerIntent, userId);
461 if (certInstallerPackage != null
462 && doesPackageSupportRuntimePermissions(certInstallerPackage)) {
463 grantRuntimePermissions(certInstallerPackage, STORAGE_PERMISSIONS, true, userId);
464 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700465
466 // Dialer
467 if (dialerAppPackageNames == null) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000468 Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
469 PackageParser.Package dialerPackage = getDefaultSystemHandlerActivityPackage(
470 dialerIntent, userId);
471 if (dialerPackage != null) {
472 grantDefaultPermissionsToDefaultSystemDialerApp(dialerPackage, userId);
473 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700474 } else {
475 for (String dialerAppPackageName : dialerAppPackageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000476 PackageParser.Package dialerPackage = getSystemPackage(dialerAppPackageName);
477 if (dialerPackage != null) {
478 grantDefaultPermissionsToDefaultSystemDialerApp(dialerPackage, userId);
479 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700480 }
481 }
482
483 // Sim call manager
484 if (simCallManagerPackageNames != null) {
485 for (String simCallManagerPackageName : simCallManagerPackageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000486 PackageParser.Package simCallManagerPackage =
487 getSystemPackage(simCallManagerPackageName);
488 if (simCallManagerPackage != null) {
489 grantDefaultPermissionsToDefaultSimCallManager(simCallManagerPackage,
490 userId);
491 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700492 }
493 }
494
Eric Enslen1e423b92017-12-18 11:30:21 -0800495 // Use Open Wifi
496 if (useOpenWifiAppPackageNames != null) {
497 for (String useOpenWifiPackageName : useOpenWifiAppPackageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000498 PackageParser.Package useOpenWifiPackage =
499 getSystemPackage(useOpenWifiPackageName);
500 if (useOpenWifiPackage != null) {
501 grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(useOpenWifiPackage,
502 userId);
503 }
Eric Enslen1e423b92017-12-18 11:30:21 -0800504 }
505 }
506
Todd Kennedy82b08422017-09-28 13:32:05 -0700507 // SMS
508 if (smsAppPackageNames == null) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000509 Intent smsIntent = new Intent(Intent.ACTION_MAIN);
510 smsIntent.addCategory(Intent.CATEGORY_APP_MESSAGING);
511 PackageParser.Package smsPackage = getDefaultSystemHandlerActivityPackage(
512 smsIntent, userId);
513 if (smsPackage != null) {
514 grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
515 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700516 } else {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000517 for (String smsPackageName : smsAppPackageNames) {
518 PackageParser.Package smsPackage = getSystemPackage(smsPackageName);
519 if (smsPackage != null) {
520 grantDefaultPermissionsToDefaultSystemSmsApp(smsPackage, userId);
521 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700522 }
523 }
524
525 // Cell Broadcast Receiver
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000526 Intent cbrIntent = new Intent(Intents.SMS_CB_RECEIVED_ACTION);
527 PackageParser.Package cbrPackage =
528 getDefaultSystemHandlerActivityPackage(cbrIntent, userId);
529 if (cbrPackage != null && doesPackageSupportRuntimePermissions(cbrPackage)) {
530 grantRuntimePermissions(cbrPackage, SMS_PERMISSIONS, userId);
531 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700532
533 // Carrier Provisioning Service
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000534 Intent carrierProvIntent = new Intent(Intents.SMS_CARRIER_PROVISION_ACTION);
535 PackageParser.Package carrierProvPackage =
536 getDefaultSystemHandlerServicePackage(carrierProvIntent, userId);
537 if (carrierProvPackage != null
538 && doesPackageSupportRuntimePermissions(carrierProvPackage)) {
539 grantRuntimePermissions(carrierProvPackage, SMS_PERMISSIONS, false, userId);
540 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700541
542 // Calendar
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000543 Intent calendarIntent = new Intent(Intent.ACTION_MAIN);
544 calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR);
545 PackageParser.Package calendarPackage = getDefaultSystemHandlerActivityPackage(
546 calendarIntent, userId);
547 if (calendarPackage != null
548 && doesPackageSupportRuntimePermissions(calendarPackage)) {
549 grantRuntimePermissions(calendarPackage, CALENDAR_PERMISSIONS, userId);
550 grantRuntimePermissions(calendarPackage, CONTACTS_PERMISSIONS, userId);
551 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700552
553 // Calendar provider
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000554 PackageParser.Package calendarProviderPackage = getDefaultProviderAuthorityPackage(
555 CalendarContract.AUTHORITY, userId);
556 if (calendarProviderPackage != null) {
557 grantRuntimePermissions(calendarProviderPackage, CONTACTS_PERMISSIONS, userId);
558 grantRuntimePermissions(calendarProviderPackage, CALENDAR_PERMISSIONS,
559 true, userId);
560 grantRuntimePermissions(calendarProviderPackage, STORAGE_PERMISSIONS, userId);
561 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700562
563 // Calendar provider sync adapters
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000564 List<PackageParser.Package> calendarSyncAdapters = getHeadlessSyncAdapterPackages(
565 calendarSyncAdapterPackages, userId);
566 final int calendarSyncAdapterCount = calendarSyncAdapters.size();
567 for (int i = 0; i < calendarSyncAdapterCount; i++) {
568 PackageParser.Package calendarSyncAdapter = calendarSyncAdapters.get(i);
569 if (doesPackageSupportRuntimePermissions(calendarSyncAdapter)) {
570 grantRuntimePermissions(calendarSyncAdapter, CALENDAR_PERMISSIONS, userId);
Eugene Susla47e88202018-07-02 18:48:55 -0700571 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700572 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000573
574 // Contacts
575 Intent contactsIntent = new Intent(Intent.ACTION_MAIN);
576 contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS);
577 PackageParser.Package contactsPackage = getDefaultSystemHandlerActivityPackage(
578 contactsIntent, userId);
579 if (contactsPackage != null
580 && doesPackageSupportRuntimePermissions(contactsPackage)) {
581 grantRuntimePermissions(contactsPackage, CONTACTS_PERMISSIONS, userId);
582 grantRuntimePermissions(contactsPackage, PHONE_PERMISSIONS, userId);
583 }
584
585 // Contacts provider sync adapters
586 List<PackageParser.Package> contactsSyncAdapters = getHeadlessSyncAdapterPackages(
587 contactsSyncAdapterPackages, userId);
588 final int contactsSyncAdapterCount = contactsSyncAdapters.size();
589 for (int i = 0; i < contactsSyncAdapterCount; i++) {
590 PackageParser.Package contactsSyncAdapter = contactsSyncAdapters.get(i);
591 if (doesPackageSupportRuntimePermissions(contactsSyncAdapter)) {
592 grantRuntimePermissions(contactsSyncAdapter, CONTACTS_PERMISSIONS, userId);
593 }
594 }
595
596 // Contacts provider
597 PackageParser.Package contactsProviderPackage = getDefaultProviderAuthorityPackage(
598 ContactsContract.AUTHORITY, userId);
599 if (contactsProviderPackage != null) {
600 grantRuntimePermissions(contactsProviderPackage, CONTACTS_PERMISSIONS,
601 true, userId);
602 grantRuntimePermissions(contactsProviderPackage, PHONE_PERMISSIONS,
603 true, userId);
604 grantRuntimePermissions(contactsProviderPackage, STORAGE_PERMISSIONS, userId);
605 }
606
607 // Device provisioning
608 Intent deviceProvisionIntent = new Intent(
609 DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE);
610 PackageParser.Package deviceProvisionPackage =
611 getDefaultSystemHandlerActivityPackage(deviceProvisionIntent, userId);
612 if (deviceProvisionPackage != null
613 && doesPackageSupportRuntimePermissions(deviceProvisionPackage)) {
614 grantRuntimePermissions(deviceProvisionPackage, CONTACTS_PERMISSIONS, userId);
615 }
616
617 // Maps
618 Intent mapsIntent = new Intent(Intent.ACTION_MAIN);
619 mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS);
620 PackageParser.Package mapsPackage = getDefaultSystemHandlerActivityPackage(
621 mapsIntent, userId);
622 if (mapsPackage != null
623 && doesPackageSupportRuntimePermissions(mapsPackage)) {
624 grantRuntimePermissions(mapsPackage, LOCATION_PERMISSIONS, userId);
625 }
626
627 // Gallery
628 Intent galleryIntent = new Intent(Intent.ACTION_MAIN);
629 galleryIntent.addCategory(Intent.CATEGORY_APP_GALLERY);
630 PackageParser.Package galleryPackage = getDefaultSystemHandlerActivityPackage(
631 galleryIntent, userId);
632 if (galleryPackage != null
633 && doesPackageSupportRuntimePermissions(galleryPackage)) {
634 grantRuntimePermissions(galleryPackage, STORAGE_PERMISSIONS, userId);
635 grantRuntimePermissions(galleryPackage, MEDIA_VISUAL_PERMISSIONS, userId);
636 }
637
638 // Email
639 Intent emailIntent = new Intent(Intent.ACTION_MAIN);
640 emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
641 PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackage(
642 emailIntent, userId);
643 if (emailPackage != null
644 && doesPackageSupportRuntimePermissions(emailPackage)) {
645 grantRuntimePermissions(emailPackage, CONTACTS_PERMISSIONS, userId);
646 grantRuntimePermissions(emailPackage, CALENDAR_PERMISSIONS, userId);
647 }
648
649 // Browser
650 PackageParser.Package browserPackage = null;
651 String defaultBrowserPackage = mServiceInternal.getKnownPackageName(
652 PackageManagerInternal.PACKAGE_BROWSER, userId);
653 if (defaultBrowserPackage != null) {
654 browserPackage = getPackage(defaultBrowserPackage);
655 }
656 if (browserPackage == null) {
657 Intent browserIntent = new Intent(Intent.ACTION_MAIN);
658 browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
659 browserPackage = getDefaultSystemHandlerActivityPackage(
660 browserIntent, userId);
661 }
662 if (browserPackage != null
663 && doesPackageSupportRuntimePermissions(browserPackage)) {
664 grantRuntimePermissions(browserPackage, LOCATION_PERMISSIONS, userId);
665 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700666
667 // Voice interaction
668 if (voiceInteractPackageNames != null) {
669 for (String voiceInteractPackageName : voiceInteractPackageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000670 PackageParser.Package voiceInteractPackage = getSystemPackage(
671 voiceInteractPackageName);
672 if (voiceInteractPackage != null
673 && doesPackageSupportRuntimePermissions(voiceInteractPackage)) {
674 grantRuntimePermissions(voiceInteractPackage,
675 CONTACTS_PERMISSIONS, userId);
676 grantRuntimePermissions(voiceInteractPackage,
677 CALENDAR_PERMISSIONS, userId);
678 grantRuntimePermissions(voiceInteractPackage,
679 MICROPHONE_PERMISSIONS, userId);
680 grantRuntimePermissions(voiceInteractPackage,
681 PHONE_PERMISSIONS, userId);
682 grantRuntimePermissions(voiceInteractPackage,
683 SMS_PERMISSIONS, userId);
684 grantRuntimePermissions(voiceInteractPackage,
685 LOCATION_PERMISSIONS, userId);
686 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700687 }
688 }
689
690 if (ActivityManager.isLowRamDeviceStatic()) {
691 // Allow voice search on low-ram devices
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000692 Intent globalSearchIntent = new Intent("android.search.action.GLOBAL_SEARCH");
693 PackageParser.Package globalSearchPickerPackage =
694 getDefaultSystemHandlerActivityPackage(globalSearchIntent, userId);
695
696 if (globalSearchPickerPackage != null
697 && doesPackageSupportRuntimePermissions(globalSearchPickerPackage)) {
698 grantRuntimePermissions(globalSearchPickerPackage,
699 MICROPHONE_PERMISSIONS, false, userId);
700 grantRuntimePermissions(globalSearchPickerPackage,
701 LOCATION_PERMISSIONS, false, userId);
702 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700703 }
704
705 // Voice recognition
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000706 Intent voiceRecoIntent = new Intent("android.speech.RecognitionService");
707 voiceRecoIntent.addCategory(Intent.CATEGORY_DEFAULT);
708 PackageParser.Package voiceRecoPackage = getDefaultSystemHandlerServicePackage(
709 voiceRecoIntent, userId);
710 if (voiceRecoPackage != null
711 && doesPackageSupportRuntimePermissions(voiceRecoPackage)) {
712 grantRuntimePermissions(voiceRecoPackage, MICROPHONE_PERMISSIONS, userId);
713 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700714
715 // Location
716 if (locationPackageNames != null) {
717 for (String packageName : locationPackageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000718 PackageParser.Package locationPackage = getSystemPackage(packageName);
719 if (locationPackage != null
720 && doesPackageSupportRuntimePermissions(locationPackage)) {
721 grantRuntimePermissions(locationPackage, CONTACTS_PERMISSIONS, userId);
722 grantRuntimePermissions(locationPackage, CALENDAR_PERMISSIONS, userId);
723 grantRuntimePermissions(locationPackage, MICROPHONE_PERMISSIONS, userId);
724 grantRuntimePermissions(locationPackage, PHONE_PERMISSIONS, userId);
725 grantRuntimePermissions(locationPackage, SMS_PERMISSIONS, userId);
726 grantRuntimePermissions(locationPackage, LOCATION_PERMISSIONS,
727 true, userId);
728 grantRuntimePermissions(locationPackage, CAMERA_PERMISSIONS, userId);
729 grantRuntimePermissions(locationPackage, SENSORS_PERMISSIONS, userId);
730 grantRuntimePermissions(locationPackage, STORAGE_PERMISSIONS, userId);
731 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700732 }
733 }
734
735 // Music
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000736 Intent musicIntent = new Intent(Intent.ACTION_VIEW);
737 musicIntent.addCategory(Intent.CATEGORY_DEFAULT);
738 musicIntent.setDataAndType(Uri.fromFile(new File("foo.mp3")),
739 AUDIO_MIME_TYPE);
740 PackageParser.Package musicPackage = getDefaultSystemHandlerActivityPackage(
741 musicIntent, userId);
742 if (musicPackage != null
743 && doesPackageSupportRuntimePermissions(musicPackage)) {
744 grantRuntimePermissions(musicPackage, STORAGE_PERMISSIONS, userId);
745 grantRuntimePermissions(musicPackage, MEDIA_AURAL_PERMISSIONS, userId);
746 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700747
748 // Home
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000749 Intent homeIntent = new Intent(Intent.ACTION_MAIN);
750 homeIntent.addCategory(Intent.CATEGORY_HOME);
751 homeIntent.addCategory(Intent.CATEGORY_LAUNCHER_APP);
752 PackageParser.Package homePackage = getDefaultSystemHandlerActivityPackage(
753 homeIntent, userId);
754 if (homePackage != null
755 && doesPackageSupportRuntimePermissions(homePackage)) {
756 grantRuntimePermissions(homePackage, LOCATION_PERMISSIONS, false, userId);
757 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700758
759 // Watches
760 if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) {
761 // Home application on watches
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000762 Intent wearHomeIntent = new Intent(Intent.ACTION_MAIN);
763 wearHomeIntent.addCategory(Intent.CATEGORY_HOME_MAIN);
Todd Kennedy82b08422017-09-28 13:32:05 -0700764
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000765 PackageParser.Package wearHomePackage = getDefaultSystemHandlerActivityPackage(
766 wearHomeIntent, userId);
767
768 if (wearHomePackage != null
769 && doesPackageSupportRuntimePermissions(wearHomePackage)) {
770 grantRuntimePermissions(wearHomePackage, CONTACTS_PERMISSIONS, false,
771 userId);
772 grantRuntimePermissions(wearHomePackage, PHONE_PERMISSIONS, true, userId);
773 grantRuntimePermissions(wearHomePackage, MICROPHONE_PERMISSIONS, false,
774 userId);
775 grantRuntimePermissions(wearHomePackage, LOCATION_PERMISSIONS, false,
776 userId);
777 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700778
779 // Fitness tracking on watches
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000780 Intent trackIntent = new Intent(ACTION_TRACK);
781 PackageParser.Package trackPackage = getDefaultSystemHandlerActivityPackage(
782 trackIntent, userId);
783 if (trackPackage != null
784 && doesPackageSupportRuntimePermissions(trackPackage)) {
785 grantRuntimePermissions(trackPackage, SENSORS_PERMISSIONS, false, userId);
786 grantRuntimePermissions(trackPackage, LOCATION_PERMISSIONS, false, userId);
787 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700788 }
789
790 // Print Spooler
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000791 PackageParser.Package printSpoolerPackage = getSystemPackage(
792 PrintManager.PRINT_SPOOLER_PACKAGE_NAME);
793 if (printSpoolerPackage != null
794 && doesPackageSupportRuntimePermissions(printSpoolerPackage)) {
795 grantRuntimePermissions(printSpoolerPackage, LOCATION_PERMISSIONS, true, userId);
796 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700797
798 // EmergencyInfo
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000799 Intent emergencyInfoIntent = new Intent(TelephonyManager.ACTION_EMERGENCY_ASSISTANCE);
800 PackageParser.Package emergencyInfoPckg = getDefaultSystemHandlerActivityPackage(
801 emergencyInfoIntent, userId);
802 if (emergencyInfoPckg != null
803 && doesPackageSupportRuntimePermissions(emergencyInfoPckg)) {
804 grantRuntimePermissions(emergencyInfoPckg, CONTACTS_PERMISSIONS, true, userId);
805 grantRuntimePermissions(emergencyInfoPckg, PHONE_PERMISSIONS, true, userId);
806 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700807
808 // NFC Tag viewer
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000809 Intent nfcTagIntent = new Intent(Intent.ACTION_VIEW);
810 nfcTagIntent.setType("vnd.android.cursor.item/ndef_msg");
811 PackageParser.Package nfcTagPkg = getDefaultSystemHandlerActivityPackage(
812 nfcTagIntent, userId);
813 if (nfcTagPkg != null
814 && doesPackageSupportRuntimePermissions(nfcTagPkg)) {
815 grantRuntimePermissions(nfcTagPkg, CONTACTS_PERMISSIONS, false, userId);
816 grantRuntimePermissions(nfcTagPkg, PHONE_PERMISSIONS, false, userId);
817 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700818
819 // Storage Manager
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000820 Intent storageManagerIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
821 PackageParser.Package storageManagerPckg = getDefaultSystemHandlerActivityPackage(
822 storageManagerIntent, userId);
823 if (storageManagerPckg != null
824 && doesPackageSupportRuntimePermissions(storageManagerPckg)) {
825 grantRuntimePermissions(storageManagerPckg, STORAGE_PERMISSIONS, true, userId);
826 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700827
828 // Companion devices
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000829 PackageParser.Package companionDeviceDiscoveryPackage = getSystemPackage(
830 CompanionDeviceManager.COMPANION_DEVICE_DISCOVERY_PACKAGE_NAME);
831 if (companionDeviceDiscoveryPackage != null
832 && doesPackageSupportRuntimePermissions(companionDeviceDiscoveryPackage)) {
833 grantRuntimePermissions(companionDeviceDiscoveryPackage,
834 LOCATION_PERMISSIONS, true, userId);
835 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700836
837 // Ringtone Picker
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000838 Intent ringtonePickerIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
839 PackageParser.Package ringtonePickerPackage =
840 getDefaultSystemHandlerActivityPackage(ringtonePickerIntent, userId);
841 if (ringtonePickerPackage != null
842 && doesPackageSupportRuntimePermissions(ringtonePickerPackage)) {
843 grantRuntimePermissions(ringtonePickerPackage,
844 STORAGE_PERMISSIONS, true, userId);
845 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700846
Abodunrinwa Toki2c01b6c2018-02-13 17:47:48 +0000847 // TextClassifier Service
Ye Wen8e8b2d52018-03-14 11:48:24 -0700848 String textClassifierPackageName =
849 mContext.getPackageManager().getSystemTextClassifierPackageName();
850 if (!TextUtils.isEmpty(textClassifierPackageName)) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000851 PackageParser.Package textClassifierPackage =
852 getSystemPackage(textClassifierPackageName);
853 if (textClassifierPackage != null
854 && doesPackageSupportRuntimePermissions(textClassifierPackage)) {
855 grantRuntimePermissions(textClassifierPackage, PHONE_PERMISSIONS, false, userId);
856 grantRuntimePermissions(textClassifierPackage, SMS_PERMISSIONS, false, userId);
857 grantRuntimePermissions(textClassifierPackage, CALENDAR_PERMISSIONS, false, userId);
858 grantRuntimePermissions(textClassifierPackage, LOCATION_PERMISSIONS, false, userId);
859 grantRuntimePermissions(textClassifierPackage, CONTACTS_PERMISSIONS, false, userId);
860 }
Abodunrinwa Toki2c01b6c2018-02-13 17:47:48 +0000861 }
862
Anton Philippov4b3a1f52018-05-04 14:46:44 +0100863 // There is no real "marker" interface to identify the shared storage backup, it is
864 // hardcoded in BackupManagerService.SHARED_BACKUP_AGENT_PACKAGE.
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000865 PackageParser.Package sharedStorageBackupPackage = getSystemPackage(
866 "com.android.sharedstoragebackup");
867 if (sharedStorageBackupPackage != null) {
868 grantRuntimePermissions(sharedStorageBackupPackage, STORAGE_PERMISSIONS, true, userId);
869 }
Anton Philippov4b3a1f52018-05-04 14:46:44 +0100870
Todd Kennedy0eb97382017-10-03 16:57:22 -0700871 if (mPermissionGrantedCallback != null) {
872 mPermissionGrantedCallback.onDefaultRuntimePermissionsGranted(userId);
873 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700874 }
875
Eugene Susla47e88202018-07-02 18:48:55 -0700876 private void grantDefaultPermissionsToDefaultSystemDialerApp(
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000877 PackageParser.Package dialerPackage, int userId) {
878 if (doesPackageSupportRuntimePermissions(dialerPackage)) {
879 boolean isPhonePermFixed =
880 mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH, 0);
881 grantRuntimePermissions(
882 dialerPackage, PHONE_PERMISSIONS, isPhonePermFixed, userId);
883 grantRuntimePermissions(dialerPackage, CONTACTS_PERMISSIONS, userId);
884 grantRuntimePermissions(dialerPackage, SMS_PERMISSIONS, userId);
885 grantRuntimePermissions(dialerPackage, MICROPHONE_PERMISSIONS, userId);
886 grantRuntimePermissions(dialerPackage, CAMERA_PERMISSIONS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700887 }
Eugene Susla47e88202018-07-02 18:48:55 -0700888 }
889
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000890 private void grantDefaultPermissionsToDefaultSystemSmsApp(
891 PackageParser.Package smsPackage, int userId) {
892 if (doesPackageSupportRuntimePermissions(smsPackage)) {
893 grantRuntimePermissions(smsPackage, PHONE_PERMISSIONS, userId);
894 grantRuntimePermissions(smsPackage, CONTACTS_PERMISSIONS, userId);
895 grantRuntimePermissions(smsPackage, SMS_PERMISSIONS, userId);
896 grantRuntimePermissions(smsPackage, STORAGE_PERMISSIONS, userId);
897 grantRuntimePermissions(smsPackage, MICROPHONE_PERMISSIONS, userId);
898 grantRuntimePermissions(smsPackage, CAMERA_PERMISSIONS, userId);
899 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700900 }
901
Eric Enslen1e423b92017-12-18 11:30:21 -0800902 private void grantDefaultPermissionsToDefaultSystemUseOpenWifiApp(
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000903 PackageParser.Package useOpenWifiPackage, int userId) {
904 if (doesPackageSupportRuntimePermissions(useOpenWifiPackage)) {
905 grantRuntimePermissions(useOpenWifiPackage, COARSE_LOCATION_PERMISSIONS, userId);
906 }
Eric Enslen1e423b92017-12-18 11:30:21 -0800907 }
908
Todd Kennedy82b08422017-09-28 13:32:05 -0700909 public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) {
910 Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000911 if (packageName == null) {
912 return;
913 }
914 PackageParser.Package smsPackage = getPackage(packageName);
915 if (smsPackage != null && doesPackageSupportRuntimePermissions(smsPackage)) {
916 grantRuntimePermissions(smsPackage, PHONE_PERMISSIONS, false, true, userId);
917 grantRuntimePermissions(smsPackage, CONTACTS_PERMISSIONS, false, true, userId);
918 grantRuntimePermissions(smsPackage, SMS_PERMISSIONS, false, true, userId);
919 grantRuntimePermissions(smsPackage, STORAGE_PERMISSIONS, false, true, userId);
920 grantRuntimePermissions(smsPackage, MICROPHONE_PERMISSIONS, false, true, userId);
921 grantRuntimePermissions(smsPackage, CAMERA_PERMISSIONS, false, true, userId);
922 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700923 }
924
925 public void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId) {
926 Log.i(TAG, "Granting permissions to default dialer app for user:" + userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000927 if (packageName == null) {
928 return;
929 }
930 PackageParser.Package dialerPackage = getPackage(packageName);
931 if (dialerPackage != null
932 && doesPackageSupportRuntimePermissions(dialerPackage)) {
933 grantRuntimePermissions(dialerPackage, PHONE_PERMISSIONS, false, true, userId);
934 grantRuntimePermissions(dialerPackage, CONTACTS_PERMISSIONS, false, true, userId);
935 grantRuntimePermissions(dialerPackage, SMS_PERMISSIONS, false, true, userId);
936 grantRuntimePermissions(dialerPackage, MICROPHONE_PERMISSIONS, false, true, userId);
937 grantRuntimePermissions(dialerPackage, CAMERA_PERMISSIONS, false, true, userId);
938 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700939 }
940
Eric Enslen1e423b92017-12-18 11:30:21 -0800941 public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
942 Log.i(TAG, "Granting permissions to default Use Open WiFi app for user:" + userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000943 if (packageName == null) {
944 return;
945 }
946 PackageParser.Package useOpenWifiPackage = getPackage(packageName);
947 if (useOpenWifiPackage != null
948 && doesPackageSupportRuntimePermissions(useOpenWifiPackage)) {
949 grantRuntimePermissions(
950 useOpenWifiPackage, COARSE_LOCATION_PERMISSIONS, false, true, userId);
951 }
952 }
953
954 private void grantDefaultPermissionsToDefaultSimCallManager(
955 PackageParser.Package simCallManagerPackage, int userId) {
956 Log.i(TAG, "Granting permissions to sim call manager for user:" + userId);
957 if (doesPackageSupportRuntimePermissions(simCallManagerPackage)) {
958 grantRuntimePermissions(simCallManagerPackage, PHONE_PERMISSIONS, userId);
959 grantRuntimePermissions(simCallManagerPackage, MICROPHONE_PERMISSIONS, userId);
960 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700961 }
962
963 public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) {
964 if (packageName == null) {
965 return;
966 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000967 PackageParser.Package simCallManagerPackage = getPackage(packageName);
968 if (simCallManagerPackage != null) {
969 grantDefaultPermissionsToDefaultSimCallManager(simCallManagerPackage, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -0700970 }
971 }
972
973 public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
974 Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
975 if (packageNames == null) {
976 return;
977 }
978 for (String packageName : packageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000979 PackageParser.Package carrierPackage = getSystemPackage(packageName);
980 if (carrierPackage != null
981 && doesPackageSupportRuntimePermissions(carrierPackage)) {
982 grantRuntimePermissions(carrierPackage, PHONE_PERMISSIONS, userId);
983 grantRuntimePermissions(carrierPackage, LOCATION_PERMISSIONS, userId);
984 grantRuntimePermissions(carrierPackage, SMS_PERMISSIONS, userId);
985 }
Todd Kennedy82b08422017-09-28 13:32:05 -0700986 }
987 }
988
989 public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
990 Log.i(TAG, "Granting permissions to enabled ImsServices for user:" + userId);
991 if (packageNames == null) {
992 return;
993 }
994 for (String packageName : packageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +0000995 PackageParser.Package imsServicePackage = getSystemPackage(packageName);
996 if (imsServicePackage != null
997 && doesPackageSupportRuntimePermissions(imsServicePackage)) {
998 grantRuntimePermissions(imsServicePackage, PHONE_PERMISSIONS, userId);
999 grantRuntimePermissions(imsServicePackage, MICROPHONE_PERMISSIONS, userId);
1000 grantRuntimePermissions(imsServicePackage, LOCATION_PERMISSIONS, userId);
1001 grantRuntimePermissions(imsServicePackage, CAMERA_PERMISSIONS, userId);
1002 grantRuntimePermissions(imsServicePackage, CONTACTS_PERMISSIONS, userId);
1003 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001004 }
1005 }
1006
Nathan Harold76ad1a32018-02-20 14:31:09 -08001007 public void grantDefaultPermissionsToEnabledTelephonyDataServices(
1008 String[] packageNames, int userId) {
1009 Log.i(TAG, "Granting permissions to enabled data services for user:" + userId);
1010 if (packageNames == null) {
1011 return;
1012 }
1013 for (String packageName : packageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001014 PackageParser.Package dataServicePackage = getSystemPackage(packageName);
1015 if (dataServicePackage != null
1016 && doesPackageSupportRuntimePermissions(dataServicePackage)) {
1017 // Grant these permissions as system-fixed, so that nobody can accidentally
1018 // break cellular data.
1019 grantRuntimePermissions(dataServicePackage, PHONE_PERMISSIONS, true, userId);
1020 grantRuntimePermissions(dataServicePackage, LOCATION_PERMISSIONS, true, userId);
1021 }
Nathan Harold76ad1a32018-02-20 14:31:09 -08001022 }
1023 }
1024
1025 public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
1026 String[] packageNames, int userId) {
1027 Log.i(TAG, "Revoking permissions from disabled data services for user:" + userId);
1028 if (packageNames == null) {
1029 return;
1030 }
1031 for (String packageName : packageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001032 PackageParser.Package dataServicePackage = getSystemPackage(packageName);
1033 if (dataServicePackage != null
1034 && doesPackageSupportRuntimePermissions(dataServicePackage)) {
1035 revokeRuntimePermissions(dataServicePackage, PHONE_PERMISSIONS, true, userId);
1036 revokeRuntimePermissions(dataServicePackage, LOCATION_PERMISSIONS, true, userId);
Nathan Harold76ad1a32018-02-20 14:31:09 -08001037 }
1038 }
1039 }
1040
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -07001041 public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
1042 Log.i(TAG, "Granting permissions to active LUI app for user:" + userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001043 if (packageName == null) {
1044 return;
1045 }
1046 PackageParser.Package luiAppPackage = getSystemPackage(packageName);
1047 if (luiAppPackage != null
1048 && doesPackageSupportRuntimePermissions(luiAppPackage)) {
1049 grantRuntimePermissions(luiAppPackage, CAMERA_PERMISSIONS, true, userId);
1050 }
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -07001051 }
1052
1053 public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
1054 Log.i(TAG, "Revoke permissions from LUI apps for user:" + userId);
1055 if (packageNames == null) {
1056 return;
1057 }
1058 for (String packageName : packageNames) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001059 PackageParser.Package luiAppPackage = getSystemPackage(packageName);
1060 if (luiAppPackage != null
1061 && doesPackageSupportRuntimePermissions(luiAppPackage)) {
1062 revokeRuntimePermissions(luiAppPackage, CAMERA_PERMISSIONS, true, userId);
Holly Jiuyu Sun349e2142018-03-26 15:29:42 -07001063 }
1064 }
1065 }
1066
Todd Kennedy82b08422017-09-28 13:32:05 -07001067 public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) {
1068 Log.i(TAG, "Granting permissions to default browser for user:" + userId);
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001069 if (packageName == null) {
1070 return;
1071 }
1072 PackageParser.Package browserPackage = getSystemPackage(packageName);
1073 if (browserPackage != null
1074 && doesPackageSupportRuntimePermissions(browserPackage)) {
1075 grantRuntimePermissions(browserPackage, LOCATION_PERMISSIONS, false, false, userId);
1076 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001077 }
1078
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001079 private PackageParser.Package getDefaultSystemHandlerActivityPackage(
1080 Intent intent, int userId) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001081 ResolveInfo handler = mServiceInternal.resolveIntent(intent,
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001082 intent.resolveType(mContext.getContentResolver()), DEFAULT_FLAGS, userId, false,
1083 Binder.getCallingUid());
Todd Kennedy82b08422017-09-28 13:32:05 -07001084 if (handler == null || handler.activityInfo == null) {
1085 return null;
1086 }
1087 if (mServiceInternal.isResolveActivityComponent(handler.activityInfo)) {
1088 return null;
1089 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001090 return getSystemPackage(handler.activityInfo.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001091 }
1092
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001093 private PackageParser.Package getDefaultSystemHandlerServicePackage(
Todd Kennedy82b08422017-09-28 13:32:05 -07001094 Intent intent, int userId) {
1095 List<ResolveInfo> handlers = mServiceInternal.queryIntentServices(
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001096 intent, DEFAULT_FLAGS, Binder.getCallingUid(), userId);
Todd Kennedy82b08422017-09-28 13:32:05 -07001097 if (handlers == null) {
1098 return null;
1099 }
1100 final int handlerCount = handlers.size();
1101 for (int i = 0; i < handlerCount; i++) {
1102 ResolveInfo handler = handlers.get(i);
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001103 PackageParser.Package handlerPackage = getSystemPackage(
1104 handler.serviceInfo.packageName);
1105 if (handlerPackage != null) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001106 return handlerPackage;
1107 }
1108 }
1109 return null;
1110 }
1111
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001112 private List<PackageParser.Package> getHeadlessSyncAdapterPackages(
Todd Kennedy82b08422017-09-28 13:32:05 -07001113 String[] syncAdapterPackageNames, int userId) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001114 List<PackageParser.Package> syncAdapterPackages = new ArrayList<>();
Todd Kennedy82b08422017-09-28 13:32:05 -07001115
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001116 Intent homeIntent = new Intent(Intent.ACTION_MAIN);
1117 homeIntent.addCategory(Intent.CATEGORY_LAUNCHER);
Todd Kennedy82b08422017-09-28 13:32:05 -07001118
1119 for (String syncAdapterPackageName : syncAdapterPackageNames) {
1120 homeIntent.setPackage(syncAdapterPackageName);
1121
1122 ResolveInfo homeActivity = mServiceInternal.resolveIntent(homeIntent,
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001123 homeIntent.resolveType(mContext.getContentResolver()), DEFAULT_FLAGS,
Patrick Baumann78380272018-04-04 10:41:01 -07001124 userId, false, Binder.getCallingUid());
Todd Kennedy82b08422017-09-28 13:32:05 -07001125 if (homeActivity != null) {
1126 continue;
1127 }
1128
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001129 PackageParser.Package syncAdapterPackage = getSystemPackage(syncAdapterPackageName);
1130 if (syncAdapterPackage != null) {
1131 syncAdapterPackages.add(syncAdapterPackage);
Todd Kennedy82b08422017-09-28 13:32:05 -07001132 }
1133 }
1134
1135 return syncAdapterPackages;
1136 }
1137
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001138 private PackageParser.Package getDefaultProviderAuthorityPackage(
1139 String authority, int userId) {
1140 ProviderInfo provider =
1141 mServiceInternal.resolveContentProvider(authority, DEFAULT_FLAGS, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -07001142 if (provider != null) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001143 return getSystemPackage(provider.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001144 }
1145 return null;
1146 }
1147
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001148 private PackageParser.Package getPackage(String packageName) {
1149 return mServiceInternal.getPackage(packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001150 }
1151
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001152 private PackageParser.Package getSystemPackage(String packageName) {
1153 PackageParser.Package pkg = getPackage(packageName);
1154 if (pkg != null && pkg.isSystem()) {
1155 return !isSysComponentOrPersistentPlatformSignedPrivApp(pkg) ? pkg : null;
Todd Kennedy82b08422017-09-28 13:32:05 -07001156 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001157 return null;
Todd Kennedy82b08422017-09-28 13:32:05 -07001158 }
1159
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001160 private void grantRuntimePermissions(PackageParser.Package pkg, Set<String> permissions,
1161 int userId) {
1162 grantRuntimePermissions(pkg, permissions, false, false, userId);
1163 }
1164
1165 private void grantRuntimePermissions(PackageParser.Package pkg, Set<String> permissions,
Todd Kennedy82b08422017-09-28 13:32:05 -07001166 boolean systemFixed, int userId) {
1167 grantRuntimePermissions(pkg, permissions, systemFixed, false, userId);
1168 }
1169
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001170 private void revokeRuntimePermissions(PackageParser.Package pkg, Set<String> permissions,
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001171 boolean systemFixed, int userId) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001172 if (pkg.requestedPermissions.isEmpty()) {
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001173 return;
1174 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001175 Set<String> revokablePermissions = new ArraySet<>(pkg.requestedPermissions);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001176
1177 for (String permission : permissions) {
1178 // We can't revoke what wasn't requested.
1179 if (!revokablePermissions.contains(permission)) {
1180 continue;
1181 }
1182
1183 final int flags = mServiceInternal.getPermissionFlagsTEMP(
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001184 permission, pkg.packageName, userId);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001185
1186 // We didn't get this through the default grant policy. Move along.
1187 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) == 0) {
1188 continue;
1189 }
1190 // We aren't going to clobber device policy with a DefaultGrant.
1191 if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
1192 continue;
1193 }
1194 // Do not revoke system fixed permissions unless caller set them that way;
1195 // there is no refcount for the number of sources of this, so there
1196 // should be at most one grantor doing SYSTEM_FIXED for any given package.
1197 if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && !systemFixed) {
1198 continue;
1199 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001200 mServiceInternal.revokeRuntimePermission(pkg.packageName, permission, userId, false);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001201
1202 if (DEBUG) {
1203 Log.i(TAG, "revoked " + (systemFixed ? "fixed " : "not fixed ")
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001204 + permission + " to " + pkg.packageName);
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001205 }
1206
1207 // Remove the GRANTED_BY_DEFAULT flag without touching the others.
1208 // Note that we do not revoke FLAG_PERMISSION_SYSTEM_FIXED. That bit remains
1209 // sticky once set.
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001210 mServiceInternal.updatePermissionFlagsTEMP(permission, pkg.packageName,
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001211 PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, userId);
1212 }
1213 }
1214
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001215 private void grantRuntimePermissions(PackageParser.Package pkg,
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001216 Set<String> permissionsWithoutSplits, boolean systemFixed, boolean ignoreSystemPackage,
1217 int userId) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001218 if (pkg.requestedPermissions.isEmpty()) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001219 return;
1220 }
1221
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001222 final ArraySet<String> permissions = new ArraySet<>(permissionsWithoutSplits);
1223
1224 // Automatically attempt to grant split permissions to older APKs
1225 final int numSplitPerms = PackageParser.SPLIT_PERMISSIONS.length;
1226 for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
1227 final PackageParser.SplitPermissionInfo splitPerm =
1228 PackageParser.SPLIT_PERMISSIONS[splitPermNum];
1229
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001230 if (pkg.applicationInfo.targetSdkVersion < splitPerm.targetSdk
Philip P. Moltmann8b560032018-07-12 09:51:02 -07001231 && permissionsWithoutSplits.contains(splitPerm.rootPerm)) {
1232 Collections.addAll(permissions, splitPerm.newPerms);
1233 }
1234 }
1235
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001236 List<String> requestedPermissions = pkg.requestedPermissions;
Todd Kennedy82b08422017-09-28 13:32:05 -07001237 Set<String> grantablePermissions = null;
1238
Eric Enslen1e423b92017-12-18 11:30:21 -08001239 // In some cases, like for the Phone or SMS app, we grant permissions regardless
1240 // of if the version on the system image declares the permission as used since
1241 // selecting the app as the default for that function the user makes a deliberate
Todd Kennedy82b08422017-09-28 13:32:05 -07001242 // choice to grant this app the permissions needed to function. For all other
1243 // apps, (default grants on first boot and user creation) we don't grant default
1244 // permissions if the version on the system image does not declare them.
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001245 if (!ignoreSystemPackage && pkg.isUpdatedSystemApp()) {
1246 final PackageParser.Package disabledPkg =
1247 mServiceInternal.getDisabledPackage(pkg.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001248 if (disabledPkg != null) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001249 if (disabledPkg.requestedPermissions.isEmpty()) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001250 return;
1251 }
1252 if (!requestedPermissions.equals(disabledPkg.requestedPermissions)) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001253 grantablePermissions = new ArraySet<>(requestedPermissions);
Todd Kennedy82b08422017-09-28 13:32:05 -07001254 requestedPermissions = disabledPkg.requestedPermissions;
1255 }
1256 }
1257 }
1258
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001259 final int grantablePermissionCount = requestedPermissions.size();
Todd Kennedy82b08422017-09-28 13:32:05 -07001260 for (int i = 0; i < grantablePermissionCount; i++) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001261 String permission = requestedPermissions.get(i);
Todd Kennedy82b08422017-09-28 13:32:05 -07001262
1263 // If there is a disabled system app it may request a permission the updated
1264 // version ot the data partition doesn't, In this case skip the permission.
1265 if (grantablePermissions != null && !grantablePermissions.contains(permission)) {
1266 continue;
1267 }
1268
1269 if (permissions.contains(permission)) {
1270 final int flags = mServiceInternal.getPermissionFlagsTEMP(
1271 permission, pkg.packageName, userId);
1272
1273 // If any flags are set to the permission, then it is either set in
1274 // its current state by the system or device/profile owner or the user.
1275 // In all these cases we do not want to clobber the current state.
1276 // Unless the caller wants to override user choices. The override is
1277 // to make sure we can grant the needed permission to the default
1278 // sms and phone apps after the user chooses this in the UI.
Eric Enslen1e423b92017-12-18 11:30:21 -08001279 if (flags == 0 || ignoreSystemPackage) {
Nathan Haroldd66b9f32018-03-14 19:55:38 -07001280 // Never clobber policy fixed permissions.
1281 // We must allow the grant of a system-fixed permission because
1282 // system-fixed is sticky, but the permission itself may be revoked.
1283 if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001284 continue;
1285 }
1286
1287 mServiceInternal.grantRuntimePermission(
1288 pkg.packageName, permission, userId, false);
1289 if (DEBUG) {
1290 Log.i(TAG, "Granted " + (systemFixed ? "fixed " : "not fixed ")
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001291 + permission + " to default handler " + pkg.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001292 }
1293
1294 int newFlags = PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT;
1295 if (systemFixed) {
1296 newFlags |= PackageManager.FLAG_PERMISSION_SYSTEM_FIXED;
1297 }
1298
1299 mServiceInternal.updatePermissionFlagsTEMP(permission, pkg.packageName,
1300 newFlags, newFlags, userId);
1301 }
1302
1303 // If a component gets a permission for being the default handler A
1304 // and also default handler B, we grant the weaker grant form.
1305 if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0
1306 && (flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0
1307 && !systemFixed) {
1308 if (DEBUG) {
1309 Log.i(TAG, "Granted not fixed " + permission + " to default handler "
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001310 + pkg.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001311 }
1312 mServiceInternal.updatePermissionFlagsTEMP(permission, pkg.packageName,
1313 PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, 0, userId);
1314 }
1315 }
1316 }
1317 }
1318
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001319 private boolean isSysComponentOrPersistentPlatformSignedPrivApp(PackageParser.Package pkg) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001320 if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) {
1321 return true;
1322 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001323 if (!pkg.isPrivileged()) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001324 return false;
1325 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001326 final PackageParser.Package disabledPkg =
1327 mServiceInternal.getDisabledPackage(pkg.packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001328 if (disabledPkg != null) {
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001329 if ((disabledPkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001330 return false;
1331 }
1332 } else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
1333 return false;
1334 }
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001335 final String systemPackageName = mServiceInternal.getKnownPackageName(
1336 PackageManagerInternal.PACKAGE_SYSTEM, UserHandle.USER_SYSTEM);
1337 final PackageParser.Package systemPackage = getPackage(systemPackageName);
1338 return pkg.mSigningDetails.hasAncestorOrSelf(systemPackage.mSigningDetails)
1339 || systemPackage.mSigningDetails.checkCapability(pkg.mSigningDetails,
1340 PackageParser.SigningDetails.CertCapabilities.PERMISSION);
Todd Kennedy82b08422017-09-28 13:32:05 -07001341 }
1342
1343 private void grantDefaultPermissionExceptions(int userId) {
1344 mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
1345
1346 synchronized (mLock) {
1347 // mGrantExceptions is null only before the first read and then
1348 // it serves as a cache of the default grants that should be
1349 // performed for every user. If there is an entry then the app
1350 // is on the system image and supports runtime permissions.
1351 if (mGrantExceptions == null) {
1352 mGrantExceptions = readDefaultPermissionExceptionsLocked();
1353 }
1354 }
1355
1356 Set<String> permissions = null;
1357 final int exceptionCount = mGrantExceptions.size();
1358 for (int i = 0; i < exceptionCount; i++) {
1359 String packageName = mGrantExceptions.keyAt(i);
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001360 PackageParser.Package pkg = getSystemPackage(packageName);
Todd Kennedy82b08422017-09-28 13:32:05 -07001361 List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i);
1362 final int permissionGrantCount = permissionGrants.size();
1363 for (int j = 0; j < permissionGrantCount; j++) {
1364 DefaultPermissionGrant permissionGrant = permissionGrants.get(j);
1365 if (permissions == null) {
1366 permissions = new ArraySet<>();
1367 } else {
1368 permissions.clear();
1369 }
1370 permissions.add(permissionGrant.name);
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001371 grantRuntimePermissions(pkg, permissions,
1372 permissionGrant.fixed, userId);
Todd Kennedy82b08422017-09-28 13:32:05 -07001373 }
1374 }
1375 }
1376
1377 private File[] getDefaultPermissionFiles() {
1378 ArrayList<File> ret = new ArrayList<File>();
1379 File dir = new File(Environment.getRootDirectory(), "etc/default-permissions");
1380 if (dir.isDirectory() && dir.canRead()) {
1381 Collections.addAll(ret, dir.listFiles());
1382 }
1383 dir = new File(Environment.getVendorDirectory(), "etc/default-permissions");
1384 if (dir.isDirectory() && dir.canRead()) {
1385 Collections.addAll(ret, dir.listFiles());
1386 }
Jiyong Park0989e382018-03-13 10:26:47 +09001387 dir = new File(Environment.getOdmDirectory(), "etc/default-permissions");
1388 if (dir.isDirectory() && dir.canRead()) {
1389 Collections.addAll(ret, dir.listFiles());
1390 }
Jaekyun Seok1713d9e2018-01-12 21:47:26 +09001391 dir = new File(Environment.getProductDirectory(), "etc/default-permissions");
1392 if (dir.isDirectory() && dir.canRead()) {
1393 Collections.addAll(ret, dir.listFiles());
1394 }
Dario Freni1ae46d72018-08-17 15:56:43 +01001395 dir = new File(Environment.getProductServicesDirectory(),
1396 "etc/default-permissions");
1397 if (dir.isDirectory() && dir.canRead()) {
1398 Collections.addAll(ret, dir.listFiles());
1399 }
Ralph Nathanbd111582018-03-21 14:53:23 -07001400 // For IoT devices, we check the oem partition for default permissions for each app.
1401 if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) {
1402 dir = new File(Environment.getOemDirectory(), "etc/default-permissions");
1403 if (dir.isDirectory() && dir.canRead()) {
1404 Collections.addAll(ret, dir.listFiles());
1405 }
1406 }
Todd Kennedy82b08422017-09-28 13:32:05 -07001407 return ret.isEmpty() ? null : ret.toArray(new File[0]);
1408 }
1409
1410 private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
1411 readDefaultPermissionExceptionsLocked() {
1412 File[] files = getDefaultPermissionFiles();
1413 if (files == null) {
1414 return new ArrayMap<>(0);
1415 }
1416
1417 ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>();
1418
1419 // Iterate over the files in the directory and scan .xml files
1420 for (File file : files) {
1421 if (!file.getPath().endsWith(".xml")) {
1422 Slog.i(TAG, "Non-xml file " + file
1423 + " in " + file.getParent() + " directory, ignoring");
1424 continue;
1425 }
1426 if (!file.canRead()) {
1427 Slog.w(TAG, "Default permissions file " + file + " cannot be read");
1428 continue;
1429 }
1430 try (
1431 InputStream str = new BufferedInputStream(new FileInputStream(file))
1432 ) {
1433 XmlPullParser parser = Xml.newPullParser();
1434 parser.setInput(str, null);
1435 parse(parser, grantExceptions);
1436 } catch (XmlPullParserException | IOException e) {
1437 Slog.w(TAG, "Error reading default permissions file " + file, e);
1438 }
1439 }
1440
1441 return grantExceptions;
1442 }
1443
1444 private void parse(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1445 outGrantExceptions) throws IOException, XmlPullParserException {
1446 final int outerDepth = parser.getDepth();
1447 int type;
1448 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1449 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1450 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1451 continue;
1452 }
1453 if (TAG_EXCEPTIONS.equals(parser.getName())) {
1454 parseExceptions(parser, outGrantExceptions);
1455 } else {
1456 Log.e(TAG, "Unknown tag " + parser.getName());
1457 }
1458 }
1459 }
1460
1461 private void parseExceptions(XmlPullParser parser, Map<String, List<DefaultPermissionGrant>>
1462 outGrantExceptions) throws IOException, XmlPullParserException {
1463 final int outerDepth = parser.getDepth();
1464 int type;
1465 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1466 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1467 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1468 continue;
1469 }
1470 if (TAG_EXCEPTION.equals(parser.getName())) {
1471 String packageName = parser.getAttributeValue(null, ATTR_PACKAGE);
1472
1473 List<DefaultPermissionGrant> packageExceptions =
1474 outGrantExceptions.get(packageName);
1475 if (packageExceptions == null) {
1476 // The package must be on the system image
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001477 PackageParser.Package pkg = getSystemPackage(packageName);
1478 if (pkg == null) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001479 Log.w(TAG, "Unknown package:" + packageName);
1480 XmlUtils.skipCurrentTag(parser);
1481 continue;
1482 }
1483
1484 // The package must support runtime permissions
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001485 if (!doesPackageSupportRuntimePermissions(pkg)) {
Todd Kennedy82b08422017-09-28 13:32:05 -07001486 Log.w(TAG, "Skipping non supporting runtime permissions package:"
1487 + packageName);
1488 XmlUtils.skipCurrentTag(parser);
1489 continue;
1490 }
1491 packageExceptions = new ArrayList<>();
1492 outGrantExceptions.put(packageName, packageExceptions);
1493 }
1494
1495 parsePermission(parser, packageExceptions);
1496 } else {
1497 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exceptions>");
1498 }
1499 }
1500 }
1501
1502 private void parsePermission(XmlPullParser parser, List<DefaultPermissionGrant>
1503 outPackageExceptions) throws IOException, XmlPullParserException {
1504 final int outerDepth = parser.getDepth();
1505 int type;
1506 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
1507 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1508 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
1509 continue;
1510 }
1511
1512 if (TAG_PERMISSION.contains(parser.getName())) {
1513 String name = parser.getAttributeValue(null, ATTR_NAME);
1514 if (name == null) {
1515 Log.w(TAG, "Mandatory name attribute missing for permission tag");
1516 XmlUtils.skipCurrentTag(parser);
1517 continue;
1518 }
1519
1520 final boolean fixed = XmlUtils.readBooleanAttribute(parser, ATTR_FIXED);
1521
1522 DefaultPermissionGrant exception = new DefaultPermissionGrant(name, fixed);
1523 outPackageExceptions.add(exception);
1524 } else {
1525 Log.e(TAG, "Unknown tag " + parser.getName() + "under <exception>");
1526 }
1527 }
1528 }
1529
Philip P. Moltmannfa894222018-09-18 21:24:00 +00001530 private static boolean doesPackageSupportRuntimePermissions(PackageParser.Package pkg) {
1531 return pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
Todd Kennedy82b08422017-09-28 13:32:05 -07001532 }
1533
1534 private static final class DefaultPermissionGrant {
1535 final String name;
1536 final boolean fixed;
1537
1538 public DefaultPermissionGrant(String name, boolean fixed) {
1539 this.name = name;
1540 this.fixed = fixed;
1541 }
1542 }
1543}