1 /*
2  * Copyright (C) 2023 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.app.admin;
18 
19 import static android.app.admin.PolicyUpdateReceiver.EXTRA_PACKAGE_NAME;
20 import static android.app.admin.PolicyUpdateReceiver.EXTRA_PERMISSION_NAME;
21 import static android.app.admin.PolicyUpdateReceiver.EXTRA_POLICY_BUNDLE_KEY;
22 import static android.app.admin.PolicyUpdateReceiver.EXTRA_POLICY_KEY;
23 
24 import android.annotation.NonNull;
25 import android.annotation.Nullable;
26 import android.annotation.SystemApi;
27 import android.annotation.TestApi;
28 import android.app.admin.flags.Flags;
29 import android.os.Bundle;
30 import android.os.Parcel;
31 import android.os.Parcelable;
32 
33 import com.android.modules.utils.TypedXmlPullParser;
34 import com.android.modules.utils.TypedXmlSerializer;
35 
36 import org.xmlpull.v1.XmlPullParserException;
37 
38 import java.io.IOException;
39 import java.util.Objects;
40 
41 /**
42  * Class used to identify a policy that relates to a certain package and permission
43  * (e.g. {@link DevicePolicyManager#setPermissionGrantState}).
44  *
45  * @hide
46  */
47 @SystemApi
48 public final class PackagePermissionPolicyKey extends PolicyKey {
49     private static final String ATTR_PACKAGE_NAME = "package-name";
50     private static final String ATTR_PERMISSION_NAME = "permission-name";
51 
52     private final String mPackageName;
53     private final String mPermissionName;
54 
55     /**
56      * @hide
57      */
58     @TestApi
PackagePermissionPolicyKey(@onNull String identifier, @NonNull String packageName, @NonNull String permissionName)59     public PackagePermissionPolicyKey(@NonNull String identifier, @NonNull String packageName,
60             @NonNull String permissionName) {
61         super(identifier);
62         if (Flags.devicePolicySizeTrackingInternalBugFixEnabled()) {
63             PolicySizeVerifier.enforceMaxPackageNameLength(packageName);
64             PolicySizeVerifier.enforceMaxStringLength(permissionName, "permissionName");
65         }
66         mPackageName = Objects.requireNonNull((packageName));
67         mPermissionName = Objects.requireNonNull((permissionName));
68     }
69 
70     /**
71      * @hide
72      */
PackagePermissionPolicyKey(@onNull String identifier)73     public PackagePermissionPolicyKey(@NonNull String identifier) {
74         super(identifier);
75         mPackageName = null;
76         mPermissionName = null;
77     }
78 
PackagePermissionPolicyKey(Parcel source)79     private PackagePermissionPolicyKey(Parcel source) {
80         super(source.readString());
81         mPackageName = source.readString();
82         mPermissionName = source.readString();
83     }
84 
85     /**
86      * Returns the package name this policy relates to.
87      */
88     @NonNull
getPackageName()89     public String getPackageName() {
90         return mPackageName;
91     }
92 
93     /**
94      * Returns the permission name this policy relates to.
95      */
96     @NonNull
getPermissionName()97     public String getPermissionName() {
98         return mPermissionName;
99     }
100 
101     /**
102      * @hide
103      */
104     @Override
saveToXml(TypedXmlSerializer serializer)105     public void saveToXml(TypedXmlSerializer serializer) throws IOException {
106         serializer.attribute(/* namespace= */ null, ATTR_POLICY_IDENTIFIER, getIdentifier());
107         serializer.attribute(/* namespace= */ null, ATTR_PACKAGE_NAME, mPackageName);
108         serializer.attribute(/* namespace= */ null, ATTR_PERMISSION_NAME, mPermissionName);
109     }
110 
111     /**
112      * @hide
113      */
114     @Override
readFromXml(TypedXmlPullParser parser)115     public PackagePermissionPolicyKey readFromXml(TypedXmlPullParser parser)
116             throws XmlPullParserException, IOException {
117         String identifier = parser.getAttributeValue(
118                 /* namespace= */ null, ATTR_POLICY_IDENTIFIER);
119         String packageName = parser.getAttributeValue(/* namespace= */ null, ATTR_PACKAGE_NAME);
120         String permissionName = parser.getAttributeValue(
121                 /* namespace= */ null, ATTR_PERMISSION_NAME);
122         return new PackagePermissionPolicyKey(identifier, packageName, permissionName);
123     }
124 
125     /**
126      * @hide
127      */
128     @Override
writeToBundle(Bundle bundle)129     public void writeToBundle(Bundle bundle) {
130         bundle.putString(EXTRA_POLICY_KEY, getIdentifier());
131         Bundle extraPolicyParams = new Bundle();
132         extraPolicyParams.putString(EXTRA_PACKAGE_NAME, mPackageName);
133         extraPolicyParams.putString(EXTRA_PERMISSION_NAME, mPermissionName);
134         bundle.putBundle(EXTRA_POLICY_BUNDLE_KEY, extraPolicyParams);
135     }
136 
137     @Override
equals(@ullable Object o)138     public boolean equals(@Nullable Object o) {
139         if (this == o) return true;
140         if (o == null || getClass() != o.getClass()) return false;
141         PackagePermissionPolicyKey other = (PackagePermissionPolicyKey) o;
142         return Objects.equals(getIdentifier(), other.getIdentifier())
143                 && Objects.equals(mPackageName, other.mPackageName)
144                 && Objects.equals(mPermissionName, other.mPermissionName);
145     }
146 
147     @Override
hashCode()148     public int hashCode() {
149         return Objects.hash(getIdentifier(), mPackageName, mPermissionName);
150     }
151 
152     @Override
toString()153     public String toString() {
154         return "PackagePermissionPolicyKey{mIdentifier= " + getIdentifier() + "; mPackageName= "
155                 + mPackageName + "; mPermissionName= " + mPermissionName + "}";
156     }
157 
158     @Override
describeContents()159     public int describeContents() {
160         return 0;
161     }
162 
163     @Override
writeToParcel(@onNull Parcel dest, int flags)164     public void writeToParcel(@NonNull Parcel dest, int flags) {
165         dest.writeString(getIdentifier());
166         dest.writeString(mPackageName);
167         dest.writeString(mPermissionName);
168     }
169 
170     @NonNull
171     public static final Parcelable.Creator<PackagePermissionPolicyKey> CREATOR =
172             new Parcelable.Creator<PackagePermissionPolicyKey>() {
173                 @Override
174                 public PackagePermissionPolicyKey createFromParcel(Parcel source) {
175                     return new PackagePermissionPolicyKey(source);
176                 }
177 
178                 @Override
179                 public PackagePermissionPolicyKey[] newArray(int size) {
180                     return new PackagePermissionPolicyKey[size];
181                 }
182             };
183 }
184