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 mMockSystemServices = mockSystemServices; 175 realTestContext = context; 176 177 binder = new MockBinder(); 178 resources = mock(Resources.class); 179 spiedContext = mock(Context.class); 180 181 // Set up density for notification building 182 DisplayMetrics displayMetrics = mock(DisplayMetrics.class); 183 displayMetrics.density = 2.25f; 184 when(resources.getDisplayMetrics()).thenReturn(displayMetrics); 185 } 186 187 @Override getResources()188 public Resources getResources() { 189 return resources; 190 } 191 192 @Override getTheme()193 public Resources.Theme getTheme() { 194 return spiedContext.getTheme(); 195 } 196 197 @Override getPackageName()198 public String getPackageName() { 199 if (packageName != null) { 200 return packageName; 201 } 202 return super.getPackageName(); 203 } 204 205 @Override getApplicationInfo()206 public ApplicationInfo getApplicationInfo() { 207 if (applicationInfo != null) { 208 return applicationInfo; 209 } 210 return super.getApplicationInfo(); 211 } 212 213 @Override getSystemService(String name)214 public Object getSystemService(String name) { 215 switch (name) { 216 case Context.ALARM_SERVICE: 217 return mMockSystemServices.alarmManager; 218 case Context.USER_SERVICE: 219 return mMockSystemServices.userManager; 220 case Context.POWER_SERVICE: 221 return mMockSystemServices.powerManager; 222 case Context.WIFI_SERVICE: 223 return mMockSystemServices.wifiManager; 224 case Context.ACCOUNT_SERVICE: 225 return mMockSystemServices.accountManager; 226 case Context.TELEPHONY_SERVICE: 227 return mMockSystemServices.telephonyManager; 228 case Context.CONNECTIVITY_SERVICE: 229 return mMockSystemServices.connectivityManager; 230 case Context.APP_OPS_SERVICE: 231 return mMockSystemServices.appOpsManager; 232 case Context.CROSS_PROFILE_APPS_SERVICE: 233 return mMockSystemServices.crossProfileApps; 234 case Context.VPN_MANAGEMENT_SERVICE: 235 return mMockSystemServices.vpnManager; 236 case Context.DEVICE_POLICY_SERVICE: 237 return mMockSystemServices.devicePolicyManager; 238 case Context.LOCATION_SERVICE: 239 return mMockSystemServices.locationManager; 240 case Context.ROLE_SERVICE: 241 return mMockSystemServices.roleManager; 242 } 243 throw new UnsupportedOperationException(); 244 } 245 246 @Override getSystemServiceName(Class<?> serviceClass)247 public String getSystemServiceName(Class<?> serviceClass) { 248 return realTestContext.getSystemServiceName(serviceClass); 249 } 250 251 @Override getPackageManager()252 public PackageManager getPackageManager() { 253 return mMockSystemServices.packageManager; 254 } 255 getUserManagerInternal()256 public UserManagerInternal getUserManagerInternal() { 257 return mMockSystemServices.userManagerInternal; 258 } 259 260 @Override enforceCallingOrSelfPermission(String permission, String message)261 public void enforceCallingOrSelfPermission(String permission, String message) { 262 if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) { 263 return; // Assume system has all permissions. 264 } 265 List<String> permissions = binder.callingPermissions.get(binder.getCallingUid()); 266 if (permissions == null) { 267 // TODO: delete the following line. to do this without breaking any tests, first it's 268 // necessary to remove all tests that set it directly. 269 permissions = callerPermissions; 270 // throw new UnsupportedOperationException( 271 // "Caller UID " + binder.getCallingUid() + " doesn't exist"); 272 } 273 if (!permissions.contains(permission)) { 274 throw new SecurityException("Caller doesn't have " + permission + " : " + message); 275 } 276 } 277 278 @Override checkPermission(String permission, int pid, int uid)279 public int checkPermission(String permission, int pid, int uid) { 280 return checkPermission(permission); 281 } 282 283 @Override sendBroadcast(Intent intent)284 public void sendBroadcast(Intent intent) { 285 spiedContext.sendBroadcast(intent); 286 } 287 288 @Override sendBroadcast(Intent intent, String receiverPermission)289 public void sendBroadcast(Intent intent, String receiverPermission) { 290 spiedContext.sendBroadcast(intent, receiverPermission); 291 } 292 293 @Override sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions)294 public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) { 295 spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions); 296 } 297 298 @Override sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, Bundle options)299 public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, 300 Bundle options) { 301 spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions, options); 302 } 303 304 @Override sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions)305 public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, 306 String[] receiverPermissions) { 307 spiedContext.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions); 308 } 309 310 @Override sendBroadcast(Intent intent, String receiverPermission, Bundle options)311 public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) { 312 spiedContext.sendBroadcast(intent, receiverPermission, options); 313 } 314 315 @Override sendBroadcast(Intent intent, String receiverPermission, int appOp)316 public void sendBroadcast(Intent intent, String receiverPermission, int appOp) { 317 spiedContext.sendBroadcast(intent, receiverPermission, appOp); 318 } 319 320 @Override sendOrderedBroadcast(Intent intent, String receiverPermission)321 public void sendOrderedBroadcast(Intent intent, String receiverPermission) { 322 spiedContext.sendOrderedBroadcast(intent, receiverPermission); 323 } 324 325 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)326 public void sendOrderedBroadcast(Intent intent, String receiverPermission, 327 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 328 String initialData, Bundle initialExtras) { 329 spiedContext.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 330 initialCode, initialData, initialExtras); 331 } 332 333 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)334 public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, 335 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 336 String initialData, Bundle initialExtras) { 337 spiedContext.sendOrderedBroadcast(intent, receiverPermission, options, resultReceiver, 338 scheduler, 339 initialCode, initialData, initialExtras); 340 } 341 342 @Override sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)343 public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, 344 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 345 String initialData, Bundle initialExtras) { 346 spiedContext.sendOrderedBroadcast(intent, receiverPermission, appOp, resultReceiver, 347 scheduler, 348 initialCode, initialData, initialExtras); 349 } 350 351 @Override sendBroadcastAsUser(Intent intent, UserHandle user)352 public void sendBroadcastAsUser(Intent intent, UserHandle user) { 353 if (binder.callingPid != SYSTEM_PID) { 354 // Unless called as the system process, can only call if the target user is the 355 // calling user. 356 // (The actual check is more complex; we may need to change it later.) 357 Assert.assertEquals(UserHandle.getUserId(binder.getCallingUid()), user.getIdentifier()); 358 } 359 360 spiedContext.sendBroadcastAsUser(intent, user); 361 } 362 363 @Override sendBroadcastAsUser(Intent intent, UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options)364 public void sendBroadcastAsUser(Intent intent, 365 UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options) { 366 spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, options); 367 } 368 369 @Override sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)370 public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { 371 spiedContext.sendBroadcastAsUser(intent, user, receiverPermission); 372 } 373 374 @Override sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp)375 public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, 376 int appOp) { 377 spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, appOp); 378 } 379 380 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)381 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 382 String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 383 int initialCode, String initialData, Bundle initialExtras) { 384 sendOrderedBroadcastAsUser( 385 intent, user, receiverPermission, AppOpsManager.OP_NONE, resultReceiver, 386 scheduler, initialCode, initialData, initialExtras); 387 } 388 389 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)390 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 391 String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 392 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 393 sendOrderedBroadcastAsUser( 394 intent, user, receiverPermission, appOp, null, resultReceiver, 395 scheduler, initialCode, initialData, initialExtras); 396 } 397 398 @Override sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)399 public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 400 String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, 401 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 402 spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, options, 403 resultReceiver, scheduler, initialCode, initialData, initialExtras); 404 resultReceiver.onReceive(spiedContext, intent); 405 } 406 407 @Override sendStickyBroadcast(Intent intent)408 public void sendStickyBroadcast(Intent intent) { 409 spiedContext.sendStickyBroadcast(intent); 410 } 411 412 @Override sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)413 public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, 414 Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 415 spiedContext.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, 416 initialData, initialExtras); 417 } 418 419 @Override removeStickyBroadcast(Intent intent)420 public void removeStickyBroadcast(Intent intent) { 421 spiedContext.removeStickyBroadcast(intent); 422 } 423 424 @Override sendStickyBroadcastAsUser(Intent intent, UserHandle user)425 public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) { 426 spiedContext.sendStickyBroadcastAsUser(intent, user); 427 } 428 429 @Override sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)430 public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, 431 BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 432 String initialData, Bundle initialExtras) { 433 spiedContext.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode, 434 initialData, initialExtras); 435 } 436 437 @Override removeStickyBroadcastAsUser(Intent intent, UserHandle user)438 public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) { 439 spiedContext.removeStickyBroadcastAsUser(intent, user); 440 } 441 442 @Override registerReceiver(BroadcastReceiver receiver, IntentFilter filter)443 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 444 mMockSystemServices.registerReceiver(receiver, filter, null); 445 return spiedContext.registerReceiver(receiver, filter); 446 } 447 448 @Override registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)449 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) { 450 mMockSystemServices.registerReceiver(receiver, filter, null); 451 return spiedContext.registerReceiver(receiver, filter, flags); 452 } 453 454 @Override registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)455 public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 456 String broadcastPermission, Handler scheduler) { 457 mMockSystemServices.registerReceiver(receiver, filter, scheduler); 458 return spiedContext.registerReceiver(receiver, filter, broadcastPermission, scheduler); 459 } 460 461 @Override registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)462 public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 463 IntentFilter filter, String broadcastPermission, Handler scheduler) { 464 mMockSystemServices.registerReceiver(receiver, filter, scheduler); 465 return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission, 466 scheduler); 467 } 468 469 @Override unregisterReceiver(BroadcastReceiver receiver)470 public void unregisterReceiver(BroadcastReceiver receiver) { 471 mMockSystemServices.unregisterReceiver(receiver); 472 spiedContext.unregisterReceiver(receiver); 473 } 474 475 @Override createPackageContextAsUser(String packageName, int flags, UserHandle user)476 public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 477 throws PackageManager.NameNotFoundException { 478 return mMockSystemServices.createPackageContextAsUser(packageName, flags, user); 479 } 480 481 @Override createContextAsUser(UserHandle user, int flags)482 public Context createContextAsUser(UserHandle user, int flags) { 483 try { 484 return mMockSystemServices.createPackageContextAsUser(packageName, flags, user); 485 } catch (PackageManager.NameNotFoundException e) { 486 throw new IllegalStateException(e); 487 } 488 } 489 490 @Override getContentResolver()491 public ContentResolver getContentResolver() { 492 return mMockSystemServices.contentResolver; 493 } 494 495 @Override getUserId()496 public int getUserId() { 497 return UserHandle.getUserId(binder.getCallingUid()); 498 } 499 500 @Override getMainExecutor()501 public Executor getMainExecutor() { 502 return mMockSystemServices.executor; 503 } 504 505 @Override checkCallingPermission(String permission)506 public int checkCallingPermission(String permission) { 507 return checkPermission(permission); 508 } 509 510 @Override checkCallingOrSelfPermission(String permission)511 public int checkCallingOrSelfPermission(String permission) { 512 return checkPermission(permission); 513 } 514 515 @Override startActivityAsUser(Intent intent, UserHandle userHandle)516 public void startActivityAsUser(Intent intent, UserHandle userHandle) { 517 spiedContext.startActivityAsUser(intent, userHandle); 518 } 519 checkPermission(String permission)520 private int checkPermission(String permission) { 521 if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) { 522 return PackageManager.PERMISSION_GRANTED; // Assume system has all permissions. 523 } 524 List<String> permissions = binder.callingPermissions.get(binder.getCallingUid()); 525 if (permissions == null) { 526 permissions = callerPermissions; 527 } 528 if (permissions.contains(permission)) { 529 return PackageManager.PERMISSION_GRANTED; 530 } else { 531 return PackageManager.PERMISSION_DENIED; 532 } 533 } 534 535 } 536