1 /* 2 * Copyright (C) 2015 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.devicepolicy; 18 19 import static org.mockito.Mockito.mock; 20 import static org.mockito.Mockito.when; 21 22 import android.annotation.Nullable; 23 import android.app.AppOpsManager; 24 import android.content.BroadcastReceiver; 25 import android.content.ContentResolver; 26 import android.content.Context; 27 import android.content.Intent; 28 import android.content.IntentFilter; 29 import android.content.pm.ApplicationInfo; 30 import android.content.pm.PackageManager; 31 import android.content.res.Resources; 32 import android.os.Bundle; 33 import android.os.Handler; 34 import android.os.UserHandle; 35 import android.test.mock.MockContext; 36 import android.util.ArrayMap; 37 import android.util.DisplayMetrics; 38 import android.util.ExceptionUtils; 39 40 import androidx.annotation.NonNull; 41 42 import com.android.internal.util.FunctionalUtils; 43 import com.android.server.pm.UserManagerInternal; 44 45 import org.junit.Assert; 46 47 import java.util.ArrayList; 48 import java.util.List; 49 import java.util.Map; 50 import java.util.concurrent.Executor; 51 52 /** 53 * Context used throughout DPMS tests. 54 */ 55 public class DpmMockContext extends MockContext { 56 /** 57 * User-id of a non-system user we use throughout unit tests. 58 */ 59 public static final int CALLER_USER_HANDLE = 20; 60 61 /** 62 * UID corresponding to {@link #CALLER_USER_HANDLE}. 63 */ 64 public static final int CALLER_UID = UserHandle.getUid(CALLER_USER_HANDLE, 20123); 65 66 /** 67 * UID corresponding to {@link #CALLER_USER_HANDLE}. 68 */ 69 public static final int CALLER_MANAGED_PROVISIONING_UID = UserHandle.getUid(CALLER_USER_HANDLE, 70 20125); 71 72 /** 73 * UID used when a caller is on the system user. 74 */ 75 public static final int CALLER_SYSTEM_USER_UID = 20321; 76 77 /** 78 * PID of the caller. 79 */ 80 public static final int CALLER_PID = 22222; 81 82 /** 83 * UID of the system server. 84 */ 85 public static final int SYSTEM_UID = android.os.Process.SYSTEM_UID; 86 87 /** 88 * PID of the system server. 89 */ 90 public static final int SYSTEM_PID = 11111; 91 92 public static final String ANOTHER_PACKAGE_NAME = "com.another.package.name"; 93 public static final int ANOTHER_UID = UserHandle.getUid(UserHandle.USER_SYSTEM, 18434); 94 95 public static final String DELEGATE_PACKAGE_NAME = "com.delegate.package.name"; 96 public static final int DELEGATE_CERT_INSTALLER_UID = UserHandle.getUid(UserHandle.USER_SYSTEM, 97 18437); 98 99 private final MockSystemServices mMockSystemServices; 100 101 public static class MockBinder { 102 public int callingUid = CALLER_UID; 103 public int callingPid = CALLER_PID; 104 public final Map<Integer, List<String>> callingPermissions = new ArrayMap<>(); 105 clearCallingIdentity()106 public long clearCallingIdentity() { 107 final long token = (((long) callingUid) << 32) | (callingPid); 108 callingUid = SYSTEM_UID; 109 callingPid = SYSTEM_PID; 110 return token; 111 } 112 restoreCallingIdentity(long token)113 public void restoreCallingIdentity(long token) { 114 callingUid = (int) (token >> 32); 115 callingPid = (int) token; 116 } 117 withCleanCallingIdentity(@onNull FunctionalUtils.ThrowingRunnable action)118 public void withCleanCallingIdentity(@NonNull FunctionalUtils.ThrowingRunnable action) { 119 final long callingIdentity = clearCallingIdentity(); 120 Throwable throwableToPropagate = null; 121 try { 122 action.runOrThrow(); 123 } catch (Throwable throwable) { 124 throwableToPropagate = throwable; 125 } finally { 126 restoreCallingIdentity(callingIdentity); 127 if (throwableToPropagate != null) { 128 throw ExceptionUtils.propagate(throwableToPropagate); 129 } 130 } 131 } 132 getCallingUid()133 public int getCallingUid() { 134 return callingUid; 135 } 136 getCallingPid()137 public int getCallingPid() { 138 return callingPid; 139 } 140 getCallingUserHandle()141 public UserHandle getCallingUserHandle() { 142 return new UserHandle(UserHandle.getUserId(getCallingUid())); 143 } 144 isCallerUidMyUid()145 public boolean isCallerUidMyUid() { 146 return callingUid == SYSTEM_UID; 147 } 148 } 149 150 private final Context realTestContext; 151 152 /** 153 * Use this instance to verify unimplemented methods such as {@link #sendBroadcast}. 154 * (Spying on {@code this} instance will confuse mockito somehow and I got weired "wrong number 155 * of arguments" exceptions.) 156 */ 157 public final Context spiedContext; 158 159 public final MockBinder binder; 160 public final Resources resources; 161 162 /** TODO: Migrate everything to use {@link #permissions} to avoid confusion. */ 163 @Deprecated 164 public final List<String> callerPermissions = new ArrayList<>(); 165 166 /** Less confusing alias for {@link #callerPermissions}. */ 167 public final List<String> permissions = callerPermissions; 168 169 public String packageName = null; 170 171 public ApplicationInfo applicationInfo = null; 172 DpmMockContext(MockSystemServices mockSystemServices, Context context)173 public DpmMockContext(MockSystemServices mockSystemServices, Context context) { 174 this(mockSystemServices, context, new MockBinder()); 175 } 176 DpmMockContext(MockSystemServices mockSystemServices, Context context, @NonNull MockBinder mockBinder)177 public DpmMockContext(MockSystemServices mockSystemServices, Context context, 178 @NonNull MockBinder mockBinder) { 179 mMockSystemServices = mockSystemServices; 180 realTestContext = context; 181 binder = mockBinder; 182 183 resources = mock(Resources.class); 184 spiedContext = mock(Context.class); 185 186 // Set up density for notification building 187 DisplayMetrics displayMetrics = mock(DisplayMetrics.class); 188 displayMetrics.density = 2.25f; 189 when(resources.getDisplayMetrics()).thenReturn(displayMetrics); 190 } 191 192 @Override getResources()193 public Resources getResources() { 194 return resources; 195 } 196 197 @Override getTheme()198 public Resources.Theme getTheme() { 199 return spiedContext.getTheme(); 200 } 201 202 @Override getPackageName()203 public String getPackageName() { 204 if (packageName != null) { 205 return packageName; 206 } 207 return super.getPackageName(); 208 } 209 210 @Override getOpPackageName()211 public String getOpPackageName() { 212 return getPackageName(); 213 } 214 215 @Override getApplicationInfo()216 public ApplicationInfo getApplicationInfo() { 217 if (applicationInfo != null) { 218 return applicationInfo; 219 } 220 return super.getApplicationInfo(); 221 } 222 223 @Override getSystemService(String name)224 public Object getSystemService(String name) { 225 switch (name) { 226 case Context.ALARM_SERVICE: 227 return mMockSystemServices.alarmManager; 228 case Context.USER_SERVICE: 229 return mMockSystemServices.userManager; 230 case Context.POWER_SERVICE: 231 return mMockSystemServices.powerManager; 232 case Context.WIFI_SERVICE: 233 return mMockSystemServices.wifiManager; 234 case Context.ACCOUNT_SERVICE: 235 return mMockSystemServices.accountManager; 236 case Context.TELEPHONY_SERVICE: 237 return mMockSystemServices.telephonyManager; 238 case Context.CONNECTIVITY_SERVICE: 239 return mMockSystemServices.connectivityManager; 240 case Context.APP_OPS_SERVICE: 241 return mMockSystemServices.appOpsManager; 242 case Context.CROSS_PROFILE_APPS_SERVICE: 243 return mMockSystemServices.crossProfileApps; 244 case Context.VPN_MANAGEMENT_SERVICE: 245 return mMockSystemServices.vpnManager; 246 case Context.DEVICE_POLICY_SERVICE: 247 return mMockSystemServices.devicePolicyManager; 248 case Context.LOCATION_SERVICE: 249 return mMockSystemServices.locationManager; 250 case Context.ROLE_SERVICE: 251 return mMockSystemServices.roleManager; 252 case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 253 return mMockSystemServices.subscriptionManager; 254 case Context.USB_SERVICE: 255 return mMockSystemServices.usbManager; 256 case Context.EUICC_SERVICE: 257 return mMockSystemServices.euiccManager; 258 } 259 throw new UnsupportedOperationException(); 260 } 261 262 @Override getSystemServiceName(Class<?> serviceClass)263 public String getSystemServiceName(Class<?> serviceClass) { 264 return realTestContext.getSystemServiceName(serviceClass); 265 } 266 267 @Override getApplicationContext()268 public Context getApplicationContext() { 269 return this; 270 } 271 272 @Override getPackageManager()273 public PackageManager getPackageManager() { 274 return mMockSystemServices.packageManager; 275 } 276 getUserManagerInternal()277 public UserManagerInternal getUserManagerInternal() { 278 return mMockSystemServices.userManagerInternal; 279 } 280 281 @Override enforceCallingOrSelfPermission(String permission, String message)282 public void enforceCallingOrSelfPermission(String permission, String message) { 283 if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) { 284 return; // Assume system has all permissions. 285 } 286 List<String> permissions = binder.callingPermissions.get(binder.getCallingUid()); 287 if (permissions == null) { 288 // TODO: delete the following line. to do this without breaking any tests, first it's 289 // necessary to remove all tests that set it directly. 290 permissions = callerPermissions; 291 // throw new UnsupportedOperationException( 292 // "Caller UID " + binder.getCallingUid() + " doesn't exist"); 293 } 294 if (!permissions.contains(permission)) { 295 throw new SecurityException("Caller doesn't have " + permission + " : " + message); 296 } 297 } 298 299 @Override checkPermission(String permission, int pid, int uid)300 public int checkPermission(String permission, int pid, int uid) { 301 return checkPermission(permission); 302 } 303 304 @Override sendBroadcast(Intent intent)305 public void sendBroadcast(Intent intent) { 306 spiedContext.sendBroadcast(intent); 307 } 308 309 @Override sendBroadcast(Intent intent, String receiverPermission)310 public void sendBroadcast(Intent intent, String receiverPermission) { 311 spiedContext.sendBroadcast(intent, receiverPermission); 312 } 313 314 @Override sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions)315 public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) { 316 spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions); 317 } 318 319 @Override sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, Bundle options)320 public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, 321 Bundle options) { 322 spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions, options); 323 } 324 325 @Override sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions)326 public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, 327 String[] receiverPermissions) { 328 spiedContext.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions); 329 } 330 331 @Override sendBroadcast(Intent intent, String receiverPermission, Bundle options)332 public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { 333 spiedContext.sendBroadcast(intent, receiverPermission, options); 334 } 335 336 @Override sendBroadcast(Intent intent, String receiverPermission, int appOp)337 public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { 338 spiedContext.sendBroadcast(intent, receiverPermission, appOp); 339 } 340 341 @Override sendOrderedBroadcast(Intent intent, String receiverPermission)342 public void sendOrderedBroadcast(Intent intent, String receiverPermission) { 343 spiedContext.sendOrderedBroadcast(intent, receiverPermission); 344 } 345 346 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)347 public void sendOrderedBroadcast(Intent intent, String receiverPermission, 348 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 349 String initialData, Bundle initialExtras) { 350 spiedContext.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 351 initialCode, initialData, initialExtras); 352 } 353 354 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)355 public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, 356 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 357 String initialData, Bundle initialExtras) { 358 spiedContext.sendOrderedBroadcast(intent, receiverPermission, options, resultReceiver, 359 scheduler, 360 initialCode, initialData, initialExtras); 361 } 362 363 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)364 public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, 365 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 366 String initialData, Bundle initialExtras) { 367 spiedContext.sendOrderedBroadcast(intent, receiverPermission, appOp, resultReceiver, 368 scheduler, 369 initialCode, initialData, initialExtras); 370 } 371 372 @Override sendBroadcastAsUser(Intent intent, UserHandle user)373 public void sendBroadcastAsUser(Intent intent, UserHandle user) { 374 if (binder.callingPid != SYSTEM_PID) { 375 // Unless called as the system process, can only call if the target user is the 376 // calling user. 377 // (The actual check is more complex; we may need to change it later.) 378 Assert.assertEquals(UserHandle.getUserId(binder.getCallingUid()), user.getIdentifier()); 379 } 380 381 spiedContext.sendBroadcastAsUser(intent, user); 382 } 383 384 @Override sendBroadcastAsUser(Intent intent, UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options)385 public void sendBroadcastAsUser(Intent intent, 386 UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options) { 387 spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, options); 388 } 389 390 @Override sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)391 public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { 392 spiedContext.sendBroadcastAsUser(intent, user, receiverPermission); 393 } 394 395 @Override sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp)396 public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, 397 int appOp) { 398 spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, appOp); 399 } 400 401 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)402 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 403 String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 404 int initialCode, String initialData, Bundle initialExtras) { 405 sendOrderedBroadcastAsUser( 406 intent, user, receiverPermission, AppOpsManager.OP_NONE, resultReceiver, 407 scheduler, initialCode, initialData, initialExtras); 408 } 409 410 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)411 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 412 String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 413 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 414 sendOrderedBroadcastAsUser( 415 intent, user, receiverPermission, appOp, null, resultReceiver, 416 scheduler, initialCode, initialData, initialExtras); 417 } 418 419 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)420 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 421 String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, 422 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 423 spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, options, 424 resultReceiver, scheduler, initialCode, initialData, initialExtras); 425 resultReceiver.onReceive(spiedContext, intent); 426 } 427 428 @Override sendStickyBroadcast(Intent intent)429 public void sendStickyBroadcast(Intent intent) { 430 spiedContext.sendStickyBroadcast(intent); 431 } 432 433 @Override sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)434 public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, 435 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 436 spiedContext.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, 437 initialData, initialExtras); 438 } 439 440 @Override removeStickyBroadcast(Intent intent)441 public void removeStickyBroadcast(Intent intent) { 442 spiedContext.removeStickyBroadcast(intent); 443 } 444 445 @Override sendStickyBroadcastAsUser(Intent intent, UserHandle user)446 public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 447 spiedContext.sendStickyBroadcastAsUser(intent, user); 448 } 449 450 @Override sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)451 public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, 452 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 453 String initialData, Bundle initialExtras) { 454 spiedContext.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode, 455 initialData, initialExtras); 456 } 457 458 @Override removeStickyBroadcastAsUser(Intent intent, UserHandle user)459 public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { 460 spiedContext.removeStickyBroadcastAsUser(intent, user); 461 } 462 463 @Override registerReceiver(BroadcastReceiver receiver, IntentFilter filter)464 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 465 mMockSystemServices.registerReceiver(receiver, filter, null); 466 return spiedContext.registerReceiver(receiver, filter, 467 Context.RECEIVER_EXPORTED_UNAUDITED); 468 } 469 470 @Override registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)471 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) { 472 mMockSystemServices.registerReceiver(receiver, filter, null); 473 return spiedContext.registerReceiver(receiver, filter, flags); 474 } 475 476 @Override registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)477 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 478 String broadcastPermission, Handler scheduler) { 479 mMockSystemServices.registerReceiver(receiver, filter, scheduler); 480 return spiedContext.registerReceiver(receiver, filter, broadcastPermission, scheduler); 481 } 482 483 @Override registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)484 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 485 IntentFilter filter, String broadcastPermission, Handler scheduler) { 486 mMockSystemServices.registerReceiver(receiver, filter, scheduler); 487 return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission, 488 scheduler); 489 } 490 491 @Override registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)492 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 493 IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) { 494 mMockSystemServices.registerReceiver(receiver, filter, scheduler); 495 return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission, 496 scheduler, flags); 497 } 498 499 @Override unregisterReceiver(BroadcastReceiver receiver)500 public void unregisterReceiver(BroadcastReceiver receiver) { 501 mMockSystemServices.unregisterReceiver(receiver); 502 spiedContext.unregisterReceiver(receiver); 503 } 504 505 @Override createPackageContextAsUser(String packageName, int flags, UserHandle user)506 public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 507 throws PackageManager.NameNotFoundException { 508 return mMockSystemServices.createPackageContextAsUser(packageName, flags, user); 509 } 510 511 @Override createContextAsUser(UserHandle user, int flags)512 public Context createContextAsUser(UserHandle user, int flags) { 513 try { 514 return mMockSystemServices.createPackageContextAsUser(packageName, flags, user); 515 } catch (PackageManager.NameNotFoundException e) { 516 throw new IllegalStateException(e); 517 } 518 } 519 520 @Override getContentResolver()521 public ContentResolver getContentResolver() { 522 return mMockSystemServices.contentResolver; 523 } 524 525 @Override getUserId()526 public int getUserId() { 527 return UserHandle.getUserId(binder.getCallingUid()); 528 } 529 530 @Override getMainExecutor()531 public Executor getMainExecutor() { 532 return mMockSystemServices.executor; 533 } 534 535 @Override checkCallingPermission(String permission)536 public int checkCallingPermission(String permission) { 537 return checkPermission(permission); 538 } 539 540 @Override checkCallingOrSelfPermission(String permission)541 public int checkCallingOrSelfPermission(String permission) { 542 return checkPermission(permission); 543 } 544 545 @Override startActivityAsUser(Intent intent, UserHandle userHandle)546 public void startActivityAsUser(Intent intent, UserHandle userHandle) { 547 spiedContext.startActivityAsUser(intent, userHandle); 548 } 549 checkPermission(String permission)550 private int checkPermission(String permission) { 551 if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) { 552 return PackageManager.PERMISSION_GRANTED; // Assume system has all permissions. 553 } 554 List<String> permissions = binder.callingPermissions.get(binder.getCallingUid()); 555 if (permissions == null) { 556 permissions = callerPermissions; 557 } 558 if (permissions.contains(permission)) { 559 return PackageManager.PERMISSION_GRANTED; 560 } else { 561 return PackageManager.PERMISSION_DENIED; 562 } 563 } 564 565 } 566