2626import android .os .Binder ;
2727import android .util .Log ;
2828
29+ import androidx .annotation .NonNull ;
2930import androidx .annotation .Nullable ;
3031import org .microg .gms .utils .ExtendedPackageInfo ;
3132
3637import java .util .List ;
3738
3839import static android .os .Build .VERSION .SDK_INT ;
39- import static org .microg .gms .common .Constants .GMS_PACKAGE_NAME ;
4040import static org .microg .gms .common .Constants .GMS_PACKAGE_SIGNATURE_SHA1 ;
4141import 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