blob: d2b8783d03c5bafa02948074d826698ffbb50c77 [file] [log] [blame]
Svet Ganovadc1cf42015-06-15 16:36:24 -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;
18
19import android.Manifest;
20import android.content.Intent;
21import android.content.pm.ApplicationInfo;
22import android.content.pm.PackageManager;
23import android.content.pm.PackageManagerInternal.PackagesProvider;
24import android.content.pm.PackageParser;
25import android.content.pm.ResolveInfo;
26import android.net.Uri;
27import android.os.Build;
28import android.os.UserHandle;
29import android.provider.MediaStore;
30import android.util.ArraySet;
31import android.util.Log;
32
33import java.io.File;
34import java.util.ArrayList;
35import java.util.List;
36import java.util.Set;
37
38import static android.os.Process.FIRST_APPLICATION_UID;
39
40/**
41 * This class is the policy for granting runtime permissions to
42 * platform components and default handlers in the system such
43 * that the device is usable out-of-the-box. For example, the
44 * shell UID is a part of the system and the Phone app should
45 * have phone related permission by default.
46 */
47final class DefaultPermissionGrantPolicy {
Jeff Davidson2a880312015-06-22 16:54:34 -070048 private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
Svet Ganovadc1cf42015-06-15 16:36:24 -070049 private static final boolean DEBUG = false;
50
51 private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
52
53 private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
54 static {
55 PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
56 PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
57 PHONE_PERMISSIONS.add( Manifest.permission.READ_CALL_LOG);
58 PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
59 PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
60 PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
61 PHONE_PERMISSIONS.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
62 }
63
64 private static final Set<String> CONTACTS_PERMISSIONS = new ArraySet<>();
65 static {
66 CONTACTS_PERMISSIONS.add(Manifest.permission.READ_CONTACTS);
67 CONTACTS_PERMISSIONS.add(Manifest.permission.WRITE_CONTACTS);
68 }
69
70 private static final Set<String> LOCATION_PERMISSIONS = new ArraySet<>();
71 static {
72 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_FINE_LOCATION);
73 LOCATION_PERMISSIONS.add(Manifest.permission.ACCESS_COARSE_LOCATION);
74 }
75
76 private static final Set<String> CALENDAR_PERMISSIONS = new ArraySet<>();
77 static {
78 CALENDAR_PERMISSIONS.add(Manifest.permission.READ_CALENDAR);
79 CALENDAR_PERMISSIONS.add(Manifest.permission.WRITE_CALENDAR);
80 }
81
82 private static final Set<String> SMS_PERMISSIONS = new ArraySet<>();
83 static {
84 SMS_PERMISSIONS.add(Manifest.permission.SEND_SMS);
85 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_SMS);
86 SMS_PERMISSIONS.add(Manifest.permission.READ_SMS);
87 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_WAP_PUSH);
88 SMS_PERMISSIONS.add(Manifest.permission.RECEIVE_MMS);
89 SMS_PERMISSIONS.add(Manifest.permission.READ_CELL_BROADCASTS);
90 }
91
92 private static final Set<String> MICROPHONE_PERMISSIONS = new ArraySet<>();
93 static {
94 MICROPHONE_PERMISSIONS.add(Manifest.permission.RECORD_AUDIO);
95 }
96
97 private static final Set<String> CAMERA_PERMISSIONS = new ArraySet<>();
98 static {
99 CAMERA_PERMISSIONS.add(Manifest.permission.CAMERA);
100 }
101
102 private static final Set<String> SENSORS_PERMISSIONS = new ArraySet<>();
103 static {
104 SENSORS_PERMISSIONS.add(Manifest.permission.BODY_SENSORS);
105 }
106
107 private static final Set<String> STORAGE_PERMISSIONS = new ArraySet<>();
108 static {
Svet Ganov975fa472015-06-22 20:45:31 -0700109 STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700110 STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
111 }
112
113 private static final Set<String> SETTINGS_PERMISSIONS = new ArraySet<>();
114 static {
115 SETTINGS_PERMISSIONS.add(Manifest.permission.WRITE_SETTINGS);
116 }
117
118 private static final Set<String> INSTALLER_PERMISSIONS = new ArraySet<>();
119 static {
120 INSTALLER_PERMISSIONS.add(Manifest.permission.GRANT_REVOKE_PERMISSIONS);
121 INSTALLER_PERMISSIONS.add(Manifest.permission.INTERACT_ACROSS_USERS_FULL);
122 INSTALLER_PERMISSIONS.add(Manifest.permission.CLEAR_APP_USER_DATA);
123 INSTALLER_PERMISSIONS.add(Manifest.permission.KILL_UID);
124 }
125
126 private static final Set<String> VERIFIER_PERMISSIONS = new ArraySet<>();
127 static {
128 INSTALLER_PERMISSIONS.add(Manifest.permission.GRANT_REVOKE_PERMISSIONS);
129 }
130
131 private final PackageManagerService mService;
132
133 private PackagesProvider mImePackagesProvider;
134 private PackagesProvider mLocationPackagesProvider;
135 private PackagesProvider mVoiceInteractionPackagesProvider;
Jeff Davidson2a880312015-06-22 16:54:34 -0700136 private PackagesProvider mCarrierAppPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700137
138 public DefaultPermissionGrantPolicy(PackageManagerService service) {
139 mService = service;
140 }
141
142 public void setImePackagesProviderLPr(PackagesProvider provider) {
143 mImePackagesProvider = provider;
144 }
145
146 public void setLocationPackagesProviderLPw(PackagesProvider provider) {
147 mLocationPackagesProvider = provider;
148 }
149
150 public void setVoiceInteractionPackagesProviderLPw(PackagesProvider provider) {
151 mVoiceInteractionPackagesProvider = provider;
152 }
153
Jeff Davidson2a880312015-06-22 16:54:34 -0700154 public void setCarrierAppPackagesProviderLPw(PackagesProvider provider) {
155 mCarrierAppPackagesProvider = provider;
156 }
157
Svet Ganovadc1cf42015-06-15 16:36:24 -0700158 public void grantDefaultPermissions(int userId) {
159 grantPermissionsToSysComponentsAndPrivApps(userId);
160 grantDefaultSystemHandlerPermissions(userId);
161 }
162
163 private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
164 Log.i(TAG, "Granting permissions to platform components");
165
166 synchronized (mService.mPackages) {
167 for (PackageParser.Package pkg : mService.mPackages.values()) {
168 if (!isSysComponentOrPersistentPrivApp(pkg)
169 || !doesPackageSupportRuntimePermissions(pkg)) {
170 continue;
171 }
172 final int permissionCount = pkg.requestedPermissions.size();
173 for (int i = 0; i < permissionCount; i++) {
174 String permission = pkg.requestedPermissions.get(i);
175 BasePermission bp = mService.mSettings.mPermissions.get(permission);
176 if (bp != null && bp.isRuntime()) {
177 final int flags = mService.getPermissionFlags(permission,
178 pkg.packageName, userId);
179 if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) == 0) {
180 mService.grantRuntimePermission(pkg.packageName, permission, userId);
181 mService.updatePermissionFlags(permission, pkg.packageName,
182 PackageManager.MASK_PERMISSION_FLAGS,
183 PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, userId);
184 if (DEBUG) {
185 Log.i(TAG, "Granted " + permission + " to system component "
186 + pkg.packageName);
187 }
188 }
189 }
190 }
191 }
192 }
193 }
194
195 private void grantDefaultSystemHandlerPermissions(int userId) {
196 Log.i(TAG, "Granting permissions to default platform handlers");
197
198 final PackagesProvider imePackagesProvider;
199 final PackagesProvider locationPackagesProvider;
200 final PackagesProvider voiceInteractionPackagesProvider;
Jeff Davidson2a880312015-06-22 16:54:34 -0700201 final PackagesProvider carrierAppPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700202
203 synchronized (mService.mPackages) {
204 imePackagesProvider = mImePackagesProvider;
205 locationPackagesProvider = mLocationPackagesProvider;
206 voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
Jeff Davidson2a880312015-06-22 16:54:34 -0700207 carrierAppPackagesProvider = mCarrierAppPackagesProvider;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700208 }
209
210 String[] imePackageNames = (imePackagesProvider != null)
211 ? imePackagesProvider.getPackages(userId) : null;
212 String[] voiceInteractPackageNames = (voiceInteractionPackagesProvider != null)
213 ? voiceInteractionPackagesProvider.getPackages(userId) : null;
214 String[] locationPackageNames = (locationPackagesProvider != null)
215 ? locationPackagesProvider.getPackages(userId) : null;
Jeff Davidson2a880312015-06-22 16:54:34 -0700216 String[] carrierAppPackageNames = (carrierAppPackagesProvider != null)
217 ? carrierAppPackagesProvider.getPackages(userId) : null;
Svet Ganovadc1cf42015-06-15 16:36:24 -0700218
219 synchronized (mService.mPackages) {
220 // Installers
221 Intent installerIntent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
222 installerIntent.addCategory(Intent.CATEGORY_DEFAULT);
223 installerIntent.setDataAndType(Uri.fromFile(new File("foo.apk")),
224 PACKAGE_MIME_TYPE);
225 List<PackageParser.Package> installerPackages =
226 getPrivilegedHandlerActivityPackagesLPr(installerIntent, userId);
227 final int installerCount = installerPackages.size();
228 for (int i = 0; i < installerCount; i++) {
229 PackageParser.Package installPackage = installerPackages.get(i);
230 grantInstallPermissionsLPw(installPackage, INSTALLER_PERMISSIONS, userId);
231 }
232
233 // Verifiers
234 Intent verifierIntent = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
235 verifierIntent.setType(PACKAGE_MIME_TYPE);
236 List<PackageParser.Package> verifierPackages =
237 getPrivilegedHandlerReceiverPackagesLPr(verifierIntent, userId);
238 final int verifierCount = verifierPackages.size();
239 for (int i = 0; i < verifierCount; i++) {
240 PackageParser.Package verifierPackage = verifierPackages.get(i);
241 grantInstallPermissionsLPw(verifierPackage, VERIFIER_PERMISSIONS, userId);
242 }
243
244 // SetupWizard
245 Intent setupIntent = new Intent(Intent.ACTION_MAIN);
246 setupIntent.addCategory(Intent.CATEGORY_HOME);
247 PackageParser.Package setupPackage = getDefaultSystemHandlerActvityPackageLPr(
248 setupIntent, userId);
249 if (setupPackage != null
250 && doesPackageSupportRuntimePermissions(setupPackage)) {
251 grantRuntimePermissionsLPw(setupPackage, PHONE_PERMISSIONS, userId);
252 grantRuntimePermissionsLPw(setupPackage, CONTACTS_PERMISSIONS, userId);
253 grantRuntimePermissionsLPw(setupPackage, SETTINGS_PERMISSIONS, userId);
254 }
255
256 // Phone
257 Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
258 PackageParser.Package dialerPackage = getDefaultSystemHandlerActvityPackageLPr(
259 dialerIntent, userId);
260 if (dialerPackage != null
261 && doesPackageSupportRuntimePermissions(dialerPackage)) {
262 grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
263 grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
264 grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
265 grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
266 }
267
268 // Camera
269 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
270 PackageParser.Package cameraPackage = getDefaultSystemHandlerActvityPackageLPr(
271 cameraIntent, userId);
272 if (cameraPackage != null
273 && doesPackageSupportRuntimePermissions(cameraPackage)) {
274 grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId);
275 grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId);
276 }
277
278 // Messaging
279 Intent messagingIntent = new Intent(Intent.ACTION_MAIN);
280 messagingIntent.addCategory(Intent.CATEGORY_APP_MESSAGING);
281 PackageParser.Package messagingPackage = getDefaultSystemHandlerActvityPackageLPr(
282 messagingIntent, userId);
283 if (messagingPackage != null
284 && doesPackageSupportRuntimePermissions(messagingPackage)) {
285 grantRuntimePermissionsLPw(messagingPackage, PHONE_PERMISSIONS, userId);
286 grantRuntimePermissionsLPw(messagingPackage, CONTACTS_PERMISSIONS, userId);
287 grantRuntimePermissionsLPw(messagingPackage, SMS_PERMISSIONS, userId);
288 }
289
290 // Calendar
291 Intent calendarIntent = new Intent(Intent.ACTION_MAIN);
292 calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR);
293 PackageParser.Package calendarPackage = getDefaultSystemHandlerActvityPackageLPr(
294 calendarIntent, userId);
295 if (calendarPackage != null
296 && doesPackageSupportRuntimePermissions(calendarPackage)) {
297 grantRuntimePermissionsLPw(calendarPackage, CALENDAR_PERMISSIONS, userId);
298 grantRuntimePermissionsLPw(calendarPackage, CONTACTS_PERMISSIONS, userId);
299 }
300
301 // Contacts
302 Intent contactsIntent = new Intent(Intent.ACTION_MAIN);
303 contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS);
304 PackageParser.Package contactsPackage = getDefaultSystemHandlerActvityPackageLPr(
305 contactsIntent, userId);
306 if (contactsPackage != null
307 && doesPackageSupportRuntimePermissions(contactsPackage)) {
308 grantRuntimePermissionsLPw(contactsPackage, CONTACTS_PERMISSIONS, userId);
309 grantRuntimePermissionsLPw(contactsPackage, PHONE_PERMISSIONS, userId);
310 }
311
312 // Maps
313 Intent mapsIntent = new Intent(Intent.ACTION_MAIN);
314 mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS);
315 PackageParser.Package mapsPackage = getDefaultSystemHandlerActvityPackageLPr(
316 mapsIntent, userId);
317 if (mapsPackage != null
318 && doesPackageSupportRuntimePermissions(mapsPackage)) {
319 grantRuntimePermissionsLPw(mapsPackage, LOCATION_PERMISSIONS, userId);
320 }
321
322 // Email
323 Intent emailIntent = new Intent(Intent.ACTION_MAIN);
324 emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
325 PackageParser.Package emailPackage = getDefaultSystemHandlerActvityPackageLPr(
326 emailIntent, userId);
327 if (emailPackage != null
328 && doesPackageSupportRuntimePermissions(emailPackage)) {
329 grantRuntimePermissionsLPw(emailPackage, CONTACTS_PERMISSIONS, userId);
330 }
331
332 // Browser
333 Intent browserIntent = new Intent(Intent.ACTION_MAIN);
334 browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
335 PackageParser.Package browserPackage = getDefaultSystemHandlerActvityPackageLPr(
336 browserIntent, userId);
337 if (browserPackage != null
338 && doesPackageSupportRuntimePermissions(browserPackage)) {
339 grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
340 }
341
342 // IME
343 if (imePackageNames != null) {
344 for (String imePackageName : imePackageNames) {
345 PackageParser.Package imePackage = getSystemPackageLPr(imePackageName);
346 if (imePackage != null
347 && doesPackageSupportRuntimePermissions(imePackage)) {
348 grantRuntimePermissionsLPw(imePackage, CONTACTS_PERMISSIONS, userId);
349 }
350 }
351 }
352
353 // Voice interaction
354 if (voiceInteractPackageNames != null) {
355 for (String voiceInteractPackageName : voiceInteractPackageNames) {
356 PackageParser.Package voiceInteractPackage = getSystemPackageLPr(
357 voiceInteractPackageName);
358 if (voiceInteractPackage != null
359 && doesPackageSupportRuntimePermissions(voiceInteractPackage)) {
360 grantRuntimePermissionsLPw(voiceInteractPackage,
361 CONTACTS_PERMISSIONS, userId);
362 grantRuntimePermissionsLPw(voiceInteractPackage,
363 CALENDAR_PERMISSIONS, userId);
364 grantRuntimePermissionsLPw(voiceInteractPackage,
365 MICROPHONE_PERMISSIONS, userId);
366 grantRuntimePermissionsLPw(voiceInteractPackage,
367 PHONE_PERMISSIONS, userId);
368 grantRuntimePermissionsLPw(voiceInteractPackage,
369 SMS_PERMISSIONS, userId);
370 grantRuntimePermissionsLPw(voiceInteractPackage,
371 LOCATION_PERMISSIONS, userId);
372 }
373 }
374 }
375
376 // Location
377 if (locationPackageNames != null) {
378 for (String packageName : locationPackageNames) {
379 PackageParser.Package locationPackage = getSystemPackageLPr(packageName);
380 if (locationPackage != null
381 && doesPackageSupportRuntimePermissions(locationPackage)) {
382 grantRuntimePermissionsLPw(locationPackage, CONTACTS_PERMISSIONS, userId);
383 grantRuntimePermissionsLPw(locationPackage, CALENDAR_PERMISSIONS, userId);
384 grantRuntimePermissionsLPw(locationPackage, MICROPHONE_PERMISSIONS, userId);
385 grantRuntimePermissionsLPw(locationPackage, PHONE_PERMISSIONS, userId);
386 grantRuntimePermissionsLPw(locationPackage, SMS_PERMISSIONS, userId);
387 grantRuntimePermissionsLPw(locationPackage, LOCATION_PERMISSIONS, userId);
388 grantRuntimePermissionsLPw(locationPackage, CAMERA_PERMISSIONS, userId);
389 grantRuntimePermissionsLPw(locationPackage, SENSORS_PERMISSIONS, userId);
390 grantRuntimePermissionsLPw(locationPackage, STORAGE_PERMISSIONS, userId);
391 }
392 }
393 }
Jeff Davidson2a880312015-06-22 16:54:34 -0700394
395 // Carrier apps
396 if (carrierAppPackageNames != null) {
397 for (String packageName : carrierAppPackageNames) {
398 PackageParser.Package carrierPackage = getSystemPackageLPr(packageName);
399 if (carrierPackage != null
400 && doesPackageSupportRuntimePermissions(carrierPackage)) {
401 grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId);
402 grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId);
403 }
404 }
405 }
Svet Ganovba3ba812015-06-26 10:54:06 -0700406
407 mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
Svet Ganovadc1cf42015-06-15 16:36:24 -0700408 }
409 }
410
411 private List<PackageParser.Package> getPrivilegedHandlerReceiverPackagesLPr(
412 Intent intent, int userId) {
413 List<ResolveInfo> handlers = mService.queryIntentReceivers(
414 intent, intent.resolveTypeIfNeeded(mService.mContext.getContentResolver()),
415 0, userId);
416 return getPrivilegedPackages(handlers);
417 }
418
419 private List<PackageParser.Package> getPrivilegedHandlerActivityPackagesLPr(
420 Intent intent, int userId) {
421 List<ResolveInfo> handlers = mService.queryIntentActivities(
422 intent, intent.resolveTypeIfNeeded(mService.mContext.getContentResolver()),
423 0, userId);
424 return getPrivilegedPackages(handlers);
425 }
426
427 private List<PackageParser.Package> getPrivilegedPackages(List<ResolveInfo> resolveInfos) {
428 List<PackageParser.Package> handlerPackages = new ArrayList<>();
429 final int handlerCount = resolveInfos.size();
430 for (int i = 0; i < handlerCount; i++) {
431 ResolveInfo handler = resolveInfos.get(i);
432 PackageParser.Package handlerPackage = getPrivilegedPackageLPr(
433 handler.activityInfo.packageName);
434 if (handlerPackage != null) {
435 handlerPackages.add(handlerPackage);
436 }
437 }
438 return handlerPackages;
439 }
440
441 private PackageParser.Package getDefaultSystemHandlerActvityPackageLPr(
442 Intent intent, int userId) {
443 List<ResolveInfo> handlers = mService.queryIntentActivities(intent, null, 0, userId);
444 final int handlerCount = handlers.size();
445 for (int i = 0; i < handlerCount; i++) {
446 ResolveInfo handler = handlers.get(i);
447 // TODO: This is a temporary hack to figure out the setup app.
448 PackageParser.Package handlerPackage = getSystemPackageLPr(
449 handler.activityInfo.packageName);
450 if (handlerPackage != null) {
451 return handlerPackage;
452 }
453 }
454 return null;
455 }
456
457 private PackageParser.Package getSystemPackageLPr(String packageName) {
458 PackageParser.Package pkg = mService.mPackages.get(packageName);
459 if (pkg != null && pkg.isSystemApp()) {
460 return !isSysComponentOrPersistentPrivApp(pkg) ? pkg : null;
461 }
462 return null;
463 }
464
465 private PackageParser.Package getPrivilegedPackageLPr(String packageName) {
466 PackageParser.Package pkg = mService.mPackages.get(packageName);
467 if (pkg != null && pkg.applicationInfo.isPrivilegedApp()) {
468 return !isSysComponentOrPersistentPrivApp(pkg) ? pkg : null;
469 }
470 return null;
471 }
472
473 private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
474 int userId) {
475 List<String> requestedPermissions = pkg.requestedPermissions;
476
477 if (pkg.isUpdatedSystemApp()) {
478 PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
479 if (sysPs != null) {
480 requestedPermissions = sysPs.pkg.requestedPermissions;
481 }
482 }
483
484 final int permissionCount = requestedPermissions.size();
485 for (int i = 0; i < permissionCount; i++) {
486 String permission = requestedPermissions.get(i);
487 if (permissions.contains(permission)) {
488 final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId);
489
490 // If any flags are set to the permission, then it is either set in
491 // its current state by the system or device/profile owner or the user.
492 // In all these cases we do not want to clobber the current state.
493 if (flags == 0) {
494 mService.grantRuntimePermission(pkg.packageName, permission, userId);
495 if (DEBUG) {
496 Log.i(TAG, "Granted " + permission + " to default handler "
497 + pkg.packageName);
498 }
499 }
500 }
501 }
502 }
503
504 private void grantInstallPermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
505 int userId) {
506 List<String> requestedPermissions = pkg.requestedPermissions;
507
508 if (pkg.isUpdatedSystemApp()) {
509 PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
510 if (sysPs != null) {
511 requestedPermissions = sysPs.pkg.requestedPermissions;
512 }
513 }
514
515 final int permissionCount = requestedPermissions.size();
516 for (int i = 0; i < permissionCount; i++) {
517 String permission = requestedPermissions.get(i);
518 if (permissions.contains(permission)) {
519 final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId);
520
521 // If any flags are set to the permission, then it is either set in
522 // its current state by the system or device/profile owner or the user.
523 // In all these cases we do not want to clobber the current state.
524 if (flags == 0) {
525 mService.grantInstallPermissionLPw(permission, pkg);
526 if (DEBUG) {
527 Log.i(TAG, "Granted install " + permission + " to " + pkg.packageName);
528 }
529 }
530 }
531 }
532 }
533
534 private static boolean isSysComponentOrPersistentPrivApp(PackageParser.Package pkg) {
535 return UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID
536 || ((pkg.applicationInfo.privateFlags
537 & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0
538 && (pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) != 0);
539 }
540
541 private static boolean doesPackageSupportRuntimePermissions(PackageParser.Package pkg) {
542 return pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1;
543 }
544}