1 /*
2  * Copyright (C) 2008 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 android.content.pm;
18 
19 import android.annotation.SystemApi;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 import android.text.TextUtils;
23 
24 /**
25  * Information you can retrieve about a particular security permission
26  * known to the system.  This corresponds to information collected from the
27  * AndroidManifest.xml's <permission> tags.
28  */
29 public class PermissionInfo extends PackageItemInfo implements Parcelable {
30     /**
31      * A normal application value for {@link #protectionLevel}, corresponding
32      * to the <code>normal</code> value of
33      * {@link android.R.attr#protectionLevel}.
34      */
35     public static final int PROTECTION_NORMAL = 0;
36 
37     /**
38      * Dangerous value for {@link #protectionLevel}, corresponding
39      * to the <code>dangerous</code> value of
40      * {@link android.R.attr#protectionLevel}.
41      */
42     public static final int PROTECTION_DANGEROUS = 1;
43 
44     /**
45      * System-level value for {@link #protectionLevel}, corresponding
46      * to the <code>signature</code> value of
47      * {@link android.R.attr#protectionLevel}.
48      */
49     public static final int PROTECTION_SIGNATURE = 2;
50 
51     /**
52      * @deprecated Use {@link #PROTECTION_SIGNATURE}|{@link #PROTECTION_FLAG_PRIVILEGED}
53      * instead.
54      */
55     @Deprecated
56     public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3;
57 
58     /**
59      * Additional flag for {@link #protectionLevel}, corresponding
60      * to the <code>privileged</code> value of
61      * {@link android.R.attr#protectionLevel}.
62      */
63     public static final int PROTECTION_FLAG_PRIVILEGED = 0x10;
64 
65     /**
66      * @deprecated Old name for {@link #PROTECTION_FLAG_PRIVILEGED}, which
67      * is now very confusing because it only applies to privileged apps, not all
68      * apps on the system image.
69      */
70     @Deprecated
71     public static final int PROTECTION_FLAG_SYSTEM = 0x10;
72 
73     /**
74      * Additional flag for {@link #protectionLevel}, corresponding
75      * to the <code>development</code> value of
76      * {@link android.R.attr#protectionLevel}.
77      */
78     public static final int PROTECTION_FLAG_DEVELOPMENT = 0x20;
79 
80     /**
81      * Additional flag for {@link #protectionLevel}, corresponding
82      * to the <code>appop</code> value of
83      * {@link android.R.attr#protectionLevel}.
84      */
85     public static final int PROTECTION_FLAG_APPOP = 0x40;
86 
87     /**
88      * Additional flag for {@link #protectionLevel}, corresponding
89      * to the <code>pre23</code> value of
90      * {@link android.R.attr#protectionLevel}.
91      */
92     public static final int PROTECTION_FLAG_PRE23 = 0x80;
93 
94     /**
95      * Additional flag for {@link #protectionLevel}, corresponding
96      * to the <code>installer</code> value of
97      * {@link android.R.attr#protectionLevel}.
98      */
99     public static final int PROTECTION_FLAG_INSTALLER = 0x100;
100 
101     /**
102      * Additional flag for {@link #protectionLevel}, corresponding
103      * to the <code>verifier</code> value of
104      * {@link android.R.attr#protectionLevel}.
105      */
106     public static final int PROTECTION_FLAG_VERIFIER = 0x200;
107 
108     /**
109      * Additional flag for {@link #protectionLevel}, corresponding
110      * to the <code>preinstalled</code> value of
111      * {@link android.R.attr#protectionLevel}.
112      */
113     public static final int PROTECTION_FLAG_PREINSTALLED = 0x400;
114 
115     /**
116      * Additional flag for {@link #protectionLevel}, corresponding
117      * to the <code>setup</code> value of
118      * {@link android.R.attr#protectionLevel}.
119      */
120     public static final int PROTECTION_FLAG_SETUP = 0x800;
121 
122     /**
123      * Mask for {@link #protectionLevel}: the basic protection type.
124      */
125     public static final int PROTECTION_MASK_BASE = 0xf;
126 
127     /**
128      * Mask for {@link #protectionLevel}: additional flag bits.
129      */
130     public static final int PROTECTION_MASK_FLAGS = 0xff0;
131 
132     /**
133      * The level of access this permission is protecting, as per
134      * {@link android.R.attr#protectionLevel}.  Values may be
135      * {@link #PROTECTION_NORMAL}, {@link #PROTECTION_DANGEROUS}, or
136      * {@link #PROTECTION_SIGNATURE}.  May also include the additional
137      * flags {@link #PROTECTION_FLAG_SYSTEM} or {@link #PROTECTION_FLAG_DEVELOPMENT}
138      * (which only make sense in combination with the base
139      * {@link #PROTECTION_SIGNATURE}.
140      */
141     public int protectionLevel;
142 
143     /**
144      * The group this permission is a part of, as per
145      * {@link android.R.attr#permissionGroup}.
146      */
147     public String group;
148 
149     /**
150      * Flag for {@link #flags}, corresponding to <code>costsMoney</code>
151      * value of {@link android.R.attr#permissionFlags}.
152      */
153     public static final int FLAG_COSTS_MONEY = 1<<0;
154 
155     /**
156      * Flag for {@link #flags}, corresponding to <code>removed</code>
157      * value of {@link android.R.attr#permissionFlags}.
158      * @hide
159      */
160     @SystemApi
161     public static final int FLAG_REMOVED = 1<<1;
162 
163     /**
164      * Flag for {@link #flags}, indicating that this permission has been
165      * installed into the system's globally defined permissions.
166      */
167     public static final int FLAG_INSTALLED = 1<<30;
168 
169     /**
170      * Additional flags about this permission as given by
171      * {@link android.R.attr#permissionFlags}.
172      */
173     public int flags;
174 
175     /**
176      * A string resource identifier (in the package's resources) of this
177      * permission's description.  From the "description" attribute or,
178      * if not set, 0.
179      */
180     public int descriptionRes;
181 
182     /**
183      * The description string provided in the AndroidManifest file, if any.  You
184      * probably don't want to use this, since it will be null if the description
185      * is in a resource.  You probably want
186      * {@link PermissionInfo#loadDescription} instead.
187      */
188     public CharSequence nonLocalizedDescription;
189 
190     /** @hide */
fixProtectionLevel(int level)191     public static int fixProtectionLevel(int level) {
192         if (level == PROTECTION_SIGNATURE_OR_SYSTEM) {
193             level = PROTECTION_SIGNATURE | PROTECTION_FLAG_PRIVILEGED;
194         }
195         return level;
196     }
197 
198     /** @hide */
protectionToString(int level)199     public static String protectionToString(int level) {
200         String protLevel = "????";
201         switch (level&PROTECTION_MASK_BASE) {
202             case PermissionInfo.PROTECTION_DANGEROUS:
203                 protLevel = "dangerous";
204                 break;
205             case PermissionInfo.PROTECTION_NORMAL:
206                 protLevel = "normal";
207                 break;
208             case PermissionInfo.PROTECTION_SIGNATURE:
209                 protLevel = "signature";
210                 break;
211             case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM:
212                 protLevel = "signatureOrSystem";
213                 break;
214         }
215         if ((level&PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) {
216             protLevel += "|privileged";
217         }
218         if ((level&PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {
219             protLevel += "|development";
220         }
221         if ((level&PermissionInfo.PROTECTION_FLAG_APPOP) != 0) {
222             protLevel += "|appop";
223         }
224         if ((level&PermissionInfo.PROTECTION_FLAG_PRE23) != 0) {
225             protLevel += "|pre23";
226         }
227         if ((level&PermissionInfo.PROTECTION_FLAG_INSTALLER) != 0) {
228             protLevel += "|installer";
229         }
230         if ((level&PermissionInfo.PROTECTION_FLAG_VERIFIER) != 0) {
231             protLevel += "|verifier";
232         }
233         if ((level&PermissionInfo.PROTECTION_FLAG_PREINSTALLED) != 0) {
234             protLevel += "|preinstalled";
235         }
236         if ((level&PermissionInfo.PROTECTION_FLAG_SETUP) != 0) {
237             protLevel += "|setup";
238         }
239         return protLevel;
240     }
241 
PermissionInfo()242     public PermissionInfo() {
243     }
244 
PermissionInfo(PermissionInfo orig)245     public PermissionInfo(PermissionInfo orig) {
246         super(orig);
247         protectionLevel = orig.protectionLevel;
248         flags = orig.flags;
249         group = orig.group;
250         descriptionRes = orig.descriptionRes;
251         nonLocalizedDescription = orig.nonLocalizedDescription;
252     }
253 
254     /**
255      * Retrieve the textual description of this permission.  This
256      * will call back on the given PackageManager to load the description from
257      * the application.
258      *
259      * @param pm A PackageManager from which the label can be loaded; usually
260      * the PackageManager from which you originally retrieved this item.
261      *
262      * @return Returns a CharSequence containing the permission's description.
263      * If there is no description, null is returned.
264      */
loadDescription(PackageManager pm)265     public CharSequence loadDescription(PackageManager pm) {
266         if (nonLocalizedDescription != null) {
267             return nonLocalizedDescription;
268         }
269         if (descriptionRes != 0) {
270             CharSequence label = pm.getText(packageName, descriptionRes, null);
271             if (label != null) {
272                 return label;
273             }
274         }
275         return null;
276     }
277 
toString()278     public String toString() {
279         return "PermissionInfo{"
280             + Integer.toHexString(System.identityHashCode(this))
281             + " " + name + "}";
282     }
283 
describeContents()284     public int describeContents() {
285         return 0;
286     }
287 
writeToParcel(Parcel dest, int parcelableFlags)288     public void writeToParcel(Parcel dest, int parcelableFlags) {
289         super.writeToParcel(dest, parcelableFlags);
290         dest.writeInt(protectionLevel);
291         dest.writeInt(flags);
292         dest.writeString(group);
293         dest.writeInt(descriptionRes);
294         TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
295     }
296 
297     public static final Creator<PermissionInfo> CREATOR =
298         new Creator<PermissionInfo>() {
299         public PermissionInfo createFromParcel(Parcel source) {
300             return new PermissionInfo(source);
301         }
302         public PermissionInfo[] newArray(int size) {
303             return new PermissionInfo[size];
304         }
305     };
306 
PermissionInfo(Parcel source)307     private PermissionInfo(Parcel source) {
308         super(source);
309         protectionLevel = source.readInt();
310         flags = source.readInt();
311         group = source.readString();
312         descriptionRes = source.readInt();
313         nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
314     }
315 }
316