• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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