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 package com.android.server.devicepolicy; 17 18 import android.app.ActivityManagerInternal; 19 import android.app.AlarmManager; 20 import android.app.IActivityManager; 21 import android.app.IActivityTaskManager; 22 import android.app.NotificationManager; 23 import android.app.PendingIntent; 24 import android.app.admin.DevicePolicyManagerInternal; 25 import android.app.admin.DevicePolicyManagerLiteInternal; 26 import android.app.backup.IBackupManager; 27 import android.app.supervision.SupervisionManagerInternal; 28 import android.app.usage.UsageStatsManagerInternal; 29 import android.content.Context; 30 import android.content.Intent; 31 import android.content.pm.IPackageManager; 32 import android.content.pm.PackageManagerInternal; 33 import android.database.ContentObserver; 34 import android.net.IIpConnectivityMetrics; 35 import android.net.Uri; 36 import android.os.Bundle; 37 import android.os.Environment; 38 import android.os.Looper; 39 import android.os.PowerManagerInternal; 40 import android.os.UserHandle; 41 import android.os.UserManager; 42 import android.permission.IPermissionManager; 43 import android.security.KeyChain; 44 import android.telephony.TelephonyManager; 45 import android.util.ArrayMap; 46 import android.util.Pair; 47 import android.view.IWindowManager; 48 49 import androidx.annotation.NonNull; 50 51 import com.android.internal.util.FunctionalUtils.ThrowingRunnable; 52 import com.android.internal.widget.LockPatternUtils; 53 import com.android.internal.widget.LockSettingsInternal; 54 import com.android.server.AlarmManagerInternal; 55 import com.android.server.LocalServices; 56 import com.android.server.net.NetworkPolicyManagerInternal; 57 import com.android.server.pdb.PersistentDataBlockManagerInternal; 58 import com.android.server.pm.PackageManagerLocal; 59 import com.android.server.pm.UserManagerInternal; 60 import com.android.server.wm.ActivityTaskManagerInternal; 61 62 import java.io.File; 63 import java.io.IOException; 64 import java.util.List; 65 import java.util.Map; 66 67 /** 68 * Overrides {@link #DevicePolicyManagerService} for dependency injection. 69 */ 70 public class DevicePolicyManagerServiceTestable extends DevicePolicyManagerService { 71 public final DpmMockContext context; 72 public final MockInjector mMockInjector; 73 DevicePolicyManagerServiceTestable(MockSystemServices services, DpmMockContext context)74 public DevicePolicyManagerServiceTestable(MockSystemServices services, DpmMockContext context) { 75 this(new MockInjector(services, context), services.pathProvider); 76 } 77 DevicePolicyManagerServiceTestable( MockInjector injector, PolicyPathProvider pathProvider)78 private DevicePolicyManagerServiceTestable( 79 MockInjector injector, PolicyPathProvider pathProvider) { 80 super(unregisterLocalServices(injector), pathProvider); 81 mMockInjector = injector; 82 this.context = injector.context; 83 } 84 85 /** 86 * Unregisters local services to avoid IllegalStateException when DPMS ctor re-registers them. 87 * This is made into a static method to circumvent the requirement to call super() first. 88 * Returns its parameter as is. 89 */ unregisterLocalServices(MockInjector injector)90 private static MockInjector unregisterLocalServices(MockInjector injector) { 91 LocalServices.removeServiceForTest(DevicePolicyManagerLiteInternal.class); 92 LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class); 93 return injector; 94 } 95 notifyChangeToContentObserver(Uri uri, int userHandle)96 public void notifyChangeToContentObserver(Uri uri, int userHandle) { 97 ContentObserver co = mMockInjector.mContentObservers.get(new Pair<>(uri, userHandle)); 98 if (co != null) { 99 co.onChange(false, uri, userHandle); // notify synchronously 100 } 101 102 // Notify USER_ALL observer too. 103 co = mMockInjector.mContentObservers.get(new Pair<>(uri, UserHandle.USER_ALL)); 104 if (co != null) { 105 co.onChange(false, uri, userHandle); // notify synchronously 106 } 107 } 108 109 static class MockInjector extends Injector { 110 111 public final DpmMockContext context; 112 private final MockSystemServices services; 113 114 // Key is a pair of uri and userId 115 private final Map<Pair<Uri, Integer>, ContentObserver> mContentObservers = new ArrayMap<>(); 116 117 // Used as an override when set to nonzero. 118 private long mCurrentTimeMillis = 0; 119 120 private final Map<Long, Pair<String, Integer>> mEnabledChanges = new ArrayMap<>(); 121 MockInjector(MockSystemServices services, DpmMockContext context)122 public MockInjector(MockSystemServices services, DpmMockContext context) { 123 super(context); 124 this.services = services; 125 this.context = context; 126 } 127 128 @Override getUserManager()129 UserManager getUserManager() { 130 return services.userManager; 131 } 132 133 @Override getUserManagerInternal()134 UserManagerInternal getUserManagerInternal() { 135 return services.userManagerInternal; 136 } 137 138 @Override getUsageStatsManagerInternal()139 UsageStatsManagerInternal getUsageStatsManagerInternal() { 140 return services.usageStatsManagerInternal; 141 } 142 143 @Override getNetworkPolicyManagerInternal()144 NetworkPolicyManagerInternal getNetworkPolicyManagerInternal() { 145 return services.networkPolicyManagerInternal; 146 } 147 148 @Override getPackageManagerInternal()149 PackageManagerInternal getPackageManagerInternal() { 150 return services.packageManagerInternal; 151 } 152 153 @Override getPackageManagerLocal()154 PackageManagerLocal getPackageManagerLocal() { 155 return services.packageManagerLocal; 156 } 157 158 @Override getPowerManagerInternal()159 PowerManagerInternal getPowerManagerInternal() { 160 return services.powerManagerInternal; 161 } 162 163 @Override getNotificationManager()164 NotificationManager getNotificationManager() { 165 return services.notificationManager; 166 } 167 168 @Override getIIpConnectivityMetrics()169 IIpConnectivityMetrics getIIpConnectivityMetrics() { 170 return services.iipConnectivityMetrics; 171 } 172 173 @Override getIWindowManager()174 IWindowManager getIWindowManager() { 175 return services.iwindowManager; 176 } 177 178 @Override getIActivityManager()179 IActivityManager getIActivityManager() { 180 return services.iactivityManager; 181 } 182 183 @Override getIActivityTaskManager()184 IActivityTaskManager getIActivityTaskManager() { 185 return services.iactivityTaskManager; 186 } 187 188 @Override getActivityManagerInternal()189 ActivityManagerInternal getActivityManagerInternal() { 190 return services.activityManagerInternal; 191 } 192 193 @Override getActivityTaskManagerInternal()194 ActivityTaskManagerInternal getActivityTaskManagerInternal() { 195 return services.activityTaskManagerInternal; 196 } 197 198 @Override getIPackageManager()199 IPackageManager getIPackageManager() { 200 return services.ipackageManager; 201 } 202 203 @Override getIPermissionManager()204 IPermissionManager getIPermissionManager() { 205 return services.ipermissionManager; 206 } 207 208 @Override getIBackupManager()209 IBackupManager getIBackupManager() { 210 return services.ibackupManager; 211 } 212 213 @Override getLockSettingsInternal()214 LockSettingsInternal getLockSettingsInternal() { 215 return services.lockSettingsInternal; 216 } 217 218 @Override getPersistentDataBlockManagerInternal()219 PersistentDataBlockManagerInternal getPersistentDataBlockManagerInternal() { 220 return services.persistentDataBlockManagerInternal; 221 } 222 223 @Override getMyLooper()224 Looper getMyLooper() { 225 return Looper.getMainLooper(); 226 } 227 228 @Override getAlarmManager()229 AlarmManager getAlarmManager() {return services.alarmManager;} 230 231 @Override getAlarmManagerInternal()232 AlarmManagerInternal getAlarmManagerInternal() { 233 return services.alarmManagerInternal; 234 } 235 236 @Override newLockPatternUtils()237 LockPatternUtils newLockPatternUtils() { 238 return services.lockPatternUtils; 239 } 240 241 @Override storageManagerIsFileBasedEncryptionEnabled()242 boolean storageManagerIsFileBasedEncryptionEnabled() { 243 return services.storageManager.isFileBasedEncryptionEnabled(); 244 } 245 246 @Override binderClearCallingIdentity()247 long binderClearCallingIdentity() { 248 return context.binder.clearCallingIdentity(); 249 } 250 251 @Override binderRestoreCallingIdentity(long token)252 void binderRestoreCallingIdentity(long token) { 253 context.binder.restoreCallingIdentity(token); 254 } 255 256 @Override binderWithCleanCallingIdentity(@onNull ThrowingRunnable action)257 void binderWithCleanCallingIdentity(@NonNull ThrowingRunnable action) { 258 context.binder.withCleanCallingIdentity(action); 259 } 260 261 @Override binderGetCallingUid()262 int binderGetCallingUid() { 263 return context.binder.getCallingUid(); 264 } 265 266 @Override binderGetCallingPid()267 int binderGetCallingPid() { 268 return context.binder.getCallingPid(); 269 } 270 271 @Override binderGetCallingUserHandle()272 UserHandle binderGetCallingUserHandle() { 273 return context.binder.getCallingUserHandle(); 274 } 275 276 @Override binderIsCallingUidMyUid()277 boolean binderIsCallingUidMyUid() { 278 return context.binder.isCallerUidMyUid(); 279 } 280 281 @Override powerManagerGoToSleep(long time, int reason, int flags)282 void powerManagerGoToSleep(long time, int reason, int flags) { 283 services.powerManager.goToSleep(time, reason, flags); 284 } 285 286 @Override powerManagerReboot(String reason)287 void powerManagerReboot(String reason) { 288 services.powerManager.reboot(reason); 289 } 290 291 @Override recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force, boolean wipeEuicc, boolean wipeExtRequested, boolean wipeResetProtectionData)292 boolean recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force, 293 boolean wipeEuicc, boolean wipeExtRequested, boolean wipeResetProtectionData) 294 throws IOException { 295 return services.recoverySystem.rebootWipeUserData(shutdown, reason, force, wipeEuicc, 296 wipeExtRequested, wipeResetProtectionData); 297 } 298 299 @Override systemPropertiesGetBoolean(String key, boolean def)300 boolean systemPropertiesGetBoolean(String key, boolean def) { 301 return services.systemProperties.getBoolean(key, def); 302 } 303 304 @Override systemPropertiesGetLong(String key, long def)305 long systemPropertiesGetLong(String key, long def) { 306 return services.systemProperties.getLong(key, def); 307 } 308 309 @Override systemPropertiesGet(String key, String def)310 String systemPropertiesGet(String key, String def) { 311 return services.systemProperties.get(key, def); 312 } 313 314 @Override systemPropertiesGet(String key)315 String systemPropertiesGet(String key) { 316 return services.systemProperties.get(key); 317 } 318 319 @Override systemPropertiesSet(String key, String value)320 void systemPropertiesSet(String key, String value) { 321 services.systemProperties.set(key, value); 322 } 323 324 @Override userManagerIsHeadlessSystemUserMode()325 boolean userManagerIsHeadlessSystemUserMode() { 326 return services.userManagerForMock.isHeadlessSystemUserMode(); 327 } 328 329 @Override roleManagerGetRoleHoldersAsUser(String role, UserHandle userHandle)330 List<String> roleManagerGetRoleHoldersAsUser(String role, UserHandle userHandle) { 331 return services.roleManagerForMock.getRoleHoldersAsUser(role, userHandle); 332 } 333 334 @Override pendingIntentGetActivityAsUser(Context context, int requestCode, Intent intent, int flags, Bundle options, UserHandle user)335 PendingIntent pendingIntentGetActivityAsUser(Context context, int requestCode, 336 Intent intent, int flags, Bundle options, UserHandle user) { 337 return null; 338 } 339 340 @Override pendingIntentGetBroadcast(Context context, int requestCode, Intent intent, int flags)341 PendingIntent pendingIntentGetBroadcast(Context context, int requestCode, 342 Intent intent, int flags) { 343 return null; 344 } 345 346 @Override registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer, int userHandle)347 void registerContentObserver(Uri uri, boolean notifyForDescendents, 348 ContentObserver observer, int userHandle) { 349 mContentObservers.put(new Pair<Uri, Integer>(uri, userHandle), observer); 350 } 351 352 @Override settingsSecureGetIntForUser(String name, int def, int userHandle)353 int settingsSecureGetIntForUser(String name, int def, int userHandle) { 354 return services.settings.settingsSecureGetIntForUser(name, def, userHandle); 355 } 356 357 @Override settingsSecureGetStringForUser(String name, int userHandle)358 String settingsSecureGetStringForUser(String name, int userHandle) { 359 return services.settings.settingsSecureGetStringForUser(name, userHandle); 360 } 361 362 @Override settingsSecurePutIntForUser(String name, int value, int userHandle)363 void settingsSecurePutIntForUser(String name, int value, int userHandle) { 364 services.settings.settingsSecurePutIntForUser(name, value, userHandle); 365 } 366 367 @Override settingsSecurePutStringForUser(String name, String value, int userHandle)368 void settingsSecurePutStringForUser(String name, String value, int userHandle) { 369 services.settings.settingsSecurePutStringForUser(name, value, userHandle); 370 } 371 372 @Override settingsGlobalPutStringForUser(String name, String value, int userHandle)373 void settingsGlobalPutStringForUser(String name, String value, int userHandle) { 374 services.settings.settingsGlobalPutStringForUser(name, value, userHandle); 375 } 376 377 @Override settingsGlobalPutInt(String name, int value)378 void settingsGlobalPutInt(String name, int value) { 379 services.settings.settingsGlobalPutInt(name, value); 380 } 381 382 @Override settingsGlobalPutString(String name, String value)383 void settingsGlobalPutString(String name, String value) { 384 services.settings.settingsGlobalPutString(name, value); 385 } 386 387 @Override settingsSystemPutStringForUser(String name, String value, int userId)388 void settingsSystemPutStringForUser(String name, String value, int userId) { 389 services.settings.settingsSystemPutStringForUser(name, value, userId); 390 } 391 392 @Override settingsGlobalGetInt(String name, int def)393 int settingsGlobalGetInt(String name, int def) { 394 return services.settings.settingsGlobalGetInt(name, def); 395 } 396 397 @Override settingsGlobalGetString(String name)398 String settingsGlobalGetString(String name) { 399 return services.settings.settingsGlobalGetString(name); 400 } 401 402 @Override securityLogSetLoggingEnabledProperty(boolean enabled)403 void securityLogSetLoggingEnabledProperty(boolean enabled) { 404 services.settings.securityLogSetLoggingEnabledProperty(enabled); 405 } 406 407 @Override securityLogGetLoggingEnabledProperty()408 boolean securityLogGetLoggingEnabledProperty() { 409 return services.settings.securityLogGetLoggingEnabledProperty(); 410 } 411 412 @Override securityLogIsLoggingEnabled()413 boolean securityLogIsLoggingEnabled() { 414 return services.settings.securityLogIsLoggingEnabled(); 415 } 416 417 @Override getTelephonyManager()418 TelephonyManager getTelephonyManager() { 419 return services.telephonyManager; 420 } 421 422 @Override isBuildDebuggable()423 boolean isBuildDebuggable() { 424 return services.buildMock.isDebuggable; 425 } 426 427 @Override keyChainBind()428 KeyChain.KeyChainConnection keyChainBind() { 429 return services.keyChainConnection; 430 } 431 432 @Override keyChainBindAsUser(UserHandle user)433 KeyChain.KeyChainConnection keyChainBindAsUser(UserHandle user) { 434 return services.keyChainConnection; 435 } 436 437 @Override postOnSystemServerInitThreadPool(Runnable runnable)438 void postOnSystemServerInitThreadPool(Runnable runnable) { 439 runnable.run(); 440 } 441 442 @Override newTransferOwnershipMetadataManager()443 public TransferOwnershipMetadataManager newTransferOwnershipMetadataManager() { 444 return new TransferOwnershipMetadataManager( 445 new TransferOwnershipMetadataManagerMockInjector()); 446 } 447 448 @Override runCryptoSelfTest()449 public void runCryptoSelfTest() {} 450 setSystemCurrentTimeMillis(long value)451 public void setSystemCurrentTimeMillis(long value) { 452 mCurrentTimeMillis = value; 453 } 454 455 @Override systemCurrentTimeMillis()456 public long systemCurrentTimeMillis() { 457 return mCurrentTimeMillis != 0 ? mCurrentTimeMillis : System.currentTimeMillis(); 458 } 459 setChangeEnabledForPackage( long changeId, boolean enabled, String packageName, int userId)460 public void setChangeEnabledForPackage( 461 long changeId, boolean enabled, String packageName, int userId) { 462 if (enabled) { 463 mEnabledChanges.put(changeId, Pair.create(packageName, userId)); 464 } else { 465 mEnabledChanges.remove(changeId); 466 } 467 } 468 clearEnabledChanges()469 public void clearEnabledChanges() { 470 mEnabledChanges.clear(); 471 } 472 473 @Override isChangeEnabled(long changeId, String packageName, int userId)474 public boolean isChangeEnabled(long changeId, String packageName, int userId) { 475 Pair<String, Integer> packageAndUser = mEnabledChanges.get(changeId); 476 if (packageAndUser == null) { 477 return false; 478 } 479 480 if (!packageAndUser.first.equals(packageName) 481 || !packageAndUser.second.equals(userId)) { 482 return false; 483 } 484 485 return true; 486 } 487 488 @Override createContextAsUser(UserHandle user)489 public Context createContextAsUser(UserHandle user) { 490 return context; 491 } 492 493 @Override getSupervisionManager()494 SupervisionManagerInternal getSupervisionManager() { 495 return services.supervisionManagerInternal; 496 } 497 } 498 499 static class TransferOwnershipMetadataManagerMockInjector extends 500 TransferOwnershipMetadataManager.Injector { 501 @Override getOwnerTransferMetadataDir()502 public File getOwnerTransferMetadataDir() { 503 return Environment.getExternalStorageDirectory(); 504 } 505 } 506 } 507