blob: f4e4e089dec6d4f58d07076e172ba1a62b5bf046 [file] [log] [blame]
Makoto Onukicc4bbeb2015-09-17 10:28:24 -07001/*
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 */
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070016package com.android.server.devicepolicy;
17
Pavel Grafov6a40f092016-10-25 15:46:51 +010018import static android.os.UserManagerInternal.CAMERA_DISABLED_GLOBALLY;
19import static android.os.UserManagerInternal.CAMERA_DISABLED_LOCALLY;
20import static android.os.UserManagerInternal.CAMERA_NOT_DISABLED;
21
Makoto Onukif76b06a2015-09-22 15:03:44 -070022import android.Manifest.permission;
23import android.app.Activity;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070024import android.app.admin.DeviceAdminReceiver;
25import android.app.admin.DevicePolicyManager;
26import android.app.admin.DevicePolicyManagerInternal;
Makoto Onukif76b06a2015-09-22 15:03:44 -070027import android.content.BroadcastReceiver;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070028import android.content.ComponentName;
Tony Mak2f26b792016-11-28 17:54:51 +000029import android.content.Context;
30import android.content.Intent;
31import android.content.ServiceConnection;
Rubin Xued1928a2016-02-11 17:23:06 +000032import android.content.pm.ApplicationInfo;
33import android.content.pm.PackageInfo;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070034import android.content.pm.PackageManager;
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +010035import android.content.res.Resources;
36import android.graphics.Color;
37import android.net.IIpConnectivityMetrics;
Tony Mak2f26b792016-11-28 17:54:51 +000038import android.content.pm.UserInfo;
Makoto Onukia31ebbc2015-11-23 17:15:21 -080039import android.net.wifi.WifiInfo;
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -080040import android.os.Build.VERSION_CODES;
Makoto Onukif76b06a2015-09-22 15:03:44 -070041import android.os.Bundle;
Tony Mak2f26b792016-11-28 17:54:51 +000042import android.os.IBinder;
Makoto Onukic8a5a552015-11-19 14:29:12 -080043import android.os.Process;
Makoto Onukib643fb02015-09-22 15:03:44 -070044import android.os.UserHandle;
Makoto Onukia4f11972015-10-01 13:19:58 -070045import android.os.UserManager;
Pavel Grafov6a40f092016-10-25 15:46:51 +010046import android.os.UserManagerInternal;
Makoto Onuki2a3c3da2016-02-18 14:25:30 -080047import android.provider.Settings;
Mahaver Chopra1216ae52016-03-11 15:39:48 +000048import android.telephony.TelephonyManager;
Makoto Onukia31ebbc2015-11-23 17:15:21 -080049import android.test.MoreAsserts;
Benjamin Franz6d009032016-01-25 18:56:38 +000050import android.test.suitebuilder.annotation.SmallTest;
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +010051import android.util.ArraySet;
Makoto Onukib643fb02015-09-22 15:03:44 -070052import android.util.Pair;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070053
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +010054import com.android.internal.R;
Alan Treadwayafad8782016-01-19 15:15:08 +000055import com.android.server.LocalServices;
56import com.android.server.SystemService;
Esteban Talavera6c9116a2016-11-24 16:12:44 +000057import com.android.server.pm.UserRestrictionsUtils;
Alan Treadwayafad8782016-01-19 15:15:08 +000058
Makoto Onukib643fb02015-09-22 15:03:44 -070059import org.mockito.invocation.InvocationOnMock;
60import org.mockito.stubbing.Answer;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070061
Makoto Onukic8a5a552015-11-19 14:29:12 -080062import java.util.ArrayList;
Alan Treadwayafad8782016-01-19 15:15:08 +000063import java.util.Arrays;
Esteban Talaverac9bb3782016-11-11 15:41:14 +000064import java.util.Collections;
Makoto Onukib643fb02015-09-22 15:03:44 -070065import java.util.HashMap;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070066import java.util.List;
Makoto Onukib643fb02015-09-22 15:03:44 -070067import java.util.Map;
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +010068import java.util.Set;
Michal Karpinskid084ca52017-01-18 15:54:18 +000069import java.util.concurrent.TimeUnit;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070070
Edman Anjosf9946772016-11-28 16:35:15 +010071import static android.app.admin.DevicePolicyManager.DELEGATION_APP_RESTRICTIONS;
72import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_INSTALL;
73
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070074import static org.mockito.Matchers.any;
Makoto Onukia52562c2015-10-01 16:12:31 -070075import static org.mockito.Matchers.anyInt;
Michal Karpinskid084ca52017-01-18 15:54:18 +000076import static org.mockito.Matchers.anyLong;
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +010077import static org.mockito.Matchers.anyObject;
Makoto Onukif76b06a2015-09-22 15:03:44 -070078import static org.mockito.Matchers.anyString;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070079import static org.mockito.Matchers.eq;
Makoto Onukif76b06a2015-09-22 15:03:44 -070080import static org.mockito.Matchers.isNull;
Esteban Talavera548a04b2016-12-20 15:22:30 +000081import static org.mockito.Mockito.atLeast;
Makoto Onukib643fb02015-09-22 15:03:44 -070082import static org.mockito.Mockito.doAnswer;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070083import static org.mockito.Mockito.doReturn;
Robin Leed2a73ed2016-12-19 09:07:16 +000084import static org.mockito.Mockito.never;
Makoto Onuki1a2cd742015-11-16 13:51:27 -080085import static org.mockito.Mockito.reset;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070086import static org.mockito.Mockito.times;
87import static org.mockito.Mockito.verify;
Esteban Talaverab88f42b2017-01-24 16:47:16 +000088import static org.mockito.Mockito.verifyZeroInteractions;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070089import static org.mockito.Mockito.when;
90
91/**
Makoto Onukif76b06a2015-09-22 15:03:44 -070092 * Tests for DevicePolicyManager( and DevicePolicyManagerService).
Esteban Talavera01576862016-12-15 11:16:44 +000093 * You can run them via:
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070094 m FrameworksServicesTests &&
95 adb install \
Alan Treadwayafad8782016-01-19 15:15:08 +000096 -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070097 adb shell am instrument -e class com.android.server.devicepolicy.DevicePolicyManagerTest \
Makoto Onukic8a5a552015-11-19 14:29:12 -080098 -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070099
100 (mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
Esteban Talavera01576862016-12-15 11:16:44 +0000101 *
102 * , or:
103 * runtest -c com.android.server.devicepolicy.DevicePolicyManagerTest frameworks-services
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700104 */
Benjamin Franz6d009032016-01-25 18:56:38 +0000105@SmallTest
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700106public class DevicePolicyManagerTest extends DpmTestBase {
Alan Treadwayafad8782016-01-19 15:15:08 +0000107 private static final List<String> OWNER_SETUP_PERMISSIONS = Arrays.asList(
108 permission.MANAGE_DEVICE_ADMINS, permission.MANAGE_PROFILE_AND_DEVICE_OWNERS,
109 permission.MANAGE_USERS, permission.INTERACT_ACROSS_USERS_FULL);
110
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700111 private DpmMockContext mContext;
112 public DevicePolicyManager dpm;
113 public DevicePolicyManagerServiceTestable dpms;
114
115 @Override
116 protected void setUp() throws Exception {
117 super.setUp();
118
119 mContext = getContext();
120
121 when(mContext.packageManager.hasSystemFeature(eq(PackageManager.FEATURE_DEVICE_ADMIN)))
122 .thenReturn(true);
123
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800124 // By default, pretend all users are running and unlocked.
125 when(mContext.userManager.isUserUnlocked(anyInt())).thenReturn(true);
126
Makoto Onukia52562c2015-10-01 16:12:31 -0700127 initializeDpms();
Makoto Onukif76b06a2015-09-22 15:03:44 -0700128
Makoto Onukid932f762015-09-29 16:53:38 -0700129 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
130 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
131 setUpPackageManagerForAdmin(admin3, DpmMockContext.CALLER_UID);
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -0800132 setUpPackageManagerForAdmin(adminNoPerm, DpmMockContext.CALLER_UID);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700133
Makoto Onukib643fb02015-09-22 15:03:44 -0700134 setUpUserManager();
Makoto Onukif76b06a2015-09-22 15:03:44 -0700135 }
136
Makoto Onukia52562c2015-10-01 16:12:31 -0700137 private void initializeDpms() {
138 // Need clearCallingIdentity() to pass permission checks.
139 final long ident = mContext.binder.clearCallingIdentity();
140 try {
141 LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
142
143 dpms = new DevicePolicyManagerServiceTestable(mContext, dataDir);
144
145 dpms.systemReady(SystemService.PHASE_LOCK_SETTINGS_READY);
146 dpms.systemReady(SystemService.PHASE_BOOT_COMPLETED);
147
148 dpm = new DevicePolicyManagerTestable(mContext, dpms);
149 } finally {
150 mContext.binder.restoreCallingIdentity(ident);
151 }
152 }
153
Makoto Onukib643fb02015-09-22 15:03:44 -0700154 private void setUpUserManager() {
155 // Emulate UserManager.set/getApplicationRestriction().
156 final Map<Pair<String, UserHandle>, Bundle> appRestrictions = new HashMap<>();
157
158 // UM.setApplicationRestrictions() will save to appRestrictions.
159 doAnswer(new Answer<Void>() {
160 @Override
161 public Void answer(InvocationOnMock invocation) throws Throwable {
162 String pkg = (String) invocation.getArguments()[0];
163 Bundle bundle = (Bundle) invocation.getArguments()[1];
164 UserHandle user = (UserHandle) invocation.getArguments()[2];
165
166 appRestrictions.put(Pair.create(pkg, user), bundle);
167
168 return null;
169 }
170 }).when(mContext.userManager).setApplicationRestrictions(
171 anyString(), any(Bundle.class), any(UserHandle.class));
172
173 // UM.getApplicationRestrictions() will read from appRestrictions.
174 doAnswer(new Answer<Bundle>() {
175 @Override
176 public Bundle answer(InvocationOnMock invocation) throws Throwable {
177 String pkg = (String) invocation.getArguments()[0];
178 UserHandle user = (UserHandle) invocation.getArguments()[1];
179
180 return appRestrictions.get(Pair.create(pkg, user));
181 }
182 }).when(mContext.userManager).getApplicationRestrictions(
183 anyString(), any(UserHandle.class));
184
Makoto Onukid932f762015-09-29 16:53:38 -0700185 // Add the first secondary user.
186 mContext.addUser(DpmMockContext.CALLER_USER_HANDLE, 0);
Makoto Onukib643fb02015-09-22 15:03:44 -0700187 }
188
189 private void setAsProfileOwner(ComponentName admin) {
190 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
191 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
192
Makoto Onukia4f11972015-10-01 13:19:58 -0700193 // PO needs to be an DA.
Makoto Onukib643fb02015-09-22 15:03:44 -0700194 dpm.setActiveAdmin(admin, /* replace =*/ false);
195
196 // Fire!
197 assertTrue(dpm.setProfileOwner(admin, "owner-name", DpmMockContext.CALLER_USER_HANDLE));
198
199 // Check
Makoto Onuki068c54a2015-10-13 14:34:03 -0700200 assertEquals(admin, dpm.getProfileOwnerAsUser(DpmMockContext.CALLER_USER_HANDLE));
Makoto Onukib643fb02015-09-22 15:03:44 -0700201 }
202
203 public void testHasNoFeature() throws Exception {
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700204 when(mContext.packageManager.hasSystemFeature(eq(PackageManager.FEATURE_DEVICE_ADMIN)))
205 .thenReturn(false);
206
207 LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
208 new DevicePolicyManagerServiceTestable(mContext, dataDir);
209
210 // If the device has no DPMS feature, it shouldn't register the local service.
211 assertNull(LocalServices.getService(DevicePolicyManagerInternal.class));
212 }
213
214 /**
215 * Caller doesn't have proper permissions.
216 */
217 public void testSetActiveAdmin_SecurityException() {
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700218 // 1. Failure cases.
219
220 // Caller doesn't have MANAGE_DEVICE_ADMINS.
221 try {
Makoto Onukif76b06a2015-09-22 15:03:44 -0700222 dpm.setActiveAdmin(admin1, false);
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700223 fail("Didn't throw SecurityException");
224 } catch (SecurityException expected) {
225 }
226
227 // Caller has MANAGE_DEVICE_ADMINS, but for different user.
228 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
229 try {
Makoto Onukif76b06a2015-09-22 15:03:44 -0700230 dpm.setActiveAdmin(admin1, false, DpmMockContext.CALLER_USER_HANDLE + 1);
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700231 fail("Didn't throw SecurityException");
232 } catch (SecurityException expected) {
233 }
234 }
235
Makoto Onukif76b06a2015-09-22 15:03:44 -0700236 /**
237 * Test for:
238 * {@link DevicePolicyManager#setActiveAdmin}
Makoto Onuki2a3c3da2016-02-18 14:25:30 -0800239 * with replace=false and replace=true
Makoto Onukif76b06a2015-09-22 15:03:44 -0700240 * {@link DevicePolicyManager#isAdminActive}
241 * {@link DevicePolicyManager#isAdminActiveAsUser}
242 * {@link DevicePolicyManager#getActiveAdmins}
243 * {@link DevicePolicyManager#getActiveAdminsAsUser}
244 */
245 public void testSetActiveAdmin() throws Exception {
246 // 1. Make sure the caller has proper permissions.
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700247 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
248
Makoto Onukif76b06a2015-09-22 15:03:44 -0700249 // 2. Call the API.
250 dpm.setActiveAdmin(admin1, /* replace =*/ false);
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700251
252 // 3. Verify internal calls.
253
254 // Check if the boradcast is sent.
Makoto Onukif76b06a2015-09-22 15:03:44 -0700255 verify(mContext.spiedContext).sendBroadcastAsUser(
256 MockUtils.checkIntentAction(
257 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
258 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
259 verify(mContext.spiedContext).sendBroadcastAsUser(
260 MockUtils.checkIntentAction(
261 DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700262 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
263
Makoto Onukif76b06a2015-09-22 15:03:44 -0700264 verify(mContext.ipackageManager, times(1)).setApplicationEnabledSetting(
265 eq(admin1.getPackageName()),
266 eq(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT),
267 eq(PackageManager.DONT_KILL_APP),
268 eq(DpmMockContext.CALLER_USER_HANDLE),
269 anyString());
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700270
271 // TODO Verify other calls too.
Makoto Onukif76b06a2015-09-22 15:03:44 -0700272
273 // Make sure it's active admin1.
274 assertTrue(dpm.isAdminActive(admin1));
275 assertFalse(dpm.isAdminActive(admin2));
276 assertFalse(dpm.isAdminActive(admin3));
277
278 // But not admin1 for a different user.
279
280 // For this to work, caller needs android.permission.INTERACT_ACROSS_USERS_FULL.
281 // (Because we're checking a different user's status from CALLER_USER_HANDLE.)
282 mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL");
283
284 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE + 1));
285 assertFalse(dpm.isAdminActiveAsUser(admin2, DpmMockContext.CALLER_USER_HANDLE + 1));
286
287 mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL");
288
289 // Next, add one more admin.
290 // Before doing so, update the application info, now it's enabled.
Makoto Onukia52562c2015-10-01 16:12:31 -0700291 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID,
292 PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700293
294 dpm.setActiveAdmin(admin2, /* replace =*/ false);
295
296 // Now we have two admins.
297 assertTrue(dpm.isAdminActive(admin1));
298 assertTrue(dpm.isAdminActive(admin2));
299 assertFalse(dpm.isAdminActive(admin3));
300
301 // Admin2 was already enabled, so setApplicationEnabledSetting() shouldn't have called
302 // again. (times(1) because it was previously called for admin1)
303 verify(mContext.ipackageManager, times(1)).setApplicationEnabledSetting(
304 eq(admin1.getPackageName()),
305 eq(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT),
306 eq(PackageManager.DONT_KILL_APP),
307 eq(DpmMockContext.CALLER_USER_HANDLE),
308 anyString());
309
310 // 4. Add the same admin1 again without replace, which should throw.
311 try {
312 dpm.setActiveAdmin(admin1, /* replace =*/ false);
313 fail("Didn't throw");
314 } catch (IllegalArgumentException expected) {
315 }
316
317 // 5. Add the same admin1 again with replace, which should succeed.
318 dpm.setActiveAdmin(admin1, /* replace =*/ true);
319
320 // TODO make sure it's replaced.
321
322 // 6. Test getActiveAdmins()
323 List<ComponentName> admins = dpm.getActiveAdmins();
324 assertEquals(2, admins.size());
325 assertEquals(admin1, admins.get(0));
326 assertEquals(admin2, admins.get(1));
327
328 // Another user has no admins.
329 mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL");
330
331 assertEquals(0, DpmTestUtils.getListSizeAllowingNull(
332 dpm.getActiveAdminsAsUser(DpmMockContext.CALLER_USER_HANDLE + 1)));
333
334 mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL");
335 }
336
Makoto Onukid932f762015-09-29 16:53:38 -0700337 public void testSetActiveAdmin_multiUsers() throws Exception {
338
339 final int ANOTHER_USER_ID = 100;
340 final int ANOTHER_ADMIN_UID = UserHandle.getUid(ANOTHER_USER_ID, 20456);
341
342 mMockContext.addUser(ANOTHER_USER_ID, 0); // Add one more user.
343
344 // Set up pacakge manager for the other user.
345 setUpPackageManagerForAdmin(admin2, ANOTHER_ADMIN_UID);
Makoto Onukid932f762015-09-29 16:53:38 -0700346
347 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
348
349 dpm.setActiveAdmin(admin1, /* replace =*/ false);
350
351 mMockContext.binder.callingUid = ANOTHER_ADMIN_UID;
352 dpm.setActiveAdmin(admin2, /* replace =*/ false);
353
354
355 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
356 assertTrue(dpm.isAdminActive(admin1));
357 assertFalse(dpm.isAdminActive(admin2));
358
359 mMockContext.binder.callingUid = ANOTHER_ADMIN_UID;
360 assertFalse(dpm.isAdminActive(admin1));
361 assertTrue(dpm.isAdminActive(admin2));
362 }
363
Makoto Onukif76b06a2015-09-22 15:03:44 -0700364 /**
365 * Test for:
366 * {@link DevicePolicyManager#setActiveAdmin}
Makoto Onuki2a3c3da2016-02-18 14:25:30 -0800367 * with replace=false
Makoto Onukif76b06a2015-09-22 15:03:44 -0700368 */
369 public void testSetActiveAdmin_twiceWithoutReplace() throws Exception {
370 // 1. Make sure the caller has proper permissions.
371 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
372
373 dpm.setActiveAdmin(admin1, /* replace =*/ false);
374 assertTrue(dpm.isAdminActive(admin1));
375
376 // Add the same admin1 again without replace, which should throw.
377 try {
378 dpm.setActiveAdmin(admin1, /* replace =*/ false);
379 fail("Didn't throw");
380 } catch (IllegalArgumentException expected) {
381 }
382 }
383
384 /**
385 * Test for:
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -0800386 * {@link DevicePolicyManager#setActiveAdmin} when the admin isn't protected with
387 * BIND_DEVICE_ADMIN.
388 */
389 public void testSetActiveAdmin_permissionCheck() throws Exception {
390 // 1. Make sure the caller has proper permissions.
391 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
392
393 try {
394 dpm.setActiveAdmin(adminNoPerm, /* replace =*/ false);
395 fail();
396 } catch (IllegalArgumentException expected) {
397 assertTrue(expected.getMessage().contains(permission.BIND_DEVICE_ADMIN));
398 }
399 assertFalse(dpm.isAdminActive(adminNoPerm));
400
401 // Change the target API level to MNC. Now it can be set as DA.
402 setUpPackageManagerForAdmin(adminNoPerm, DpmMockContext.CALLER_UID, null,
403 VERSION_CODES.M);
404 dpm.setActiveAdmin(adminNoPerm, /* replace =*/ false);
405 assertTrue(dpm.isAdminActive(adminNoPerm));
406
407 // TODO Test the "load from the file" case where DA will still be loaded even without
408 // BIND_DEVICE_ADMIN and target API is N.
409 }
410
411 /**
412 * Test for:
Makoto Onukif76b06a2015-09-22 15:03:44 -0700413 * {@link DevicePolicyManager#removeActiveAdmin}
414 */
415 public void testRemoveActiveAdmin_SecurityException() {
416 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
417
418 // Add admin.
419
420 dpm.setActiveAdmin(admin1, /* replace =*/ false);
421
422 assertTrue(dpm.isAdminActive(admin1));
423
424 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
425
426 // Directly call the DPMS method with a different userid, which should fail.
427 try {
428 dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE + 1);
429 fail("Didn't throw SecurityException");
430 } catch (SecurityException expected) {
431 }
432
433 // Try to remove active admin with a different caller userid should fail too, without
434 // having MANAGE_DEVICE_ADMINS.
435 mContext.callerPermissions.clear();
436
Makoto Onukid932f762015-09-29 16:53:38 -0700437 // Change the caller, and call into DPMS directly with a different user-id.
438
Makoto Onukif76b06a2015-09-22 15:03:44 -0700439 mContext.binder.callingUid = 1234567;
440 try {
Makoto Onukid932f762015-09-29 16:53:38 -0700441 dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700442 fail("Didn't throw SecurityException");
443 } catch (SecurityException expected) {
444 }
445 }
446
447 /**
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800448 * {@link DevicePolicyManager#removeActiveAdmin} should fail with the user is not unlocked
449 * (because we can't send the remove broadcast).
450 */
451 public void testRemoveActiveAdmin_userNotRunningOrLocked() {
452 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
453
454 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
455
456 // Add admin.
457
458 dpm.setActiveAdmin(admin1, /* replace =*/ false);
459
460 assertTrue(dpm.isAdminActive(admin1));
461
462 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
463
464 // 1. User not unlocked.
465 when(mContext.userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE)))
466 .thenReturn(false);
467 try {
468 dpm.removeActiveAdmin(admin1);
469 fail("Didn't throw IllegalStateException");
470 } catch (IllegalStateException expected) {
471 MoreAsserts.assertContainsRegex(
472 "User must be running and unlocked", expected.getMessage());
473 }
474
475 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
476
477 // 2. User unlocked.
478 when(mContext.userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE)))
479 .thenReturn(true);
480
481 dpm.removeActiveAdmin(admin1);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700482 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800483 }
484
485 /**
Makoto Onukif76b06a2015-09-22 15:03:44 -0700486 * Test for:
487 * {@link DevicePolicyManager#removeActiveAdmin}
488 */
Makoto Onukid932f762015-09-29 16:53:38 -0700489 public void testRemoveActiveAdmin_fromDifferentUserWithINTERACT_ACROSS_USERS_FULL() {
Makoto Onukif76b06a2015-09-22 15:03:44 -0700490 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
491
492 // Add admin1.
493
494 dpm.setActiveAdmin(admin1, /* replace =*/ false);
495
496 assertTrue(dpm.isAdminActive(admin1));
497 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
498
499 // Different user, but should work, because caller has proper permissions.
500 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
Makoto Onukid932f762015-09-29 16:53:38 -0700501
502 // Change the caller, and call into DPMS directly with a different user-id.
Makoto Onukif76b06a2015-09-22 15:03:44 -0700503 mContext.binder.callingUid = 1234567;
Makoto Onukid932f762015-09-29 16:53:38 -0700504
505 dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700506 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Makoto Onukif76b06a2015-09-22 15:03:44 -0700507
508 // TODO DO Still can't be removed in this case.
509 }
510
511 /**
512 * Test for:
513 * {@link DevicePolicyManager#removeActiveAdmin}
514 */
515 public void testRemoveActiveAdmin_sameUserNoMANAGE_DEVICE_ADMINS() {
516 // Need MANAGE_DEVICE_ADMINS for setActiveAdmin. We'll remove it later.
517 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
518
519 // Add admin1.
520
521 dpm.setActiveAdmin(admin1, /* replace =*/ false);
522
523 assertTrue(dpm.isAdminActive(admin1));
524 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
525
526 // Broadcast from saveSettingsLocked().
527 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
528 MockUtils.checkIntentAction(
529 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
530 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
531
532 // Remove. No permissions, but same user, so it'll work.
533 mContext.callerPermissions.clear();
534 dpm.removeActiveAdmin(admin1);
535
Makoto Onukif76b06a2015-09-22 15:03:44 -0700536 verify(mContext.spiedContext).sendOrderedBroadcastAsUser(
537 MockUtils.checkIntentAction(
538 DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED),
539 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE),
540 isNull(String.class),
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700541 any(BroadcastReceiver.class),
Makoto Onukif76b06a2015-09-22 15:03:44 -0700542 eq(dpms.mHandler),
543 eq(Activity.RESULT_OK),
544 isNull(String.class),
545 isNull(Bundle.class));
546
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700547 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Makoto Onukif76b06a2015-09-22 15:03:44 -0700548
549 // Again broadcast from saveSettingsLocked().
550 verify(mContext.spiedContext, times(2)).sendBroadcastAsUser(
551 MockUtils.checkIntentAction(
552 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
553 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
554
555 // TODO Check other internal calls.
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700556 }
Makoto Onukib643fb02015-09-22 15:03:44 -0700557
558 /**
Robin Leed2a73ed2016-12-19 09:07:16 +0000559 * Test for: @{link DevicePolicyManager#setActivePasswordState}
560 *
561 * Validates that when the password for a user changes, the notification broadcast intent
562 * {@link DeviceAdminReceiver#ACTION_PASSWORD_CHANGED} is sent to managed profile owners, in
563 * addition to ones in the original user.
564 */
565 public void testSetActivePasswordState_sendToProfiles() throws Exception {
566 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
567
568 final int MANAGED_PROFILE_USER_ID = 78;
569 final int MANAGED_PROFILE_ADMIN_UID =
570 UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID);
571
572 // Setup device owner.
573 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
574 mContext.packageName = admin1.getPackageName();
575 setupDeviceOwner();
576
577 // Add a managed profile belonging to the system user.
578 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
579
580 // Change the parent user's password.
581 dpm.reportPasswordChanged(UserHandle.USER_SYSTEM);
582
583 // Both the device owner and the managed profile owner should receive this broadcast.
584 final Intent intent = new Intent(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED);
585 intent.setComponent(admin1);
586 intent.putExtra(Intent.EXTRA_USER, UserHandle.of(UserHandle.USER_SYSTEM));
587
588 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
589 MockUtils.checkIntent(intent),
590 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
591 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
592 MockUtils.checkIntent(intent),
593 MockUtils.checkUserHandle(MANAGED_PROFILE_USER_ID));
594 }
595
596 /**
597 * Test for: @{link DevicePolicyManager#setActivePasswordState}
598 *
599 * Validates that when the password for a managed profile changes, the notification broadcast
600 * intent {@link DeviceAdminReceiver#ACTION_PASSWORD_CHANGED} is only sent to the profile, not
601 * its parent.
602 */
603 public void testSetActivePasswordState_notSentToParent() throws Exception {
604 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
605
606 final int MANAGED_PROFILE_USER_ID = 78;
607 final int MANAGED_PROFILE_ADMIN_UID =
608 UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID);
609
610 // Setup device owner.
611 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
612 mContext.packageName = admin1.getPackageName();
613 doReturn(true).when(mContext.lockPatternUtils)
614 .isSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID);
615 setupDeviceOwner();
616
617 // Add a managed profile belonging to the system user.
618 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
619
620 // Change the profile's password.
621 dpm.reportPasswordChanged(MANAGED_PROFILE_USER_ID);
622
623 // Both the device owner and the managed profile owner should receive this broadcast.
624 final Intent intent = new Intent(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED);
625 intent.setComponent(admin1);
626 intent.putExtra(Intent.EXTRA_USER, UserHandle.of(MANAGED_PROFILE_USER_ID));
627
628 verify(mContext.spiedContext, never()).sendBroadcastAsUser(
629 MockUtils.checkIntent(intent),
630 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
631 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
632 MockUtils.checkIntent(intent),
633 MockUtils.checkUserHandle(MANAGED_PROFILE_USER_ID));
634 }
635 /**
Victor Chang3e794af2016-03-04 13:48:17 +0000636 * Test for: {@link DevicePolicyManager#setDeviceOwner} DO on system user installs successfully.
Makoto Onukib643fb02015-09-22 15:03:44 -0700637 */
638 public void testSetDeviceOwner() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +0000639 setDeviceOwner();
640
641 // Try to set a profile owner on the same user, which should fail.
642 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_SYSTEM_USER_UID);
643 dpm.setActiveAdmin(admin2, /* refreshing= */ true, UserHandle.USER_SYSTEM);
644 try {
645 dpm.setProfileOwner(admin2, "owner-name", UserHandle.USER_SYSTEM);
646 fail("IllegalStateException not thrown");
647 } catch (IllegalStateException expected) {
648 assertTrue("Message was: " + expected.getMessage(),
649 expected.getMessage().contains("already has a device owner"));
650 }
651
652 // DO admin can't be deactivated.
653 dpm.removeActiveAdmin(admin1);
654 assertTrue(dpm.isAdminActive(admin1));
655
656 // TODO Test getDeviceOwnerName() too. To do so, we need to change
657 // DPMS.getApplicationLabel() because Context.createPackageContextAsUser() is not mockable.
658 }
659
660 private void setDeviceOwner() throws Exception {
Makoto Onukib643fb02015-09-22 15:03:44 -0700661 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -0800662 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukib643fb02015-09-22 15:03:44 -0700663 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
664 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
665
Makoto Onukid932f762015-09-29 16:53:38 -0700666 // In this test, change the caller user to "system".
Makoto Onukib643fb02015-09-22 15:03:44 -0700667 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
668
Makoto Onukid932f762015-09-29 16:53:38 -0700669 // Make sure admin1 is installed on system user.
670 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
Makoto Onukid932f762015-09-29 16:53:38 -0700671
Makoto Onukic8a5a552015-11-19 14:29:12 -0800672 // Check various get APIs.
673 checkGetDeviceOwnerInfoApi(dpm, /* hasDeviceOwner =*/ false);
674
Makoto Onukib643fb02015-09-22 15:03:44 -0700675 // DO needs to be an DA.
676 dpm.setActiveAdmin(admin1, /* replace =*/ false);
677
678 // Fire!
Makoto Onukia52562c2015-10-01 16:12:31 -0700679 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
Makoto Onukib643fb02015-09-22 15:03:44 -0700680
Makoto Onukic8a5a552015-11-19 14:29:12 -0800681 // getDeviceOwnerComponent should return the admin1 component.
682 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
683 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
684
685 // Check various get APIs.
686 checkGetDeviceOwnerInfoApi(dpm, /* hasDeviceOwner =*/ true);
687
688 // getDeviceOwnerComponent should *NOT* return the admin1 component for other users.
689 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
690 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
691 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
692
693 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
694
Makoto Onuki219bbaf2015-11-12 01:38:47 +0000695 // Verify internal calls.
696 verify(mContext.iactivityManager, times(1)).updateDeviceOwner(
697 eq(admin1.getPackageName()));
698
Makoto Onukib643fb02015-09-22 15:03:44 -0700699 // TODO We should check if the caller has called clearCallerIdentity().
700 verify(mContext.ibackupManager, times(1)).setBackupServiceActive(
701 eq(UserHandle.USER_SYSTEM), eq(false));
702
703 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
704 MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED),
705 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
706
Makoto Onukic8a5a552015-11-19 14:29:12 -0800707 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukib643fb02015-09-22 15:03:44 -0700708 }
709
Makoto Onukic8a5a552015-11-19 14:29:12 -0800710 private void checkGetDeviceOwnerInfoApi(DevicePolicyManager dpm, boolean hasDeviceOwner) {
711 final int origCallingUser = mContext.binder.callingUid;
712 final List origPermissions = new ArrayList(mContext.callerPermissions);
713 mContext.callerPermissions.clear();
714
715 mContext.callerPermissions.add(permission.MANAGE_USERS);
716
717 mContext.binder.callingUid = Process.SYSTEM_UID;
718
719 // TODO Test getDeviceOwnerName() too. To do so, we need to change
720 // DPMS.getApplicationLabel() because Context.createPackageContextAsUser() is not mockable.
721 if (hasDeviceOwner) {
722 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
723 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
724 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
725
726 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
727 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
728 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
729 } else {
730 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
731 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
732 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
733
734 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
735 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
736 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
737 }
738
739 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
740 if (hasDeviceOwner) {
741 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
742 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
743 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
744
745 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
746 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
747 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
748 } else {
749 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
750 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
751 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
752
753 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
754 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
755 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
756 }
757
758 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
759 // Still with MANAGE_USERS.
760 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
761 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
762 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
763
764 if (hasDeviceOwner) {
765 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
766 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
767 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
768 } else {
769 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
770 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
771 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
772 }
773
774 mContext.binder.callingUid = Process.SYSTEM_UID;
775 mContext.callerPermissions.remove(permission.MANAGE_USERS);
776 // System can still call "OnAnyUser" without MANAGE_USERS.
777 if (hasDeviceOwner) {
778 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
779 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
780 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
781
782 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
783 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
784 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
785 } else {
786 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
787 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
788 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
789
790 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
791 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
792 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
793 }
794
795 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
796 // Still no MANAGE_USERS.
797 if (hasDeviceOwner) {
798 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
799 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
800 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
801 } else {
802 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
803 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
804 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
805 }
806
807 try {
808 dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName());
809 fail();
810 } catch (SecurityException expected) {
811 }
812 try {
813 dpm.getDeviceOwnerComponentOnAnyUser();
814 fail();
815 } catch (SecurityException expected) {
816 }
817 try {
818 dpm.getDeviceOwnerUserId();
819 fail();
820 } catch (SecurityException expected) {
821 }
822 try {
823 dpm.getDeviceOwnerNameOnAnyUser();
824 fail();
825 } catch (SecurityException expected) {
826 }
827
828 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
829 // Still no MANAGE_USERS.
830 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
831 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
832 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
833
834 try {
835 dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName());
836 fail();
837 } catch (SecurityException expected) {
838 }
839 try {
840 dpm.getDeviceOwnerComponentOnAnyUser();
841 fail();
842 } catch (SecurityException expected) {
843 }
844 try {
845 dpm.getDeviceOwnerUserId();
846 fail();
847 } catch (SecurityException expected) {
848 }
849 try {
850 dpm.getDeviceOwnerNameOnAnyUser();
851 fail();
852 } catch (SecurityException expected) {
853 }
854
855 // Restore.
856 mContext.binder.callingUid = origCallingUser;
857 mContext.callerPermissions.addAll(origPermissions);
858 }
859
860
Makoto Onukib643fb02015-09-22 15:03:44 -0700861 /**
862 * Test for: {@link DevicePolicyManager#setDeviceOwner} Package doesn't exist.
863 */
864 public void testSetDeviceOwner_noSuchPackage() {
865 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -0800866 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukib643fb02015-09-22 15:03:44 -0700867 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
868 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
869
870 // Call from a process on the system user.
871 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
872
Makoto Onukib643fb02015-09-22 15:03:44 -0700873 try {
Makoto Onukia52562c2015-10-01 16:12:31 -0700874 dpm.setDeviceOwner(new ComponentName("a.b.c", ".def"));
Makoto Onukib643fb02015-09-22 15:03:44 -0700875 fail("Didn't throw IllegalArgumentException");
876 } catch (IllegalArgumentException expected) {
Makoto Onuki803d6752015-10-30 12:58:39 -0700877 assertTrue("Message was: " + expected.getMessage(),
878 expected.getMessage().contains("Invalid component"));
Makoto Onukib643fb02015-09-22 15:03:44 -0700879 }
880 }
881
882 public void testSetDeviceOwner_failures() throws Exception {
883 // TODO Test more failure cases. Basically test all chacks in enforceCanSetDeviceOwner().
884 }
885
Makoto Onukia52562c2015-10-01 16:12:31 -0700886 public void testClearDeviceOwner() throws Exception {
887 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -0800888 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia52562c2015-10-01 16:12:31 -0700889 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
890 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
891
892 // Set admin1 as a DA to the secondary user.
893 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
894
895 dpm.setActiveAdmin(admin1, /* replace =*/ false);
896
897 // Set admin 1 as the DO to the system user.
898
899 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
900 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
901 dpm.setActiveAdmin(admin1, /* replace =*/ false);
902 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
903
Makoto Onuki219bbaf2015-11-12 01:38:47 +0000904 // Verify internal calls.
905 verify(mContext.iactivityManager, times(1)).updateDeviceOwner(
906 eq(admin1.getPackageName()));
907
Makoto Onukic8a5a552015-11-19 14:29:12 -0800908 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukia52562c2015-10-01 16:12:31 -0700909
Makoto Onuki90b89652016-01-28 14:44:18 -0800910 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
911
912 assertTrue(dpm.isAdminActive(admin1));
913 assertFalse(dpm.isRemovingAdmin(admin1, UserHandle.USER_SYSTEM));
914
Makoto Onukia52562c2015-10-01 16:12:31 -0700915 // Set up other mocks.
916 when(mContext.userManager.getUserRestrictions()).thenReturn(new Bundle());
917
918 // Now call clear.
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700919 doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(mContext.packageManager).getPackageUidAsUser(
Makoto Onukia52562c2015-10-01 16:12:31 -0700920 eq(admin1.getPackageName()),
921 anyInt());
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800922
923 // But first pretend the user is locked. Then it should fail.
924 when(mContext.userManager.isUserUnlocked(anyInt())).thenReturn(false);
925 try {
926 dpm.clearDeviceOwnerApp(admin1.getPackageName());
927 fail("Didn't throw IllegalStateException");
928 } catch (IllegalStateException expected) {
929 MoreAsserts.assertContainsRegex(
930 "User must be running and unlocked", expected.getMessage());
931 }
932
933 when(mContext.userManager.isUserUnlocked(anyInt())).thenReturn(true);
Makoto Onuki90b89652016-01-28 14:44:18 -0800934 reset(mContext.userManagerInternal);
Makoto Onukia52562c2015-10-01 16:12:31 -0700935 dpm.clearDeviceOwnerApp(admin1.getPackageName());
936
937 // Now DO shouldn't be set.
Makoto Onukic8a5a552015-11-19 14:29:12 -0800938 assertNull(dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukia52562c2015-10-01 16:12:31 -0700939
Makoto Onuki90b89652016-01-28 14:44:18 -0800940 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
941 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +0100942 eq(null),
943 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki90b89652016-01-28 14:44:18 -0800944
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700945 assertFalse(dpm.isAdminActiveAsUser(admin1, UserHandle.USER_SYSTEM));
Tony Mak1970f972016-08-30 17:41:48 +0100946
947 // ACTION_DEVICE_OWNER_CHANGED should be sent twice, once for setting the device owner
948 // and once for clearing it.
949 verify(mContext.spiedContext, times(2)).sendBroadcastAsUser(
950 MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED),
951 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
Makoto Onukia52562c2015-10-01 16:12:31 -0700952 // TODO Check other calls.
953 }
954
955 public void testClearDeviceOwner_fromDifferentUser() throws Exception {
956 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -0800957 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia52562c2015-10-01 16:12:31 -0700958 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
959 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
960
961 // Set admin1 as a DA to the secondary user.
962 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
963
964 dpm.setActiveAdmin(admin1, /* replace =*/ false);
965
966 // Set admin 1 as the DO to the system user.
967
968 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
969 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
970 dpm.setActiveAdmin(admin1, /* replace =*/ false);
971 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
972
Makoto Onuki219bbaf2015-11-12 01:38:47 +0000973 // Verify internal calls.
974 verify(mContext.iactivityManager, times(1)).updateDeviceOwner(
975 eq(admin1.getPackageName()));
976
Makoto Onukic8a5a552015-11-19 14:29:12 -0800977 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukia52562c2015-10-01 16:12:31 -0700978
979 // Now call clear from the secondary user, which should throw.
980 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
981
982 // Now call clear.
Jeff Sharkeye06b4d12016-01-06 14:51:50 -0700983 doReturn(DpmMockContext.CALLER_UID).when(mContext.packageManager).getPackageUidAsUser(
Makoto Onukia52562c2015-10-01 16:12:31 -0700984 eq(admin1.getPackageName()),
985 anyInt());
986 try {
987 dpm.clearDeviceOwnerApp(admin1.getPackageName());
988 fail("Didn't throw");
989 } catch (SecurityException e) {
990 assertEquals("clearDeviceOwner can only be called by the device owner", e.getMessage());
991 }
992
Makoto Onukic8a5a552015-11-19 14:29:12 -0800993 // DO shouldn't be removed.
994 assertTrue(dpm.isDeviceManaged());
Makoto Onukia52562c2015-10-01 16:12:31 -0700995 }
996
Makoto Onukib643fb02015-09-22 15:03:44 -0700997 public void testSetProfileOwner() throws Exception {
998 setAsProfileOwner(admin1);
Makoto Onuki803d6752015-10-30 12:58:39 -0700999
Makoto Onuki90b89652016-01-28 14:44:18 -08001000 // PO admin can't be deactivated.
1001 dpm.removeActiveAdmin(admin1);
1002 assertTrue(dpm.isAdminActive(admin1));
1003
Makoto Onuki803d6752015-10-30 12:58:39 -07001004 // Try setting DO on the same user, which should fail.
1005 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
1006 dpm.setActiveAdmin(admin2, /* refreshing= */ true, DpmMockContext.CALLER_USER_HANDLE);
1007 try {
1008 dpm.setDeviceOwner(admin2, "owner-name", DpmMockContext.CALLER_USER_HANDLE);
1009 fail("IllegalStateException not thrown");
1010 } catch (IllegalStateException expected) {
1011 assertTrue("Message was: " + expected.getMessage(),
1012 expected.getMessage().contains("already has a profile owner"));
1013 }
Makoto Onukib643fb02015-09-22 15:03:44 -07001014 }
1015
Makoto Onuki90b89652016-01-28 14:44:18 -08001016 public void testClearProfileOwner() throws Exception {
1017 setAsProfileOwner(admin1);
1018
1019 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1020
1021 assertTrue(dpm.isProfileOwnerApp(admin1.getPackageName()));
1022 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
1023
Makoto Onuki1a5ee772016-02-12 15:34:57 -08001024 // First try when the user is locked, which should fail.
1025 when(mContext.userManager.isUserUnlocked(anyInt()))
1026 .thenReturn(false);
1027 try {
1028 dpm.clearProfileOwner(admin1);
1029 fail("Didn't throw IllegalStateException");
1030 } catch (IllegalStateException expected) {
1031 MoreAsserts.assertContainsRegex(
1032 "User must be running and unlocked", expected.getMessage());
1033 }
1034 // Clear, really.
1035 when(mContext.userManager.isUserUnlocked(anyInt()))
1036 .thenReturn(true);
Makoto Onuki90b89652016-01-28 14:44:18 -08001037 dpm.clearProfileOwner(admin1);
1038
1039 // Check
1040 assertFalse(dpm.isProfileOwnerApp(admin1.getPackageName()));
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07001041 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Makoto Onuki90b89652016-01-28 14:44:18 -08001042 }
1043
Makoto Onukib643fb02015-09-22 15:03:44 -07001044 public void testSetProfileOwner_failures() throws Exception {
1045 // TODO Test more failure cases. Basically test all chacks in enforceCanSetProfileOwner().
1046 }
1047
Makoto Onukia52562c2015-10-01 16:12:31 -07001048 public void testGetDeviceOwnerAdminLocked() throws Exception {
1049 checkDeviceOwnerWithMultipleDeviceAdmins();
1050 }
1051
1052 private void checkDeviceOwnerWithMultipleDeviceAdmins() throws Exception {
1053 // In ths test, we use 3 users (system + 2 secondary users), set some device admins to them,
1054 // set admin2 on CALLER_USER_HANDLE as DO, then call getDeviceOwnerAdminLocked() to
1055 // make sure it gets the right component from the right user.
1056
1057 final int ANOTHER_USER_ID = 100;
1058 final int ANOTHER_ADMIN_UID = UserHandle.getUid(ANOTHER_USER_ID, 456);
1059
1060 mMockContext.addUser(ANOTHER_USER_ID, 0); // Add one more user.
1061
1062 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001063 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia52562c2015-10-01 16:12:31 -07001064 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1065 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1066
1067 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1068
Victor Change29cd472016-03-02 20:57:42 +00001069 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
1070
Makoto Onukia52562c2015-10-01 16:12:31 -07001071 // Make sure the admin packge is installed to each user.
1072 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1073 setUpPackageManagerForAdmin(admin3, DpmMockContext.CALLER_SYSTEM_USER_UID);
1074
1075 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
1076 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
1077
1078 setUpPackageManagerForAdmin(admin2, ANOTHER_ADMIN_UID);
1079
1080
1081 // Set active admins to the users.
1082 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1083 dpm.setActiveAdmin(admin3, /* replace =*/ false);
1084
1085 dpm.setActiveAdmin(admin1, /* replace =*/ false, DpmMockContext.CALLER_USER_HANDLE);
1086 dpm.setActiveAdmin(admin2, /* replace =*/ false, DpmMockContext.CALLER_USER_HANDLE);
1087
1088 dpm.setActiveAdmin(admin2, /* replace =*/ false, ANOTHER_USER_ID);
1089
1090 // Set DO on the first non-system user.
1091 mContext.setUserRunning(DpmMockContext.CALLER_USER_HANDLE, true);
1092 assertTrue(dpm.setDeviceOwner(admin2, "owner-name", DpmMockContext.CALLER_USER_HANDLE));
1093
Makoto Onukic8a5a552015-11-19 14:29:12 -08001094 assertEquals(admin2, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false));
Makoto Onukia52562c2015-10-01 16:12:31 -07001095
1096 // Then check getDeviceOwnerAdminLocked().
1097 assertEquals(admin2, dpms.getDeviceOwnerAdminLocked().info.getComponent());
1098 assertEquals(DpmMockContext.CALLER_UID, dpms.getDeviceOwnerAdminLocked().getUid());
1099 }
1100
1101 /**
1102 * This essentially tests
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08001103 * {@code DevicePolicyManagerService.findOwnerComponentIfNecessaryLocked()}. (which is
1104 * private.)
Makoto Onukia52562c2015-10-01 16:12:31 -07001105 *
1106 * We didn't use to persist the DO component class name, but now we do, and the above method
1107 * finds the right component from a package name upon migration.
1108 */
1109 public void testDeviceOwnerMigration() throws Exception {
Victor Change29cd472016-03-02 20:57:42 +00001110 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
Makoto Onukia52562c2015-10-01 16:12:31 -07001111 checkDeviceOwnerWithMultipleDeviceAdmins();
1112
1113 // Overwrite the device owner setting and clears the clas name.
1114 dpms.mOwners.setDeviceOwner(
1115 new ComponentName(admin2.getPackageName(), ""),
1116 "owner-name", DpmMockContext.CALLER_USER_HANDLE);
1117 dpms.mOwners.writeDeviceOwner();
1118
1119 // Make sure the DO component name doesn't have a class name.
Makoto Onukic8a5a552015-11-19 14:29:12 -08001120 assertEquals("", dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false).getClassName());
Makoto Onukia52562c2015-10-01 16:12:31 -07001121
1122 // Then create a new DPMS to have it load the settings from files.
Makoto Onuki068c54a2015-10-13 14:34:03 -07001123 when(mContext.userManager.getUserRestrictions(any(UserHandle.class)))
1124 .thenReturn(new Bundle());
Makoto Onukia52562c2015-10-01 16:12:31 -07001125 initializeDpms();
1126
1127 // Now the DO component name is a full name.
1128 // *BUT* because both admin1 and admin2 belong to the same package, we think admin1 is the
1129 // DO.
Makoto Onukic8a5a552015-11-19 14:29:12 -08001130 assertEquals(admin1, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false));
Makoto Onukia52562c2015-10-01 16:12:31 -07001131 }
1132
Makoto Onukib643fb02015-09-22 15:03:44 -07001133 public void testSetGetApplicationRestriction() {
1134 setAsProfileOwner(admin1);
Edman Anjosf9946772016-11-28 16:35:15 +01001135 mContext.packageName = admin1.getPackageName();
Makoto Onukib643fb02015-09-22 15:03:44 -07001136
1137 {
1138 Bundle rest = new Bundle();
1139 rest.putString("KEY_STRING", "Foo1");
1140 dpm.setApplicationRestrictions(admin1, "pkg1", rest);
1141 }
1142
1143 {
1144 Bundle rest = new Bundle();
1145 rest.putString("KEY_STRING", "Foo2");
1146 dpm.setApplicationRestrictions(admin1, "pkg2", rest);
1147 }
1148
1149 {
1150 Bundle returned = dpm.getApplicationRestrictions(admin1, "pkg1");
1151 assertNotNull(returned);
1152 assertEquals(returned.size(), 1);
1153 assertEquals(returned.get("KEY_STRING"), "Foo1");
1154 }
1155
1156 {
1157 Bundle returned = dpm.getApplicationRestrictions(admin1, "pkg2");
1158 assertNotNull(returned);
1159 assertEquals(returned.size(), 1);
1160 assertEquals(returned.get("KEY_STRING"), "Foo2");
1161 }
1162
1163 dpm.setApplicationRestrictions(admin1, "pkg2", new Bundle());
1164 assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg2").size());
1165 }
Makoto Onukia4f11972015-10-01 13:19:58 -07001166
Edman Anjosf9946772016-11-28 16:35:15 +01001167 /**
1168 * Setup a package in the package manager mock. Useful for faking installed applications.
1169 *
1170 * @param packageName the name of the package to be setup
1171 * @param appId the application ID to be given to the package
1172 * @return the UID of the package as known by the mock package manager
1173 */
1174 private int setupPackageInPackageManager(final String packageName, final int appId)
1175 throws Exception {
1176 // Make the PackageManager return the package instead of throwing a NameNotFoundException
1177 final PackageInfo pi = new PackageInfo();
1178 pi.applicationInfo = new ApplicationInfo();
1179 pi.applicationInfo.flags = ApplicationInfo.FLAG_HAS_CODE;
1180 doReturn(pi).when(mContext.ipackageManager).getPackageInfo(
1181 eq(packageName),
1182 anyInt(),
1183 eq(DpmMockContext.CALLER_USER_HANDLE));
1184 // Setup application UID with the PackageManager
1185 final int uid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, appId);
1186 doReturn(uid).when(mContext.packageManager).getPackageUidAsUser(
1187 eq(packageName),
1188 eq(DpmMockContext.CALLER_USER_HANDLE));
1189 // Associate packageName to uid
1190 doReturn(packageName).when(mContext.ipackageManager).getNameForUid(eq(uid));
1191 doReturn(new String[]{packageName})
1192 .when(mContext.ipackageManager).getPackagesForUid(eq(uid));
1193 return uid;
1194 }
1195
1196 /**
1197 * Simple test for delegate set/get and general delegation. Tests verifying that delegated
1198 * privileges can acually be exercised by a delegate are not covered here.
1199 */
1200 public void testDelegation() throws Exception {
1201 setAsProfileOwner(admin1);
1202
1203 final int userHandle = DpmMockContext.CALLER_USER_HANDLE;
1204
1205 // Given two packages
1206 final String CERT_DELEGATE = "com.delegate.certs";
1207 final String RESTRICTIONS_DELEGATE = "com.delegate.apprestrictions";
1208 final int CERT_DELEGATE_UID = setupPackageInPackageManager(CERT_DELEGATE, 20988);
1209 final int RESTRICTIONS_DELEGATE_UID = setupPackageInPackageManager(RESTRICTIONS_DELEGATE,
1210 20989);
1211
1212 // On delegation
1213 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1214 mContext.packageName = admin1.getPackageName();
1215 dpm.setCertInstallerPackage(admin1, CERT_DELEGATE);
1216 dpm.setApplicationRestrictionsManagingPackage(admin1, RESTRICTIONS_DELEGATE);
1217
1218 // DPMS correctly stores and retrieves the delegates
1219 DevicePolicyManagerService.DevicePolicyData policy = dpms.mUserData.get(userHandle);
1220 assertEquals(2, policy.mDelegationMap.size());
1221 MoreAsserts.assertContentsInAnyOrder(policy.mDelegationMap.get(CERT_DELEGATE),
1222 DELEGATION_CERT_INSTALL);
1223 MoreAsserts.assertContentsInAnyOrder(dpm.getDelegatedScopes(admin1, CERT_DELEGATE),
1224 DELEGATION_CERT_INSTALL);
1225 assertEquals(CERT_DELEGATE, dpm.getCertInstallerPackage(admin1));
1226 MoreAsserts.assertContentsInAnyOrder(policy.mDelegationMap.get(RESTRICTIONS_DELEGATE),
1227 DELEGATION_APP_RESTRICTIONS);
1228 MoreAsserts.assertContentsInAnyOrder(dpm.getDelegatedScopes(admin1, RESTRICTIONS_DELEGATE),
1229 DELEGATION_APP_RESTRICTIONS);
1230 assertEquals(RESTRICTIONS_DELEGATE, dpm.getApplicationRestrictionsManagingPackage(admin1));
1231
1232 // On calling install certificate APIs from an unauthorized process
1233 mContext.binder.callingUid = RESTRICTIONS_DELEGATE_UID;
1234 mContext.packageName = RESTRICTIONS_DELEGATE;
1235
1236 // DPMS throws a SecurityException
1237 try {
1238 dpm.installCaCert(null, null);
1239 fail("Didn't throw SecurityException on unauthorized access");
1240 } catch (SecurityException expected) {
1241 }
1242
1243 // On calling install certificate APIs from an authorized process
1244 mContext.binder.callingUid = CERT_DELEGATE_UID;
1245 mContext.packageName = CERT_DELEGATE;
1246
1247 // DPMS executes without a SecurityException
1248 try {
1249 dpm.installCaCert(null, null);
1250 } catch (SecurityException unexpected) {
1251 fail("Threw SecurityException on authorized access");
1252 } catch (NullPointerException expected) {
1253 }
1254
1255 // On removing a delegate
1256 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1257 mContext.packageName = admin1.getPackageName();
1258 dpm.setCertInstallerPackage(admin1, null);
1259
1260 // DPMS does not allow access to ex-delegate
1261 mContext.binder.callingUid = CERT_DELEGATE_UID;
1262 mContext.packageName = CERT_DELEGATE;
1263 try {
1264 dpm.installCaCert(null, null);
1265 fail("Didn't throw SecurityException on unauthorized access");
1266 } catch (SecurityException expected) {
1267 }
1268
1269 // But still allows access to other existing delegates
1270 mContext.binder.callingUid = RESTRICTIONS_DELEGATE_UID;
1271 mContext.packageName = RESTRICTIONS_DELEGATE;
1272 try {
1273 dpm.getApplicationRestrictions(null, "pkg");
1274 } catch (SecurityException expected) {
1275 fail("Threw SecurityException on authorized access");
1276 }
1277 }
1278
Esteban Talaverabf60f722015-12-10 16:26:44 +00001279 public void testApplicationRestrictionsManagingApp() throws Exception {
1280 setAsProfileOwner(admin1);
1281
Rubin Xued1928a2016-02-11 17:23:06 +00001282 final String nonExistAppRestrictionsManagerPackage = "com.google.app.restrictions.manager2";
Esteban Talaverabf60f722015-12-10 16:26:44 +00001283 final String appRestrictionsManagerPackage = "com.google.app.restrictions.manager";
1284 final int appRestrictionsManagerAppId = 20987;
Edman Anjosf9946772016-11-28 16:35:15 +01001285 final int appRestrictionsManagerUid = setupPackageInPackageManager(
1286 appRestrictionsManagerPackage, appRestrictionsManagerAppId);
Rubin Xued1928a2016-02-11 17:23:06 +00001287
Esteban Talaverabf60f722015-12-10 16:26:44 +00001288 // appRestrictionsManager package shouldn't be able to manage restrictions as the PO hasn't
1289 // delegated that permission yet.
Edman Anjosf9946772016-11-28 16:35:15 +01001290 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1291 mContext.packageName = admin1.getPackageName();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001292 assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
1293 Bundle rest = new Bundle();
1294 rest.putString("KEY_STRING", "Foo1");
1295 try {
1296 dpm.setApplicationRestrictions(null, "pkg1", rest);
1297 fail("Didn't throw expected SecurityException");
1298 } catch (SecurityException expected) {
1299 MoreAsserts.assertContainsRegex(
Edman Anjosf9946772016-11-28 16:35:15 +01001300 "Caller with uid \\d+ is not a delegate of scope delegation-app-restrictions.",
1301 expected.getMessage());
Esteban Talaverabf60f722015-12-10 16:26:44 +00001302 }
1303 try {
1304 dpm.getApplicationRestrictions(null, "pkg1");
1305 fail("Didn't throw expected SecurityException");
1306 } catch (SecurityException expected) {
1307 MoreAsserts.assertContainsRegex(
Edman Anjosf9946772016-11-28 16:35:15 +01001308 "Caller with uid \\d+ is not a delegate of scope delegation-app-restrictions.",
1309 expected.getMessage());
Esteban Talaverabf60f722015-12-10 16:26:44 +00001310 }
1311
1312 // Check via the profile owner that no restrictions were set.
1313 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Edman Anjosf9946772016-11-28 16:35:15 +01001314 mContext.packageName = admin1.getPackageName();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001315 assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg1").size());
1316
Rubin Xued1928a2016-02-11 17:23:06 +00001317 // Check the API does not allow setting a non-existent package
1318 try {
1319 dpm.setApplicationRestrictionsManagingPackage(admin1,
1320 nonExistAppRestrictionsManagerPackage);
1321 fail("Non-existent app set as app restriction manager.");
Victor Changcd14c0a2016-03-16 19:10:15 +00001322 } catch (PackageManager.NameNotFoundException expected) {
Rubin Xued1928a2016-02-11 17:23:06 +00001323 MoreAsserts.assertContainsRegex(
Victor Changcd14c0a2016-03-16 19:10:15 +00001324 nonExistAppRestrictionsManagerPackage, expected.getMessage());
Rubin Xued1928a2016-02-11 17:23:06 +00001325 }
1326
Esteban Talaverabf60f722015-12-10 16:26:44 +00001327 // Let appRestrictionsManagerPackage manage app restrictions
1328 dpm.setApplicationRestrictionsManagingPackage(admin1, appRestrictionsManagerPackage);
1329 assertEquals(appRestrictionsManagerPackage,
1330 dpm.getApplicationRestrictionsManagingPackage(admin1));
1331
1332 // Now that package should be able to set and retrieve app restrictions.
1333 mContext.binder.callingUid = appRestrictionsManagerUid;
Edman Anjosf9946772016-11-28 16:35:15 +01001334 mContext.packageName = appRestrictionsManagerPackage;
Esteban Talaverabf60f722015-12-10 16:26:44 +00001335 assertTrue(dpm.isCallerApplicationRestrictionsManagingPackage());
1336 dpm.setApplicationRestrictions(null, "pkg1", rest);
1337 Bundle returned = dpm.getApplicationRestrictions(null, "pkg1");
1338 assertEquals(1, returned.size(), 1);
1339 assertEquals("Foo1", returned.get("KEY_STRING"));
1340
1341 // The same app running on a separate user shouldn't be able to manage app restrictions.
1342 mContext.binder.callingUid = UserHandle.getUid(
1343 UserHandle.USER_SYSTEM, appRestrictionsManagerAppId);
1344 assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
1345 try {
1346 dpm.setApplicationRestrictions(null, "pkg1", rest);
1347 fail("Didn't throw expected SecurityException");
1348 } catch (SecurityException expected) {
1349 MoreAsserts.assertContainsRegex(
Edman Anjosf9946772016-11-28 16:35:15 +01001350 "Caller with uid \\d+ is not a delegate of scope delegation-app-restrictions.",
1351 expected.getMessage());
Esteban Talaverabf60f722015-12-10 16:26:44 +00001352 }
1353
1354 // The DPM is still able to manage app restrictions, even if it allowed another app to do it
1355 // too.
1356 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Edman Anjosf9946772016-11-28 16:35:15 +01001357 mContext.packageName = admin1.getPackageName();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001358 assertEquals(returned, dpm.getApplicationRestrictions(admin1, "pkg1"));
1359 dpm.setApplicationRestrictions(admin1, "pkg1", null);
1360 assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg1").size());
1361
1362 // Removing the ability for the package to manage app restrictions.
1363 dpm.setApplicationRestrictionsManagingPackage(admin1, null);
1364 assertNull(dpm.getApplicationRestrictionsManagingPackage(admin1));
1365 mContext.binder.callingUid = appRestrictionsManagerUid;
Edman Anjosf9946772016-11-28 16:35:15 +01001366 mContext.packageName = appRestrictionsManagerPackage;
Esteban Talaverabf60f722015-12-10 16:26:44 +00001367 assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
1368 try {
1369 dpm.setApplicationRestrictions(null, "pkg1", null);
1370 fail("Didn't throw expected SecurityException");
1371 } catch (SecurityException expected) {
1372 MoreAsserts.assertContainsRegex(
Edman Anjosf9946772016-11-28 16:35:15 +01001373 "Caller with uid \\d+ is not a delegate of scope delegation-app-restrictions.",
1374 expected.getMessage());
Esteban Talaverabf60f722015-12-10 16:26:44 +00001375 }
1376 }
1377
Makoto Onukia4f11972015-10-01 13:19:58 -07001378 public void testSetUserRestriction_asDo() throws Exception {
1379 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001380 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia4f11972015-10-01 13:19:58 -07001381 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1382 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1383
1384 // First, set DO.
1385
1386 // Call from a process on the system user.
1387 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1388
1389 // Make sure admin1 is installed on system user.
1390 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
Makoto Onukia4f11972015-10-01 13:19:58 -07001391
1392 // Call.
1393 dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM);
Makoto Onukia52562c2015-10-01 16:12:31 -07001394 assertTrue(dpm.setDeviceOwner(admin1, "owner-name",
Makoto Onukia4f11972015-10-01 13:19:58 -07001395 UserHandle.USER_SYSTEM));
1396
Esteban Talavera6c9116a2016-11-24 16:12:44 +00001397 // Check that the user restrictions that are enabled by default are set. Then unset them.
1398 String[] defaultRestrictions = UserRestrictionsUtils
Esteban Talavera548a04b2016-12-20 15:22:30 +00001399 .getDefaultEnabledForDeviceOwner().toArray(new String[0]);
Esteban Talavera6c9116a2016-11-24 16:12:44 +00001400 DpmTestUtils.assertRestrictions(
1401 DpmTestUtils.newRestrictions(defaultRestrictions),
1402 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1403 );
1404 DpmTestUtils.assertRestrictions(
1405 DpmTestUtils.newRestrictions(defaultRestrictions),
1406 dpm.getUserRestrictions(admin1)
1407 );
Esteban Talavera548a04b2016-12-20 15:22:30 +00001408 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1409 eq(UserHandle.USER_SYSTEM),
Nicolas Prevot2ea46fe2017-01-05 10:29:34 +00001410 MockUtils.checkUserRestrictions(defaultRestrictions),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001411 eq(true) /* isDeviceOwner */,
1412 eq(CAMERA_NOT_DISABLED)
Esteban Talavera548a04b2016-12-20 15:22:30 +00001413 );
1414 reset(mContext.userManagerInternal);
Esteban Talavera6c9116a2016-11-24 16:12:44 +00001415
1416 for (String restriction : defaultRestrictions) {
1417 dpm.clearUserRestriction(admin1, restriction);
1418 }
1419
Esteban Talavera548a04b2016-12-20 15:22:30 +00001420 assertNoDeviceOwnerRestrictions();
Pavel Grafov6a40f092016-10-25 15:46:51 +01001421 reset(mContext.userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001422
1423 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
1424 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1425 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001426 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
1427 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001428 reset(mContext.userManagerInternal);
1429
Makoto Onukia4f11972015-10-01 13:19:58 -07001430 dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001431 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1432 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001433 MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS,
1434 UserManager.DISALLOW_ADD_USER),
1435 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001436 reset(mContext.userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001437
Makoto Onuki068c54a2015-10-13 14:34:03 -07001438 DpmTestUtils.assertRestrictions(
1439 DpmTestUtils.newRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001440 UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_OUTGOING_CALLS),
Makoto Onuki068c54a2015-10-13 14:34:03 -07001441 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1442 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001443 DpmTestUtils.assertRestrictions(
1444 DpmTestUtils.newRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001445 UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_OUTGOING_CALLS),
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001446 dpm.getUserRestrictions(admin1)
1447 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001448
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001449 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
1450 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1451 eq(UserHandle.USER_SYSTEM),
1452 MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001453 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001454 reset(mContext.userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001455
Makoto Onuki068c54a2015-10-13 14:34:03 -07001456 DpmTestUtils.assertRestrictions(
1457 DpmTestUtils.newRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
1458 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1459 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001460 DpmTestUtils.assertRestrictions(
1461 DpmTestUtils.newRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
1462 dpm.getUserRestrictions(admin1)
1463 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001464
1465 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001466 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1467 eq(UserHandle.USER_SYSTEM),
1468 MockUtils.checkUserRestrictions(),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001469 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001470 reset(mContext.userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001471
Esteban Talavera548a04b2016-12-20 15:22:30 +00001472 assertNoDeviceOwnerRestrictions();
Makoto Onukia4f11972015-10-01 13:19:58 -07001473
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001474 // DISALLOW_ADJUST_VOLUME and DISALLOW_UNMUTE_MICROPHONE are PO restrictions, but when
1475 // DO sets them, the scope is global.
1476 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
1477 reset(mContext.userManagerInternal);
1478 dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
1479 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1480 eq(UserHandle.USER_SYSTEM),
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001481 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001482 UserManager.DISALLOW_UNMUTE_MICROPHONE),
1483 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001484 reset(mContext.userManagerInternal);
1485
1486 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
1487 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
Pavel Grafov6a40f092016-10-25 15:46:51 +01001488 reset(mContext.userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001489
1490 // More tests.
1491 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
1492 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1493 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001494 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
1495 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001496 reset(mContext.userManagerInternal);
1497
1498 dpm.addUserRestriction(admin1, UserManager.DISALLOW_FUN);
1499 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1500 eq(UserHandle.USER_SYSTEM),
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001501 MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001502 UserManager.DISALLOW_ADD_USER),
1503 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001504 reset(mContext.userManagerInternal);
1505
1506 dpm.setCameraDisabled(admin1, true);
1507 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1508 eq(UserHandle.USER_SYSTEM),
1509 // DISALLOW_CAMERA will be applied to both local and global.
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001510 MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001511 UserManager.DISALLOW_ADD_USER),
1512 eq(true), eq(CAMERA_DISABLED_GLOBALLY));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001513 reset(mContext.userManagerInternal);
1514
1515 // Set up another DA and let it disable camera. Now DISALLOW_CAMERA will only be applied
1516 // locally.
1517 dpm.setCameraDisabled(admin1, false);
1518 reset(mContext.userManagerInternal);
1519
1520 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_SYSTEM_USER_UID);
1521 dpm.setActiveAdmin(admin2, /* replace =*/ false, UserHandle.USER_SYSTEM);
1522 dpm.setCameraDisabled(admin2, true);
1523
1524 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1525 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001526 // DISALLOW_CAMERA will be applied to both local and global. <- TODO: fix this
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001527 MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001528 UserManager.DISALLOW_ADD_USER),
1529 eq(true), eq(CAMERA_DISABLED_LOCALLY));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001530 reset(mContext.userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001531 // TODO Make sure restrictions are written to the file.
1532 }
1533
1534 public void testSetUserRestriction_asPo() {
1535 setAsProfileOwner(admin1);
1536
Makoto Onuki068c54a2015-10-13 14:34:03 -07001537 DpmTestUtils.assertRestrictions(
1538 DpmTestUtils.newRestrictions(),
1539 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1540 .ensureUserRestrictions()
1541 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001542
1543 dpm.addUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001544 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1545 eq(DpmMockContext.CALLER_USER_HANDLE),
1546 MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001547 eq(false), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001548 reset(mContext.userManagerInternal);
1549
Makoto Onukia4f11972015-10-01 13:19:58 -07001550 dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001551 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1552 eq(DpmMockContext.CALLER_USER_HANDLE),
1553 MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
1554 UserManager.DISALLOW_OUTGOING_CALLS),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001555 eq(false), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001556 reset(mContext.userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001557
Makoto Onuki068c54a2015-10-13 14:34:03 -07001558 DpmTestUtils.assertRestrictions(
1559 DpmTestUtils.newRestrictions(
1560 UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
1561 UserManager.DISALLOW_OUTGOING_CALLS
1562 ),
1563 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1564 .ensureUserRestrictions()
1565 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001566 DpmTestUtils.assertRestrictions(
1567 DpmTestUtils.newRestrictions(
1568 UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
1569 UserManager.DISALLOW_OUTGOING_CALLS
1570 ),
1571 dpm.getUserRestrictions(admin1)
1572 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001573
1574 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001575 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1576 eq(DpmMockContext.CALLER_USER_HANDLE),
1577 MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001578 eq(false), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001579 reset(mContext.userManagerInternal);
Makoto Onuki068c54a2015-10-13 14:34:03 -07001580
1581 DpmTestUtils.assertRestrictions(
1582 DpmTestUtils.newRestrictions(
1583 UserManager.DISALLOW_OUTGOING_CALLS
1584 ),
1585 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1586 .ensureUserRestrictions()
1587 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001588 DpmTestUtils.assertRestrictions(
1589 DpmTestUtils.newRestrictions(
1590 UserManager.DISALLOW_OUTGOING_CALLS
1591 ),
1592 dpm.getUserRestrictions(admin1)
1593 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001594
1595 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001596 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1597 eq(DpmMockContext.CALLER_USER_HANDLE),
1598 MockUtils.checkUserRestrictions(),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001599 eq(false), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001600 reset(mContext.userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001601
Makoto Onuki068c54a2015-10-13 14:34:03 -07001602 DpmTestUtils.assertRestrictions(
1603 DpmTestUtils.newRestrictions(),
1604 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1605 .ensureUserRestrictions()
1606 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001607 DpmTestUtils.assertRestrictions(
1608 DpmTestUtils.newRestrictions(),
1609 dpm.getUserRestrictions(admin1)
1610 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001611
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001612 // DISALLOW_ADJUST_VOLUME and DISALLOW_UNMUTE_MICROPHONE can be set by PO too, even
1613 // though when DO sets them they'll be applied globally.
1614 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
1615 reset(mContext.userManagerInternal);
1616 dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
1617 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1618 eq(DpmMockContext.CALLER_USER_HANDLE),
1619 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
1620 UserManager.DISALLOW_UNMUTE_MICROPHONE),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001621 eq(false), eq(CAMERA_NOT_DISABLED));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001622 reset(mContext.userManagerInternal);
1623
1624 dpm.setCameraDisabled(admin1, true);
1625 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1626 eq(DpmMockContext.CALLER_USER_HANDLE),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001627 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001628 UserManager.DISALLOW_UNMUTE_MICROPHONE),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001629 eq(false), eq(CAMERA_DISABLED_LOCALLY));
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001630 reset(mContext.userManagerInternal);
1631
Makoto Onukia4f11972015-10-01 13:19:58 -07001632 // TODO Make sure restrictions are written to the file.
1633 }
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001634
Esteban Talavera548a04b2016-12-20 15:22:30 +00001635
1636 public void testDefaultEnabledUserRestrictions() throws Exception {
1637 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1638 mContext.callerPermissions.add(permission.MANAGE_USERS);
1639 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1640 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1641
1642 // First, set DO.
1643
1644 // Call from a process on the system user.
1645 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1646
1647 // Make sure admin1 is installed on system user.
1648 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1649
1650 dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM);
1651 assertTrue(dpm.setDeviceOwner(admin1, "owner-name",
1652 UserHandle.USER_SYSTEM));
1653
1654 // Check that the user restrictions that are enabled by default are set. Then unset them.
1655 String[] defaultRestrictions = UserRestrictionsUtils
1656 .getDefaultEnabledForDeviceOwner().toArray(new String[0]);
1657 assertTrue(defaultRestrictions.length > 0);
1658 DpmTestUtils.assertRestrictions(
1659 DpmTestUtils.newRestrictions(defaultRestrictions),
1660 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1661 );
1662 DpmTestUtils.assertRestrictions(
1663 DpmTestUtils.newRestrictions(defaultRestrictions),
1664 dpm.getUserRestrictions(admin1)
1665 );
1666 verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
1667 eq(UserHandle.USER_SYSTEM),
Nicolas Prevot2ea46fe2017-01-05 10:29:34 +00001668 MockUtils.checkUserRestrictions(defaultRestrictions),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001669 eq(true) /* isDeviceOwner */,
1670 eq(CAMERA_NOT_DISABLED)
Esteban Talavera548a04b2016-12-20 15:22:30 +00001671 );
1672 reset(mContext.userManagerInternal);
1673
1674 for (String restriction : defaultRestrictions) {
1675 dpm.clearUserRestriction(admin1, restriction);
1676 }
1677
1678 assertNoDeviceOwnerRestrictions();
1679
1680 // Initialize DPMS again and check that the user restriction wasn't enabled again.
1681 reset(mContext.userManagerInternal);
1682 initializeDpms();
1683 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1684 assertNotNull(dpms.getDeviceOwnerAdminLocked());
1685
1686 assertNoDeviceOwnerRestrictions();
1687
1688 // Add a new restriction to the default set, initialize DPMS, and check that the restriction
1689 // is set as it wasn't enabled during setDeviceOwner.
1690 final String newDefaultEnabledRestriction = UserManager.DISALLOW_REMOVE_MANAGED_PROFILE;
1691 assertFalse(UserRestrictionsUtils
1692 .getDefaultEnabledForDeviceOwner().contains(newDefaultEnabledRestriction));
1693 UserRestrictionsUtils
1694 .getDefaultEnabledForDeviceOwner().add(newDefaultEnabledRestriction);
1695 try {
1696 reset(mContext.userManagerInternal);
1697 initializeDpms();
1698 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1699 assertNotNull(dpms.getDeviceOwnerAdminLocked());
1700
1701 DpmTestUtils.assertRestrictions(
1702 DpmTestUtils.newRestrictions(newDefaultEnabledRestriction),
1703 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1704 );
1705 DpmTestUtils.assertRestrictions(
1706 DpmTestUtils.newRestrictions(newDefaultEnabledRestriction),
1707 dpm.getUserRestrictions(admin1)
1708 );
1709 verify(mContext.userManagerInternal, atLeast(1)).setDevicePolicyUserRestrictions(
1710 eq(UserHandle.USER_SYSTEM),
Nicolas Prevot2ea46fe2017-01-05 10:29:34 +00001711 MockUtils.checkUserRestrictions(newDefaultEnabledRestriction),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001712 eq(true) /* isDeviceOwner */,
1713 eq(CAMERA_NOT_DISABLED)
Esteban Talavera548a04b2016-12-20 15:22:30 +00001714 );
1715 reset(mContext.userManagerInternal);
1716
1717 // Remove the restriction.
1718 dpm.clearUserRestriction(admin1, newDefaultEnabledRestriction);
1719
1720 // Initialize DPMS again. The restriction shouldn't be enabled for a second time.
1721 initializeDpms();
1722 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1723 assertNotNull(dpms.getDeviceOwnerAdminLocked());
1724 assertNoDeviceOwnerRestrictions();
1725 } finally {
1726 UserRestrictionsUtils
1727 .getDefaultEnabledForDeviceOwner().remove(newDefaultEnabledRestriction);
1728 }
1729 }
1730
1731 private void assertNoDeviceOwnerRestrictions() {
1732 DpmTestUtils.assertRestrictions(
1733 DpmTestUtils.newRestrictions(),
1734 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1735 );
1736 DpmTestUtils.assertRestrictions(
1737 DpmTestUtils.newRestrictions(),
1738 dpm.getUserRestrictions(admin1)
1739 );
1740 }
1741
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001742 public void testGetMacAddress() throws Exception {
1743 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1744 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1745 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1746
1747 // In this test, change the caller user to "system".
1748 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1749
1750 // Make sure admin1 is installed on system user.
1751 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1752
1753 // Test 1. Caller doesn't have DO or DA.
1754 try {
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001755 dpm.getWifiMacAddress(admin1);
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001756 fail();
1757 } catch (SecurityException e) {
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001758 MoreAsserts.assertContainsRegex("No active admin", e.getMessage());
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001759 }
1760
1761 // DO needs to be an DA.
1762 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1763 assertTrue(dpm.isAdminActive(admin1));
1764
1765 // Test 2. Caller has DA, but not DO.
1766 try {
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001767 dpm.getWifiMacAddress(admin1);
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001768 fail();
1769 } catch (SecurityException e) {
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001770 MoreAsserts.assertContainsRegex("does not own the device", e.getMessage());
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001771 }
1772
1773 // Test 3. Caller has PO, but not DO.
1774 assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
1775 try {
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001776 dpm.getWifiMacAddress(admin1);
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001777 fail();
1778 } catch (SecurityException e) {
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001779 MoreAsserts.assertContainsRegex("does not own the device", e.getMessage());
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001780 }
1781
1782 // Remove PO.
1783 dpm.clearProfileOwner(admin1);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07001784 dpm.setActiveAdmin(admin1, false);
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001785 // Test 4, Caller is DO now.
1786 assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
1787
1788 // 4-1. But no WifiInfo.
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001789 assertNull(dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001790
1791 // 4-2. Returns WifiInfo, but with the default MAC.
1792 when(mContext.wifiManager.getConnectionInfo()).thenReturn(new WifiInfo());
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001793 assertNull(dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001794
1795 // 4-3. With a real MAC address.
1796 final WifiInfo wi = new WifiInfo();
1797 wi.setMacAddress("11:22:33:44:55:66");
1798 when(mContext.wifiManager.getConnectionInfo()).thenReturn(wi);
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001799 assertEquals("11:22:33:44:55:66", dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001800 }
Mahaver Chopraf8373b52015-12-23 14:42:18 +00001801
Mahaver Chopra1216ae52016-03-11 15:39:48 +00001802 public void testReboot() throws Exception {
Mahaver Chopraf8373b52015-12-23 14:42:18 +00001803 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1804 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1805
1806 // In this test, change the caller user to "system".
1807 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1808
1809 // Make sure admin1 is installed on system user.
1810 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1811
1812 // Set admin1 as DA.
1813 dpm.setActiveAdmin(admin1, false);
1814 assertTrue(dpm.isAdminActive(admin1));
1815 try {
1816 dpm.reboot(admin1);
1817 fail("DA calls DPM.reboot(), did not throw expected SecurityException");
1818 } catch (SecurityException expected) {
1819 MoreAsserts.assertContainsRegex("does not own the device", expected.getMessage());
1820 }
1821
1822 // Set admin1 as PO.
1823 assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
1824 try {
1825 dpm.reboot(admin1);
1826 fail("PO calls DPM.reboot(), did not throw expected SecurityException");
1827 } catch (SecurityException expected) {
1828 MoreAsserts.assertContainsRegex("does not own the device", expected.getMessage());
1829 }
1830
1831 // Remove PO and add DO.
1832 dpm.clearProfileOwner(admin1);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07001833 dpm.setActiveAdmin(admin1, false);
Mahaver Chopraf8373b52015-12-23 14:42:18 +00001834 assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
1835
Mahaver Chopra1216ae52016-03-11 15:39:48 +00001836 // admin1 is DO.
1837 // Set current call state of device to ringing.
1838 when(mContext.telephonyManager.getCallState())
1839 .thenReturn(TelephonyManager.CALL_STATE_RINGING);
1840 try {
1841 dpm.reboot(admin1);
1842 fail("DPM.reboot() called when receiveing a call, should thrown IllegalStateException");
1843 } catch (IllegalStateException expected) {
1844 MoreAsserts.assertContainsRegex("ongoing call on the device", expected.getMessage());
1845 }
1846
1847 // Set current call state of device to dialing/active.
1848 when(mContext.telephonyManager.getCallState())
1849 .thenReturn(TelephonyManager.CALL_STATE_OFFHOOK);
1850 try {
1851 dpm.reboot(admin1);
1852 fail("DPM.reboot() called when dialing, should thrown IllegalStateException");
1853 } catch (IllegalStateException expected) {
1854 MoreAsserts.assertContainsRegex("ongoing call on the device", expected.getMessage());
1855 }
1856
1857 // Set current call state of device to idle.
1858 when(mContext.telephonyManager.getCallState()).thenReturn(TelephonyManager.CALL_STATE_IDLE);
Mahaver Chopraf8373b52015-12-23 14:42:18 +00001859 dpm.reboot(admin1);
1860 }
Kenny Guy06de4e72015-12-22 12:07:39 +00001861
1862 public void testSetGetSupportText() {
1863 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1864 dpm.setActiveAdmin(admin1, true);
1865 dpm.setActiveAdmin(admin2, true);
1866 mContext.callerPermissions.remove(permission.MANAGE_DEVICE_ADMINS);
1867
1868 // Null default support messages.
1869 {
1870 assertNull(dpm.getLongSupportMessage(admin1));
1871 assertNull(dpm.getShortSupportMessage(admin1));
1872 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
1873 assertNull(dpm.getShortSupportMessageForUser(admin1,
1874 DpmMockContext.CALLER_USER_HANDLE));
1875 assertNull(dpm.getLongSupportMessageForUser(admin1,
1876 DpmMockContext.CALLER_USER_HANDLE));
1877 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
1878 }
1879
1880 // Only system can call the per user versions.
1881 {
1882 try {
1883 dpm.getShortSupportMessageForUser(admin1,
1884 DpmMockContext.CALLER_USER_HANDLE);
1885 fail("Only system should be able to call getXXXForUser versions");
1886 } catch (SecurityException expected) {
1887 MoreAsserts.assertContainsRegex("message for user", expected.getMessage());
1888 }
1889 try {
1890 dpm.getLongSupportMessageForUser(admin1,
1891 DpmMockContext.CALLER_USER_HANDLE);
1892 fail("Only system should be able to call getXXXForUser versions");
1893 } catch (SecurityException expected) {
1894 MoreAsserts.assertContainsRegex("message for user", expected.getMessage());
1895 }
1896 }
1897
1898 // Can't set message for admin in another uid.
1899 {
1900 mContext.binder.callingUid = DpmMockContext.CALLER_UID + 1;
1901 try {
1902 dpm.setShortSupportMessage(admin1, "Some text");
1903 fail("Admins should only be able to change their own support text.");
1904 } catch (SecurityException expected) {
1905 MoreAsserts.assertContainsRegex("is not owned by uid", expected.getMessage());
1906 }
1907 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1908 }
1909
1910 // Set/Get short returns what it sets and other admins text isn't changed.
1911 {
1912 final String supportText = "Some text to test with.";
1913 dpm.setShortSupportMessage(admin1, supportText);
1914 assertEquals(supportText, dpm.getShortSupportMessage(admin1));
1915 assertNull(dpm.getLongSupportMessage(admin1));
1916 assertNull(dpm.getShortSupportMessage(admin2));
1917
1918 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
1919 assertEquals(supportText, dpm.getShortSupportMessageForUser(admin1,
1920 DpmMockContext.CALLER_USER_HANDLE));
1921 assertNull(dpm.getShortSupportMessageForUser(admin2,
1922 DpmMockContext.CALLER_USER_HANDLE));
1923 assertNull(dpm.getLongSupportMessageForUser(admin1,
1924 DpmMockContext.CALLER_USER_HANDLE));
1925 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
1926
1927 dpm.setShortSupportMessage(admin1, null);
1928 assertNull(dpm.getShortSupportMessage(admin1));
1929 }
1930
1931 // Set/Get long returns what it sets and other admins text isn't changed.
1932 {
1933 final String supportText = "Some text to test with.\nWith more text.";
1934 dpm.setLongSupportMessage(admin1, supportText);
1935 assertEquals(supportText, dpm.getLongSupportMessage(admin1));
1936 assertNull(dpm.getShortSupportMessage(admin1));
1937 assertNull(dpm.getLongSupportMessage(admin2));
1938
1939 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
1940 assertEquals(supportText, dpm.getLongSupportMessageForUser(admin1,
1941 DpmMockContext.CALLER_USER_HANDLE));
1942 assertNull(dpm.getLongSupportMessageForUser(admin2,
1943 DpmMockContext.CALLER_USER_HANDLE));
1944 assertNull(dpm.getShortSupportMessageForUser(admin1,
1945 DpmMockContext.CALLER_USER_HANDLE));
1946 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
1947
1948 dpm.setLongSupportMessage(admin1, null);
1949 assertNull(dpm.getLongSupportMessage(admin1));
1950 }
1951 }
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01001952
phweiss73145f42017-01-17 19:06:38 +01001953 public void testCreateAdminSupportIntent() throws Exception {
1954 // Setup device owner.
1955 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1956 setupDeviceOwner();
1957
1958 // Nonexisting permission returns null
1959 Intent intent = dpm.createAdminSupportIntent("disallow_nothing");
1960 assertNull(intent);
1961
1962 // Existing permission that is not set returns null
1963 intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
1964 assertNull(intent);
1965
1966 // Existing permission that is not set by device/profile owner returns null
1967 when(mContext.userManager.hasUserRestriction(
1968 eq(UserManager.DISALLOW_ADJUST_VOLUME),
1969 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
1970 .thenReturn(true);
1971 intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
1972 assertNull(intent);
1973
1974 // Permission that is set by device owner returns correct intent
1975 when(mContext.userManager.getUserRestrictionSource(
1976 eq(UserManager.DISALLOW_ADJUST_VOLUME),
1977 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
1978 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
1979 intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
1980 assertNotNull(intent);
1981 assertEquals(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS, intent.getAction());
1982 assertEquals(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID),
1983 intent.getIntExtra(Intent.EXTRA_USER_ID, -1));
1984 assertEquals(admin1,
1985 (ComponentName) intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN));
1986 assertEquals(UserManager.DISALLOW_ADJUST_VOLUME,
1987 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
1988
1989 // Try with POLICY_DISABLE_CAMERA and POLICY_DISABLE_SCREEN_CAPTURE, which are not
1990 // user restrictions
1991
1992 // Camera is not disabled
1993 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
1994 assertNull(intent);
1995
1996 // Camera is disabled
1997 dpm.setCameraDisabled(admin1, true);
1998 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
1999 assertNotNull(intent);
2000 assertEquals(DevicePolicyManager.POLICY_DISABLE_CAMERA,
2001 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2002
2003 // Screen capture is not disabled
2004 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
2005 assertNull(intent);
2006
2007 // Screen capture is disabled
2008 dpm.setScreenCaptureDisabled(admin1, true);
2009 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
2010 assertNotNull(intent);
2011 assertEquals(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE,
2012 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2013
2014 // Same checks for different user
2015 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2016 // Camera should be disabled by device owner
2017 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
2018 assertNotNull(intent);
2019 assertEquals(DevicePolicyManager.POLICY_DISABLE_CAMERA,
2020 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2021 assertEquals(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID),
2022 intent.getIntExtra(Intent.EXTRA_USER_ID, -1));
2023 // ScreenCapture should not be disabled by device owner
2024 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
2025 assertNull(intent);
2026 }
2027
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002028 /**
2029 * Test for:
2030 * {@link DevicePolicyManager#setAffiliationIds}
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002031 * {@link DevicePolicyManager#getAffiliationIds}
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002032 * {@link DevicePolicyManager#isAffiliatedUser}
2033 */
2034 public void testUserAffiliation() throws Exception {
2035 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
2036 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2037 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
2038
2039 // Check that the system user is unaffiliated.
2040 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2041 assertFalse(dpm.isAffiliatedUser());
2042
2043 // Set a device owner on the system user. Check that the system user becomes affiliated.
2044 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
2045 dpm.setActiveAdmin(admin1, /* replace =*/ false);
2046 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
2047 assertTrue(dpm.isAffiliatedUser());
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002048 assertTrue(dpm.getAffiliationIds(admin1).isEmpty());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002049
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002050 // Install a profile owner. Check that the test user is unaffiliated.
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002051 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2052 setAsProfileOwner(admin2);
2053 assertFalse(dpm.isAffiliatedUser());
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002054 assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002055
2056 // Have the profile owner specify a set of affiliation ids. Check that the test user remains
2057 // unaffiliated.
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002058 final List<String> userAffiliationIds = new ArrayList<>();
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002059 userAffiliationIds.add("red");
2060 userAffiliationIds.add("green");
2061 userAffiliationIds.add("blue");
2062 dpm.setAffiliationIds(admin2, userAffiliationIds);
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002063 MoreAsserts.assertContentsInAnyOrder(dpm.getAffiliationIds(admin2), "red", "green", "blue");
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002064 assertFalse(dpm.isAffiliatedUser());
2065
2066 // Have the device owner specify a set of affiliation ids that do not intersect with those
2067 // specified by the profile owner. Check that the test user remains unaffiliated.
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002068 final List<String> deviceAffiliationIds = new ArrayList<>();
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002069 deviceAffiliationIds.add("cyan");
2070 deviceAffiliationIds.add("yellow");
2071 deviceAffiliationIds.add("magenta");
2072 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2073 dpm.setAffiliationIds(admin1, deviceAffiliationIds);
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002074 MoreAsserts.assertContentsInAnyOrder(
2075 dpm.getAffiliationIds(admin1), "cyan", "yellow", "magenta");
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002076 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2077 assertFalse(dpm.isAffiliatedUser());
2078
2079 // Have the profile owner specify a set of affiliation ids that intersect with those
2080 // specified by the device owner. Check that the test user becomes affiliated.
2081 userAffiliationIds.add("yellow");
2082 dpm.setAffiliationIds(admin2, userAffiliationIds);
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002083 MoreAsserts.assertContentsInAnyOrder(
2084 dpm.getAffiliationIds(admin2), "red", "green", "blue", "yellow");
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002085 assertTrue(dpm.isAffiliatedUser());
2086
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002087 // Clear affiliation ids for the profile owner. The user becomes unaffiliated.
2088 dpm.setAffiliationIds(admin2, Collections.emptyList());
2089 assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002090 assertFalse(dpm.isAffiliatedUser());
2091
2092 // Check that the system user remains affiliated.
2093 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2094 assertTrue(dpm.isAffiliatedUser());
2095 }
Alan Treadwayafad8782016-01-19 15:15:08 +00002096
2097 public void testGetUserProvisioningState_defaultResult() {
2098 assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
2099 }
2100
2101 public void testSetUserProvisioningState_permission() throws Exception {
2102 setupProfileOwner();
2103 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2104
2105 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2106 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2107 }
2108
2109 public void testSetUserProvisioningState_unprivileged() throws Exception {
2110 setupProfileOwner();
2111 try {
2112 dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
2113 DpmMockContext.CALLER_USER_HANDLE);
2114 fail("Expected SecurityException");
2115 } catch (SecurityException expected) {
2116 }
2117 }
2118
2119 public void testSetUserProvisioningState_noManagement() {
2120 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2121 try {
2122 dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
2123 DpmMockContext.CALLER_USER_HANDLE);
2124 fail("IllegalStateException expected");
2125 } catch (IllegalStateException e) {
2126 MoreAsserts.assertContainsRegex("change provisioning state unless a .* owner is set",
2127 e.getMessage());
2128 }
2129 assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
2130 }
2131
2132 public void testSetUserProvisioningState_deviceOwnerFromSetupWizard() throws Exception {
2133 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2134 setupDeviceOwner();
2135 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2136
2137 exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
2138 DevicePolicyManager.STATE_USER_SETUP_COMPLETE,
2139 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2140 }
2141
2142 public void testSetUserProvisioningState_deviceOwnerFromSetupWizardAlternative()
2143 throws Exception {
2144 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2145 setupDeviceOwner();
2146 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2147
2148 exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
2149 DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE,
2150 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2151 }
2152
2153 public void testSetUserProvisioningState_deviceOwnerWithoutSetupWizard() throws Exception {
2154 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2155 setupDeviceOwner();
2156 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2157
2158 exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
2159 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2160 }
2161
2162 public void testSetUserProvisioningState_managedProfileFromSetupWizard_primaryUser()
2163 throws Exception {
2164 setupProfileOwner();
2165 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2166
2167 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2168 DevicePolicyManager.STATE_USER_PROFILE_COMPLETE,
2169 DevicePolicyManager.STATE_USER_UNMANAGED);
2170 }
2171
2172 public void testSetUserProvisioningState_managedProfileFromSetupWizard_managedProfile()
2173 throws Exception {
2174 setupProfileOwner();
2175 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2176
2177 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2178 DevicePolicyManager.STATE_USER_SETUP_COMPLETE,
2179 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2180 }
2181
2182 public void testSetUserProvisioningState_managedProfileWithoutSetupWizard() throws Exception {
2183 setupProfileOwner();
2184 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2185
2186 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2187 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2188 }
2189
2190 public void testSetUserProvisioningState_illegalTransitionOutOfFinalized1() throws Exception {
2191 setupProfileOwner();
2192 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2193
2194 try {
2195 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2196 DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
2197 DevicePolicyManager.STATE_USER_UNMANAGED);
2198 fail("Expected IllegalStateException");
2199 } catch (IllegalStateException e) {
2200 MoreAsserts.assertContainsRegex("Cannot move to user provisioning state",
2201 e.getMessage());
2202 }
2203 }
2204
2205 public void testSetUserProvisioningState_illegalTransitionToAnotherInProgressState()
2206 throws Exception {
2207 setupProfileOwner();
2208 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2209
2210 try {
2211 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2212 DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE,
2213 DevicePolicyManager.STATE_USER_SETUP_COMPLETE);
2214 fail("Expected IllegalStateException");
2215 } catch (IllegalStateException e) {
2216 MoreAsserts.assertContainsRegex("Cannot move to user provisioning state",
2217 e.getMessage());
2218 }
2219 }
2220
2221 private void exerciseUserProvisioningTransitions(int userId, int... states) {
2222 assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
2223 for (int state : states) {
2224 dpm.setUserProvisioningState(state, userId);
2225 assertEquals(state, dpm.getUserProvisioningState());
2226 }
2227 }
2228
2229 private void setupProfileOwner() throws Exception {
2230 mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
2231
2232 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
2233 dpm.setActiveAdmin(admin1, false);
2234 assertTrue(dpm.setProfileOwner(admin1, null, DpmMockContext.CALLER_USER_HANDLE));
2235
2236 mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
2237 }
2238
2239 private void setupDeviceOwner() throws Exception {
2240 mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
2241
2242 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
2243 dpm.setActiveAdmin(admin1, false);
2244 assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
2245
2246 mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
2247 }
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002248
2249 public void testSetMaximumTimeToLock() {
2250 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
2251
2252 dpm.setActiveAdmin(admin1, /* replace =*/ false);
2253 dpm.setActiveAdmin(admin2, /* replace =*/ false);
2254
2255 reset(mMockContext.powerManagerInternal);
2256 reset(mMockContext.settings);
2257
2258 dpm.setMaximumTimeToLock(admin1, 0);
2259 verifyScreenTimeoutCall(null, false);
2260 reset(mMockContext.powerManagerInternal);
2261 reset(mMockContext.settings);
2262
2263 dpm.setMaximumTimeToLock(admin1, 1);
2264 verifyScreenTimeoutCall(1, true);
2265 reset(mMockContext.powerManagerInternal);
2266 reset(mMockContext.settings);
2267
2268 dpm.setMaximumTimeToLock(admin2, 10);
2269 verifyScreenTimeoutCall(null, false);
2270 reset(mMockContext.powerManagerInternal);
2271 reset(mMockContext.settings);
2272
2273 dpm.setMaximumTimeToLock(admin1, 5);
2274 verifyScreenTimeoutCall(5, true);
2275 reset(mMockContext.powerManagerInternal);
2276 reset(mMockContext.settings);
2277
2278 dpm.setMaximumTimeToLock(admin2, 4);
2279 verifyScreenTimeoutCall(4, true);
2280 reset(mMockContext.powerManagerInternal);
2281 reset(mMockContext.settings);
2282
2283 dpm.setMaximumTimeToLock(admin1, 0);
2284 reset(mMockContext.powerManagerInternal);
2285 reset(mMockContext.settings);
2286
2287 dpm.setMaximumTimeToLock(admin2, Integer.MAX_VALUE);
2288 verifyScreenTimeoutCall(Integer.MAX_VALUE, true);
2289 reset(mMockContext.powerManagerInternal);
2290 reset(mMockContext.settings);
2291
2292 dpm.setMaximumTimeToLock(admin2, Integer.MAX_VALUE + 1);
2293 verifyScreenTimeoutCall(Integer.MAX_VALUE, true);
2294 reset(mMockContext.powerManagerInternal);
2295 reset(mMockContext.settings);
2296
2297 dpm.setMaximumTimeToLock(admin2, 10);
2298 verifyScreenTimeoutCall(10, true);
2299 reset(mMockContext.powerManagerInternal);
2300 reset(mMockContext.settings);
2301
2302 // There's no restriction; shold be set to MAX.
2303 dpm.setMaximumTimeToLock(admin2, 0);
2304 verifyScreenTimeoutCall(Integer.MAX_VALUE, false);
2305 }
2306
Michal Karpinski943aabd2016-10-06 11:09:25 +01002307 public void testSetRequiredStrongAuthTimeout_DeviceOwner() throws Exception {
2308 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2309 setupDeviceOwner();
2310 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2311
Michal Karpinskid084ca52017-01-18 15:54:18 +00002312 final long MINIMUM_STRONG_AUTH_TIMEOUT_MS = TimeUnit.HOURS.toMillis(1);
2313 final long ONE_MINUTE = TimeUnit.MINUTES.toMillis(1);
2314 final long MIN_PLUS_ONE_MINUTE = MINIMUM_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE;
2315 final long MAX_MINUS_ONE_MINUTE = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS
2316 - ONE_MINUTE;
2317
2318 // verify that the minimum timeout cannot be modified on user builds (system property is
2319 // not being read)
2320 mContext.buildMock.isDebuggable = false;
2321
2322 dpm.setRequiredStrongAuthTimeout(admin1, MAX_MINUS_ONE_MINUTE);
2323 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MAX_MINUS_ONE_MINUTE);
2324 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MAX_MINUS_ONE_MINUTE);
2325
2326 verify(mContext.systemProperties, never()).getLong(anyString(), anyLong());
2327
2328 // restore to the debuggable build state
2329 mContext.buildMock.isDebuggable = true;
2330
2331 // Always return the default (second arg) when getting system property for long type
2332 when(mContext.systemProperties.getLong(anyString(), anyLong())).thenAnswer(
2333 new Answer<Long>() {
2334 @Override
2335 public Long answer(InvocationOnMock invocation) throws Throwable {
2336 return (Long) invocation.getArguments()[1];
2337 }
2338 }
2339 );
2340
2341 // reset to default (0 means the admin is not participating, so default should be returned)
2342 dpm.setRequiredStrongAuthTimeout(admin1, 0);
Michal Karpinski943aabd2016-10-06 11:09:25 +01002343
2344 // aggregation should be the default if unset by any admin
2345 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2346 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2347
2348 // admin not participating by default
2349 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
2350
2351 //clamping from the top
2352 dpm.setRequiredStrongAuthTimeout(admin1,
2353 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE);
2354 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1),
2355 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2356 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2357 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2358
Michal Karpinskid084ca52017-01-18 15:54:18 +00002359 // 0 means the admin is not participating, so default should be returned
Michal Karpinski943aabd2016-10-06 11:09:25 +01002360 dpm.setRequiredStrongAuthTimeout(admin1, 0);
2361 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
2362 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2363 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2364
2365 // clamping from the bottom
2366 dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS - ONE_MINUTE);
2367 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
2368 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
2369
Michal Karpinskid084ca52017-01-18 15:54:18 +00002370 // values within range
2371 dpm.setRequiredStrongAuthTimeout(admin1, MIN_PLUS_ONE_MINUTE);
2372 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MIN_PLUS_ONE_MINUTE);
2373 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MIN_PLUS_ONE_MINUTE);
2374
2375 dpm.setRequiredStrongAuthTimeout(admin1, MAX_MINUS_ONE_MINUTE);
2376 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MAX_MINUS_ONE_MINUTE);
2377 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MAX_MINUS_ONE_MINUTE);
Michal Karpinski943aabd2016-10-06 11:09:25 +01002378
2379 // reset to default
2380 dpm.setRequiredStrongAuthTimeout(admin1, 0);
2381 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
2382 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2383 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2384
2385 // negative value
2386 try {
2387 dpm.setRequiredStrongAuthTimeout(admin1, -ONE_MINUTE);
2388 fail("Didn't throw IllegalArgumentException");
2389 } catch (IllegalArgumentException iae) {
2390 }
2391 }
2392
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002393 private void verifyScreenTimeoutCall(Integer expectedTimeout,
2394 boolean shouldStayOnWhilePluggedInBeCleared) {
2395 if (expectedTimeout == null) {
2396 verify(mMockContext.powerManagerInternal, times(0))
2397 .setMaximumScreenOffTimeoutFromDeviceAdmin(anyInt());
2398 } else {
2399 verify(mMockContext.powerManagerInternal, times(1))
2400 .setMaximumScreenOffTimeoutFromDeviceAdmin(eq(expectedTimeout));
2401 }
2402 // TODO Verify calls to settingsGlobalPutInt. Tried but somehow mockito threw
2403 // UnfinishedVerificationException.
2404 }
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002405
Esteban Talavera01576862016-12-15 11:16:44 +00002406 private void setup_DeviceAdminFeatureOff() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002407 when(mContext.packageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN))
2408 .thenReturn(false);
2409 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2410 .thenReturn(false);
2411 initializeDpms();
2412 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(false);
2413 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2414 .thenReturn(true);
2415 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2416
2417 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002418 }
Victor Chang3e794af2016-03-04 13:48:17 +00002419
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002420 public void testIsProvisioningAllowed_DeviceAdminFeatureOff() throws Exception {
2421 setup_DeviceAdminFeatureOff();
Esteban Talavera01576862016-12-15 11:16:44 +00002422 mContext.packageName = admin1.getPackageName();
2423 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002424 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, false);
2425 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2426 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2427 false);
2428 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
2429 }
2430
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002431 public void testCheckProvisioningPreCondition_DeviceAdminFeatureOff() throws Exception {
2432 setup_DeviceAdminFeatureOff();
2433 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2434 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2435 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2436 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2437 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2438 assertCheckProvisioningPreCondition(
2439 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2440 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2441 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2442 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2443 }
2444
Esteban Talavera01576862016-12-15 11:16:44 +00002445 private void setup_ManagedProfileFeatureOff() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002446 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2447 .thenReturn(false);
2448 initializeDpms();
2449 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(false);
2450 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2451 .thenReturn(true);
2452 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2453
2454 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002455 }
Victor Chang3e794af2016-03-04 13:48:17 +00002456
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002457 public void testIsProvisioningAllowed_ManagedProfileFeatureOff() throws Exception {
2458 setup_ManagedProfileFeatureOff();
Esteban Talavera01576862016-12-15 11:16:44 +00002459 mContext.packageName = admin1.getPackageName();
2460 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002461 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2462 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2463 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2464 false);
2465 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
2466
2467 // Test again when split user is on
2468 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2469 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2470 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2471 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2472 true);
2473 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
2474 }
2475
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002476 public void testCheckProvisioningPreCondition_ManagedProfileFeatureOff() throws Exception {
2477 setup_ManagedProfileFeatureOff();
2478 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2479 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2480 DevicePolicyManager.CODE_OK);
2481 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2482 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2483 assertCheckProvisioningPreCondition(
2484 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2485 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2486 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2487 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2488
2489 // Test again when split user is on
2490 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2491 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2492 DevicePolicyManager.CODE_OK);
2493 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2494 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2495 assertCheckProvisioningPreCondition(
2496 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2497 DevicePolicyManager.CODE_OK);
2498 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2499 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2500 }
2501
Esteban Talavera01576862016-12-15 11:16:44 +00002502 private void setup_nonSplitUser_firstBoot_primaryUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002503 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2504 .thenReturn(true);
2505 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(false);
2506 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2507 .thenReturn(true);
2508 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2509
2510 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002511 }
Victor Chang3e794af2016-03-04 13:48:17 +00002512
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002513 public void testIsProvisioningAllowed_nonSplitUser_firstBoot_primaryUser() throws Exception {
2514 setup_nonSplitUser_firstBoot_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002515 mContext.packageName = admin1.getPackageName();
2516 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002517 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2518 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2519 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2520 false /* because of non-split user */);
2521 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2522 false /* because of non-split user */);
2523 }
2524
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002525 public void testCheckProvisioningPreCondition_nonSplitUser_firstBoot_primaryUser()
Victor Chang3e794af2016-03-04 13:48:17 +00002526 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002527 setup_nonSplitUser_firstBoot_primaryUser();
2528 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2529 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2530 DevicePolicyManager.CODE_OK);
2531 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2532 DevicePolicyManager.CODE_OK);
2533 assertCheckProvisioningPreCondition(
2534 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2535 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2536 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2537 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2538 }
2539
Esteban Talavera01576862016-12-15 11:16:44 +00002540 private void setup_nonSplitUser_afterDeviceSetup_primaryUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002541 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2542 .thenReturn(true);
2543 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(false);
2544 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2545 .thenReturn(true);
2546 setUserSetupCompleteForUser(true, UserHandle.USER_SYSTEM);
2547
2548 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002549 }
Victor Chang3e794af2016-03-04 13:48:17 +00002550
Nicolas Prevot45d29072017-01-18 16:11:19 +00002551 private void setup_nonSplitUser_withDo_primaryUser() throws Exception {
2552 setDeviceOwner();
2553 setup_nonSplitUser_afterDeviceSetup_primaryUser();
2554 setUpPackageManagerForFakeAdmin(adminAnotherPackage, DpmMockContext.ANOTHER_UID, admin2);
2555 }
2556
2557 private void setup_nonSplitUser_withDo_primaryUser_ManagedProfile() throws Exception {
2558 setup_nonSplitUser_withDo_primaryUser();
2559 final int MANAGED_PROFILE_USER_ID = 18;
2560 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 1308);
2561 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
2562 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM,
2563 false /* we can't remove a managed profile */)).thenReturn(false);
2564 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM,
2565 true)).thenReturn(true);
2566 }
2567
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002568 public void testIsProvisioningAllowed_nonSplitUser_afterDeviceSetup_primaryUser()
2569 throws Exception {
2570 setup_nonSplitUser_afterDeviceSetup_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002571 mContext.packageName = admin1.getPackageName();
2572 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002573 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2574 false/* because of completed device setup */);
2575 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2576 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2577 false/* because of non-split user */);
2578 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2579 false/* because of non-split user */);
2580 }
2581
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002582 public void testCheckProvisioningPreCondition_nonSplitUser_afterDeviceSetup_primaryUser()
2583 throws Exception {
2584 setup_nonSplitUser_afterDeviceSetup_primaryUser();
2585 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2586 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2587 DevicePolicyManager.CODE_USER_SETUP_COMPLETED);
2588 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2589 DevicePolicyManager.CODE_OK);
2590 assertCheckProvisioningPreCondition(
2591 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2592 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2593 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2594 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2595 }
2596
Nicolas Prevot45d29072017-01-18 16:11:19 +00002597 public void testProvisioning_nonSplitUser_withDo_primaryUser() throws Exception {
2598 setup_nonSplitUser_withDo_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002599 mContext.packageName = admin1.getPackageName();
Esteban Talavera01576862016-12-15 11:16:44 +00002600 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2601
2602 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2603 DevicePolicyManager.CODE_HAS_DEVICE_OWNER);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002604 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, false);
Esteban Talavera01576862016-12-15 11:16:44 +00002605
2606 // COMP mode is allowed.
2607 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2608 DevicePolicyManager.CODE_OK);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002609 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
Esteban Talavera01576862016-12-15 11:16:44 +00002610
Nicolas Prevot45d29072017-01-18 16:11:19 +00002611 // And other DPCs can also provision a managed profile (DO + BYOD case).
Esteban Talavera01576862016-12-15 11:16:44 +00002612 assertCheckProvisioningPreCondition(
2613 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002614 DpmMockContext.ANOTHER_PACKAGE_NAME,
Esteban Talavera01576862016-12-15 11:16:44 +00002615 DevicePolicyManager.CODE_OK);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002616 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true,
2617 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
2618 }
Esteban Talavera01576862016-12-15 11:16:44 +00002619
Nicolas Prevot45d29072017-01-18 16:11:19 +00002620 public void testProvisioning_nonSplitUser_withDo_primaryUser_restrictedByDo() throws Exception {
2621 setup_nonSplitUser_withDo_primaryUser();
2622 mContext.packageName = admin1.getPackageName();
2623 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2624 // The DO should be allowed to initiate provisioning if it set the restriction itself, but
2625 // other packages should be forbidden.
Esteban Talavera01576862016-12-15 11:16:44 +00002626 when(mContext.userManager.hasUserRestriction(
2627 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2628 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2629 .thenReturn(true);
Esteban Talavera01576862016-12-15 11:16:44 +00002630 when(mContext.userManager.getUserRestrictionSource(
2631 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2632 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2633 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
2634 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2635 DevicePolicyManager.CODE_OK);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002636 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
Esteban Talavera01576862016-12-15 11:16:44 +00002637 assertCheckProvisioningPreCondition(
2638 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002639 DpmMockContext.ANOTHER_PACKAGE_NAME,
Esteban Talavera01576862016-12-15 11:16:44 +00002640 DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002641 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false,
2642 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
2643 }
Esteban Talavera01576862016-12-15 11:16:44 +00002644
Nicolas Prevot45d29072017-01-18 16:11:19 +00002645 public void testProvisioning_nonSplitUser_withDo_primaryUser_restrictedBySystem()
2646 throws Exception {
2647 setup_nonSplitUser_withDo_primaryUser();
2648 mContext.packageName = admin1.getPackageName();
2649 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
Esteban Talavera01576862016-12-15 11:16:44 +00002650 // The DO should not be allowed to initiate provisioning if the restriction is set by
2651 // another entity.
Nicolas Prevot45d29072017-01-18 16:11:19 +00002652 when(mContext.userManager.hasUserRestriction(
2653 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2654 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2655 .thenReturn(true);
Esteban Talavera01576862016-12-15 11:16:44 +00002656 when(mContext.userManager.getUserRestrictionSource(
2657 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2658 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2659 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
2660 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2661 DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002662 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2663
2664 assertCheckProvisioningPreCondition(
Esteban Talavera01576862016-12-15 11:16:44 +00002665 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002666 DpmMockContext.ANOTHER_PACKAGE_NAME,
Esteban Talavera01576862016-12-15 11:16:44 +00002667 DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002668 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false,
2669 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
2670 }
2671
2672 public void testCheckProvisioningPreCondition_nonSplitUser_comp() throws Exception {
2673 setup_nonSplitUser_withDo_primaryUser_ManagedProfile();
2674 mContext.packageName = admin1.getPackageName();
2675 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2676
2677 // We can delete the managed profile to create a new one, so provisioning is allowed.
2678 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2679 DevicePolicyManager.CODE_OK);
2680 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2681 assertCheckProvisioningPreCondition(
2682 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2683 DpmMockContext.ANOTHER_PACKAGE_NAME,
2684 DevicePolicyManager.CODE_OK);
2685 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true,
2686 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
2687 }
2688
2689 public void testCheckProvisioningPreCondition_nonSplitUser_comp_cannot_remove_profile()
2690 throws Exception {
2691 setup_nonSplitUser_withDo_primaryUser_ManagedProfile();
2692 mContext.packageName = admin1.getPackageName();
2693 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2694 when(mContext.userManager.hasUserRestriction(
2695 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
2696 eq(UserHandle.SYSTEM)))
2697 .thenReturn(true);
Nicolas Prevotd37c4a92017-01-23 11:56:00 +00002698 when(mContext.userManager.getUserRestrictionSource(
2699 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
2700 eq(UserHandle.SYSTEM)))
2701 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002702
2703 // We can't remove the profile to create a new one.
Nicolas Prevot45d29072017-01-18 16:11:19 +00002704 assertCheckProvisioningPreCondition(
2705 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2706 DpmMockContext.ANOTHER_PACKAGE_NAME,
2707 DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE);
2708 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false,
2709 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
Nicolas Prevotd37c4a92017-01-23 11:56:00 +00002710
2711 // But the device owner can still do it because it has set the restriction itself.
2712 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2713 DevicePolicyManager.CODE_OK);
2714 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
Esteban Talavera01576862016-12-15 11:16:44 +00002715 }
2716
2717 private void setup_splitUser_firstBoot_systemUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002718 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2719 .thenReturn(true);
2720 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2721 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2722 .thenReturn(false);
2723 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2724
2725 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002726 }
Victor Chang3e794af2016-03-04 13:48:17 +00002727
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002728 public void testIsProvisioningAllowed_splitUser_firstBoot_systemUser() throws Exception {
2729 setup_splitUser_firstBoot_systemUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002730 mContext.packageName = admin1.getPackageName();
2731 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002732 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2733 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2734 false /* because canAddMoreManagedProfiles returns false */);
2735 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2736 true);
2737 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2738 false/* because calling uid is system user */);
Victor Chang3e794af2016-03-04 13:48:17 +00002739 }
2740
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002741 public void testCheckProvisioningPreCondition_splitUser_firstBoot_systemUser()
2742 throws Exception {
2743 setup_splitUser_firstBoot_systemUser();
2744 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2745 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2746 DevicePolicyManager.CODE_OK);
2747 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Esteban Talavera6c9116a2016-11-24 16:12:44 +00002748 DevicePolicyManager.CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER);
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002749 assertCheckProvisioningPreCondition(
2750 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2751 DevicePolicyManager.CODE_OK);
2752 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2753 DevicePolicyManager.CODE_SYSTEM_USER);
2754 }
2755
Esteban Talavera01576862016-12-15 11:16:44 +00002756 private void setup_splitUser_afterDeviceSetup_systemUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002757 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2758 .thenReturn(true);
2759 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2760 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2761 .thenReturn(false);
2762 setUserSetupCompleteForUser(true, UserHandle.USER_SYSTEM);
2763
2764 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002765 }
Victor Chang3e794af2016-03-04 13:48:17 +00002766
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002767 public void testIsProvisioningAllowed_splitUser_afterDeviceSetup_systemUser() throws Exception {
2768 setup_splitUser_afterDeviceSetup_systemUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002769 mContext.packageName = admin1.getPackageName();
2770 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002771 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2772 true/* it's undefined behavior. Can be changed into false in the future */);
2773 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2774 false /* because canAddMoreManagedProfiles returns false */);
2775 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2776 true/* it's undefined behavior. Can be changed into false in the future */);
2777 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2778 false/* because calling uid is system user */);
2779 }
2780
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002781 public void testCheckProvisioningPreCondition_splitUser_afterDeviceSetup_systemUser()
2782 throws Exception {
2783 setup_splitUser_afterDeviceSetup_systemUser();
2784 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2785 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2786 DevicePolicyManager.CODE_OK);
2787 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Esteban Talavera6c9116a2016-11-24 16:12:44 +00002788 DevicePolicyManager.CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER);
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002789 assertCheckProvisioningPreCondition(
2790 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2791 DevicePolicyManager.CODE_OK);
2792 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2793 DevicePolicyManager.CODE_SYSTEM_USER);
2794 }
2795
Esteban Talavera01576862016-12-15 11:16:44 +00002796 private void setup_splitUser_firstBoot_primaryUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002797 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2798 .thenReturn(true);
2799 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2800 when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
2801 true)).thenReturn(true);
2802 setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE);
2803
2804 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002805 }
Victor Chang3e794af2016-03-04 13:48:17 +00002806
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002807 public void testIsProvisioningAllowed_splitUser_firstBoot_primaryUser() throws Exception {
2808 setup_splitUser_firstBoot_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002809 mContext.packageName = admin1.getPackageName();
2810 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002811 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2812 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2813 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2814 true);
2815 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, true);
Victor Chang3e794af2016-03-04 13:48:17 +00002816 }
2817
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002818 public void testCheckProvisioningPreCondition_splitUser_firstBoot_primaryUser()
Victor Chang3e794af2016-03-04 13:48:17 +00002819 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002820 setup_splitUser_firstBoot_primaryUser();
2821 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2822 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2823 DevicePolicyManager.CODE_OK);
2824 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2825 DevicePolicyManager.CODE_OK);
2826 assertCheckProvisioningPreCondition(
2827 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2828 DevicePolicyManager.CODE_OK);
2829 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2830 DevicePolicyManager.CODE_OK);
2831 }
2832
Esteban Talavera01576862016-12-15 11:16:44 +00002833 private void setup_splitUser_afterDeviceSetup_primaryUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002834 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2835 .thenReturn(true);
2836 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2837 when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
2838 true)).thenReturn(true);
2839 setUserSetupCompleteForUser(true, DpmMockContext.CALLER_USER_HANDLE);
2840
2841 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002842 }
Victor Chang3e794af2016-03-04 13:48:17 +00002843
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002844 public void testIsProvisioningAllowed_splitUser_afterDeviceSetup_primaryUser()
2845 throws Exception {
2846 setup_splitUser_afterDeviceSetup_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002847 mContext.packageName = admin1.getPackageName();
2848 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002849 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2850 true/* it's undefined behavior. Can be changed into false in the future */);
2851 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2852 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2853 true/* it's undefined behavior. Can be changed into false in the future */);
2854 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2855 false/* because user setup completed */);
2856 }
2857
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002858 public void testCheckProvisioningPreCondition_splitUser_afterDeviceSetup_primaryUser()
Victor Chang3e794af2016-03-04 13:48:17 +00002859 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002860 setup_splitUser_afterDeviceSetup_primaryUser();
2861 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2862 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2863 DevicePolicyManager.CODE_OK);
2864 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2865 DevicePolicyManager.CODE_OK);
2866 assertCheckProvisioningPreCondition(
2867 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2868 DevicePolicyManager.CODE_OK);
2869 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2870 DevicePolicyManager.CODE_USER_SETUP_COMPLETED);
2871 }
2872
Esteban Talavera01576862016-12-15 11:16:44 +00002873 private void setup_provisionManagedProfileWithDeviceOwner_systemUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002874 setDeviceOwner();
2875
2876 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2877 .thenReturn(true);
2878 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2879 when(mContext.userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
2880 .thenReturn(false);
2881 setUserSetupCompleteForUser(true, UserHandle.USER_SYSTEM);
2882
2883 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002884 }
Victor Chang3e794af2016-03-04 13:48:17 +00002885
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002886 public void testIsProvisioningAllowed_provisionManagedProfileWithDeviceOwner_systemUser()
2887 throws Exception {
2888 setup_provisionManagedProfileWithDeviceOwner_systemUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002889 mContext.packageName = admin1.getPackageName();
2890 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002891 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2892 false /* can't provision managed profile on system user */);
2893 }
2894
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002895 public void testCheckProvisioningPreCondition_provisionManagedProfileWithDeviceOwner_systemUser()
Victor Chang3e794af2016-03-04 13:48:17 +00002896 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002897 setup_provisionManagedProfileWithDeviceOwner_systemUser();
2898 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2899 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2900 DevicePolicyManager.CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER);
2901 }
2902
2903 private void setup_provisionManagedProfileWithDeviceOwner_primaryUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00002904 setDeviceOwner();
2905
2906 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2907 .thenReturn(true);
2908 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
2909 when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
2910 true)).thenReturn(true);
2911 setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE);
2912
2913 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002914 }
Victor Chang3e794af2016-03-04 13:48:17 +00002915
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002916 public void testIsProvisioningAllowed_provisionManagedProfileWithDeviceOwner_primaryUser()
2917 throws Exception {
2918 setup_provisionManagedProfileWithDeviceOwner_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002919 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
2920 mContext.packageName = admin1.getPackageName();
Victor Chang3e794af2016-03-04 13:48:17 +00002921 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2922 }
2923
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002924 public void testCheckProvisioningPreCondition_provisionManagedProfileWithDeviceOwner_primaryUser()
Nicolas Prevot56400a42016-11-10 12:57:54 +00002925 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002926 setup_provisionManagedProfileWithDeviceOwner_primaryUser();
2927 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
Esteban Talavera01576862016-12-15 11:16:44 +00002928
2929 // COMP mode is allowed.
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002930 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2931 DevicePolicyManager.CODE_OK);
2932 }
2933
2934 private void setup_provisionManagedProfileCantRemoveUser_primaryUser() throws Exception {
Nicolas Prevot56400a42016-11-10 12:57:54 +00002935 setDeviceOwner();
2936
2937 when(mContext.ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
2938 .thenReturn(true);
2939 when(mContext.userManagerForMock.isSplitSystemUser()).thenReturn(true);
Esteban Talavera6c9116a2016-11-24 16:12:44 +00002940 when(mContext.userManager.hasUserRestriction(
Esteban Talavera01576862016-12-15 11:16:44 +00002941 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
2942 eq(UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))))
Nicolas Prevot56400a42016-11-10 12:57:54 +00002943 .thenReturn(true);
2944 when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002945 false /* we can't remove a managed profile */)).thenReturn(false);
Nicolas Prevot56400a42016-11-10 12:57:54 +00002946 when(mContext.userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
2947 true)).thenReturn(true);
2948 setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE);
2949
2950 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002951 }
Nicolas Prevot56400a42016-11-10 12:57:54 +00002952
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002953 public void testIsProvisioningAllowed_provisionManagedProfileCantRemoveUser_primaryUser()
2954 throws Exception {
2955 setup_provisionManagedProfileCantRemoveUser_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002956 mContext.packageName = admin1.getPackageName();
2957 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Nicolas Prevot56400a42016-11-10 12:57:54 +00002958 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2959 }
2960
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002961 public void testCheckProvisioningPreCondition_provisionManagedProfileCantRemoveUser_primaryUser()
2962 throws Exception {
2963 setup_provisionManagedProfileCantRemoveUser_primaryUser();
2964 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2965 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2966 DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE);
2967 }
2968
2969 public void testCheckProvisioningPreCondition_permission() {
2970 // GIVEN the permission MANAGE_PROFILE_AND_DEVICE_OWNERS is not granted
2971 try {
Esteban Talavera01576862016-12-15 11:16:44 +00002972 dpm.checkProvisioningPreCondition(
2973 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, "some.package");
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002974 fail("Didn't throw SecurityException");
2975 } catch (SecurityException expected) {
2976 }
2977 }
2978
Victor Chang3577ed22016-08-25 18:49:26 +01002979 public void testForceUpdateUserSetupComplete_permission() {
2980 // GIVEN the permission MANAGE_PROFILE_AND_DEVICE_OWNERS is not granted
2981 try {
2982 dpm.forceUpdateUserSetupComplete();
2983 fail("Didn't throw SecurityException");
2984 } catch (SecurityException expected) {
2985 }
2986 }
2987
2988 public void testForceUpdateUserSetupComplete_systemUser() {
2989 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2990 // GIVEN calling from user 20
2991 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2992 try {
2993 dpm.forceUpdateUserSetupComplete();
2994 fail("Didn't throw SecurityException");
2995 } catch (SecurityException expected) {
2996 }
2997 }
2998
2999 public void testForceUpdateUserSetupComplete_userbuild() {
3000 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3001 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3002
3003 final int userId = UserHandle.USER_SYSTEM;
3004 // GIVEN userComplete is false in SettingsProvider
3005 setUserSetupCompleteForUser(false, userId);
3006
3007 // GIVEN userComplete is true in DPM
3008 DevicePolicyManagerService.DevicePolicyData userData =
3009 new DevicePolicyManagerService.DevicePolicyData(userId);
3010 userData.mUserSetupComplete = true;
3011 dpms.mUserData.put(UserHandle.USER_SYSTEM, userData);
3012
3013 // GIVEN it's user build
3014 mContext.buildMock.isDebuggable = false;
3015
3016 assertTrue(dpms.hasUserSetupCompleted());
3017
3018 dpm.forceUpdateUserSetupComplete();
3019
3020 // THEN the state in dpms is not changed
3021 assertTrue(dpms.hasUserSetupCompleted());
3022 }
3023
3024 public void testForceUpdateUserSetupComplete_userDebugbuild() {
3025 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3026 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3027
3028 final int userId = UserHandle.USER_SYSTEM;
3029 // GIVEN userComplete is false in SettingsProvider
3030 setUserSetupCompleteForUser(false, userId);
3031
3032 // GIVEN userComplete is true in DPM
3033 DevicePolicyManagerService.DevicePolicyData userData =
3034 new DevicePolicyManagerService.DevicePolicyData(userId);
3035 userData.mUserSetupComplete = true;
3036 dpms.mUserData.put(UserHandle.USER_SYSTEM, userData);
3037
3038 // GIVEN it's userdebug build
3039 mContext.buildMock.isDebuggable = true;
3040
3041 assertTrue(dpms.hasUserSetupCompleted());
3042
3043 dpm.forceUpdateUserSetupComplete();
3044
3045 // THEN the state in dpms is not changed
3046 assertFalse(dpms.hasUserSetupCompleted());
3047 }
3048
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003049 private void clearDeviceOwner() throws Exception {
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003050 final long ident = mContext.binder.clearCallingIdentity();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003051 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3052 doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(mContext.packageManager)
3053 .getPackageUidAsUser(eq(admin1.getPackageName()), anyInt());
3054 dpm.clearDeviceOwnerApp(admin1.getPackageName());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003055 mContext.binder.restoreCallingIdentity(ident);
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003056 }
3057
3058 public void testGetLastSecurityLogRetrievalTime() throws Exception {
3059 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3060 setupDeviceOwner();
Esteban Talaverad36dd152016-12-15 08:51:45 +00003061
3062 // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the
3063 // feature is disabled because there are non-affiliated secondary users.
3064 mContext.removeUser(DpmMockContext.CALLER_USER_HANDLE);
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003065 when(mContext.resources.getBoolean(R.bool.config_supportPreRebootSecurityLogs))
3066 .thenReturn(true);
3067
3068 // No logs were retrieved so far.
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003069 assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003070
3071 // Enabling logging should not change the timestamp.
3072 dpm.setSecurityLoggingEnabled(admin1, true);
Esteban Talaverad36dd152016-12-15 08:51:45 +00003073 verify(mContext.settings)
3074 .securityLogSetLoggingEnabledProperty(true);
3075 when(mContext.settings.securityLogGetLoggingEnabledProperty())
3076 .thenReturn(true);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003077 assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003078
3079 // Retrieving the logs should update the timestamp.
3080 final long beforeRetrieval = System.currentTimeMillis();
3081 dpm.retrieveSecurityLogs(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003082 final long firstSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003083 final long afterRetrieval = System.currentTimeMillis();
3084 assertTrue(firstSecurityLogRetrievalTime >= beforeRetrieval);
3085 assertTrue(firstSecurityLogRetrievalTime <= afterRetrieval);
3086
3087 // Retrieving the pre-boot logs should update the timestamp.
3088 Thread.sleep(2);
3089 dpm.retrievePreRebootSecurityLogs(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003090 final long secondSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003091 assertTrue(secondSecurityLogRetrievalTime > firstSecurityLogRetrievalTime);
3092
3093 // Checking the timestamp again should not change it.
3094 Thread.sleep(2);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003095 assertEquals(secondSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003096
3097 // Retrieving the logs again should update the timestamp.
3098 dpm.retrieveSecurityLogs(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003099 final long thirdSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003100 assertTrue(thirdSecurityLogRetrievalTime > secondSecurityLogRetrievalTime);
3101
3102 // Disabling logging should not change the timestamp.
3103 Thread.sleep(2);
3104 dpm.setSecurityLoggingEnabled(admin1, false);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003105 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003106
3107 // Restarting the DPMS should not lose the timestamp.
3108 initializeDpms();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003109 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003110
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003111 // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
3112 mContext.binder.callingUid = 1234567;
3113 mContext.callerPermissions.add(permission.MANAGE_USERS);
3114 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
3115 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3116
3117 // System can retrieve the timestamp.
3118 mContext.binder.clearCallingIdentity();
3119 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
3120
3121 // Removing the device owner should clear the timestamp.
3122 clearDeviceOwner();
3123 assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003124 }
3125
3126 public void testGetLastBugReportRequestTime() throws Exception {
3127 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3128 setupDeviceOwner();
Esteban Talaverad36dd152016-12-15 08:51:45 +00003129
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003130 mContext.packageName = admin1.getPackageName();
3131 mContext.applicationInfo = new ApplicationInfo();
3132 when(mContext.resources.getColor(eq(R.color.notification_action_list), anyObject()))
3133 .thenReturn(Color.WHITE);
3134 when(mContext.resources.getColor(eq(R.color.notification_material_background_color),
3135 anyObject())).thenReturn(Color.WHITE);
3136
Esteban Talaverad36dd152016-12-15 08:51:45 +00003137 // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the
3138 // feature is disabled because there are non-affiliated secondary users.
3139 mContext.removeUser(DpmMockContext.CALLER_USER_HANDLE);
3140
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003141 // No bug reports were requested so far.
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003142 assertEquals(-1, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003143
3144 // Requesting a bug report should update the timestamp.
3145 final long beforeRequest = System.currentTimeMillis();
3146 dpm.requestBugreport(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003147 final long bugReportRequestTime = dpm.getLastBugReportRequestTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003148 final long afterRequest = System.currentTimeMillis();
3149 assertTrue(bugReportRequestTime >= beforeRequest);
3150 assertTrue(bugReportRequestTime <= afterRequest);
3151
3152 // Checking the timestamp again should not change it.
3153 Thread.sleep(2);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003154 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003155
3156 // Restarting the DPMS should not lose the timestamp.
3157 initializeDpms();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003158 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003159
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003160 // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
3161 mContext.binder.callingUid = 1234567;
3162 mContext.callerPermissions.add(permission.MANAGE_USERS);
3163 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
3164 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3165
3166 // System can retrieve the timestamp.
3167 mContext.binder.clearCallingIdentity();
3168 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
3169
3170 // Removing the device owner should clear the timestamp.
3171 clearDeviceOwner();
3172 assertEquals(-1, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003173 }
3174
3175 public void testGetLastNetworkLogRetrievalTime() throws Exception {
3176 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3177 setupDeviceOwner();
Esteban Talaverad36dd152016-12-15 08:51:45 +00003178 mContext.packageName = admin1.getPackageName();
3179 mContext.applicationInfo = new ApplicationInfo();
3180 when(mContext.resources.getColor(eq(R.color.notification_action_list), anyObject()))
3181 .thenReturn(Color.WHITE);
3182 when(mContext.resources.getColor(eq(R.color.notification_material_background_color),
3183 anyObject())).thenReturn(Color.WHITE);
3184
3185 // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the
3186 // feature is disabled because there are non-affiliated secondary users.
3187 mContext.removeUser(DpmMockContext.CALLER_USER_HANDLE);
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003188 when(mContext.iipConnectivityMetrics.registerNetdEventCallback(anyObject()))
3189 .thenReturn(true);
3190
3191 // No logs were retrieved so far.
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003192 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003193
3194 // Attempting to retrieve logs without enabling logging should not change the timestamp.
3195 dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003196 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003197
3198 // Enabling logging should not change the timestamp.
3199 dpm.setNetworkLoggingEnabled(admin1, true);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003200 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003201
3202 // Retrieving the logs should update the timestamp.
3203 final long beforeRetrieval = System.currentTimeMillis();
3204 dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003205 final long firstNetworkLogRetrievalTime = dpm.getLastNetworkLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003206 final long afterRetrieval = System.currentTimeMillis();
3207 assertTrue(firstNetworkLogRetrievalTime >= beforeRetrieval);
3208 assertTrue(firstNetworkLogRetrievalTime <= afterRetrieval);
3209
3210 // Checking the timestamp again should not change it.
3211 Thread.sleep(2);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003212 assertEquals(firstNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003213
3214 // Retrieving the logs again should update the timestamp.
3215 dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003216 final long secondNetworkLogRetrievalTime = dpm.getLastNetworkLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003217 assertTrue(secondNetworkLogRetrievalTime > firstNetworkLogRetrievalTime);
3218
3219 // Disabling logging should not change the timestamp.
3220 Thread.sleep(2);
3221 dpm.setNetworkLoggingEnabled(admin1, false);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003222 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003223
3224 // Restarting the DPMS should not lose the timestamp.
3225 initializeDpms();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003226 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
3227
3228 // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
3229 mContext.binder.callingUid = 1234567;
3230 mContext.callerPermissions.add(permission.MANAGE_USERS);
3231 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
3232 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3233
3234 // System can retrieve the timestamp.
3235 mContext.binder.clearCallingIdentity();
3236 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
3237
3238 // Removing the device owner should clear the timestamp.
3239 clearDeviceOwner();
3240 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003241 }
3242
Tony Mak2f26b792016-11-28 17:54:51 +00003243 public void testGetBindDeviceAdminTargetUsers() throws Exception {
3244 // Setup device owner.
3245 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3246 setupDeviceOwner();
3247
3248 // Only device owner is setup, the result list should be empty.
3249 List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3250 MoreAsserts.assertEmpty(targetUsers);
3251
3252 // Setup a managed profile managed by the same admin.
3253 final int MANAGED_PROFILE_USER_ID = 15;
3254 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456);
3255 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3256
3257 // Add a secondary user, it should never talk with.
3258 final int ANOTHER_USER_ID = 36;
3259 mContext.addUser(ANOTHER_USER_ID, 0);
3260
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003261 // Since the managed profile is not affiliated, they should not be allowed to talk to each
3262 // other.
3263 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3264 MoreAsserts.assertEmpty(targetUsers);
3265
3266 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3267 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3268 MoreAsserts.assertEmpty(targetUsers);
3269
3270 // Setting affiliation ids
3271 final List<String> userAffiliationIds = Arrays.asList("some.affiliation-id");
3272 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3273 dpm.setAffiliationIds(admin1, userAffiliationIds);
3274
3275 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3276 dpm.setAffiliationIds(admin1, userAffiliationIds);
3277
Tony Mak2f26b792016-11-28 17:54:51 +00003278 // Calling from device owner admin, the result list should just contain the managed
3279 // profile user id.
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003280 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Tony Mak2f26b792016-11-28 17:54:51 +00003281 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3282 MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.of(MANAGED_PROFILE_USER_ID));
3283
3284 // Calling from managed profile admin, the result list should just contain the system
3285 // user id.
3286 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3287 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3288 MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.SYSTEM);
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003289
3290 // Changing affiliation ids in one
3291 dpm.setAffiliationIds(admin1, Arrays.asList("some-different-affiliation-id"));
3292
3293 // Since the managed profile is not affiliated any more, they should not be allowed to talk
3294 // to each other.
3295 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3296 MoreAsserts.assertEmpty(targetUsers);
3297
3298 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3299 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3300 MoreAsserts.assertEmpty(targetUsers);
Tony Mak2f26b792016-11-28 17:54:51 +00003301 }
3302
3303 public void testGetBindDeviceAdminTargetUsers_differentPackage() throws Exception {
3304 // Setup a device owner.
3305 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3306 setupDeviceOwner();
3307
3308 // Set up a managed profile managed by different package.
3309 final int MANAGED_PROFILE_USER_ID = 15;
3310 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456);
3311 final ComponentName adminDifferentPackage =
3312 new ComponentName("another.package", "whatever.class");
3313 addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2);
3314
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003315 // Setting affiliation ids
3316 final List<String> userAffiliationIds = Arrays.asList("some-affiliation-id");
3317 dpm.setAffiliationIds(admin1, userAffiliationIds);
3318
3319 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3320 dpm.setAffiliationIds(adminDifferentPackage, userAffiliationIds);
3321
Tony Mak2f26b792016-11-28 17:54:51 +00003322 // Calling from device owner admin, we should get zero bind device admin target users as
3323 // their packages are different.
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003324 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Tony Mak2f26b792016-11-28 17:54:51 +00003325 List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3326 MoreAsserts.assertEmpty(targetUsers);
3327
3328 // Calling from managed profile admin, we should still get zero target users for the same
3329 // reason.
3330 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3331 targetUsers = dpm.getBindDeviceAdminTargetUsers(adminDifferentPackage);
3332 MoreAsserts.assertEmpty(targetUsers);
3333 }
3334
Bartosz Fabianowskidd7f8da2016-11-30 11:09:22 +01003335 public void testIsDeviceManaged() throws Exception {
3336 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3337 setupDeviceOwner();
3338
3339 // The device owner itself, any uid holding MANAGE_USERS permission and the system can
3340 // find out that the device has a device owner.
3341 assertTrue(dpm.isDeviceManaged());
3342 mContext.binder.callingUid = 1234567;
3343 mContext.callerPermissions.add(permission.MANAGE_USERS);
3344 assertTrue(dpm.isDeviceManaged());
3345 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3346 mContext.binder.clearCallingIdentity();
3347 assertTrue(dpm.isDeviceManaged());
3348
3349 clearDeviceOwner();
3350
3351 // Any uid holding MANAGE_USERS permission and the system can find out that the device does
3352 // not have a device owner.
3353 mContext.binder.callingUid = 1234567;
3354 mContext.callerPermissions.add(permission.MANAGE_USERS);
3355 assertFalse(dpm.isDeviceManaged());
3356 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3357 mContext.binder.clearCallingIdentity();
3358 assertFalse(dpm.isDeviceManaged());
3359 }
3360
Bartosz Fabianowski365a3db2016-11-30 18:28:10 +01003361 public void testDeviceOwnerOrganizationName() throws Exception {
3362 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3363 setupDeviceOwner();
3364
3365 dpm.setOrganizationName(admin1, "organization");
3366
3367 // Device owner can retrieve organization managing the device.
3368 assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
3369
3370 // Any uid holding MANAGE_USERS permission can retrieve organization managing the device.
3371 mContext.binder.callingUid = 1234567;
3372 mContext.callerPermissions.add(permission.MANAGE_USERS);
3373 assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
3374 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3375
3376 // System can retrieve organization managing the device.
3377 mContext.binder.clearCallingIdentity();
3378 assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
3379
3380 // Removing the device owner clears the organization managing the device.
3381 clearDeviceOwner();
3382 assertNull(dpm.getDeviceOwnerOrganizationName());
3383 }
3384
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003385 public void testWipeDataManagedProfile() throws Exception {
3386 final int MANAGED_PROFILE_USER_ID = 15;
3387 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
3388 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3389 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3390
3391 // Even if the caller is the managed profile, the current user is the user 0
3392 when(mContext.iactivityManager.getCurrentUser())
3393 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
3394
3395 dpm.wipeData(0);
3396 verify(mContext.userManagerInternal).removeUserEvenWhenDisallowed(
3397 MANAGED_PROFILE_USER_ID);
3398 }
3399
3400 public void testWipeDataManagedProfileDisallowed() throws Exception {
3401 final int MANAGED_PROFILE_USER_ID = 15;
3402 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
3403 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3404
3405 // Even if the caller is the managed profile, the current user is the user 0
3406 when(mContext.iactivityManager.getCurrentUser())
3407 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
3408
3409 when(mContext.userManager.getUserRestrictionSource(
3410 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
3411 UserHandle.of(MANAGED_PROFILE_USER_ID)))
3412 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
3413 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3414 try {
3415 // The PO is not allowed to remove the profile if the user restriction was set on the
3416 // profile by the system
3417 dpm.wipeData(0);
3418 fail("SecurityException not thrown");
3419 } catch (SecurityException expected) {
3420 }
3421 }
3422
Esteban Talaverab88f42b2017-01-24 16:47:16 +00003423 public void testWipeDataDeviceOwner() throws Exception {
3424 setDeviceOwner();
3425 when(mContext.userManager.getUserRestrictionSource(
3426 UserManager.DISALLOW_FACTORY_RESET,
3427 UserHandle.SYSTEM))
3428 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
3429
3430 dpm.wipeData(0);
3431 verify(mContext.recoverySystem).rebootWipeUserData(
3432 /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true));
3433 }
3434
3435 public void testWipeDataDeviceOwnerDisallowed() throws Exception {
3436 setDeviceOwner();
3437 when(mContext.userManager.getUserRestrictionSource(
3438 UserManager.DISALLOW_FACTORY_RESET,
3439 UserHandle.SYSTEM))
3440 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
3441 try {
3442 // The DO is not allowed to wipe the device if the user restriction was set
3443 // by the system
3444 dpm.wipeData(0);
3445 fail("SecurityException not thrown");
3446 } catch (SecurityException expected) {
3447 }
3448 }
3449
3450 public void testMaximumFailedPasswordAttemptsReachedManagedProfile() throws Exception {
3451 final int MANAGED_PROFILE_USER_ID = 15;
3452 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
3453 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3454
3455 // Even if the caller is the managed profile, the current user is the user 0
3456 when(mContext.iactivityManager.getCurrentUser())
3457 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
3458
3459 when(mContext.userManager.getUserRestrictionSource(
3460 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
3461 UserHandle.of(MANAGED_PROFILE_USER_ID)))
3462 .thenReturn(UserManager.RESTRICTION_SOURCE_PROFILE_OWNER);
3463
3464 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3465 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
3466
3467 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
3468 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
3469 // Failed password attempts on the parent user are taken into account, as there isn't a
3470 // separate work challenge.
3471 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3472 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3473 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3474
3475 // The profile should be wiped even if DISALLOW_REMOVE_MANAGED_PROFILE is enabled, because
3476 // both the user restriction and the policy were set by the PO.
3477 verify(mContext.userManagerInternal).removeUserEvenWhenDisallowed(
3478 MANAGED_PROFILE_USER_ID);
3479 verifyZeroInteractions(mContext.recoverySystem);
3480 }
3481
3482 public void testMaximumFailedPasswordAttemptsReachedManagedProfileDisallowed()
3483 throws Exception {
3484 final int MANAGED_PROFILE_USER_ID = 15;
3485 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
3486 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3487
3488 // Even if the caller is the managed profile, the current user is the user 0
3489 when(mContext.iactivityManager.getCurrentUser())
3490 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
3491
3492 when(mContext.userManager.getUserRestrictionSource(
3493 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
3494 UserHandle.of(MANAGED_PROFILE_USER_ID)))
3495 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
3496
3497 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3498 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
3499
3500 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
3501 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
3502 // Failed password attempts on the parent user are taken into account, as there isn't a
3503 // separate work challenge.
3504 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3505 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3506 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3507
3508 // DISALLOW_REMOVE_MANAGED_PROFILE was set by the system, not the PO, so the profile is
3509 // not wiped.
3510 verify(mContext.userManagerInternal, never())
3511 .removeUserEvenWhenDisallowed(anyInt());
3512 verifyZeroInteractions(mContext.recoverySystem);
3513 }
3514
3515 public void testMaximumFailedPasswordAttemptsReachedDeviceOwner() throws Exception {
3516 setDeviceOwner();
3517 when(mContext.userManager.getUserRestrictionSource(
3518 UserManager.DISALLOW_FACTORY_RESET,
3519 UserHandle.SYSTEM))
3520 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
3521
3522 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
3523
3524 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
3525 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
3526 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3527 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3528 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3529
3530 // The device should be wiped even if DISALLOW_FACTORY_RESET is enabled, because both the
3531 // user restriction and the policy were set by the DO.
3532 verify(mContext.recoverySystem).rebootWipeUserData(
3533 /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true));
3534 }
3535
3536 public void testMaximumFailedPasswordAttemptsReachedDeviceOwnerDisallowed() throws Exception {
3537 setDeviceOwner();
3538 when(mContext.userManager.getUserRestrictionSource(
3539 UserManager.DISALLOW_FACTORY_RESET,
3540 UserHandle.SYSTEM))
3541 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
3542
3543 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
3544
3545 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
3546 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
3547 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3548 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3549 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
3550
3551 // DISALLOW_FACTORY_RESET was set by the system, not the DO, so the device is not wiped.
3552 verifyZeroInteractions(mContext.recoverySystem);
3553 verify(mContext.userManagerInternal, never())
3554 .removeUserEvenWhenDisallowed(anyInt());
3555 }
3556
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01003557 public void testGetPermissionGrantState() throws Exception {
3558 final String permission = "some.permission";
3559 final String app1 = "com.example.app1";
3560 final String app2 = "com.example.app2";
3561
3562 when(mContext.ipackageManager.checkPermission(eq(permission), eq(app1), anyInt()))
3563 .thenReturn(PackageManager.PERMISSION_GRANTED);
3564 doReturn(PackageManager.FLAG_PERMISSION_POLICY_FIXED).when(mContext.packageManager)
3565 .getPermissionFlags(permission, app1, UserHandle.SYSTEM);
3566 when(mContext.packageManager.getPermissionFlags(permission, app1,
3567 UserHandle.of(DpmMockContext.CALLER_USER_HANDLE)))
3568 .thenReturn(PackageManager.FLAG_PERMISSION_POLICY_FIXED);
3569 when(mContext.ipackageManager.checkPermission(eq(permission), eq(app2), anyInt()))
3570 .thenReturn(PackageManager.PERMISSION_DENIED);
3571 doReturn(0).when(mContext.packageManager).getPermissionFlags(permission, app2,
3572 UserHandle.SYSTEM);
3573 when(mContext.packageManager.getPermissionFlags(permission, app2,
3574 UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))).thenReturn(0);
3575
3576 // System can retrieve permission grant state.
3577 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01003578 mContext.packageName = "com.example.system";
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01003579 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED,
3580 dpm.getPermissionGrantState(null, app1, permission));
3581 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT,
3582 dpm.getPermissionGrantState(null, app2, permission));
3583
3584 // A regular app cannot retrieve permission grant state.
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01003585 mContext.binder.callingUid = setupPackageInPackageManager(app1, 1);
3586 mContext.packageName = app1;
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01003587 try {
3588 dpm.getPermissionGrantState(null, app1, permission);
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01003589 fail("Didn't throw SecurityException");
3590 } catch (SecurityException expected) {
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01003591 }
3592
3593 // Profile owner can retrieve permission grant state.
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01003594 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
3595 mContext.packageName = admin1.getPackageName();
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01003596 setAsProfileOwner(admin1);
3597 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED,
3598 dpm.getPermissionGrantState(admin1, app1, permission));
3599 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT,
3600 dpm.getPermissionGrantState(admin1, app2, permission));
3601 }
3602
Victor Chang3e794af2016-03-04 13:48:17 +00003603 private void setUserSetupCompleteForUser(boolean isUserSetupComplete, int userhandle) {
3604 when(mContext.settings.settingsSecureGetIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0,
3605 userhandle)).thenReturn(isUserSetupComplete ? 1 : 0);
3606 dpms.notifyChangeToContentObserver(
3607 Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), userhandle);
3608 }
3609
3610 private void assertProvisioningAllowed(String action, boolean expected) {
3611 assertEquals("isProvisioningAllowed(" + action + ") returning unexpected result", expected,
3612 dpm.isProvisioningAllowed(action));
3613 }
Tony Mak2f26b792016-11-28 17:54:51 +00003614
Nicolas Prevot45d29072017-01-18 16:11:19 +00003615 private void assertProvisioningAllowed(String action, boolean expected, String packageName,
3616 int uid) {
3617 String previousPackageName = mContext.packageName;
3618 int previousUid = mMockContext.binder.callingUid;
3619
3620 // Call assertProvisioningAllowed with the packageName / uid passed as arguments.
3621 mContext.packageName = packageName;
3622 mMockContext.binder.callingUid = uid;
3623 assertProvisioningAllowed(action, expected);
3624
3625 // Set the previous package name / calling uid to go back to the initial state.
3626 mContext.packageName = previousPackageName;
3627 mMockContext.binder.callingUid = previousUid;
3628 }
3629
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003630 private void assertCheckProvisioningPreCondition(String action, int provisioningCondition) {
Esteban Talavera01576862016-12-15 11:16:44 +00003631 assertCheckProvisioningPreCondition(action, admin1.getPackageName(), provisioningCondition);
3632 }
3633
3634 private void assertCheckProvisioningPreCondition(
3635 String action, String packageName, int provisioningCondition) {
3636 assertEquals("checkProvisioningPreCondition("
3637 + action + ", " + packageName + ") returning unexpected result",
3638 provisioningCondition, dpm.checkProvisioningPreCondition(action, packageName));
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003639 }
3640
Tony Mak2f26b792016-11-28 17:54:51 +00003641 /**
3642 * Setup a managed profile with the specified admin and its uid.
3643 * @param admin ComponentName that's visible to the test code, which doesn't have to exist.
3644 * @param adminUid uid of the admin package.
3645 * @param copyFromAdmin package information for {@code admin} will be built based on this
3646 * component's information.
3647 */
3648 private void addManagedProfile(
3649 ComponentName admin, int adminUid, ComponentName copyFromAdmin) throws Exception {
3650 final int userId = UserHandle.getUserId(adminUid);
3651 mContext.addUser(userId, UserInfo.FLAG_MANAGED_PROFILE, UserHandle.USER_SYSTEM);
3652 mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
3653 setUpPackageManagerForFakeAdmin(admin, adminUid, copyFromAdmin);
3654 dpm.setActiveAdmin(admin, false, userId);
3655 assertTrue(dpm.setProfileOwner(admin, null, userId));
3656 mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
3657 }
Victor Chang3e794af2016-03-04 13:48:17 +00003658}