1 /* 2 * Copyright (C) 2006 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 17 package com.android.server.pm; 18 19 import android.content.pm.PackageParser; 20 import android.content.pm.PermissionInfo; 21 import android.os.UserHandle; 22 23 final class BasePermission { 24 final static int TYPE_NORMAL = 0; 25 26 final static int TYPE_BUILTIN = 1; 27 28 final static int TYPE_DYNAMIC = 2; 29 30 final String name; 31 32 String sourcePackage; 33 34 PackageSettingBase packageSetting; 35 36 final int type; 37 38 int protectionLevel; 39 40 PackageParser.Permission perm; 41 42 PermissionInfo pendingInfo; 43 44 /** UID that owns the definition of this permission */ 45 int uid; 46 47 /** Additional GIDs given to apps granted this permission */ 48 private int[] gids; 49 50 /** 51 * Flag indicating that {@link #gids} should be adjusted based on the 52 * {@link UserHandle} the granted app is running as. 53 */ 54 private boolean perUser; 55 BasePermission(String _name, String _sourcePackage, int _type)56 BasePermission(String _name, String _sourcePackage, int _type) { 57 name = _name; 58 sourcePackage = _sourcePackage; 59 type = _type; 60 // Default to most conservative protection level. 61 protectionLevel = PermissionInfo.PROTECTION_SIGNATURE; 62 } 63 64 @Override toString()65 public String toString() { 66 return "BasePermission{" + Integer.toHexString(System.identityHashCode(this)) + " " + name 67 + "}"; 68 } 69 setGids(int[] gids, boolean perUser)70 public void setGids(int[] gids, boolean perUser) { 71 this.gids = gids; 72 this.perUser = perUser; 73 } 74 computeGids(int userId)75 public int[] computeGids(int userId) { 76 if (perUser) { 77 final int[] userGids = new int[gids.length]; 78 for (int i = 0; i < gids.length; i++) { 79 userGids[i] = UserHandle.getUid(userId, gids[i]); 80 } 81 return userGids; 82 } else { 83 return gids; 84 } 85 } 86 isRuntime()87 public boolean isRuntime() { 88 return (protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) 89 == PermissionInfo.PROTECTION_DANGEROUS; 90 } 91 isDevelopment()92 public boolean isDevelopment() { 93 return (protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) 94 == PermissionInfo.PROTECTION_SIGNATURE 95 && (protectionLevel & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0; 96 } 97 } 98