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