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