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.usage.UsageStatsManagerInternal; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.pm.IPackageManager; 31 import android.content.pm.PackageManagerInternal; 32 import android.database.ContentObserver; 33 import android.hardware.usb.UsbManager; 34 import android.media.IAudioService; 35 import android.net.IIpConnectivityMetrics; 36 import android.net.Uri; 37 import android.os.Bundle; 38 import android.os.Environment; 39 import android.os.Looper; 40 import android.os.PowerManagerInternal; 41 import android.os.UserHandle; 42 import android.os.UserManager; 43 import android.permission.IPermissionManager; 44 import android.security.KeyChain; 45 import android.telephony.TelephonyManager; 46 import android.util.ArrayMap; 47 import android.util.Pair; 48 import android.view.IWindowManager; 49 50 import androidx.annotation.NonNull; 51 52 import com.android.internal.util.FunctionalUtils.ThrowingRunnable; 53 import com.android.internal.widget.LockPatternUtils; 54 import com.android.internal.widget.LockSettingsInternal; 55 import com.android.server.AlarmManagerInternal; 56 import com.android.server.LocalServices; 57 import com.android.server.PersistentDataBlockManagerInternal; 58 import com.android.server.net.NetworkPolicyManagerInternal; 59 import com.android.server.pm.PackageManagerLocal; 60 import com.android.server.pm.UserManagerInternal; 61 import com.android.server.wm.ActivityTaskManagerInternal; 62 63 import java.io.File; 64 import java.io.IOException; 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 getIAudioService()219 IAudioService getIAudioService() { 220 return services.iaudioService; 221 } 222 223 @Override getPersistentDataBlockManagerInternal()224 PersistentDataBlockManagerInternal getPersistentDataBlockManagerInternal() { 225 return services.persistentDataBlockManagerInternal; 226 } 227 228 @Override getMyLooper()229 Looper getMyLooper() { 230 return Looper.getMainLooper(); 231 } 232 233 @Override getAlarmManager()234 AlarmManager getAlarmManager() {return services.alarmManager;} 235 236 @Override getAlarmManagerInternal()237 AlarmManagerInternal getAlarmManagerInternal() { 238 return services.alarmManagerInternal; 239 } 240 241 @Override newLockPatternUtils()242 LockPatternUtils newLockPatternUtils() { 243 return services.lockPatternUtils; 244 } 245 246 @Override getUsbManager()247 UsbManager getUsbManager() { 248 return services.usbManager; 249 } 250 251 @Override storageManagerIsFileBasedEncryptionEnabled()252 boolean storageManagerIsFileBasedEncryptionEnabled() { 253 return services.storageManager.isFileBasedEncryptionEnabled(); 254 } 255 256 @Override binderClearCallingIdentity()257 long binderClearCallingIdentity() { 258 return context.binder.clearCallingIdentity(); 259 } 260 261 @Override binderRestoreCallingIdentity(long token)262 void binderRestoreCallingIdentity(long token) { 263 context.binder.restoreCallingIdentity(token); 264 } 265 266 @Override binderWithCleanCallingIdentity(@onNull ThrowingRunnable action)267 void binderWithCleanCallingIdentity(@NonNull ThrowingRunnable action) { 268 context.binder.withCleanCallingIdentity(action); 269 } 270 271 @Override binderGetCallingUid()272 int binderGetCallingUid() { 273 return context.binder.getCallingUid(); 274 } 275 276 @Override binderGetCallingPid()277 int binderGetCallingPid() { 278 return context.binder.getCallingPid(); 279 } 280 281 @Override binderGetCallingUserHandle()282 UserHandle binderGetCallingUserHandle() { 283 return context.binder.getCallingUserHandle(); 284 } 285 286 @Override binderIsCallingUidMyUid()287 boolean binderIsCallingUidMyUid() { 288 return context.binder.isCallerUidMyUid(); 289 } 290 291 @Override powerManagerGoToSleep(long time, int reason, int flags)292 void powerManagerGoToSleep(long time, int reason, int flags) { 293 services.powerManager.goToSleep(time, reason, flags); 294 } 295 296 @Override powerManagerReboot(String reason)297 void powerManagerReboot(String reason) { 298 services.powerManager.reboot(reason); 299 } 300 301 @Override recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force, boolean wipeEuicc, boolean wipeExtRequested, boolean wipeResetProtectionData)302 boolean recoverySystemRebootWipeUserData(boolean shutdown, String reason, boolean force, 303 boolean wipeEuicc, boolean wipeExtRequested, boolean wipeResetProtectionData) 304 throws IOException { 305 return services.recoverySystem.rebootWipeUserData(shutdown, reason, force, wipeEuicc, 306 wipeExtRequested, wipeResetProtectionData); 307 } 308 309 @Override systemPropertiesGetBoolean(String key, boolean def)310 boolean systemPropertiesGetBoolean(String key, boolean def) { 311 return services.systemProperties.getBoolean(key, def); 312 } 313 314 @Override systemPropertiesGetLong(String key, long def)315 long systemPropertiesGetLong(String key, long def) { 316 return services.systemProperties.getLong(key, def); 317 } 318 319 @Override systemPropertiesGet(String key, String def)320 String systemPropertiesGet(String key, String def) { 321 return services.systemProperties.get(key, def); 322 } 323 324 @Override systemPropertiesGet(String key)325 String systemPropertiesGet(String key) { 326 return services.systemProperties.get(key); 327 } 328 329 @Override systemPropertiesSet(String key, String value)330 void systemPropertiesSet(String key, String value) { 331 services.systemProperties.set(key, value); 332 } 333 334 @Override userManagerIsHeadlessSystemUserMode()335 boolean userManagerIsHeadlessSystemUserMode() { 336 return services.userManagerForMock.isHeadlessSystemUserMode(); 337 } 338 339 @Override pendingIntentGetActivityAsUser(Context context, int requestCode, Intent intent, int flags, Bundle options, UserHandle user)340 PendingIntent pendingIntentGetActivityAsUser(Context context, int requestCode, 341 Intent intent, int flags, Bundle options, UserHandle user) { 342 return null; 343 } 344 345 @Override pendingIntentGetBroadcast(Context context, int requestCode, Intent intent, int flags)346 PendingIntent pendingIntentGetBroadcast(Context context, int requestCode, 347 Intent intent, int flags) { 348 return null; 349 } 350 351 @Override registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer, int userHandle)352 void registerContentObserver(Uri uri, boolean notifyForDescendents, 353 ContentObserver observer, int userHandle) { 354 mContentObservers.put(new Pair<Uri, Integer>(uri, userHandle), observer); 355 } 356 357 @Override settingsSecureGetIntForUser(String name, int def, int userHandle)358 int settingsSecureGetIntForUser(String name, int def, int userHandle) { 359 return services.settings.settingsSecureGetIntForUser(name, def, userHandle); 360 } 361 362 @Override settingsSecureGetStringForUser(String name, int userHandle)363 String settingsSecureGetStringForUser(String name, int userHandle) { 364 return services.settings.settingsSecureGetStringForUser(name, userHandle); 365 } 366 367 @Override settingsSecurePutIntForUser(String name, int value, int userHandle)368 void settingsSecurePutIntForUser(String name, int value, int userHandle) { 369 services.settings.settingsSecurePutIntForUser(name, value, userHandle); 370 } 371 372 @Override settingsSecurePutStringForUser(String name, String value, int userHandle)373 void settingsSecurePutStringForUser(String name, String value, int userHandle) { 374 services.settings.settingsSecurePutStringForUser(name, value, userHandle); 375 } 376 377 @Override settingsGlobalPutStringForUser(String name, String value, int userHandle)378 void settingsGlobalPutStringForUser(String name, String value, int userHandle) { 379 services.settings.settingsGlobalPutStringForUser(name, value, userHandle); 380 } 381 382 @Override settingsSecurePutInt(String name, int value)383 void settingsSecurePutInt(String name, int value) { 384 services.settings.settingsSecurePutInt(name, value); 385 } 386 387 @Override settingsGlobalPutInt(String name, int value)388 void settingsGlobalPutInt(String name, int value) { 389 services.settings.settingsGlobalPutInt(name, value); 390 } 391 392 @Override settingsSecurePutString(String name, String value)393 void settingsSecurePutString(String name, String value) { 394 services.settings.settingsSecurePutString(name, value); 395 } 396 397 @Override settingsGlobalPutString(String name, String value)398 void settingsGlobalPutString(String name, String value) { 399 services.settings.settingsGlobalPutString(name, value); 400 } 401 402 @Override settingsSystemPutStringForUser(String name, String value, int userId)403 void settingsSystemPutStringForUser(String name, String value, int userId) { 404 services.settings.settingsSystemPutStringForUser(name, value, userId); 405 } 406 407 @Override settingsGlobalGetInt(String name, int def)408 int settingsGlobalGetInt(String name, int def) { 409 return services.settings.settingsGlobalGetInt(name, def); 410 } 411 412 @Override settingsGlobalGetString(String name)413 String settingsGlobalGetString(String name) { 414 return services.settings.settingsGlobalGetString(name); 415 } 416 417 @Override securityLogSetLoggingEnabledProperty(boolean enabled)418 void securityLogSetLoggingEnabledProperty(boolean enabled) { 419 services.settings.securityLogSetLoggingEnabledProperty(enabled); 420 } 421 422 @Override securityLogGetLoggingEnabledProperty()423 boolean securityLogGetLoggingEnabledProperty() { 424 return services.settings.securityLogGetLoggingEnabledProperty(); 425 } 426 427 @Override securityLogIsLoggingEnabled()428 boolean securityLogIsLoggingEnabled() { 429 return services.settings.securityLogIsLoggingEnabled(); 430 } 431 432 @Override getTelephonyManager()433 TelephonyManager getTelephonyManager() { 434 return services.telephonyManager; 435 } 436 437 @Override isBuildDebuggable()438 boolean isBuildDebuggable() { 439 return services.buildMock.isDebuggable; 440 } 441 442 @Override keyChainBind()443 KeyChain.KeyChainConnection keyChainBind() { 444 return services.keyChainConnection; 445 } 446 447 @Override keyChainBindAsUser(UserHandle user)448 KeyChain.KeyChainConnection keyChainBindAsUser(UserHandle user) { 449 return services.keyChainConnection; 450 } 451 452 @Override postOnSystemServerInitThreadPool(Runnable runnable)453 void postOnSystemServerInitThreadPool(Runnable runnable) { 454 runnable.run(); 455 } 456 457 @Override newTransferOwnershipMetadataManager()458 public TransferOwnershipMetadataManager newTransferOwnershipMetadataManager() { 459 return new TransferOwnershipMetadataManager( 460 new TransferOwnershipMetadataManagerMockInjector()); 461 } 462 463 @Override runCryptoSelfTest()464 public void runCryptoSelfTest() {} 465 466 @Override getPersonalAppsForSuspension(int userId)467 public String[] getPersonalAppsForSuspension(int userId) { 468 return new String[]{}; 469 } 470 setSystemCurrentTimeMillis(long value)471 public void setSystemCurrentTimeMillis(long value) { 472 mCurrentTimeMillis = value; 473 } 474 475 @Override systemCurrentTimeMillis()476 public long systemCurrentTimeMillis() { 477 return mCurrentTimeMillis != 0 ? mCurrentTimeMillis : System.currentTimeMillis(); 478 } 479 setChangeEnabledForPackage( long changeId, boolean enabled, String packageName, int userId)480 public void setChangeEnabledForPackage( 481 long changeId, boolean enabled, String packageName, int userId) { 482 if (enabled) { 483 mEnabledChanges.put(changeId, Pair.create(packageName, userId)); 484 } else { 485 mEnabledChanges.remove(changeId); 486 } 487 } 488 clearEnabledChanges()489 public void clearEnabledChanges() { 490 mEnabledChanges.clear(); 491 } 492 493 @Override isChangeEnabled(long changeId, String packageName, int userId)494 public boolean isChangeEnabled(long changeId, String packageName, int userId) { 495 Pair<String, Integer> packageAndUser = mEnabledChanges.get(changeId); 496 if (packageAndUser == null) { 497 return false; 498 } 499 500 if (!packageAndUser.first.equals(packageName) 501 || !packageAndUser.second.equals(userId)) { 502 return false; 503 } 504 505 return true; 506 } 507 508 @Override createContextAsUser(UserHandle user)509 public Context createContextAsUser(UserHandle user) { 510 return context; 511 } 512 } 513 514 static class TransferOwnershipMetadataManagerMockInjector extends 515 TransferOwnershipMetadataManager.Injector { 516 @Override getOwnerTransferMetadataDir()517 public File getOwnerTransferMetadataDir() { 518 return Environment.getExternalStorageDirectory(); 519 } 520 } 521 } 522