Skip to content

Commit 6b68421

Browse files
committed
Add null-handling to PackageUtils
1 parent 35c7a06 commit 6b68421

File tree

1 file changed

+37
-66
lines changed

1 file changed

+37
-66
lines changed

play-services-base/core/src/main/java/org/microg/gms/common/PackageUtils.java

Lines changed: 37 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import android.os.Binder;
2727
import android.util.Log;
2828

29+
import androidx.annotation.NonNull;
2930
import androidx.annotation.Nullable;
3031
import org.microg.gms.utils.ExtendedPackageInfo;
3132

@@ -36,7 +37,6 @@
3637
import java.util.List;
3738

3839
import static android.os.Build.VERSION.SDK_INT;
39-
import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME;
4040
import static org.microg.gms.common.Constants.GMS_PACKAGE_SIGNATURE_SHA1;
4141
import static org.microg.gms.common.Constants.GMS_SECONDARY_PACKAGE_SIGNATURE_SHA1;
4242

@@ -49,19 +49,20 @@ public class PackageUtils {
4949
private static final String[] GOOGLE_PRIMARY_KEYS = {GOOGLE_PLATFORM_KEY, GOOGLE_PLATFORM_KEY_2, GOOGLE_APP_KEY};
5050

5151
@Deprecated
52-
public static boolean isGooglePackage(Context context, String packageName) {
52+
public static boolean isGooglePackage(@NonNull Context context, @Nullable String packageName) {
53+
if (packageName == null) return false;
5354
return new ExtendedPackageInfo(context, packageName).isGoogleOrPlatformPackage();
5455
}
5556

5657
/**
5758
* @deprecated Extended access is a deprecated concept
5859
*/
5960
@Deprecated
60-
public static boolean callerHasExtendedAccessPermission(Context context) {
61+
public static boolean callerHasExtendedAccessPermission(@NonNull Context context) {
6162
return context.checkCallingPermission("org.microg.gms.EXTENDED_ACCESS") == PackageManager.PERMISSION_GRANTED;
6263
}
6364

64-
public static void assertGooglePackagePermission(Context context, GooglePackagePermission permission) {
65+
public static void assertGooglePackagePermission(@NonNull Context context, GooglePackagePermission permission) {
6566
try {
6667
if (!callerHasGooglePackagePermission(context, permission))
6768
throw new SecurityException("Access denied, missing google package permission for " + permission.name());
@@ -71,7 +72,7 @@ public static void assertGooglePackagePermission(Context context, GooglePackageP
7172
}
7273
}
7374

74-
public static boolean callerHasGooglePackagePermission(Context context, GooglePackagePermission permission) {
75+
public static boolean callerHasGooglePackagePermission(@NonNull Context context, GooglePackagePermission permission) {
7576
for (String packageCandidate : getCallingPackageCandidates(context)) {
7677
if (new ExtendedPackageInfo(context, packageCandidate).hasGooglePackagePermission(permission)) {
7778
return true;
@@ -84,7 +85,7 @@ public static boolean callerHasGooglePackagePermission(Context context, GooglePa
8485
return false;
8586
}
8687

87-
public static void checkPackageUid(Context context, String packageName, int callingUid) {
88+
public static void checkPackageUid(@NonNull Context context, @NonNull String packageName, int callingUid) {
8889
getAndCheckPackage(context, packageName, callingUid, 0);
8990
}
9091

@@ -93,7 +94,7 @@ public static void checkPackageUid(Context context, String packageName, int call
9394
*/
9495
@Deprecated
9596
@Nullable
96-
public static String firstSignatureDigest(Context context, String packageName) {
97+
public static String firstSignatureDigest(@NonNull Context context, @Nullable String packageName) {
9798
return firstSignatureDigest(context, packageName, false);
9899
}
99100

@@ -102,7 +103,7 @@ public static String firstSignatureDigest(Context context, String packageName) {
102103
*/
103104
@Deprecated
104105
@Nullable
105-
public static String firstSignatureDigest(Context context, String packageName, boolean useSigningInfo) {
106+
public static String firstSignatureDigest(@NonNull Context context, @Nullable String packageName, boolean useSigningInfo) {
106107
return firstSignatureDigest(context.getPackageManager(), packageName, useSigningInfo);
107108
}
108109

@@ -111,7 +112,7 @@ public static String firstSignatureDigest(Context context, String packageName, b
111112
*/
112113
@Deprecated
113114
@Nullable
114-
public static String firstSignatureDigest(PackageManager packageManager, String packageName) {
115+
public static String firstSignatureDigest(@NonNull PackageManager packageManager, @Nullable String packageName) {
115116
return firstSignatureDigest(packageManager, packageName, false);
116117
}
117118

@@ -120,41 +121,16 @@ public static String firstSignatureDigest(PackageManager packageManager, String
120121
*/
121122
@Deprecated
122123
@Nullable
123-
public static String firstSignatureDigest(PackageManager packageManager, String packageName, boolean useSigningInfo) {
124-
final PackageInfo info;
125-
try {
126-
info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES | (useSigningInfo && SDK_INT >= 28 ? PackageManager.GET_SIGNING_CERTIFICATES : 0));
127-
} catch (PackageManager.NameNotFoundException e) {
128-
return null;
129-
}
130-
if (info == null) return null;
131-
if (SDK_INT >= 28 && useSigningInfo && info.signingInfo != null) {
132-
if (!info.signingInfo.hasMultipleSigners()) {
133-
for (Signature sig : info.signingInfo.getSigningCertificateHistory()) {
134-
String digest = sha1sum(sig.toByteArray());
135-
if (digest != null) {
136-
return digest;
137-
}
138-
}
139-
}
140-
}
141-
if (info.signatures != null) {
142-
for (Signature sig : info.signatures) {
143-
String digest = sha1sum(sig.toByteArray());
144-
if (digest != null) {
145-
return digest;
146-
}
147-
}
148-
}
149-
return null;
124+
public static String firstSignatureDigest(@NonNull PackageManager packageManager, String packageName, boolean useSigningInfo) {
125+
return bytesToSumString(firstSignatureDigestBytes(packageManager, packageName, useSigningInfo));
150126
}
151127

152128
/**
153129
* @deprecated We should stop using SHA-1 for certificate fingerprints!
154130
*/
155131
@Deprecated
156132
@Nullable
157-
public static byte[] firstSignatureDigestBytes(Context context, String packageName) {
133+
public static byte[] firstSignatureDigestBytes(@NonNull Context context, @Nullable String packageName) {
158134
return firstSignatureDigestBytes(context.getPackageManager(), packageName);
159135
}
160136

@@ -163,7 +139,7 @@ public static byte[] firstSignatureDigestBytes(Context context, String packageNa
163139
*/
164140
@Deprecated
165141
@Nullable
166-
public static byte[] firstSignatureDigestBytes(PackageManager packageManager, String packageName) {
142+
public static byte[] firstSignatureDigestBytes(@NonNull PackageManager packageManager, @Nullable String packageName) {
167143
return firstSignatureDigestBytes(packageManager, packageName, false);
168144
}
169145

@@ -172,7 +148,8 @@ public static byte[] firstSignatureDigestBytes(PackageManager packageManager, St
172148
*/
173149
@Deprecated
174150
@Nullable
175-
public static byte[] firstSignatureDigestBytes(PackageManager packageManager, String packageName, boolean useSigningInfo) {
151+
public static byte[] firstSignatureDigestBytes(@NonNull PackageManager packageManager, @Nullable String packageName, boolean useSigningInfo) {
152+
if (packageName == null) return null;
176153
final PackageInfo info;
177154
try {
178155
info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES | (useSigningInfo && SDK_INT >= 28 ? PackageManager.GET_SIGNING_CERTIFICATES : 0));
@@ -202,7 +179,7 @@ public static byte[] firstSignatureDigestBytes(PackageManager packageManager, St
202179
}
203180

204181
@Nullable
205-
public static String getCallingPackage(Context context) {
182+
public static String getCallingPackage(@NonNull Context context) {
206183
int callingUid = Binder.getCallingUid(), callingPid = Binder.getCallingPid();
207184
String packageName = packageFromProcessId(context, callingPid);
208185
if (packageName == null) {
@@ -211,7 +188,7 @@ public static String getCallingPackage(Context context) {
211188
return packageName;
212189
}
213190

214-
public static String[] getCallingPackageCandidates(Context context) {
191+
public static String[] getCallingPackageCandidates(@NonNull Context context) {
215192
int callingUid = Binder.getCallingUid(), callingPid = Binder.getCallingPid();
216193
String packageName = packageFromProcessId(context, callingPid);
217194
if (packageName != null) return new String[]{packageName};
@@ -221,12 +198,12 @@ public static String[] getCallingPackageCandidates(Context context) {
221198
}
222199

223200
@Nullable
224-
public static String getAndCheckCallingPackage(Context context, String suggestedPackageName) {
201+
public static String getAndCheckCallingPackage(@NonNull Context context, @Nullable String suggestedPackageName) {
225202
return getAndCheckCallingPackage(context, suggestedPackageName, 0);
226203
}
227204

228205
@Nullable
229-
public static String getAndCheckCallingPackageOrImpersonation(Context context, String suggestedPackageName) {
206+
public static String getAndCheckCallingPackageOrImpersonation(@NonNull Context context, @Nullable String suggestedPackageName) {
230207
try {
231208
return getAndCheckCallingPackage(context, suggestedPackageName, 0);
232209
} catch (Exception e) {
@@ -238,17 +215,17 @@ public static String getAndCheckCallingPackageOrImpersonation(Context context, S
238215
}
239216

240217
@Nullable
241-
public static String getAndCheckCallingPackage(Context context, int suggestedCallerUid) {
218+
public static String getAndCheckCallingPackage(@NonNull Context context, int suggestedCallerUid) {
242219
return getAndCheckCallingPackage(context, null, suggestedCallerUid);
243220
}
244221

245222
@Nullable
246-
public static String getAndCheckCallingPackage(Context context, String suggestedPackageName, int suggestedCallerUid) {
223+
public static String getAndCheckCallingPackage(@NonNull Context context, @Nullable String suggestedPackageName, int suggestedCallerUid) {
247224
return getAndCheckCallingPackage(context, suggestedPackageName, suggestedCallerUid, 0);
248225
}
249226

250227
@Nullable
251-
public static String getAndCheckCallingPackage(Context context, String suggestedPackageName, int suggestedCallerUid, int suggestedCallerPid) {
228+
public static String getAndCheckCallingPackage(@NonNull Context context, @Nullable String suggestedPackageName, int suggestedCallerUid, int suggestedCallerPid) {
252229
int callingUid = Binder.getCallingUid(), callingPid = Binder.getCallingPid();
253230
if (suggestedCallerUid > 0 && suggestedCallerUid != callingUid) {
254231
throw new SecurityException("suggested UID [" + suggestedCallerUid + "] and real calling UID [" + callingUid + "] mismatch!");
@@ -265,7 +242,7 @@ public static String getAndCheckPackage(Context context, String suggestedPackage
265242
}
266243

267244
@Nullable
268-
public static String getAndCheckPackage(Context context, String suggestedPackageName, int callingUid, int callingPid) {
245+
public static String getAndCheckPackage(@NonNull Context context, @Nullable String suggestedPackageName, int callingUid, int callingPid) {
269246
String packageName = packageFromProcessId(context, callingPid);
270247
if (packageName == null) {
271248
String[] packagesForUid = context.getPackageManager().getPackagesForUid(callingUid);
@@ -287,7 +264,7 @@ public static String getAndCheckPackage(Context context, String suggestedPackage
287264

288265
@Nullable
289266
@Deprecated
290-
public static String packageFromProcessId(Context context, int pid) {
267+
public static String packageFromProcessId(@NonNull Context context, int pid) {
291268
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
292269
if (manager == null) return null;
293270
if (pid <= 0) return null;
@@ -303,7 +280,7 @@ public static String packageFromProcessId(Context context, int pid) {
303280
}
304281

305282
@Nullable
306-
public static String firstPackageFromUserId(Context context, int uid) {
283+
public static String firstPackageFromUserId(@NonNull Context context, int uid) {
307284
String[] packagesForUid = context.getPackageManager().getPackagesForUid(uid);
308285
if (packagesForUid != null && packagesForUid.length != 0) {
309286
return packagesForUid[0];
@@ -312,7 +289,7 @@ public static String firstPackageFromUserId(Context context, int uid) {
312289
}
313290

314291
@SuppressWarnings("deprecation")
315-
public static String packageFromPendingIntent(PendingIntent pi) {
292+
public static String packageFromPendingIntent(@Nullable PendingIntent pi) {
316293
if (pi == null) return null;
317294
if (SDK_INT < 17) {
318295
return pi.getTargetPackage();
@@ -369,23 +346,17 @@ public static void warnIfNotMainProcess(Context context, Class<?> clazz) {
369346
*/
370347
@Deprecated
371348
public static String sha1sum(byte[] bytes) {
372-
MessageDigest md;
373-
try {
374-
md = MessageDigest.getInstance("SHA1");
375-
} catch (final NoSuchAlgorithmException e) {
376-
return null;
377-
}
378-
if (md != null) {
379-
bytes = md.digest(bytes);
380-
if (bytes != null) {
381-
StringBuilder sb = new StringBuilder(2 * bytes.length);
382-
for (byte b : bytes) {
383-
sb.append(String.format("%02x", b));
384-
}
385-
return sb.toString();
386-
}
349+
return bytesToSumString(sha1bytes(bytes));
350+
}
351+
352+
@Nullable
353+
private static String bytesToSumString(@Nullable byte[] bytes) {
354+
if (bytes == null) return null;
355+
StringBuilder sb = new StringBuilder(2 * bytes.length);
356+
for (byte b : bytes) {
357+
sb.append(String.format("%02x", b));
387358
}
388-
return null;
359+
return sb.toString();
389360
}
390361

391362
/**

0 commit comments

Comments
 (0)