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