blob: ccf4a8293d67d770144e017df4c8b70c89bf83c4 [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 Grafov75c0a892017-05-18 17:28:27 +010018import static android.app.admin.DevicePolicyManager.DELEGATION_APP_RESTRICTIONS;
19import static android.app.admin.DevicePolicyManager.DELEGATION_CERT_INSTALL;
Eran Messeri94d56762017-12-21 20:50:54 +000020import static android.app.admin.DevicePolicyManager.ID_TYPE_BASE_INFO;
21import static android.app.admin.DevicePolicyManager.ID_TYPE_IMEI;
22import static android.app.admin.DevicePolicyManager.ID_TYPE_MEID;
23import static android.app.admin.DevicePolicyManager.ID_TYPE_SERIAL;
yinxuf4f9cec2017-06-19 10:28:19 -070024import static android.app.admin.DevicePolicyManager.WIPE_EUICC;
Pavel Grafov6a40f092016-10-25 15:46:51 +010025import static android.os.UserManagerInternal.CAMERA_DISABLED_GLOBALLY;
26import static android.os.UserManagerInternal.CAMERA_DISABLED_LOCALLY;
27import static android.os.UserManagerInternal.CAMERA_NOT_DISABLED;
28
Eugene Susla4f8680b2017-08-07 17:25:30 -070029import static com.android.server.testutils.TestUtils.assertExpectException;
Pavel Grafova1ea8d92017-05-25 21:55:24 +010030
Pavel Grafov75c0a892017-05-18 17:28:27 +010031import static org.mockito.Matchers.any;
32import static org.mockito.Matchers.anyInt;
33import static org.mockito.Matchers.anyLong;
34import static org.mockito.Matchers.anyObject;
35import static org.mockito.Matchers.anyString;
36import static org.mockito.Matchers.eq;
37import static org.mockito.Matchers.isNull;
38import static org.mockito.Mockito.atLeast;
39import static org.mockito.Mockito.doAnswer;
40import static org.mockito.Mockito.doReturn;
41import static org.mockito.Mockito.never;
42import static org.mockito.Mockito.nullable;
43import static org.mockito.Mockito.reset;
44import static org.mockito.Mockito.timeout;
45import static org.mockito.Mockito.times;
46import static org.mockito.Mockito.verify;
Sudheer Shanka101c3532018-01-08 16:28:42 -080047import static org.mockito.Mockito.verifyNoMoreInteractions;
Pavel Grafov75c0a892017-05-18 17:28:27 +010048import static org.mockito.Mockito.verifyZeroInteractions;
49import static org.mockito.Mockito.when;
50import static org.mockito.hamcrest.MockitoHamcrest.argThat;
51
Makoto Onukif76b06a2015-09-22 15:03:44 -070052import android.Manifest.permission;
arangelov08d534b2018-01-22 15:20:53 +000053import android.annotation.RawRes;
Makoto Onukif76b06a2015-09-22 15:03:44 -070054import android.app.Activity;
Robin Lee7f5c91c2017-02-08 21:27:02 +000055import android.app.Notification;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070056import android.app.admin.DeviceAdminReceiver;
57import android.app.admin.DevicePolicyManager;
58import android.app.admin.DevicePolicyManagerInternal;
Eric Sandnessfabfcb02017-05-03 18:28:56 +010059import android.app.admin.PasswordMetrics;
Lenka Trochtova56681f72018-03-09 15:47:50 +010060import android.app.backup.ISelectBackupTransportCallback;
Makoto Onukif76b06a2015-09-22 15:03:44 -070061import android.content.BroadcastReceiver;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070062import android.content.ComponentName;
Tony Mak2f26b792016-11-28 17:54:51 +000063import android.content.Intent;
Rubin Xued1928a2016-02-11 17:23:06 +000064import android.content.pm.ApplicationInfo;
65import android.content.pm.PackageInfo;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070066import android.content.pm.PackageManager;
Benjamin Franz714f77b2017-08-01 14:18:35 +010067import android.content.pm.ResolveInfo;
Robin Leeabaa0692017-02-20 20:54:22 +000068import android.content.pm.StringParceledListSlice;
Tony Mak2f26b792016-11-28 17:54:51 +000069import android.content.pm.UserInfo;
Pavel Grafov75c0a892017-05-18 17:28:27 +010070import android.graphics.Color;
71import android.net.Uri;
Makoto Onukia31ebbc2015-11-23 17:15:21 -080072import android.net.wifi.WifiInfo;
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -080073import android.os.Build.VERSION_CODES;
Makoto Onukif76b06a2015-09-22 15:03:44 -070074import android.os.Bundle;
Makoto Onukic8a5a552015-11-19 14:29:12 -080075import android.os.Process;
Makoto Onukib643fb02015-09-22 15:03:44 -070076import android.os.UserHandle;
Makoto Onukia4f11972015-10-01 13:19:58 -070077import android.os.UserManager;
Pavel Grafovc14b3172017-07-03 13:15:11 +010078import android.platform.test.annotations.Presubmit;
Makoto Onuki2a3c3da2016-02-18 14:25:30 -080079import android.provider.Settings;
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +010080import android.security.KeyChain;
Eran Messeri94d56762017-12-21 20:50:54 +000081import android.security.keystore.AttestationUtils;
Mahaver Chopra1216ae52016-03-11 15:39:48 +000082import android.telephony.TelephonyManager;
yuemingwe3d9c092018-01-11 12:11:44 +000083import android.telephony.data.ApnSetting;
Makoto Onukia31ebbc2015-11-23 17:15:21 -080084import android.test.MoreAsserts;
Benjamin Franz6d009032016-01-25 18:56:38 +000085import android.test.suitebuilder.annotation.SmallTest;
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +010086import android.util.ArraySet;
Makoto Onukib643fb02015-09-22 15:03:44 -070087import android.util.Pair;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -070088
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +010089import com.android.internal.R;
Rubin Xuaab7a412016-12-30 21:13:29 +000090import com.android.internal.widget.LockPatternUtils;
Alan Treadwayafad8782016-01-19 15:15:08 +000091import com.android.server.LocalServices;
92import com.android.server.SystemService;
Rubin Xucc391c22018-01-02 20:37:35 +000093import com.android.server.devicepolicy.DevicePolicyManagerService.RestrictionsListener;
Esteban Talavera6c9116a2016-11-24 16:12:44 +000094import com.android.server.pm.UserRestrictionsUtils;
Alan Treadwayafad8782016-01-19 15:15:08 +000095
Robin Lee7f5c91c2017-02-08 21:27:02 +000096import org.hamcrest.BaseMatcher;
97import org.hamcrest.Description;
Sudheer Shanka101c3532018-01-08 16:28:42 -080098import org.mockito.Mockito;
Makoto Onukib643fb02015-09-22 15:03:44 -070099import org.mockito.invocation.InvocationOnMock;
100import org.mockito.stubbing.Answer;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700101
arangelov08d534b2018-01-22 15:20:53 +0000102import java.io.File;
103import java.io.InputStream;
Makoto Onukic8a5a552015-11-19 14:29:12 -0800104import java.util.ArrayList;
Alan Treadwayafad8782016-01-19 15:15:08 +0000105import java.util.Arrays;
Esteban Talaverac9bb3782016-11-11 15:41:14 +0000106import java.util.Collections;
Makoto Onukib643fb02015-09-22 15:03:44 -0700107import java.util.HashMap;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700108import java.util.List;
Makoto Onukib643fb02015-09-22 15:03:44 -0700109import java.util.Map;
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +0100110import java.util.Set;
Michal Karpinskid084ca52017-01-18 15:54:18 +0000111import java.util.concurrent.TimeUnit;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700112
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700113/**
Makoto Onukif76b06a2015-09-22 15:03:44 -0700114 * Tests for DevicePolicyManager( and DevicePolicyManagerService).
Esteban Talavera01576862016-12-15 11:16:44 +0000115 * You can run them via:
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700116 m FrameworksServicesTests &&
117 adb install \
Alan Treadwayafad8782016-01-19 15:15:08 +0000118 -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworksServicesTests/FrameworksServicesTests.apk &&
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700119 adb shell am instrument -e class com.android.server.devicepolicy.DevicePolicyManagerTest \
Makoto Onukic8a5a552015-11-19 14:29:12 -0800120 -w com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700121
122 (mmma frameworks/base/services/tests/servicestests/ for non-ninja build)
Esteban Talavera01576862016-12-15 11:16:44 +0000123 *
124 * , or:
125 * runtest -c com.android.server.devicepolicy.DevicePolicyManagerTest frameworks-services
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700126 */
Benjamin Franz6d009032016-01-25 18:56:38 +0000127@SmallTest
Pavel Grafovc14b3172017-07-03 13:15:11 +0100128@Presubmit
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700129public class DevicePolicyManagerTest extends DpmTestBase {
Alan Treadwayafad8782016-01-19 15:15:08 +0000130 private static final List<String> OWNER_SETUP_PERMISSIONS = Arrays.asList(
131 permission.MANAGE_DEVICE_ADMINS, permission.MANAGE_PROFILE_AND_DEVICE_OWNERS,
132 permission.MANAGE_USERS, permission.INTERACT_ACROSS_USERS_FULL);
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100133 public static final String NOT_DEVICE_OWNER_MSG = "does not own the device";
Sudheer Shanka04d61ae2018-01-17 12:16:57 -0800134 public static final String NOT_PROFILE_OWNER_MSG = "does not own the profile";
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100135 public static final String ONGOING_CALL_MSG = "ongoing call on the device";
Alan Treadwayafad8782016-01-19 15:15:08 +0000136
Pavel Grafov75c0a892017-05-18 17:28:27 +0100137 // TODO replace all instances of this with explicit {@link #mServiceContext}.
138 @Deprecated
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700139 private DpmMockContext mContext;
Pavel Grafov75c0a892017-05-18 17:28:27 +0100140
141 private DpmMockContext mServiceContext;
142 private DpmMockContext mAdmin1Context;
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700143 public DevicePolicyManager dpm;
144 public DevicePolicyManagerServiceTestable dpms;
145
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +0100146 /*
147 * The CA cert below is the content of cacert.pem as generated by:
148 *
149 * openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem
150 */
151 private static final String TEST_CA =
152 "-----BEGIN CERTIFICATE-----\n" +
153 "MIIDXTCCAkWgAwIBAgIJAK9Tl/F9V8kSMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\n" +
154 "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n" +
155 "aWRnaXRzIFB0eSBMdGQwHhcNMTUwMzA2MTczMjExWhcNMjUwMzAzMTczMjExWjBF\n" +
156 "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n" +
157 "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n" +
158 "CgKCAQEAvItOutsE75WBTgTyNAHt4JXQ3JoseaGqcC3WQij6vhrleWi5KJ0jh1/M\n" +
159 "Rpry7Fajtwwb4t8VZa0NuM2h2YALv52w1xivql88zce/HU1y7XzbXhxis9o6SCI+\n" +
160 "oVQSbPeXRgBPppFzBEh3ZqYTVhAqw451XhwdA4Aqs3wts7ddjwlUzyMdU44osCUg\n" +
161 "kVg7lfPf9sTm5IoHVcfLSCWH5n6Nr9sH3o2ksyTwxuOAvsN11F/a0mmUoPciYPp+\n" +
162 "q7DzQzdi7akRG601DZ4YVOwo6UITGvDyuAAdxl5isovUXqe6Jmz2/myTSpAKxGFs\n" +
163 "jk9oRoG6WXWB1kni490GIPjJ1OceyQIDAQABo1AwTjAdBgNVHQ4EFgQUH1QIlPKL\n" +
164 "p2OQ/AoLOjKvBW4zK3AwHwYDVR0jBBgwFoAUH1QIlPKLp2OQ/AoLOjKvBW4zK3Aw\n" +
165 "DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAcMi4voMMJHeQLjtq8Oky\n" +
166 "Azpyk8moDwgCd4llcGj7izOkIIFqq/lyqKdtykVKUWz2bSHO5cLrtaOCiBWVlaCV\n" +
167 "DYAnnVLM8aqaA6hJDIfaGs4zmwz0dY8hVMFCuCBiLWuPfiYtbEmjHGSmpQTG6Qxn\n" +
168 "ZJlaK5CZyt5pgh5EdNdvQmDEbKGmu0wpCq9qjZImwdyAul1t/B0DrsWApZMgZpeI\n" +
169 "d2od0VBrCICB1K4p+C51D93xyQiva7xQcCne+TAnGNy9+gjQ/MyR8MRpwRLv5ikD\n" +
170 "u0anJCN8pXo6IMglfMAsoton1J6o5/ae5uhC6caQU8bNUsCK570gpNfjkzo6rbP0\n" +
171 "wQ==\n" +
172 "-----END CERTIFICATE-----\n";
173
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700174 @Override
175 protected void setUp() throws Exception {
176 super.setUp();
177
178 mContext = getContext();
Pavel Grafov75c0a892017-05-18 17:28:27 +0100179 mServiceContext = mContext;
180 mServiceContext.binder.callingUid = DpmMockContext.CALLER_UID;
181 when(getServices().packageManager.hasSystemFeature(eq(PackageManager.FEATURE_DEVICE_ADMIN)))
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700182 .thenReturn(true);
Benjamin Franz714f77b2017-08-01 14:18:35 +0100183 doReturn(Collections.singletonList(new ResolveInfo()))
184 .when(getServices().packageManager).queryBroadcastReceiversAsUser(
185 any(Intent.class),
186 anyInt(),
187 any(UserHandle.class));
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700188
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800189 // By default, pretend all users are running and unlocked.
Pavel Grafov75c0a892017-05-18 17:28:27 +0100190 when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true);
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800191
Makoto Onukia52562c2015-10-01 16:12:31 -0700192 initializeDpms();
Makoto Onukif76b06a2015-09-22 15:03:44 -0700193
Sudheer Shanka101c3532018-01-08 16:28:42 -0800194 Mockito.reset(getServices().usageStatsManagerInternal);
Sudheer Shankac53c47f2018-01-16 12:01:00 -0800195 Mockito.reset(getServices().networkPolicyManagerInternal);
Makoto Onukid932f762015-09-29 16:53:38 -0700196 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
197 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
198 setUpPackageManagerForAdmin(admin3, DpmMockContext.CALLER_UID);
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -0800199 setUpPackageManagerForAdmin(adminNoPerm, DpmMockContext.CALLER_UID);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700200
Pavel Grafov75c0a892017-05-18 17:28:27 +0100201 mAdmin1Context = new DpmMockContext(getServices(), mRealTestContext);
202 mAdmin1Context.packageName = admin1.getPackageName();
203 mAdmin1Context.applicationInfo = new ApplicationInfo();
204 mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_UID;
205
Makoto Onukib643fb02015-09-22 15:03:44 -0700206 setUpUserManager();
Makoto Onukif76b06a2015-09-22 15:03:44 -0700207 }
208
arangelov08d534b2018-01-22 15:20:53 +0000209 private TransferOwnershipMetadataManager getMockTransferMetadataManager() {
210 return dpms.mTransferOwnershipMetadataManager;
211 }
212
Robin Lee2c68dad2017-03-17 12:50:24 +0000213 @Override
214 protected void tearDown() throws Exception {
215 flushTasks();
arangelov08d534b2018-01-22 15:20:53 +0000216 getMockTransferMetadataManager().deleteMetadataFile();
Robin Lee2c68dad2017-03-17 12:50:24 +0000217 super.tearDown();
218 }
219
Makoto Onukia52562c2015-10-01 16:12:31 -0700220 private void initializeDpms() {
221 // Need clearCallingIdentity() to pass permission checks.
222 final long ident = mContext.binder.clearCallingIdentity();
Pavel Grafov75c0a892017-05-18 17:28:27 +0100223 LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
Makoto Onukia52562c2015-10-01 16:12:31 -0700224
Pavel Grafov75c0a892017-05-18 17:28:27 +0100225 dpms = new DevicePolicyManagerServiceTestable(getServices(), mContext);
226 dpms.systemReady(SystemService.PHASE_LOCK_SETTINGS_READY);
227 dpms.systemReady(SystemService.PHASE_BOOT_COMPLETED);
Makoto Onukia52562c2015-10-01 16:12:31 -0700228
Pavel Grafov75c0a892017-05-18 17:28:27 +0100229 dpm = new DevicePolicyManagerTestable(mContext, dpms);
Makoto Onukia52562c2015-10-01 16:12:31 -0700230
Pavel Grafov75c0a892017-05-18 17:28:27 +0100231 mContext.binder.restoreCallingIdentity(ident);
Makoto Onukia52562c2015-10-01 16:12:31 -0700232 }
233
Makoto Onukib643fb02015-09-22 15:03:44 -0700234 private void setUpUserManager() {
235 // Emulate UserManager.set/getApplicationRestriction().
236 final Map<Pair<String, UserHandle>, Bundle> appRestrictions = new HashMap<>();
237
238 // UM.setApplicationRestrictions() will save to appRestrictions.
239 doAnswer(new Answer<Void>() {
240 @Override
241 public Void answer(InvocationOnMock invocation) throws Throwable {
242 String pkg = (String) invocation.getArguments()[0];
243 Bundle bundle = (Bundle) invocation.getArguments()[1];
244 UserHandle user = (UserHandle) invocation.getArguments()[2];
245
246 appRestrictions.put(Pair.create(pkg, user), bundle);
247
248 return null;
249 }
Pavel Grafov75c0a892017-05-18 17:28:27 +0100250 }).when(getServices().userManager).setApplicationRestrictions(
Eric Sandnessa9b82532017-04-07 18:17:12 +0100251 anyString(), nullable(Bundle.class), any(UserHandle.class));
Makoto Onukib643fb02015-09-22 15:03:44 -0700252
253 // UM.getApplicationRestrictions() will read from appRestrictions.
254 doAnswer(new Answer<Bundle>() {
255 @Override
256 public Bundle answer(InvocationOnMock invocation) throws Throwable {
257 String pkg = (String) invocation.getArguments()[0];
258 UserHandle user = (UserHandle) invocation.getArguments()[1];
259
260 return appRestrictions.get(Pair.create(pkg, user));
261 }
Pavel Grafov75c0a892017-05-18 17:28:27 +0100262 }).when(getServices().userManager).getApplicationRestrictions(
Makoto Onukib643fb02015-09-22 15:03:44 -0700263 anyString(), any(UserHandle.class));
264
Makoto Onukid932f762015-09-29 16:53:38 -0700265 // Add the first secondary user.
Pavel Grafov75c0a892017-05-18 17:28:27 +0100266 getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, 0);
Makoto Onukib643fb02015-09-22 15:03:44 -0700267 }
268
269 private void setAsProfileOwner(ComponentName admin) {
Pavel Grafov75c0a892017-05-18 17:28:27 +0100270 final long ident = mServiceContext.binder.clearCallingIdentity();
Makoto Onukib643fb02015-09-22 15:03:44 -0700271
Pavel Grafov75c0a892017-05-18 17:28:27 +0100272 mServiceContext.binder.callingUid =
273 UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, DpmMockContext.SYSTEM_UID);
274 runAsCaller(mServiceContext, dpms, dpm -> {
275 // PO needs to be a DA.
276 dpm.setActiveAdmin(admin, /*replace=*/ false);
277 // Fire!
278 assertTrue(dpm.setProfileOwner(admin, "owner-name", DpmMockContext.CALLER_USER_HANDLE));
279 // Check
280 assertEquals(admin, dpm.getProfileOwnerAsUser(DpmMockContext.CALLER_USER_HANDLE));
281 });
Makoto Onukib643fb02015-09-22 15:03:44 -0700282
Pavel Grafov75c0a892017-05-18 17:28:27 +0100283 mServiceContext.binder.restoreCallingIdentity(ident);
Makoto Onukib643fb02015-09-22 15:03:44 -0700284 }
285
286 public void testHasNoFeature() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +0100287 when(getServices().packageManager.hasSystemFeature(eq(PackageManager.FEATURE_DEVICE_ADMIN)))
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700288 .thenReturn(false);
289
290 LocalServices.removeServiceForTest(DevicePolicyManagerInternal.class);
Pavel Grafov75c0a892017-05-18 17:28:27 +0100291 new DevicePolicyManagerServiceTestable(getServices(), mContext);
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700292
293 // If the device has no DPMS feature, it shouldn't register the local service.
294 assertNull(LocalServices.getService(DevicePolicyManagerInternal.class));
295 }
296
Sudheer Shankac53c47f2018-01-16 12:01:00 -0800297 public void testLoadAdminData() throws Exception {
Sudheer Shanka101c3532018-01-08 16:28:42 -0800298 // Device owner in SYSTEM_USER
299 setDeviceOwner();
300 // Profile owner in CALLER_USER_HANDLE
301 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
302 setAsProfileOwner(admin2);
303 // Active admin in CALLER_USER_HANDLE
304 final int ANOTHER_UID = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE, 1306);
305 setUpPackageManagerForFakeAdmin(adminAnotherPackage, ANOTHER_UID, admin2);
306 dpm.setActiveAdmin(adminAnotherPackage, /* replace =*/ false,
307 DpmMockContext.CALLER_USER_HANDLE);
308 assertTrue(dpm.isAdminActiveAsUser(adminAnotherPackage,
309 DpmMockContext.CALLER_USER_HANDLE));
310
311 initializeDpms();
312
313 // Verify
314 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
Sudheer Shanka04d61ae2018-01-17 12:16:57 -0800315 MockUtils.checkApps(admin1.getPackageName()),
Sudheer Shanka101c3532018-01-08 16:28:42 -0800316 eq(UserHandle.USER_SYSTEM));
317 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
Sudheer Shanka04d61ae2018-01-17 12:16:57 -0800318 MockUtils.checkApps(admin2.getPackageName(),
Sudheer Shanka101c3532018-01-08 16:28:42 -0800319 adminAnotherPackage.getPackageName()),
320 eq(DpmMockContext.CALLER_USER_HANDLE));
Sudheer Shankac53c47f2018-01-16 12:01:00 -0800321 verify(getServices().usageStatsManagerInternal).onAdminDataAvailable();
322 verify(getServices().networkPolicyManagerInternal).onAdminDataAvailable();
323 }
324
325 public void testLoadAdminData_noAdmins() throws Exception {
326 final int ANOTHER_USER_ID = 15;
327 getServices().addUser(ANOTHER_USER_ID, 0);
328
329 initializeDpms();
330
331 // Verify
332 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
333 null, DpmMockContext.CALLER_USER_HANDLE);
334 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
335 null, ANOTHER_USER_ID);
336 verify(getServices().usageStatsManagerInternal).onAdminDataAvailable();
337 verify(getServices().networkPolicyManagerInternal).onAdminDataAvailable();
Sudheer Shanka101c3532018-01-08 16:28:42 -0800338 }
339
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700340 /**
341 * Caller doesn't have proper permissions.
342 */
343 public void testSetActiveAdmin_SecurityException() {
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700344 // 1. Failure cases.
345
346 // Caller doesn't have MANAGE_DEVICE_ADMINS.
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100347 assertExpectException(SecurityException.class, /* messageRegex= */ null,
348 () -> dpm.setActiveAdmin(admin1, false));
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700349
350 // Caller has MANAGE_DEVICE_ADMINS, but for different user.
351 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100352
353 assertExpectException(SecurityException.class, /* messageRegex= */ null,
354 () -> dpm.setActiveAdmin(admin1, false, DpmMockContext.CALLER_USER_HANDLE + 1));
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700355 }
356
Makoto Onukif76b06a2015-09-22 15:03:44 -0700357 /**
358 * Test for:
359 * {@link DevicePolicyManager#setActiveAdmin}
Makoto Onuki2a3c3da2016-02-18 14:25:30 -0800360 * with replace=false and replace=true
Makoto Onukif76b06a2015-09-22 15:03:44 -0700361 * {@link DevicePolicyManager#isAdminActive}
362 * {@link DevicePolicyManager#isAdminActiveAsUser}
363 * {@link DevicePolicyManager#getActiveAdmins}
364 * {@link DevicePolicyManager#getActiveAdminsAsUser}
365 */
366 public void testSetActiveAdmin() throws Exception {
367 // 1. Make sure the caller has proper permissions.
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700368 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
369
Makoto Onukif76b06a2015-09-22 15:03:44 -0700370 // 2. Call the API.
371 dpm.setActiveAdmin(admin1, /* replace =*/ false);
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700372
373 // 3. Verify internal calls.
374
375 // Check if the boradcast is sent.
Makoto Onukif76b06a2015-09-22 15:03:44 -0700376 verify(mContext.spiedContext).sendBroadcastAsUser(
377 MockUtils.checkIntentAction(
378 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
379 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
380 verify(mContext.spiedContext).sendBroadcastAsUser(
381 MockUtils.checkIntentAction(
382 DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700383 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
384
Pavel Grafov75c0a892017-05-18 17:28:27 +0100385 verify(getServices().ipackageManager, times(1)).setApplicationEnabledSetting(
Makoto Onukif76b06a2015-09-22 15:03:44 -0700386 eq(admin1.getPackageName()),
387 eq(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT),
388 eq(PackageManager.DONT_KILL_APP),
389 eq(DpmMockContext.CALLER_USER_HANDLE),
390 anyString());
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700391
Sudheer Shanka101c3532018-01-08 16:28:42 -0800392 verify(getServices().usageStatsManagerInternal).onActiveAdminAdded(
393 admin1.getPackageName(), DpmMockContext.CALLER_USER_HANDLE);
394
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700395 // TODO Verify other calls too.
Makoto Onukif76b06a2015-09-22 15:03:44 -0700396
397 // Make sure it's active admin1.
398 assertTrue(dpm.isAdminActive(admin1));
399 assertFalse(dpm.isAdminActive(admin2));
400 assertFalse(dpm.isAdminActive(admin3));
401
402 // But not admin1 for a different user.
403
404 // For this to work, caller needs android.permission.INTERACT_ACROSS_USERS_FULL.
405 // (Because we're checking a different user's status from CALLER_USER_HANDLE.)
406 mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL");
407
408 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE + 1));
409 assertFalse(dpm.isAdminActiveAsUser(admin2, DpmMockContext.CALLER_USER_HANDLE + 1));
410
411 mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL");
412
413 // Next, add one more admin.
414 // Before doing so, update the application info, now it's enabled.
Makoto Onukia52562c2015-10-01 16:12:31 -0700415 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID,
Christine Franks361b8252017-06-23 18:12:46 -0700416 PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700417
418 dpm.setActiveAdmin(admin2, /* replace =*/ false);
419
420 // Now we have two admins.
421 assertTrue(dpm.isAdminActive(admin1));
422 assertTrue(dpm.isAdminActive(admin2));
423 assertFalse(dpm.isAdminActive(admin3));
424
425 // Admin2 was already enabled, so setApplicationEnabledSetting() shouldn't have called
426 // again. (times(1) because it was previously called for admin1)
Pavel Grafov75c0a892017-05-18 17:28:27 +0100427 verify(getServices().ipackageManager, times(1)).setApplicationEnabledSetting(
Makoto Onukif76b06a2015-09-22 15:03:44 -0700428 eq(admin1.getPackageName()),
429 eq(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT),
430 eq(PackageManager.DONT_KILL_APP),
431 eq(DpmMockContext.CALLER_USER_HANDLE),
432 anyString());
433
Sudheer Shanka101c3532018-01-08 16:28:42 -0800434 // times(2) because it was previously called for admin1 which is in the same package
435 // as admin2.
436 verify(getServices().usageStatsManagerInternal, times(2)).onActiveAdminAdded(
437 admin2.getPackageName(), DpmMockContext.CALLER_USER_HANDLE);
438
Makoto Onukif76b06a2015-09-22 15:03:44 -0700439 // 4. Add the same admin1 again without replace, which should throw.
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100440 assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null,
441 () -> dpm.setActiveAdmin(admin1, /* replace =*/ false));
Makoto Onukif76b06a2015-09-22 15:03:44 -0700442
443 // 5. Add the same admin1 again with replace, which should succeed.
444 dpm.setActiveAdmin(admin1, /* replace =*/ true);
445
446 // TODO make sure it's replaced.
447
448 // 6. Test getActiveAdmins()
449 List<ComponentName> admins = dpm.getActiveAdmins();
450 assertEquals(2, admins.size());
451 assertEquals(admin1, admins.get(0));
452 assertEquals(admin2, admins.get(1));
453
Sudheer Shanka101c3532018-01-08 16:28:42 -0800454 // There shouldn't be any callback to UsageStatsManagerInternal when the admin is being
455 // replaced
456 verifyNoMoreInteractions(getServices().usageStatsManagerInternal);
457
Makoto Onukif76b06a2015-09-22 15:03:44 -0700458 // Another user has no admins.
459 mContext.callerPermissions.add("android.permission.INTERACT_ACROSS_USERS_FULL");
460
461 assertEquals(0, DpmTestUtils.getListSizeAllowingNull(
462 dpm.getActiveAdminsAsUser(DpmMockContext.CALLER_USER_HANDLE + 1)));
463
464 mContext.callerPermissions.remove("android.permission.INTERACT_ACROSS_USERS_FULL");
465 }
466
Makoto Onukid932f762015-09-29 16:53:38 -0700467 public void testSetActiveAdmin_multiUsers() throws Exception {
468
469 final int ANOTHER_USER_ID = 100;
470 final int ANOTHER_ADMIN_UID = UserHandle.getUid(ANOTHER_USER_ID, 20456);
471
Pavel Grafov75c0a892017-05-18 17:28:27 +0100472 getServices().addUser(ANOTHER_USER_ID, 0); // Add one more user.
Makoto Onukid932f762015-09-29 16:53:38 -0700473
474 // Set up pacakge manager for the other user.
475 setUpPackageManagerForAdmin(admin2, ANOTHER_ADMIN_UID);
Makoto Onukid932f762015-09-29 16:53:38 -0700476
477 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
478
479 dpm.setActiveAdmin(admin1, /* replace =*/ false);
480
481 mMockContext.binder.callingUid = ANOTHER_ADMIN_UID;
482 dpm.setActiveAdmin(admin2, /* replace =*/ false);
483
484
485 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
486 assertTrue(dpm.isAdminActive(admin1));
487 assertFalse(dpm.isAdminActive(admin2));
488
489 mMockContext.binder.callingUid = ANOTHER_ADMIN_UID;
490 assertFalse(dpm.isAdminActive(admin1));
491 assertTrue(dpm.isAdminActive(admin2));
492 }
493
Makoto Onukif76b06a2015-09-22 15:03:44 -0700494 /**
495 * Test for:
496 * {@link DevicePolicyManager#setActiveAdmin}
Makoto Onuki2a3c3da2016-02-18 14:25:30 -0800497 * with replace=false
Makoto Onukif76b06a2015-09-22 15:03:44 -0700498 */
499 public void testSetActiveAdmin_twiceWithoutReplace() throws Exception {
500 // 1. Make sure the caller has proper permissions.
501 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
502
503 dpm.setActiveAdmin(admin1, /* replace =*/ false);
504 assertTrue(dpm.isAdminActive(admin1));
505
506 // Add the same admin1 again without replace, which should throw.
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100507 assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null,
508 () -> dpm.setActiveAdmin(admin1, /* replace =*/ false));
Makoto Onukif76b06a2015-09-22 15:03:44 -0700509 }
510
511 /**
512 * Test for:
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -0800513 * {@link DevicePolicyManager#setActiveAdmin} when the admin isn't protected with
514 * BIND_DEVICE_ADMIN.
515 */
516 public void testSetActiveAdmin_permissionCheck() throws Exception {
517 // 1. Make sure the caller has proper permissions.
518 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
519
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100520 assertExpectException(IllegalArgumentException.class,
521 /* messageRegex= */ permission.BIND_DEVICE_ADMIN,
522 () -> dpm.setActiveAdmin(adminNoPerm, /* replace =*/ false));
Makoto Onuki3ab6f2e2015-11-05 13:55:37 -0800523 assertFalse(dpm.isAdminActive(adminNoPerm));
524
525 // Change the target API level to MNC. Now it can be set as DA.
526 setUpPackageManagerForAdmin(adminNoPerm, DpmMockContext.CALLER_UID, null,
527 VERSION_CODES.M);
528 dpm.setActiveAdmin(adminNoPerm, /* replace =*/ false);
529 assertTrue(dpm.isAdminActive(adminNoPerm));
530
531 // TODO Test the "load from the file" case where DA will still be loaded even without
532 // BIND_DEVICE_ADMIN and target API is N.
533 }
534
535 /**
536 * Test for:
Makoto Onukif76b06a2015-09-22 15:03:44 -0700537 * {@link DevicePolicyManager#removeActiveAdmin}
538 */
539 public void testRemoveActiveAdmin_SecurityException() {
540 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
541
542 // Add admin.
543
544 dpm.setActiveAdmin(admin1, /* replace =*/ false);
545
546 assertTrue(dpm.isAdminActive(admin1));
547
548 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
549
550 // Directly call the DPMS method with a different userid, which should fail.
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100551 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
552 () -> dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE + 1));
Makoto Onukif76b06a2015-09-22 15:03:44 -0700553
554 // Try to remove active admin with a different caller userid should fail too, without
555 // having MANAGE_DEVICE_ADMINS.
556 mContext.callerPermissions.clear();
557
Makoto Onukid932f762015-09-29 16:53:38 -0700558 // Change the caller, and call into DPMS directly with a different user-id.
559
Makoto Onukif76b06a2015-09-22 15:03:44 -0700560 mContext.binder.callingUid = 1234567;
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100561 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
562 () -> dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
Makoto Onukif76b06a2015-09-22 15:03:44 -0700563 }
564
565 /**
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800566 * {@link DevicePolicyManager#removeActiveAdmin} should fail with the user is not unlocked
567 * (because we can't send the remove broadcast).
568 */
569 public void testRemoveActiveAdmin_userNotRunningOrLocked() {
570 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
571
572 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
573
574 // Add admin.
575
576 dpm.setActiveAdmin(admin1, /* replace =*/ false);
577
578 assertTrue(dpm.isAdminActive(admin1));
579
580 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
581
582 // 1. User not unlocked.
Pavel Grafov75c0a892017-05-18 17:28:27 +0100583 when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE)))
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800584 .thenReturn(false);
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100585 assertExpectException(IllegalStateException.class,
586 /* messageRegex= */ "User must be running and unlocked",
587 () -> dpm.removeActiveAdmin(admin1));
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800588
589 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
Sudheer Shanka101c3532018-01-08 16:28:42 -0800590 verify(getServices().usageStatsManagerInternal, times(0)).setActiveAdminApps(
591 null, DpmMockContext.CALLER_USER_HANDLE);
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800592
593 // 2. User unlocked.
Pavel Grafov75c0a892017-05-18 17:28:27 +0100594 when(getServices().userManager.isUserUnlocked(eq(DpmMockContext.CALLER_USER_HANDLE)))
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800595 .thenReturn(true);
596
597 dpm.removeActiveAdmin(admin1);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700598 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Sudheer Shanka101c3532018-01-08 16:28:42 -0800599 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
600 null, DpmMockContext.CALLER_USER_HANDLE);
Makoto Onuki1a5ee772016-02-12 15:34:57 -0800601 }
602
603 /**
Makoto Onukif76b06a2015-09-22 15:03:44 -0700604 * Test for:
605 * {@link DevicePolicyManager#removeActiveAdmin}
606 */
Makoto Onukid932f762015-09-29 16:53:38 -0700607 public void testRemoveActiveAdmin_fromDifferentUserWithINTERACT_ACROSS_USERS_FULL() {
Makoto Onukif76b06a2015-09-22 15:03:44 -0700608 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
609
610 // Add admin1.
611
612 dpm.setActiveAdmin(admin1, /* replace =*/ false);
613
614 assertTrue(dpm.isAdminActive(admin1));
615 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
616
617 // Different user, but should work, because caller has proper permissions.
618 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
Makoto Onukid932f762015-09-29 16:53:38 -0700619
620 // Change the caller, and call into DPMS directly with a different user-id.
Makoto Onukif76b06a2015-09-22 15:03:44 -0700621 mContext.binder.callingUid = 1234567;
Makoto Onukid932f762015-09-29 16:53:38 -0700622
623 dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700624 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Sudheer Shanka101c3532018-01-08 16:28:42 -0800625 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
626 null, DpmMockContext.CALLER_USER_HANDLE);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700627
628 // TODO DO Still can't be removed in this case.
629 }
630
631 /**
632 * Test for:
633 * {@link DevicePolicyManager#removeActiveAdmin}
634 */
635 public void testRemoveActiveAdmin_sameUserNoMANAGE_DEVICE_ADMINS() {
636 // Need MANAGE_DEVICE_ADMINS for setActiveAdmin. We'll remove it later.
637 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
638
639 // Add admin1.
640
641 dpm.setActiveAdmin(admin1, /* replace =*/ false);
642
643 assertTrue(dpm.isAdminActive(admin1));
644 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
645
646 // Broadcast from saveSettingsLocked().
647 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
648 MockUtils.checkIntentAction(
649 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
650 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
651
652 // Remove. No permissions, but same user, so it'll work.
653 mContext.callerPermissions.clear();
654 dpm.removeActiveAdmin(admin1);
655
Makoto Onukif76b06a2015-09-22 15:03:44 -0700656 verify(mContext.spiedContext).sendOrderedBroadcastAsUser(
657 MockUtils.checkIntentAction(
658 DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED),
659 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE),
660 isNull(String.class),
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700661 any(BroadcastReceiver.class),
Makoto Onukif76b06a2015-09-22 15:03:44 -0700662 eq(dpms.mHandler),
663 eq(Activity.RESULT_OK),
664 isNull(String.class),
665 isNull(Bundle.class));
666
Suprabh Shukla3cb2b492016-08-09 17:20:57 -0700667 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Sudheer Shanka101c3532018-01-08 16:28:42 -0800668 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
669 null, DpmMockContext.CALLER_USER_HANDLE);
Makoto Onukif76b06a2015-09-22 15:03:44 -0700670
671 // Again broadcast from saveSettingsLocked().
672 verify(mContext.spiedContext, times(2)).sendBroadcastAsUser(
673 MockUtils.checkIntentAction(
674 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
675 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
676
677 // TODO Check other internal calls.
Makoto Onukicc4bbeb2015-09-17 10:28:24 -0700678 }
Makoto Onukib643fb02015-09-22 15:03:44 -0700679
Sudheer Shanka101c3532018-01-08 16:28:42 -0800680 public void testRemoveActiveAdmin_multipleAdminsInUser() {
681 // Need MANAGE_DEVICE_ADMINS for setActiveAdmin. We'll remove it later.
682 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
683
684 // Add admin1.
685 dpm.setActiveAdmin(admin1, /* replace =*/ false);
686
687 assertTrue(dpm.isAdminActive(admin1));
688 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
689
690 // Add admin2.
691 dpm.setActiveAdmin(admin2, /* replace =*/ false);
692
693 assertTrue(dpm.isAdminActive(admin2));
694 assertFalse(dpm.isRemovingAdmin(admin2, DpmMockContext.CALLER_USER_HANDLE));
695
696 // Broadcast from saveSettingsLocked().
697 verify(mContext.spiedContext, times(2)).sendBroadcastAsUser(
698 MockUtils.checkIntentAction(
699 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
700 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
701
702 // Remove. No permissions, but same user, so it'll work.
703 mContext.callerPermissions.clear();
704 dpm.removeActiveAdmin(admin1);
705
706 verify(mContext.spiedContext).sendOrderedBroadcastAsUser(
707 MockUtils.checkIntentAction(
708 DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED),
709 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE),
710 isNull(String.class),
711 any(BroadcastReceiver.class),
712 eq(dpms.mHandler),
713 eq(Activity.RESULT_OK),
714 isNull(String.class),
715 isNull(Bundle.class));
716
717 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
718 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
Sudheer Shanka04d61ae2018-01-17 12:16:57 -0800719 MockUtils.checkApps(admin2.getPackageName()),
Sudheer Shanka101c3532018-01-08 16:28:42 -0800720 eq(DpmMockContext.CALLER_USER_HANDLE));
721
722 // Again broadcast from saveSettingsLocked().
723 verify(mContext.spiedContext, times(3)).sendBroadcastAsUser(
724 MockUtils.checkIntentAction(
725 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
726 MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE));
727 }
728
729 /**
730 * Test for:
731 * {@link DevicePolicyManager#forceRemoveActiveAdmin(ComponentName, int)}
732 */
733 public void testForceRemoveActiveAdmin() throws Exception {
734 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
735
736 // Add admin.
737 setupPackageInPackageManager(admin1.getPackageName(),
738 /* userId= */ DpmMockContext.CALLER_USER_HANDLE,
739 /* appId= */ 10138,
740 /* flags= */ ApplicationInfo.FLAG_TEST_ONLY);
741 dpm.setActiveAdmin(admin1, /* replace =*/ false);
742 assertTrue(dpm.isAdminActive(admin1));
743
744 // Calling from a non-shell uid should fail with a SecurityException
745 mContext.binder.callingUid = 123456;
746 assertExpectException(SecurityException.class,
747 /* messageRegex =*/ "Non-shell user attempted to call",
748 () -> dpms.forceRemoveActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
749
750 mContext.binder.callingUid = Process.SHELL_UID;
751 dpms.forceRemoveActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE);
752
753 mContext.callerPermissions.add(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL);
754 // Verify
755 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
756 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
757 null, DpmMockContext.CALLER_USER_HANDLE);
758 }
759
Makoto Onukib643fb02015-09-22 15:03:44 -0700760 /**
Robin Leed2a73ed2016-12-19 09:07:16 +0000761 * Test for: @{link DevicePolicyManager#setActivePasswordState}
762 *
763 * Validates that when the password for a user changes, the notification broadcast intent
764 * {@link DeviceAdminReceiver#ACTION_PASSWORD_CHANGED} is sent to managed profile owners, in
765 * addition to ones in the original user.
766 */
767 public void testSetActivePasswordState_sendToProfiles() throws Exception {
768 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
769
770 final int MANAGED_PROFILE_USER_ID = 78;
771 final int MANAGED_PROFILE_ADMIN_UID =
772 UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID);
773
774 // Setup device owner.
775 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
776 mContext.packageName = admin1.getPackageName();
777 setupDeviceOwner();
778
779 // Add a managed profile belonging to the system user.
780 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
781
782 // Change the parent user's password.
783 dpm.reportPasswordChanged(UserHandle.USER_SYSTEM);
784
785 // Both the device owner and the managed profile owner should receive this broadcast.
786 final Intent intent = new Intent(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED);
787 intent.setComponent(admin1);
788 intent.putExtra(Intent.EXTRA_USER, UserHandle.of(UserHandle.USER_SYSTEM));
789
790 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
791 MockUtils.checkIntent(intent),
792 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
793 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
794 MockUtils.checkIntent(intent),
795 MockUtils.checkUserHandle(MANAGED_PROFILE_USER_ID));
796 }
797
798 /**
799 * Test for: @{link DevicePolicyManager#setActivePasswordState}
800 *
801 * Validates that when the password for a managed profile changes, the notification broadcast
802 * intent {@link DeviceAdminReceiver#ACTION_PASSWORD_CHANGED} is only sent to the profile, not
803 * its parent.
804 */
805 public void testSetActivePasswordState_notSentToParent() throws Exception {
806 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
807
808 final int MANAGED_PROFILE_USER_ID = 78;
809 final int MANAGED_PROFILE_ADMIN_UID =
810 UserHandle.getUid(MANAGED_PROFILE_USER_ID, DpmMockContext.SYSTEM_UID);
811
812 // Setup device owner.
813 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
814 mContext.packageName = admin1.getPackageName();
Pavel Grafov75c0a892017-05-18 17:28:27 +0100815 doReturn(true).when(getServices().lockPatternUtils)
Robin Leed2a73ed2016-12-19 09:07:16 +0000816 .isSeparateProfileChallengeEnabled(MANAGED_PROFILE_USER_ID);
817 setupDeviceOwner();
818
819 // Add a managed profile belonging to the system user.
820 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
821
822 // Change the profile's password.
823 dpm.reportPasswordChanged(MANAGED_PROFILE_USER_ID);
824
825 // Both the device owner and the managed profile owner should receive this broadcast.
826 final Intent intent = new Intent(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED);
827 intent.setComponent(admin1);
828 intent.putExtra(Intent.EXTRA_USER, UserHandle.of(MANAGED_PROFILE_USER_ID));
829
830 verify(mContext.spiedContext, never()).sendBroadcastAsUser(
831 MockUtils.checkIntent(intent),
832 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
833 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
834 MockUtils.checkIntent(intent),
835 MockUtils.checkUserHandle(MANAGED_PROFILE_USER_ID));
836 }
837 /**
Victor Chang3e794af2016-03-04 13:48:17 +0000838 * Test for: {@link DevicePolicyManager#setDeviceOwner} DO on system user installs successfully.
Makoto Onukib643fb02015-09-22 15:03:44 -0700839 */
840 public void testSetDeviceOwner() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +0000841 setDeviceOwner();
842
843 // Try to set a profile owner on the same user, which should fail.
844 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_SYSTEM_USER_UID);
845 dpm.setActiveAdmin(admin2, /* refreshing= */ true, UserHandle.USER_SYSTEM);
Pavel Grafova1ea8d92017-05-25 21:55:24 +0100846 assertExpectException(IllegalStateException.class,
847 /* messageRegex= */ "already has a device owner",
848 () -> dpm.setProfileOwner(admin2, "owner-name", UserHandle.USER_SYSTEM));
Victor Chang3e794af2016-03-04 13:48:17 +0000849
850 // DO admin can't be deactivated.
851 dpm.removeActiveAdmin(admin1);
852 assertTrue(dpm.isAdminActive(admin1));
853
854 // TODO Test getDeviceOwnerName() too. To do so, we need to change
855 // DPMS.getApplicationLabel() because Context.createPackageContextAsUser() is not mockable.
856 }
857
858 private void setDeviceOwner() throws Exception {
Makoto Onukib643fb02015-09-22 15:03:44 -0700859 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -0800860 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukib643fb02015-09-22 15:03:44 -0700861 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
862 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
863
Makoto Onukid932f762015-09-29 16:53:38 -0700864 // In this test, change the caller user to "system".
Makoto Onukib643fb02015-09-22 15:03:44 -0700865 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
866
Makoto Onukid932f762015-09-29 16:53:38 -0700867 // Make sure admin1 is installed on system user.
868 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
Makoto Onukid932f762015-09-29 16:53:38 -0700869
Makoto Onukic8a5a552015-11-19 14:29:12 -0800870 // Check various get APIs.
871 checkGetDeviceOwnerInfoApi(dpm, /* hasDeviceOwner =*/ false);
872
Makoto Onukib643fb02015-09-22 15:03:44 -0700873 // DO needs to be an DA.
874 dpm.setActiveAdmin(admin1, /* replace =*/ false);
875
876 // Fire!
Makoto Onukia52562c2015-10-01 16:12:31 -0700877 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
Makoto Onukib643fb02015-09-22 15:03:44 -0700878
Makoto Onukic8a5a552015-11-19 14:29:12 -0800879 // getDeviceOwnerComponent should return the admin1 component.
880 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
881 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
882
883 // Check various get APIs.
884 checkGetDeviceOwnerInfoApi(dpm, /* hasDeviceOwner =*/ true);
885
886 // getDeviceOwnerComponent should *NOT* return the admin1 component for other users.
887 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
888 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
889 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
890
891 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
892
Makoto Onuki219bbaf2015-11-12 01:38:47 +0000893 // Verify internal calls.
Pavel Grafov75c0a892017-05-18 17:28:27 +0100894 verify(getServices().iactivityManager, times(1)).updateDeviceOwner(
Makoto Onuki219bbaf2015-11-12 01:38:47 +0000895 eq(admin1.getPackageName()));
896
Makoto Onukib643fb02015-09-22 15:03:44 -0700897 // TODO We should check if the caller has called clearCallerIdentity().
Pavel Grafov75c0a892017-05-18 17:28:27 +0100898 verify(getServices().ibackupManager, times(1)).setBackupServiceActive(
Makoto Onukib643fb02015-09-22 15:03:44 -0700899 eq(UserHandle.USER_SYSTEM), eq(false));
900
901 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
902 MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED),
903 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
904
Makoto Onukic8a5a552015-11-19 14:29:12 -0800905 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukib643fb02015-09-22 15:03:44 -0700906 }
907
Makoto Onukic8a5a552015-11-19 14:29:12 -0800908 private void checkGetDeviceOwnerInfoApi(DevicePolicyManager dpm, boolean hasDeviceOwner) {
909 final int origCallingUser = mContext.binder.callingUid;
910 final List origPermissions = new ArrayList(mContext.callerPermissions);
911 mContext.callerPermissions.clear();
912
913 mContext.callerPermissions.add(permission.MANAGE_USERS);
914
915 mContext.binder.callingUid = Process.SYSTEM_UID;
916
917 // TODO Test getDeviceOwnerName() too. To do so, we need to change
918 // DPMS.getApplicationLabel() because Context.createPackageContextAsUser() is not mockable.
919 if (hasDeviceOwner) {
920 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
921 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
922 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
923
924 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
925 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
926 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
927 } else {
928 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
929 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
930 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
931
932 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
933 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
934 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
935 }
936
937 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
938 if (hasDeviceOwner) {
939 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
940 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
941 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
942
943 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
944 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
945 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
946 } else {
947 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
948 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
949 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
950
951 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
952 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
953 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
954 }
955
956 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
957 // Still with MANAGE_USERS.
958 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
959 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
960 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
961
962 if (hasDeviceOwner) {
963 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
964 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
965 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
966 } else {
967 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
968 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
969 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
970 }
971
972 mContext.binder.callingUid = Process.SYSTEM_UID;
973 mContext.callerPermissions.remove(permission.MANAGE_USERS);
974 // System can still call "OnAnyUser" without MANAGE_USERS.
975 if (hasDeviceOwner) {
976 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
977 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
978 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
979
980 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
981 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
982 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
983 } else {
984 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
985 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
986 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
987
988 assertFalse(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
989 assertEquals(null, dpm.getDeviceOwnerComponentOnAnyUser());
990 assertEquals(UserHandle.USER_NULL, dpm.getDeviceOwnerUserId());
991 }
992
993 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
994 // Still no MANAGE_USERS.
995 if (hasDeviceOwner) {
996 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
997 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
998 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
999 } else {
1000 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1001 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
1002 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
1003 }
1004
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001005 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1006 () -> dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
1007 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1008 dpm::getDeviceOwnerComponentOnAnyUser);
1009 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1010 dpm::getDeviceOwnerUserId);
1011 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1012 dpm::getDeviceOwnerNameOnAnyUser);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001013
1014 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1015 // Still no MANAGE_USERS.
1016 assertFalse(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1017 assertFalse(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
1018 assertEquals(null, dpm.getDeviceOwnerComponentOnCallingUser());
1019
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001020 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1021 () -> dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
1022 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1023 dpm::getDeviceOwnerComponentOnAnyUser);
1024 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1025 dpm::getDeviceOwnerUserId);
1026 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1027 dpm::getDeviceOwnerNameOnAnyUser);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001028
1029 // Restore.
1030 mContext.binder.callingUid = origCallingUser;
1031 mContext.callerPermissions.addAll(origPermissions);
1032 }
1033
1034
Makoto Onukib643fb02015-09-22 15:03:44 -07001035 /**
1036 * Test for: {@link DevicePolicyManager#setDeviceOwner} Package doesn't exist.
1037 */
1038 public void testSetDeviceOwner_noSuchPackage() {
1039 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001040 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukib643fb02015-09-22 15:03:44 -07001041 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1042 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1043
1044 // Call from a process on the system user.
1045 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1046
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001047 assertExpectException(IllegalArgumentException.class,
1048 /* messageRegex= */ "Invalid component",
1049 () -> dpm.setDeviceOwner(new ComponentName("a.b.c", ".def")));
Makoto Onukib643fb02015-09-22 15:03:44 -07001050 }
1051
1052 public void testSetDeviceOwner_failures() throws Exception {
1053 // TODO Test more failure cases. Basically test all chacks in enforceCanSetDeviceOwner().
1054 }
1055
Makoto Onukia52562c2015-10-01 16:12:31 -07001056 public void testClearDeviceOwner() throws Exception {
1057 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001058 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia52562c2015-10-01 16:12:31 -07001059 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1060 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1061
1062 // Set admin1 as a DA to the secondary user.
1063 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
1064
1065 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1066
1067 // Set admin 1 as the DO to the system user.
1068
1069 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1070 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1071 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1072 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
1073
Makoto Onuki219bbaf2015-11-12 01:38:47 +00001074 // Verify internal calls.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001075 verify(getServices().iactivityManager, times(1)).updateDeviceOwner(
Makoto Onuki219bbaf2015-11-12 01:38:47 +00001076 eq(admin1.getPackageName()));
1077
Makoto Onukic8a5a552015-11-19 14:29:12 -08001078 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukia52562c2015-10-01 16:12:31 -07001079
Makoto Onuki90b89652016-01-28 14:44:18 -08001080 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001081 when(getServices().userManager.hasUserRestriction(eq(UserManager.DISALLOW_ADD_USER),
Victor Chang348f6962017-01-30 16:19:13 +00001082 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM))).thenReturn(true);
Makoto Onuki90b89652016-01-28 14:44:18 -08001083
1084 assertTrue(dpm.isAdminActive(admin1));
1085 assertFalse(dpm.isRemovingAdmin(admin1, UserHandle.USER_SYSTEM));
1086
Makoto Onukia52562c2015-10-01 16:12:31 -07001087 // Set up other mocks.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001088 when(getServices().userManager.getUserRestrictions()).thenReturn(new Bundle());
Makoto Onukia52562c2015-10-01 16:12:31 -07001089
1090 // Now call clear.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001091 doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(getServices().packageManager).
1092 getPackageUidAsUser(eq(admin1.getPackageName()), anyInt());
Makoto Onuki1a5ee772016-02-12 15:34:57 -08001093
1094 // But first pretend the user is locked. Then it should fail.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001095 when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(false);
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001096 assertExpectException(IllegalStateException.class,
1097 /* messageRegex= */ "User must be running and unlocked",
1098 () -> dpm.clearDeviceOwnerApp(admin1.getPackageName()));
Makoto Onuki1a5ee772016-02-12 15:34:57 -08001099
Pavel Grafov75c0a892017-05-18 17:28:27 +01001100 when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true);
1101 reset(getServices().userManagerInternal);
Makoto Onukia52562c2015-10-01 16:12:31 -07001102 dpm.clearDeviceOwnerApp(admin1.getPackageName());
1103
1104 // Now DO shouldn't be set.
Makoto Onukic8a5a552015-11-19 14:29:12 -08001105 assertNull(dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukia52562c2015-10-01 16:12:31 -07001106
Pavel Grafov75c0a892017-05-18 17:28:27 +01001107 verify(getServices().userManager).setUserRestriction(eq(UserManager.DISALLOW_ADD_USER),
Victor Chang348f6962017-01-30 16:19:13 +00001108 eq(false),
1109 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
1110
Pavel Grafov75c0a892017-05-18 17:28:27 +01001111 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki90b89652016-01-28 14:44:18 -08001112 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001113 eq(null),
1114 eq(true), eq(CAMERA_NOT_DISABLED));
Makoto Onuki90b89652016-01-28 14:44:18 -08001115
Sudheer Shanka101c3532018-01-08 16:28:42 -08001116 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
1117 null, UserHandle.USER_SYSTEM);
1118
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07001119 assertFalse(dpm.isAdminActiveAsUser(admin1, UserHandle.USER_SYSTEM));
Tony Mak1970f972016-08-30 17:41:48 +01001120
1121 // ACTION_DEVICE_OWNER_CHANGED should be sent twice, once for setting the device owner
1122 // and once for clearing it.
1123 verify(mContext.spiedContext, times(2)).sendBroadcastAsUser(
1124 MockUtils.checkIntentAction(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED),
1125 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
Makoto Onukia52562c2015-10-01 16:12:31 -07001126 // TODO Check other calls.
1127 }
1128
1129 public void testClearDeviceOwner_fromDifferentUser() throws Exception {
1130 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001131 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia52562c2015-10-01 16:12:31 -07001132 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1133 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1134
1135 // Set admin1 as a DA to the secondary user.
1136 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
1137
1138 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1139
1140 // Set admin 1 as the DO to the system user.
1141
1142 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1143 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1144 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1145 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
1146
Makoto Onuki219bbaf2015-11-12 01:38:47 +00001147 // Verify internal calls.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001148 verify(getServices().iactivityManager, times(1)).updateDeviceOwner(
Makoto Onuki219bbaf2015-11-12 01:38:47 +00001149 eq(admin1.getPackageName()));
1150
Makoto Onukic8a5a552015-11-19 14:29:12 -08001151 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
Makoto Onukia52562c2015-10-01 16:12:31 -07001152
1153 // Now call clear from the secondary user, which should throw.
1154 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1155
1156 // Now call clear.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001157 doReturn(DpmMockContext.CALLER_UID).when(getServices().packageManager).getPackageUidAsUser(
Makoto Onukia52562c2015-10-01 16:12:31 -07001158 eq(admin1.getPackageName()),
1159 anyInt());
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001160 assertExpectException(SecurityException.class,
1161 /* messageRegex =*/ "clearDeviceOwner can only be called by the device owner",
1162 () -> dpm.clearDeviceOwnerApp(admin1.getPackageName()));
Makoto Onukia52562c2015-10-01 16:12:31 -07001163
Makoto Onukic8a5a552015-11-19 14:29:12 -08001164 // DO shouldn't be removed.
1165 assertTrue(dpm.isDeviceManaged());
Makoto Onukia52562c2015-10-01 16:12:31 -07001166 }
1167
Makoto Onukib643fb02015-09-22 15:03:44 -07001168 public void testSetProfileOwner() throws Exception {
1169 setAsProfileOwner(admin1);
Makoto Onuki803d6752015-10-30 12:58:39 -07001170
Makoto Onuki90b89652016-01-28 14:44:18 -08001171 // PO admin can't be deactivated.
1172 dpm.removeActiveAdmin(admin1);
1173 assertTrue(dpm.isAdminActive(admin1));
1174
Makoto Onuki803d6752015-10-30 12:58:39 -07001175 // Try setting DO on the same user, which should fail.
1176 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001177 mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
1178 runAsCaller(mServiceContext, dpms, dpm -> {
1179 dpm.setActiveAdmin(admin2, /* refreshing= */ true, DpmMockContext.CALLER_USER_HANDLE);
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001180 assertExpectException(IllegalStateException.class,
1181 /* messageRegex= */ "already has a profile owner",
1182 () -> dpm.setDeviceOwner(admin2, "owner-name",
1183 DpmMockContext.CALLER_USER_HANDLE));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001184 });
Makoto Onukib643fb02015-09-22 15:03:44 -07001185 }
1186
Makoto Onuki90b89652016-01-28 14:44:18 -08001187 public void testClearProfileOwner() throws Exception {
1188 setAsProfileOwner(admin1);
1189
1190 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1191
1192 assertTrue(dpm.isProfileOwnerApp(admin1.getPackageName()));
1193 assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE));
1194
Makoto Onuki1a5ee772016-02-12 15:34:57 -08001195 // First try when the user is locked, which should fail.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001196 when(getServices().userManager.isUserUnlocked(anyInt()))
Makoto Onuki1a5ee772016-02-12 15:34:57 -08001197 .thenReturn(false);
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001198 assertExpectException(IllegalStateException.class,
1199 /* messageRegex= */ "User must be running and unlocked",
1200 () -> dpm.clearProfileOwner(admin1));
1201
Makoto Onuki1a5ee772016-02-12 15:34:57 -08001202 // Clear, really.
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001203 when(getServices().userManager.isUserUnlocked(anyInt())).thenReturn(true);
Makoto Onuki90b89652016-01-28 14:44:18 -08001204 dpm.clearProfileOwner(admin1);
1205
1206 // Check
1207 assertFalse(dpm.isProfileOwnerApp(admin1.getPackageName()));
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07001208 assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE));
Sudheer Shanka101c3532018-01-08 16:28:42 -08001209 verify(getServices().usageStatsManagerInternal).setActiveAdminApps(
1210 null, DpmMockContext.CALLER_USER_HANDLE);
Makoto Onuki90b89652016-01-28 14:44:18 -08001211 }
1212
Makoto Onukib643fb02015-09-22 15:03:44 -07001213 public void testSetProfileOwner_failures() throws Exception {
1214 // TODO Test more failure cases. Basically test all chacks in enforceCanSetProfileOwner().
1215 }
1216
Makoto Onukia52562c2015-10-01 16:12:31 -07001217 public void testGetDeviceOwnerAdminLocked() throws Exception {
1218 checkDeviceOwnerWithMultipleDeviceAdmins();
1219 }
1220
1221 private void checkDeviceOwnerWithMultipleDeviceAdmins() throws Exception {
1222 // In ths test, we use 3 users (system + 2 secondary users), set some device admins to them,
1223 // set admin2 on CALLER_USER_HANDLE as DO, then call getDeviceOwnerAdminLocked() to
1224 // make sure it gets the right component from the right user.
1225
1226 final int ANOTHER_USER_ID = 100;
1227 final int ANOTHER_ADMIN_UID = UserHandle.getUid(ANOTHER_USER_ID, 456);
1228
Pavel Grafov75c0a892017-05-18 17:28:27 +01001229 getServices().addUser(ANOTHER_USER_ID, 0); // Add one more user.
Makoto Onukia52562c2015-10-01 16:12:31 -07001230
1231 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001232 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia52562c2015-10-01 16:12:31 -07001233 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1234 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1235
1236 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1237
Pavel Grafov75c0a892017-05-18 17:28:27 +01001238 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
Victor Change29cd472016-03-02 20:57:42 +00001239
Makoto Onukia52562c2015-10-01 16:12:31 -07001240 // Make sure the admin packge is installed to each user.
1241 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1242 setUpPackageManagerForAdmin(admin3, DpmMockContext.CALLER_SYSTEM_USER_UID);
1243
1244 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
1245 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_UID);
1246
1247 setUpPackageManagerForAdmin(admin2, ANOTHER_ADMIN_UID);
1248
1249
1250 // Set active admins to the users.
1251 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1252 dpm.setActiveAdmin(admin3, /* replace =*/ false);
1253
1254 dpm.setActiveAdmin(admin1, /* replace =*/ false, DpmMockContext.CALLER_USER_HANDLE);
1255 dpm.setActiveAdmin(admin2, /* replace =*/ false, DpmMockContext.CALLER_USER_HANDLE);
1256
1257 dpm.setActiveAdmin(admin2, /* replace =*/ false, ANOTHER_USER_ID);
1258
1259 // Set DO on the first non-system user.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001260 getServices().setUserRunning(DpmMockContext.CALLER_USER_HANDLE, true);
Makoto Onukia52562c2015-10-01 16:12:31 -07001261 assertTrue(dpm.setDeviceOwner(admin2, "owner-name", DpmMockContext.CALLER_USER_HANDLE));
1262
Makoto Onukic8a5a552015-11-19 14:29:12 -08001263 assertEquals(admin2, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false));
Makoto Onukia52562c2015-10-01 16:12:31 -07001264
1265 // Then check getDeviceOwnerAdminLocked().
1266 assertEquals(admin2, dpms.getDeviceOwnerAdminLocked().info.getComponent());
1267 assertEquals(DpmMockContext.CALLER_UID, dpms.getDeviceOwnerAdminLocked().getUid());
1268 }
1269
1270 /**
1271 * This essentially tests
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08001272 * {@code DevicePolicyManagerService.findOwnerComponentIfNecessaryLocked()}. (which is
1273 * private.)
Makoto Onukia52562c2015-10-01 16:12:31 -07001274 *
1275 * We didn't use to persist the DO component class name, but now we do, and the above method
1276 * finds the right component from a package name upon migration.
1277 */
1278 public void testDeviceOwnerMigration() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01001279 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
Makoto Onukia52562c2015-10-01 16:12:31 -07001280 checkDeviceOwnerWithMultipleDeviceAdmins();
1281
1282 // Overwrite the device owner setting and clears the clas name.
1283 dpms.mOwners.setDeviceOwner(
1284 new ComponentName(admin2.getPackageName(), ""),
1285 "owner-name", DpmMockContext.CALLER_USER_HANDLE);
1286 dpms.mOwners.writeDeviceOwner();
1287
1288 // Make sure the DO component name doesn't have a class name.
Makoto Onukic8a5a552015-11-19 14:29:12 -08001289 assertEquals("", dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false).getClassName());
Makoto Onukia52562c2015-10-01 16:12:31 -07001290
1291 // Then create a new DPMS to have it load the settings from files.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001292 when(getServices().userManager.getUserRestrictions(any(UserHandle.class)))
Makoto Onuki068c54a2015-10-13 14:34:03 -07001293 .thenReturn(new Bundle());
Makoto Onukia52562c2015-10-01 16:12:31 -07001294 initializeDpms();
1295
1296 // Now the DO component name is a full name.
1297 // *BUT* because both admin1 and admin2 belong to the same package, we think admin1 is the
1298 // DO.
Makoto Onukic8a5a552015-11-19 14:29:12 -08001299 assertEquals(admin1, dpms.getDeviceOwnerComponent(/* callingUserOnly =*/ false));
Makoto Onukia52562c2015-10-01 16:12:31 -07001300 }
1301
Makoto Onukib643fb02015-09-22 15:03:44 -07001302 public void testSetGetApplicationRestriction() {
1303 setAsProfileOwner(admin1);
Edman Anjosf9946772016-11-28 16:35:15 +01001304 mContext.packageName = admin1.getPackageName();
Makoto Onukib643fb02015-09-22 15:03:44 -07001305
1306 {
1307 Bundle rest = new Bundle();
1308 rest.putString("KEY_STRING", "Foo1");
1309 dpm.setApplicationRestrictions(admin1, "pkg1", rest);
1310 }
1311
1312 {
1313 Bundle rest = new Bundle();
1314 rest.putString("KEY_STRING", "Foo2");
1315 dpm.setApplicationRestrictions(admin1, "pkg2", rest);
1316 }
1317
1318 {
1319 Bundle returned = dpm.getApplicationRestrictions(admin1, "pkg1");
1320 assertNotNull(returned);
1321 assertEquals(returned.size(), 1);
1322 assertEquals(returned.get("KEY_STRING"), "Foo1");
1323 }
1324
1325 {
1326 Bundle returned = dpm.getApplicationRestrictions(admin1, "pkg2");
1327 assertNotNull(returned);
1328 assertEquals(returned.size(), 1);
1329 assertEquals(returned.get("KEY_STRING"), "Foo2");
1330 }
1331
1332 dpm.setApplicationRestrictions(admin1, "pkg2", new Bundle());
1333 assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg2").size());
1334 }
Makoto Onukia4f11972015-10-01 13:19:58 -07001335
Edman Anjosf9946772016-11-28 16:35:15 +01001336 /**
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01001337 * Setup a package in the package manager mock for {@link DpmMockContext#CALLER_USER_HANDLE}.
1338 * Useful for faking installed applications.
Edman Anjosf9946772016-11-28 16:35:15 +01001339 *
1340 * @param packageName the name of the package to be setup
1341 * @param appId the application ID to be given to the package
1342 * @return the UID of the package as known by the mock package manager
1343 */
1344 private int setupPackageInPackageManager(final String packageName, final int appId)
1345 throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01001346 return setupPackageInPackageManager(packageName, DpmMockContext.CALLER_USER_HANDLE, appId,
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01001347 ApplicationInfo.FLAG_HAS_CODE);
1348 }
1349
1350 /**
1351 * Setup a package in the package manager mock. Useful for faking installed applications.
1352 *
1353 * @param packageName the name of the package to be setup
1354 * @param userId the user id where the package will be "installed"
1355 * @param appId the application ID to be given to the package
1356 * @param flags flags to set in the ApplicationInfo for this package
1357 * @return the UID of the package as known by the mock package manager
1358 */
Pavel Grafov75c0a892017-05-18 17:28:27 +01001359 private int setupPackageInPackageManager(final String packageName, int userId, final int appId,
1360 int flags) throws Exception {
1361 final int uid = UserHandle.getUid(userId, appId);
1362 // Make the PackageManager return the package instead of throwing NameNotFoundException
Edman Anjosf9946772016-11-28 16:35:15 +01001363 final PackageInfo pi = new PackageInfo();
1364 pi.applicationInfo = new ApplicationInfo();
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01001365 pi.applicationInfo.flags = flags;
Pavel Grafov75c0a892017-05-18 17:28:27 +01001366 doReturn(pi).when(getServices().ipackageManager).getPackageInfo(
Edman Anjosf9946772016-11-28 16:35:15 +01001367 eq(packageName),
1368 anyInt(),
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01001369 eq(userId));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001370 doReturn(pi.applicationInfo).when(getServices().ipackageManager).getApplicationInfo(
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01001371 eq(packageName),
1372 anyInt(),
1373 eq(userId));
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08001374 doReturn(true).when(getServices().ipackageManager).isPackageAvailable(packageName, userId);
Edman Anjosf9946772016-11-28 16:35:15 +01001375 // Setup application UID with the PackageManager
Pavel Grafov75c0a892017-05-18 17:28:27 +01001376 doReturn(uid).when(getServices().packageManager).getPackageUidAsUser(
Edman Anjosf9946772016-11-28 16:35:15 +01001377 eq(packageName),
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01001378 eq(userId));
Edman Anjosf9946772016-11-28 16:35:15 +01001379 // Associate packageName to uid
Pavel Grafov75c0a892017-05-18 17:28:27 +01001380 doReturn(packageName).when(getServices().ipackageManager).getNameForUid(eq(uid));
Edman Anjosf9946772016-11-28 16:35:15 +01001381 doReturn(new String[]{packageName})
Pavel Grafov75c0a892017-05-18 17:28:27 +01001382 .when(getServices().ipackageManager).getPackagesForUid(eq(uid));
Edman Anjosf9946772016-11-28 16:35:15 +01001383 return uid;
1384 }
1385
Robin Lee7f5c91c2017-02-08 21:27:02 +00001386 public void testCertificateDisclosure() throws Exception {
1387 final int userId = DpmMockContext.CALLER_USER_HANDLE;
1388 final UserHandle user = UserHandle.of(userId);
1389
1390 mContext.applicationInfo = new ApplicationInfo();
1391 mContext.callerPermissions.add(permission.MANAGE_USERS);
1392 mContext.packageName = "com.android.frameworks.servicestests";
Pavel Grafov75c0a892017-05-18 17:28:27 +01001393 getServices().addPackageContext(user, mContext);
Robin Lee7f5c91c2017-02-08 21:27:02 +00001394 when(mContext.resources.getColor(anyInt(), anyObject())).thenReturn(Color.WHITE);
1395
Robin Leeabaa0692017-02-20 20:54:22 +00001396 StringParceledListSlice oneCert = asSlice(new String[] {"1"});
1397 StringParceledListSlice fourCerts = asSlice(new String[] {"1", "2", "3", "4"});
Robin Lee7f5c91c2017-02-08 21:27:02 +00001398
1399 final String TEST_STRING = "Test for exactly 2 certs out of 4";
1400 doReturn(TEST_STRING).when(mContext.resources).getQuantityText(anyInt(), eq(2));
1401
1402 // Given that we have exactly one certificate installed,
Pavel Grafov75c0a892017-05-18 17:28:27 +01001403 when(getServices().keyChainConnection.getService().getUserCaAliases()).thenReturn(oneCert);
Robin Lee7f5c91c2017-02-08 21:27:02 +00001404 // when that certificate is approved,
Robin Leeabaa0692017-02-20 20:54:22 +00001405 dpms.approveCaCert(oneCert.getList().get(0), userId, true);
Robin Lee7f5c91c2017-02-08 21:27:02 +00001406 // a notification should not be shown.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001407 verify(getServices().notificationManager, timeout(1000))
Robin Lee7f5c91c2017-02-08 21:27:02 +00001408 .cancelAsUser(anyString(), anyInt(), eq(user));
1409
1410 // Given that we have four certificates installed,
Pavel Grafov75c0a892017-05-18 17:28:27 +01001411 when(getServices().keyChainConnection.getService().getUserCaAliases()).thenReturn(fourCerts);
Robin Lee7f5c91c2017-02-08 21:27:02 +00001412 // when two of them are approved (one of them approved twice hence no action),
Robin Leeabaa0692017-02-20 20:54:22 +00001413 dpms.approveCaCert(fourCerts.getList().get(0), userId, true);
1414 dpms.approveCaCert(fourCerts.getList().get(1), userId, true);
Robin Lee7f5c91c2017-02-08 21:27:02 +00001415 // a notification should be shown saying that there are two certificates left to approve.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001416 verify(getServices().notificationManager, timeout(1000))
Robin Lee7f5c91c2017-02-08 21:27:02 +00001417 .notifyAsUser(anyString(), anyInt(), argThat(
1418 new BaseMatcher<Notification>() {
1419 @Override
1420 public boolean matches(Object item) {
1421 final Notification noti = (Notification) item;
1422 return TEST_STRING.equals(
1423 noti.extras.getString(Notification.EXTRA_TITLE));
1424 }
1425 @Override
1426 public void describeTo(Description description) {
1427 description.appendText(
1428 "Notification{title=\"" + TEST_STRING + "\"}");
1429 }
1430 }), eq(user));
1431 }
1432
Edman Anjosf9946772016-11-28 16:35:15 +01001433 /**
1434 * Simple test for delegate set/get and general delegation. Tests verifying that delegated
1435 * privileges can acually be exercised by a delegate are not covered here.
1436 */
1437 public void testDelegation() throws Exception {
1438 setAsProfileOwner(admin1);
1439
1440 final int userHandle = DpmMockContext.CALLER_USER_HANDLE;
1441
1442 // Given two packages
1443 final String CERT_DELEGATE = "com.delegate.certs";
1444 final String RESTRICTIONS_DELEGATE = "com.delegate.apprestrictions";
1445 final int CERT_DELEGATE_UID = setupPackageInPackageManager(CERT_DELEGATE, 20988);
1446 final int RESTRICTIONS_DELEGATE_UID = setupPackageInPackageManager(RESTRICTIONS_DELEGATE,
1447 20989);
1448
1449 // On delegation
1450 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1451 mContext.packageName = admin1.getPackageName();
1452 dpm.setCertInstallerPackage(admin1, CERT_DELEGATE);
1453 dpm.setApplicationRestrictionsManagingPackage(admin1, RESTRICTIONS_DELEGATE);
1454
1455 // DPMS correctly stores and retrieves the delegates
1456 DevicePolicyManagerService.DevicePolicyData policy = dpms.mUserData.get(userHandle);
1457 assertEquals(2, policy.mDelegationMap.size());
1458 MoreAsserts.assertContentsInAnyOrder(policy.mDelegationMap.get(CERT_DELEGATE),
1459 DELEGATION_CERT_INSTALL);
1460 MoreAsserts.assertContentsInAnyOrder(dpm.getDelegatedScopes(admin1, CERT_DELEGATE),
1461 DELEGATION_CERT_INSTALL);
1462 assertEquals(CERT_DELEGATE, dpm.getCertInstallerPackage(admin1));
1463 MoreAsserts.assertContentsInAnyOrder(policy.mDelegationMap.get(RESTRICTIONS_DELEGATE),
1464 DELEGATION_APP_RESTRICTIONS);
1465 MoreAsserts.assertContentsInAnyOrder(dpm.getDelegatedScopes(admin1, RESTRICTIONS_DELEGATE),
1466 DELEGATION_APP_RESTRICTIONS);
1467 assertEquals(RESTRICTIONS_DELEGATE, dpm.getApplicationRestrictionsManagingPackage(admin1));
1468
1469 // On calling install certificate APIs from an unauthorized process
1470 mContext.binder.callingUid = RESTRICTIONS_DELEGATE_UID;
1471 mContext.packageName = RESTRICTIONS_DELEGATE;
1472
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001473 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1474 () -> dpm.installCaCert(null, null));
Edman Anjosf9946772016-11-28 16:35:15 +01001475
1476 // On calling install certificate APIs from an authorized process
1477 mContext.binder.callingUid = CERT_DELEGATE_UID;
1478 mContext.packageName = CERT_DELEGATE;
1479
1480 // DPMS executes without a SecurityException
1481 try {
1482 dpm.installCaCert(null, null);
1483 } catch (SecurityException unexpected) {
1484 fail("Threw SecurityException on authorized access");
1485 } catch (NullPointerException expected) {
1486 }
1487
1488 // On removing a delegate
1489 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1490 mContext.packageName = admin1.getPackageName();
1491 dpm.setCertInstallerPackage(admin1, null);
1492
1493 // DPMS does not allow access to ex-delegate
1494 mContext.binder.callingUid = CERT_DELEGATE_UID;
1495 mContext.packageName = CERT_DELEGATE;
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001496 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
1497 () -> dpm.installCaCert(null, null));
Edman Anjosf9946772016-11-28 16:35:15 +01001498
1499 // But still allows access to other existing delegates
1500 mContext.binder.callingUid = RESTRICTIONS_DELEGATE_UID;
1501 mContext.packageName = RESTRICTIONS_DELEGATE;
1502 try {
1503 dpm.getApplicationRestrictions(null, "pkg");
1504 } catch (SecurityException expected) {
1505 fail("Threw SecurityException on authorized access");
1506 }
1507 }
1508
Esteban Talaverabf60f722015-12-10 16:26:44 +00001509 public void testApplicationRestrictionsManagingApp() throws Exception {
1510 setAsProfileOwner(admin1);
1511
Rubin Xued1928a2016-02-11 17:23:06 +00001512 final String nonExistAppRestrictionsManagerPackage = "com.google.app.restrictions.manager2";
Esteban Talaverabf60f722015-12-10 16:26:44 +00001513 final String appRestrictionsManagerPackage = "com.google.app.restrictions.manager";
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001514 final String nonDelegateExceptionMessageRegex =
1515 "Caller with uid \\d+ is not a delegate of scope delegation-app-restrictions.";
Esteban Talaverabf60f722015-12-10 16:26:44 +00001516 final int appRestrictionsManagerAppId = 20987;
Edman Anjosf9946772016-11-28 16:35:15 +01001517 final int appRestrictionsManagerUid = setupPackageInPackageManager(
1518 appRestrictionsManagerPackage, appRestrictionsManagerAppId);
Rubin Xued1928a2016-02-11 17:23:06 +00001519
Esteban Talaverabf60f722015-12-10 16:26:44 +00001520 // appRestrictionsManager package shouldn't be able to manage restrictions as the PO hasn't
1521 // delegated that permission yet.
Edman Anjosf9946772016-11-28 16:35:15 +01001522 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
1523 mContext.packageName = admin1.getPackageName();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001524 assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001525 final Bundle rest = new Bundle();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001526 rest.putString("KEY_STRING", "Foo1");
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001527 assertExpectException(SecurityException.class, nonDelegateExceptionMessageRegex,
1528 () -> dpm.setApplicationRestrictions(null, "pkg1", rest));
Esteban Talaverabf60f722015-12-10 16:26:44 +00001529
1530 // Check via the profile owner that no restrictions were set.
1531 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Edman Anjosf9946772016-11-28 16:35:15 +01001532 mContext.packageName = admin1.getPackageName();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001533 assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg1").size());
1534
Rubin Xued1928a2016-02-11 17:23:06 +00001535 // Check the API does not allow setting a non-existent package
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001536 assertExpectException(PackageManager.NameNotFoundException.class,
1537 /* messageRegex= */ nonExistAppRestrictionsManagerPackage,
1538 () -> dpm.setApplicationRestrictionsManagingPackage(
1539 admin1, nonExistAppRestrictionsManagerPackage));
Rubin Xued1928a2016-02-11 17:23:06 +00001540
Esteban Talaverabf60f722015-12-10 16:26:44 +00001541 // Let appRestrictionsManagerPackage manage app restrictions
1542 dpm.setApplicationRestrictionsManagingPackage(admin1, appRestrictionsManagerPackage);
1543 assertEquals(appRestrictionsManagerPackage,
1544 dpm.getApplicationRestrictionsManagingPackage(admin1));
1545
1546 // Now that package should be able to set and retrieve app restrictions.
1547 mContext.binder.callingUid = appRestrictionsManagerUid;
Edman Anjosf9946772016-11-28 16:35:15 +01001548 mContext.packageName = appRestrictionsManagerPackage;
Esteban Talaverabf60f722015-12-10 16:26:44 +00001549 assertTrue(dpm.isCallerApplicationRestrictionsManagingPackage());
1550 dpm.setApplicationRestrictions(null, "pkg1", rest);
1551 Bundle returned = dpm.getApplicationRestrictions(null, "pkg1");
1552 assertEquals(1, returned.size(), 1);
1553 assertEquals("Foo1", returned.get("KEY_STRING"));
1554
1555 // The same app running on a separate user shouldn't be able to manage app restrictions.
1556 mContext.binder.callingUid = UserHandle.getUid(
1557 UserHandle.USER_SYSTEM, appRestrictionsManagerAppId);
1558 assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001559 assertExpectException(SecurityException.class, nonDelegateExceptionMessageRegex,
1560 () -> dpm.setApplicationRestrictions(null, "pkg1", rest));
Esteban Talaverabf60f722015-12-10 16:26:44 +00001561
1562 // The DPM is still able to manage app restrictions, even if it allowed another app to do it
1563 // too.
1564 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Edman Anjosf9946772016-11-28 16:35:15 +01001565 mContext.packageName = admin1.getPackageName();
Esteban Talaverabf60f722015-12-10 16:26:44 +00001566 assertEquals(returned, dpm.getApplicationRestrictions(admin1, "pkg1"));
1567 dpm.setApplicationRestrictions(admin1, "pkg1", null);
1568 assertEquals(0, dpm.getApplicationRestrictions(admin1, "pkg1").size());
1569
1570 // Removing the ability for the package to manage app restrictions.
1571 dpm.setApplicationRestrictionsManagingPackage(admin1, null);
1572 assertNull(dpm.getApplicationRestrictionsManagingPackage(admin1));
1573 mContext.binder.callingUid = appRestrictionsManagerUid;
Edman Anjosf9946772016-11-28 16:35:15 +01001574 mContext.packageName = appRestrictionsManagerPackage;
Esteban Talaverabf60f722015-12-10 16:26:44 +00001575 assertFalse(dpm.isCallerApplicationRestrictionsManagingPackage());
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001576 assertExpectException(SecurityException.class, nonDelegateExceptionMessageRegex,
1577 () -> dpm.setApplicationRestrictions(null, "pkg1", null));
Esteban Talaverabf60f722015-12-10 16:26:44 +00001578 }
1579
Makoto Onukia4f11972015-10-01 13:19:58 -07001580 public void testSetUserRestriction_asDo() throws Exception {
1581 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
Makoto Onukic8a5a552015-11-19 14:29:12 -08001582 mContext.callerPermissions.add(permission.MANAGE_USERS);
Makoto Onukia4f11972015-10-01 13:19:58 -07001583 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1584 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1585
1586 // First, set DO.
1587
1588 // Call from a process on the system user.
1589 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1590
1591 // Make sure admin1 is installed on system user.
1592 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
Makoto Onukia4f11972015-10-01 13:19:58 -07001593
1594 // Call.
1595 dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM);
Makoto Onukia52562c2015-10-01 16:12:31 -07001596 assertTrue(dpm.setDeviceOwner(admin1, "owner-name",
Makoto Onukia4f11972015-10-01 13:19:58 -07001597 UserHandle.USER_SYSTEM));
1598
Esteban Talavera6c9116a2016-11-24 16:12:44 +00001599 // Check that the user restrictions that are enabled by default are set. Then unset them.
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001600 final String[] defaultRestrictions = UserRestrictionsUtils
Esteban Talavera548a04b2016-12-20 15:22:30 +00001601 .getDefaultEnabledForDeviceOwner().toArray(new String[0]);
Esteban Talavera6c9116a2016-11-24 16:12:44 +00001602 DpmTestUtils.assertRestrictions(
1603 DpmTestUtils.newRestrictions(defaultRestrictions),
1604 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1605 );
1606 DpmTestUtils.assertRestrictions(
1607 DpmTestUtils.newRestrictions(defaultRestrictions),
1608 dpm.getUserRestrictions(admin1)
1609 );
Pavel Grafov75c0a892017-05-18 17:28:27 +01001610 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Esteban Talavera548a04b2016-12-20 15:22:30 +00001611 eq(UserHandle.USER_SYSTEM),
Nicolas Prevot2ea46fe2017-01-05 10:29:34 +00001612 MockUtils.checkUserRestrictions(defaultRestrictions),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001613 eq(true) /* isDeviceOwner */,
1614 eq(CAMERA_NOT_DISABLED)
Esteban Talavera548a04b2016-12-20 15:22:30 +00001615 );
Pavel Grafov75c0a892017-05-18 17:28:27 +01001616 reset(getServices().userManagerInternal);
Esteban Talavera6c9116a2016-11-24 16:12:44 +00001617
1618 for (String restriction : defaultRestrictions) {
1619 dpm.clearUserRestriction(admin1, restriction);
1620 }
1621
Esteban Talavera548a04b2016-12-20 15:22:30 +00001622 assertNoDeviceOwnerRestrictions();
Pavel Grafov75c0a892017-05-18 17:28:27 +01001623 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001624
1625 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001626 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001627 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001628 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
1629 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001630 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001631
Makoto Onukia4f11972015-10-01 13:19:58 -07001632 dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001633 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001634 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001635 MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS,
1636 UserManager.DISALLOW_ADD_USER),
1637 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001638 reset(getServices().userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001639
Makoto Onuki068c54a2015-10-13 14:34:03 -07001640 DpmTestUtils.assertRestrictions(
1641 DpmTestUtils.newRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001642 UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_OUTGOING_CALLS),
Makoto Onuki068c54a2015-10-13 14:34:03 -07001643 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1644 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001645 DpmTestUtils.assertRestrictions(
1646 DpmTestUtils.newRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001647 UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_OUTGOING_CALLS),
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001648 dpm.getUserRestrictions(admin1)
1649 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001650
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001651 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001652 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001653 eq(UserHandle.USER_SYSTEM),
1654 MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001655 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001656 reset(getServices().userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001657
Makoto Onuki068c54a2015-10-13 14:34:03 -07001658 DpmTestUtils.assertRestrictions(
1659 DpmTestUtils.newRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
1660 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1661 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001662 DpmTestUtils.assertRestrictions(
1663 DpmTestUtils.newRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
1664 dpm.getUserRestrictions(admin1)
1665 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001666
1667 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001668 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001669 eq(UserHandle.USER_SYSTEM),
1670 MockUtils.checkUserRestrictions(),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001671 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001672 reset(getServices().userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001673
Esteban Talavera548a04b2016-12-20 15:22:30 +00001674 assertNoDeviceOwnerRestrictions();
Makoto Onukia4f11972015-10-01 13:19:58 -07001675
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001676 // DISALLOW_ADJUST_VOLUME and DISALLOW_UNMUTE_MICROPHONE are PO restrictions, but when
1677 // DO sets them, the scope is global.
1678 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001679 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001680 dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001681 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001682 eq(UserHandle.USER_SYSTEM),
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001683 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001684 UserManager.DISALLOW_UNMUTE_MICROPHONE),
1685 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001686 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001687
1688 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
1689 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001690 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001691
1692 // More tests.
1693 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001694 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001695 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001696 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER),
1697 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001698 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001699
1700 dpm.addUserRestriction(admin1, UserManager.DISALLOW_FUN);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001701 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001702 eq(UserHandle.USER_SYSTEM),
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001703 MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001704 UserManager.DISALLOW_ADD_USER),
1705 eq(true), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001706 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001707
1708 dpm.setCameraDisabled(admin1, true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001709 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001710 eq(UserHandle.USER_SYSTEM),
1711 // DISALLOW_CAMERA will be applied to both local and global.
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001712 MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001713 UserManager.DISALLOW_ADD_USER),
1714 eq(true), eq(CAMERA_DISABLED_GLOBALLY));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001715 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001716
1717 // Set up another DA and let it disable camera. Now DISALLOW_CAMERA will only be applied
1718 // locally.
1719 dpm.setCameraDisabled(admin1, false);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001720 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001721
1722 setUpPackageManagerForAdmin(admin2, DpmMockContext.CALLER_SYSTEM_USER_UID);
1723 dpm.setActiveAdmin(admin2, /* replace =*/ false, UserHandle.USER_SYSTEM);
1724 dpm.setCameraDisabled(admin2, true);
1725
Pavel Grafov75c0a892017-05-18 17:28:27 +01001726 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001727 eq(UserHandle.USER_SYSTEM),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001728 // DISALLOW_CAMERA will be applied to both local and global. <- TODO: fix this
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001729 MockUtils.checkUserRestrictions(UserManager.DISALLOW_FUN,
Pavel Grafov6a40f092016-10-25 15:46:51 +01001730 UserManager.DISALLOW_ADD_USER),
1731 eq(true), eq(CAMERA_DISABLED_LOCALLY));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001732 reset(getServices().userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001733 // TODO Make sure restrictions are written to the file.
1734 }
1735
1736 public void testSetUserRestriction_asPo() {
1737 setAsProfileOwner(admin1);
1738
Makoto Onuki068c54a2015-10-13 14:34:03 -07001739 DpmTestUtils.assertRestrictions(
1740 DpmTestUtils.newRestrictions(),
1741 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1742 .ensureUserRestrictions()
1743 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001744
1745 dpm.addUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001746 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001747 eq(DpmMockContext.CALLER_USER_HANDLE),
1748 MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001749 eq(false), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001750 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001751
Makoto Onukia4f11972015-10-01 13:19:58 -07001752 dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001753 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001754 eq(DpmMockContext.CALLER_USER_HANDLE),
1755 MockUtils.checkUserRestrictions(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
1756 UserManager.DISALLOW_OUTGOING_CALLS),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001757 eq(false), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001758 reset(getServices().userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001759
Makoto Onuki068c54a2015-10-13 14:34:03 -07001760 DpmTestUtils.assertRestrictions(
1761 DpmTestUtils.newRestrictions(
1762 UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
1763 UserManager.DISALLOW_OUTGOING_CALLS
1764 ),
1765 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1766 .ensureUserRestrictions()
1767 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001768 DpmTestUtils.assertRestrictions(
1769 DpmTestUtils.newRestrictions(
1770 UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
1771 UserManager.DISALLOW_OUTGOING_CALLS
1772 ),
1773 dpm.getUserRestrictions(admin1)
1774 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001775
1776 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001777 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001778 eq(DpmMockContext.CALLER_USER_HANDLE),
1779 MockUtils.checkUserRestrictions(UserManager.DISALLOW_OUTGOING_CALLS),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001780 eq(false), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001781 reset(getServices().userManagerInternal);
Makoto Onuki068c54a2015-10-13 14:34:03 -07001782
1783 DpmTestUtils.assertRestrictions(
1784 DpmTestUtils.newRestrictions(
1785 UserManager.DISALLOW_OUTGOING_CALLS
1786 ),
1787 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1788 .ensureUserRestrictions()
1789 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001790 DpmTestUtils.assertRestrictions(
1791 DpmTestUtils.newRestrictions(
1792 UserManager.DISALLOW_OUTGOING_CALLS
1793 ),
1794 dpm.getUserRestrictions(admin1)
1795 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001796
1797 dpm.clearUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001798 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001799 eq(DpmMockContext.CALLER_USER_HANDLE),
1800 MockUtils.checkUserRestrictions(),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001801 eq(false), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001802 reset(getServices().userManagerInternal);
Makoto Onukia4f11972015-10-01 13:19:58 -07001803
Makoto Onuki068c54a2015-10-13 14:34:03 -07001804 DpmTestUtils.assertRestrictions(
1805 DpmTestUtils.newRestrictions(),
1806 dpms.getProfileOwnerAdminLocked(DpmMockContext.CALLER_USER_HANDLE)
1807 .ensureUserRestrictions()
1808 );
Makoto Onuki3a3092f2015-10-30 11:07:51 -07001809 DpmTestUtils.assertRestrictions(
1810 DpmTestUtils.newRestrictions(),
1811 dpm.getUserRestrictions(admin1)
1812 );
Makoto Onukia4f11972015-10-01 13:19:58 -07001813
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001814 // DISALLOW_ADJUST_VOLUME and DISALLOW_UNMUTE_MICROPHONE can be set by PO too, even
1815 // though when DO sets them they'll be applied globally.
1816 dpm.addUserRestriction(admin1, UserManager.DISALLOW_ADJUST_VOLUME);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001817 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001818 dpm.addUserRestriction(admin1, UserManager.DISALLOW_UNMUTE_MICROPHONE);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001819 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001820 eq(DpmMockContext.CALLER_USER_HANDLE),
1821 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
1822 UserManager.DISALLOW_UNMUTE_MICROPHONE),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001823 eq(false), eq(CAMERA_NOT_DISABLED));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001824 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001825
1826 dpm.setCameraDisabled(admin1, true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01001827 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001828 eq(DpmMockContext.CALLER_USER_HANDLE),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001829 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADJUST_VOLUME,
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001830 UserManager.DISALLOW_UNMUTE_MICROPHONE),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001831 eq(false), eq(CAMERA_DISABLED_LOCALLY));
Pavel Grafov75c0a892017-05-18 17:28:27 +01001832 reset(getServices().userManagerInternal);
Makoto Onuki1a2cd742015-11-16 13:51:27 -08001833
Makoto Onukia4f11972015-10-01 13:19:58 -07001834 // TODO Make sure restrictions are written to the file.
1835 }
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001836
Esteban Talavera548a04b2016-12-20 15:22:30 +00001837
1838 public void testDefaultEnabledUserRestrictions() throws Exception {
1839 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1840 mContext.callerPermissions.add(permission.MANAGE_USERS);
1841 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1842 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1843
1844 // First, set DO.
1845
1846 // Call from a process on the system user.
1847 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1848
1849 // Make sure admin1 is installed on system user.
1850 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1851
1852 dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM);
1853 assertTrue(dpm.setDeviceOwner(admin1, "owner-name",
1854 UserHandle.USER_SYSTEM));
1855
1856 // Check that the user restrictions that are enabled by default are set. Then unset them.
1857 String[] defaultRestrictions = UserRestrictionsUtils
1858 .getDefaultEnabledForDeviceOwner().toArray(new String[0]);
1859 assertTrue(defaultRestrictions.length > 0);
1860 DpmTestUtils.assertRestrictions(
1861 DpmTestUtils.newRestrictions(defaultRestrictions),
1862 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1863 );
1864 DpmTestUtils.assertRestrictions(
1865 DpmTestUtils.newRestrictions(defaultRestrictions),
1866 dpm.getUserRestrictions(admin1)
1867 );
Pavel Grafov75c0a892017-05-18 17:28:27 +01001868 verify(getServices().userManagerInternal).setDevicePolicyUserRestrictions(
Esteban Talavera548a04b2016-12-20 15:22:30 +00001869 eq(UserHandle.USER_SYSTEM),
Nicolas Prevot2ea46fe2017-01-05 10:29:34 +00001870 MockUtils.checkUserRestrictions(defaultRestrictions),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001871 eq(true) /* isDeviceOwner */,
1872 eq(CAMERA_NOT_DISABLED)
Esteban Talavera548a04b2016-12-20 15:22:30 +00001873 );
Pavel Grafov75c0a892017-05-18 17:28:27 +01001874 reset(getServices().userManagerInternal);
Esteban Talavera548a04b2016-12-20 15:22:30 +00001875
1876 for (String restriction : defaultRestrictions) {
1877 dpm.clearUserRestriction(admin1, restriction);
1878 }
1879
1880 assertNoDeviceOwnerRestrictions();
1881
1882 // Initialize DPMS again and check that the user restriction wasn't enabled again.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001883 reset(getServices().userManagerInternal);
Esteban Talavera548a04b2016-12-20 15:22:30 +00001884 initializeDpms();
1885 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1886 assertNotNull(dpms.getDeviceOwnerAdminLocked());
1887
1888 assertNoDeviceOwnerRestrictions();
1889
1890 // Add a new restriction to the default set, initialize DPMS, and check that the restriction
1891 // is set as it wasn't enabled during setDeviceOwner.
1892 final String newDefaultEnabledRestriction = UserManager.DISALLOW_REMOVE_MANAGED_PROFILE;
1893 assertFalse(UserRestrictionsUtils
1894 .getDefaultEnabledForDeviceOwner().contains(newDefaultEnabledRestriction));
1895 UserRestrictionsUtils
1896 .getDefaultEnabledForDeviceOwner().add(newDefaultEnabledRestriction);
1897 try {
Pavel Grafov75c0a892017-05-18 17:28:27 +01001898 reset(getServices().userManagerInternal);
Esteban Talavera548a04b2016-12-20 15:22:30 +00001899 initializeDpms();
1900 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1901 assertNotNull(dpms.getDeviceOwnerAdminLocked());
1902
1903 DpmTestUtils.assertRestrictions(
1904 DpmTestUtils.newRestrictions(newDefaultEnabledRestriction),
1905 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1906 );
1907 DpmTestUtils.assertRestrictions(
1908 DpmTestUtils.newRestrictions(newDefaultEnabledRestriction),
1909 dpm.getUserRestrictions(admin1)
1910 );
Pavel Grafov75c0a892017-05-18 17:28:27 +01001911 verify(getServices().userManagerInternal, atLeast(1)).setDevicePolicyUserRestrictions(
Esteban Talavera548a04b2016-12-20 15:22:30 +00001912 eq(UserHandle.USER_SYSTEM),
Nicolas Prevot2ea46fe2017-01-05 10:29:34 +00001913 MockUtils.checkUserRestrictions(newDefaultEnabledRestriction),
Pavel Grafov6a40f092016-10-25 15:46:51 +01001914 eq(true) /* isDeviceOwner */,
1915 eq(CAMERA_NOT_DISABLED)
Esteban Talavera548a04b2016-12-20 15:22:30 +00001916 );
Pavel Grafov75c0a892017-05-18 17:28:27 +01001917 reset(getServices().userManagerInternal);
Esteban Talavera548a04b2016-12-20 15:22:30 +00001918
1919 // Remove the restriction.
1920 dpm.clearUserRestriction(admin1, newDefaultEnabledRestriction);
1921
1922 // Initialize DPMS again. The restriction shouldn't be enabled for a second time.
1923 initializeDpms();
1924 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
1925 assertNotNull(dpms.getDeviceOwnerAdminLocked());
1926 assertNoDeviceOwnerRestrictions();
1927 } finally {
1928 UserRestrictionsUtils
1929 .getDefaultEnabledForDeviceOwner().remove(newDefaultEnabledRestriction);
1930 }
1931 }
1932
1933 private void assertNoDeviceOwnerRestrictions() {
1934 DpmTestUtils.assertRestrictions(
1935 DpmTestUtils.newRestrictions(),
1936 dpms.getDeviceOwnerAdminLocked().ensureUserRestrictions()
1937 );
1938 DpmTestUtils.assertRestrictions(
1939 DpmTestUtils.newRestrictions(),
1940 dpm.getUserRestrictions(admin1)
1941 );
1942 }
1943
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001944 public void testGetMacAddress() throws Exception {
1945 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1946 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1947 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
1948
1949 // In this test, change the caller user to "system".
1950 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1951
1952 // Make sure admin1 is installed on system user.
1953 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
1954
1955 // Test 1. Caller doesn't have DO or DA.
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001956 assertExpectException(SecurityException.class, /* messageRegex= */ "No active admin",
1957 () -> dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001958
1959 // DO needs to be an DA.
1960 dpm.setActiveAdmin(admin1, /* replace =*/ false);
1961 assertTrue(dpm.isAdminActive(admin1));
1962
1963 // Test 2. Caller has DA, but not DO.
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001964 assertExpectException(SecurityException.class, /* messageRegex= */ NOT_DEVICE_OWNER_MSG,
1965 () -> dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001966
1967 // Test 3. Caller has PO, but not DO.
1968 assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
Pavel Grafova1ea8d92017-05-25 21:55:24 +01001969 assertExpectException(SecurityException.class, /* messageRegex= */ NOT_DEVICE_OWNER_MSG,
1970 () -> dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001971
1972 // Remove PO.
1973 dpm.clearProfileOwner(admin1);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07001974 dpm.setActiveAdmin(admin1, false);
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001975 // Test 4, Caller is DO now.
1976 assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
1977
1978 // 4-1. But no WifiInfo.
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001979 assertNull(dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001980
1981 // 4-2. Returns WifiInfo, but with the default MAC.
Pavel Grafov75c0a892017-05-18 17:28:27 +01001982 when(getServices().wifiManager.getConnectionInfo()).thenReturn(new WifiInfo());
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001983 assertNull(dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001984
1985 // 4-3. With a real MAC address.
1986 final WifiInfo wi = new WifiInfo();
1987 wi.setMacAddress("11:22:33:44:55:66");
Pavel Grafov75c0a892017-05-18 17:28:27 +01001988 when(getServices().wifiManager.getConnectionInfo()).thenReturn(wi);
Sudheer Shanka3cb4da12016-03-07 18:51:49 -08001989 assertEquals("11:22:33:44:55:66", dpm.getWifiMacAddress(admin1));
Makoto Onukia31ebbc2015-11-23 17:15:21 -08001990 }
Mahaver Chopraf8373b52015-12-23 14:42:18 +00001991
Mahaver Chopra1216ae52016-03-11 15:39:48 +00001992 public void testReboot() throws Exception {
Mahaver Chopraf8373b52015-12-23 14:42:18 +00001993 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
1994 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
1995
1996 // In this test, change the caller user to "system".
1997 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
1998
1999 // Make sure admin1 is installed on system user.
2000 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
2001
2002 // Set admin1 as DA.
2003 dpm.setActiveAdmin(admin1, false);
2004 assertTrue(dpm.isAdminActive(admin1));
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002005 assertExpectException(SecurityException.class, /* messageRegex= */ NOT_DEVICE_OWNER_MSG,
2006 () -> dpm.reboot(admin1));
Mahaver Chopraf8373b52015-12-23 14:42:18 +00002007
2008 // Set admin1 as PO.
2009 assertTrue(dpm.setProfileOwner(admin1, null, UserHandle.USER_SYSTEM));
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002010 assertExpectException(SecurityException.class, /* messageRegex= */ NOT_DEVICE_OWNER_MSG,
2011 () -> dpm.reboot(admin1));
Mahaver Chopraf8373b52015-12-23 14:42:18 +00002012
2013 // Remove PO and add DO.
2014 dpm.clearProfileOwner(admin1);
Suprabh Shukla3cb2b492016-08-09 17:20:57 -07002015 dpm.setActiveAdmin(admin1, false);
Mahaver Chopraf8373b52015-12-23 14:42:18 +00002016 assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
2017
Mahaver Chopra1216ae52016-03-11 15:39:48 +00002018 // admin1 is DO.
2019 // Set current call state of device to ringing.
Pavel Grafov75c0a892017-05-18 17:28:27 +01002020 when(getServices().telephonyManager.getCallState())
Mahaver Chopra1216ae52016-03-11 15:39:48 +00002021 .thenReturn(TelephonyManager.CALL_STATE_RINGING);
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002022 assertExpectException(IllegalStateException.class, /* messageRegex= */ ONGOING_CALL_MSG,
2023 () -> dpm.reboot(admin1));
Mahaver Chopra1216ae52016-03-11 15:39:48 +00002024
2025 // Set current call state of device to dialing/active.
Pavel Grafov75c0a892017-05-18 17:28:27 +01002026 when(getServices().telephonyManager.getCallState())
Mahaver Chopra1216ae52016-03-11 15:39:48 +00002027 .thenReturn(TelephonyManager.CALL_STATE_OFFHOOK);
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002028 assertExpectException(IllegalStateException.class, /* messageRegex= */ ONGOING_CALL_MSG,
2029 () -> dpm.reboot(admin1));
Mahaver Chopra1216ae52016-03-11 15:39:48 +00002030
2031 // Set current call state of device to idle.
Pavel Grafov75c0a892017-05-18 17:28:27 +01002032 when(getServices().telephonyManager.getCallState()).thenReturn(TelephonyManager.CALL_STATE_IDLE);
Mahaver Chopraf8373b52015-12-23 14:42:18 +00002033 dpm.reboot(admin1);
2034 }
Kenny Guy06de4e72015-12-22 12:07:39 +00002035
2036 public void testSetGetSupportText() {
2037 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
2038 dpm.setActiveAdmin(admin1, true);
2039 dpm.setActiveAdmin(admin2, true);
2040 mContext.callerPermissions.remove(permission.MANAGE_DEVICE_ADMINS);
2041
2042 // Null default support messages.
2043 {
2044 assertNull(dpm.getLongSupportMessage(admin1));
2045 assertNull(dpm.getShortSupportMessage(admin1));
2046 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
2047 assertNull(dpm.getShortSupportMessageForUser(admin1,
2048 DpmMockContext.CALLER_USER_HANDLE));
2049 assertNull(dpm.getLongSupportMessageForUser(admin1,
2050 DpmMockContext.CALLER_USER_HANDLE));
2051 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
2052 }
2053
2054 // Only system can call the per user versions.
2055 {
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002056 assertExpectException(SecurityException.class, /* messageRegex= */ "message for user",
2057 () -> dpm.getShortSupportMessageForUser(admin1,
2058 DpmMockContext.CALLER_USER_HANDLE));
2059 assertExpectException(SecurityException.class, /* messageRegex= */ "message for user",
2060 () -> dpm.getLongSupportMessageForUser(admin1,
2061 DpmMockContext.CALLER_USER_HANDLE));
Kenny Guy06de4e72015-12-22 12:07:39 +00002062 }
2063
2064 // Can't set message for admin in another uid.
2065 {
2066 mContext.binder.callingUid = DpmMockContext.CALLER_UID + 1;
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002067 assertExpectException(SecurityException.class,
2068 /* messageRegex= */ "is not owned by uid",
2069 () -> dpm.setShortSupportMessage(admin1, "Some text"));
Kenny Guy06de4e72015-12-22 12:07:39 +00002070 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2071 }
2072
2073 // Set/Get short returns what it sets and other admins text isn't changed.
2074 {
2075 final String supportText = "Some text to test with.";
2076 dpm.setShortSupportMessage(admin1, supportText);
2077 assertEquals(supportText, dpm.getShortSupportMessage(admin1));
2078 assertNull(dpm.getLongSupportMessage(admin1));
2079 assertNull(dpm.getShortSupportMessage(admin2));
2080
2081 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
2082 assertEquals(supportText, dpm.getShortSupportMessageForUser(admin1,
2083 DpmMockContext.CALLER_USER_HANDLE));
2084 assertNull(dpm.getShortSupportMessageForUser(admin2,
2085 DpmMockContext.CALLER_USER_HANDLE));
2086 assertNull(dpm.getLongSupportMessageForUser(admin1,
2087 DpmMockContext.CALLER_USER_HANDLE));
2088 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
2089
2090 dpm.setShortSupportMessage(admin1, null);
2091 assertNull(dpm.getShortSupportMessage(admin1));
2092 }
2093
2094 // Set/Get long returns what it sets and other admins text isn't changed.
2095 {
2096 final String supportText = "Some text to test with.\nWith more text.";
2097 dpm.setLongSupportMessage(admin1, supportText);
2098 assertEquals(supportText, dpm.getLongSupportMessage(admin1));
2099 assertNull(dpm.getShortSupportMessage(admin1));
2100 assertNull(dpm.getLongSupportMessage(admin2));
2101
2102 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
2103 assertEquals(supportText, dpm.getLongSupportMessageForUser(admin1,
2104 DpmMockContext.CALLER_USER_HANDLE));
2105 assertNull(dpm.getLongSupportMessageForUser(admin2,
2106 DpmMockContext.CALLER_USER_HANDLE));
2107 assertNull(dpm.getShortSupportMessageForUser(admin1,
2108 DpmMockContext.CALLER_USER_HANDLE));
2109 mMockContext.binder.callingUid = DpmMockContext.CALLER_UID;
2110
2111 dpm.setLongSupportMessage(admin1, null);
2112 assertNull(dpm.getLongSupportMessage(admin1));
2113 }
2114 }
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002115
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002116 public void testSetGetMeteredDataDisabledPackages() throws Exception {
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002117 setAsProfileOwner(admin1);
2118
2119 final ArrayList<String> emptyList = new ArrayList<>();
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002120 assertEquals(emptyList, dpm.getMeteredDataDisabledPackages(admin1));
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002121
2122 // Setup
2123 final ArrayList<String> pkgsToRestrict = new ArrayList<>();
2124 final String package1 = "com.example.one";
2125 final String package2 = "com.example.two";
2126 pkgsToRestrict.add(package1);
2127 pkgsToRestrict.add(package2);
2128 setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0);
2129 setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0);
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002130 List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002131
2132 // Verify
2133 assertEquals(emptyList, excludedPkgs);
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002134 assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1));
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002135 verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
2136 MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
2137 eq(DpmMockContext.CALLER_USER_HANDLE));
2138
2139 // Setup
2140 pkgsToRestrict.remove(package1);
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002141 excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002142
2143 // Verify
2144 assertEquals(emptyList, excludedPkgs);
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002145 assertEquals(pkgsToRestrict, dpm.getMeteredDataDisabledPackages(admin1));
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002146 verify(getServices().networkPolicyManagerInternal).setMeteredRestrictedPackages(
2147 MockUtils.checkApps(pkgsToRestrict.toArray(new String[0])),
2148 eq(DpmMockContext.CALLER_USER_HANDLE));
2149 }
2150
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002151 public void testSetGetMeteredDataDisabledPackages_deviceAdmin() {
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002152 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
2153 dpm.setActiveAdmin(admin1, true);
2154 assertTrue(dpm.isAdminActive(admin1));
2155 mContext.callerPermissions.remove(permission.MANAGE_DEVICE_ADMINS);
2156
2157 assertExpectException(SecurityException.class, /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002158 () -> dpm.setMeteredDataDisabledPackages(admin1, new ArrayList<>()));
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002159 assertExpectException(SecurityException.class, /* messageRegex= */ NOT_PROFILE_OWNER_MSG,
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002160 () -> dpm.getMeteredDataDisabledPackages(admin1));
Sudheer Shanka04d61ae2018-01-17 12:16:57 -08002161 }
2162
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002163 public void testIsMeteredDataDisabledForUserPackage() throws Exception {
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002164 setAsProfileOwner(admin1);
2165
2166 // Setup
2167 final ArrayList<String> emptyList = new ArrayList<>();
2168 final ArrayList<String> pkgsToRestrict = new ArrayList<>();
2169 final String package1 = "com.example.one";
2170 final String package2 = "com.example.two";
2171 final String package3 = "com.example.three";
2172 pkgsToRestrict.add(package1);
2173 pkgsToRestrict.add(package2);
2174 setupPackageInPackageManager(package1, DpmMockContext.CALLER_USER_HANDLE, 123, 0);
2175 setupPackageInPackageManager(package2, DpmMockContext.CALLER_USER_HANDLE, 456, 0);
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002176 List<String> excludedPkgs = dpm.setMeteredDataDisabledPackages(admin1, pkgsToRestrict);
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002177
2178 // Verify
2179 assertEquals(emptyList, excludedPkgs);
2180 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
2181 assertTrue(package1 + "should be restricted",
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002182 dpm.isMeteredDataDisabledPackageForUser(admin1, package1,
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002183 DpmMockContext.CALLER_USER_HANDLE));
2184 assertTrue(package2 + "should be restricted",
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002185 dpm.isMeteredDataDisabledPackageForUser(admin1, package2,
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002186 DpmMockContext.CALLER_USER_HANDLE));
2187 assertFalse(package3 + "should not be restricted",
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002188 dpm.isMeteredDataDisabledPackageForUser(admin1, package3,
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002189 DpmMockContext.CALLER_USER_HANDLE));
2190 }
2191
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002192 public void testIsMeteredDataDisabledForUserPackage_nonSystemUidCaller() throws Exception {
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002193 setAsProfileOwner(admin1);
2194 assertExpectException(SecurityException.class,
2195 /* messageRegex= */ "Only the system can query restricted pkgs",
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002196 () -> dpm.isMeteredDataDisabledPackageForUser(
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002197 admin1, "com.example.one", DpmMockContext.CALLER_USER_HANDLE));
2198 dpm.clearProfileOwner(admin1);
2199
2200 setDeviceOwner();
2201 assertExpectException(SecurityException.class,
2202 /* messageRegex= */ "Only the system can query restricted pkgs",
Michael Wachenschwanz54164682018-03-08 16:23:52 -08002203 () -> dpm.isMeteredDataDisabledPackageForUser(
Sudheer Shanka5be44ff2018-01-23 15:15:03 -08002204 admin1, "com.example.one", DpmMockContext.CALLER_USER_HANDLE));
2205 clearDeviceOwner();
2206 }
2207
phweiss73145f42017-01-17 19:06:38 +01002208 public void testCreateAdminSupportIntent() throws Exception {
2209 // Setup device owner.
2210 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2211 setupDeviceOwner();
2212
2213 // Nonexisting permission returns null
2214 Intent intent = dpm.createAdminSupportIntent("disallow_nothing");
2215 assertNull(intent);
2216
2217 // Existing permission that is not set returns null
2218 intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
2219 assertNull(intent);
2220
2221 // Existing permission that is not set by device/profile owner returns null
Pavel Grafov75c0a892017-05-18 17:28:27 +01002222 when(getServices().userManager.hasUserRestriction(
phweiss73145f42017-01-17 19:06:38 +01002223 eq(UserManager.DISALLOW_ADJUST_VOLUME),
2224 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2225 .thenReturn(true);
2226 intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
2227 assertNull(intent);
2228
2229 // Permission that is set by device owner returns correct intent
Pavel Grafov75c0a892017-05-18 17:28:27 +01002230 when(getServices().userManager.getUserRestrictionSource(
phweiss73145f42017-01-17 19:06:38 +01002231 eq(UserManager.DISALLOW_ADJUST_VOLUME),
2232 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2233 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
2234 intent = dpm.createAdminSupportIntent(UserManager.DISALLOW_ADJUST_VOLUME);
2235 assertNotNull(intent);
2236 assertEquals(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS, intent.getAction());
2237 assertEquals(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID),
2238 intent.getIntExtra(Intent.EXTRA_USER_ID, -1));
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002239 assertEquals(admin1, intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN));
phweiss73145f42017-01-17 19:06:38 +01002240 assertEquals(UserManager.DISALLOW_ADJUST_VOLUME,
2241 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2242
Lenka Trochtova16a91c02018-01-17 11:03:30 +01002243 // Try with POLICY_DISABLE_CAMERA, POLICY_DISABLE_SCREEN_CAPTURE and
2244 // POLICY_MANDATORY_BACKUPS, which are not user restrictions
phweiss73145f42017-01-17 19:06:38 +01002245
2246 // Camera is not disabled
2247 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
2248 assertNull(intent);
2249
2250 // Camera is disabled
2251 dpm.setCameraDisabled(admin1, true);
2252 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
2253 assertNotNull(intent);
2254 assertEquals(DevicePolicyManager.POLICY_DISABLE_CAMERA,
2255 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2256
2257 // Screen capture is not disabled
2258 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
2259 assertNull(intent);
2260
2261 // Screen capture is disabled
2262 dpm.setScreenCaptureDisabled(admin1, true);
2263 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
2264 assertNotNull(intent);
2265 assertEquals(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE,
2266 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2267
Lenka Trochtova56681f72018-03-09 15:47:50 +01002268 // Make the backup transport selection succeed
2269 doAnswer(new Answer<Void>() {
2270 @Override
2271 public Void answer(InvocationOnMock invocation) throws Throwable {
2272 ISelectBackupTransportCallback callback =
2273 (ISelectBackupTransportCallback) invocation.getArguments()[1];
2274 if (callback != null) {
2275 callback.onSuccess("");
2276 }
2277 return null;
2278 }
2279 }).when(getServices().ibackupManager).selectBackupTransportAsync(
2280 any(ComponentName.class), any(ISelectBackupTransportCallback.class));
2281
2282
Lenka Trochtova16a91c02018-01-17 11:03:30 +01002283 // Backups are not mandatory
2284 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_MANDATORY_BACKUPS);
2285 assertNull(intent);
2286
2287 // Backups are mandatory
2288 ComponentName transportComponent = ComponentName.unflattenFromString(
2289 "android/com.android.internal.backup.LocalTransport");
2290 dpm.setMandatoryBackupTransport(admin1, transportComponent);
2291 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_MANDATORY_BACKUPS);
2292 assertNotNull(intent);
2293 assertEquals(DevicePolicyManager.POLICY_MANDATORY_BACKUPS,
2294 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2295
phweiss73145f42017-01-17 19:06:38 +01002296 // Same checks for different user
2297 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2298 // Camera should be disabled by device owner
2299 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_CAMERA);
2300 assertNotNull(intent);
2301 assertEquals(DevicePolicyManager.POLICY_DISABLE_CAMERA,
2302 intent.getStringExtra(DevicePolicyManager.EXTRA_RESTRICTION));
2303 assertEquals(UserHandle.getUserId(DpmMockContext.CALLER_SYSTEM_USER_UID),
2304 intent.getIntExtra(Intent.EXTRA_USER_ID, -1));
2305 // ScreenCapture should not be disabled by device owner
2306 intent = dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
2307 assertNull(intent);
2308 }
2309
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002310 /**
2311 * Test for:
2312 * {@link DevicePolicyManager#setAffiliationIds}
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002313 * {@link DevicePolicyManager#getAffiliationIds}
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002314 * {@link DevicePolicyManager#isAffiliatedUser}
2315 */
2316 public void testUserAffiliation() throws Exception {
2317 mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS);
2318 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2319 mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL);
2320
2321 // Check that the system user is unaffiliated.
2322 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2323 assertFalse(dpm.isAffiliatedUser());
2324
2325 // Set a device owner on the system user. Check that the system user becomes affiliated.
2326 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
2327 dpm.setActiveAdmin(admin1, /* replace =*/ false);
2328 assertTrue(dpm.setDeviceOwner(admin1, "owner-name"));
2329 assertTrue(dpm.isAffiliatedUser());
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002330 assertTrue(dpm.getAffiliationIds(admin1).isEmpty());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002331
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002332 // Install a profile owner. Check that the test user is unaffiliated.
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002333 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2334 setAsProfileOwner(admin2);
2335 assertFalse(dpm.isAffiliatedUser());
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002336 assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002337
2338 // Have the profile owner specify a set of affiliation ids. Check that the test user remains
2339 // unaffiliated.
Tony Mak31657432017-04-25 09:29:55 +01002340 final Set<String> userAffiliationIds = new ArraySet<>();
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002341 userAffiliationIds.add("red");
2342 userAffiliationIds.add("green");
2343 userAffiliationIds.add("blue");
2344 dpm.setAffiliationIds(admin2, userAffiliationIds);
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002345 MoreAsserts.assertContentsInAnyOrder(dpm.getAffiliationIds(admin2), "red", "green", "blue");
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002346 assertFalse(dpm.isAffiliatedUser());
2347
2348 // Have the device owner specify a set of affiliation ids that do not intersect with those
2349 // specified by the profile owner. Check that the test user remains unaffiliated.
Tony Mak31657432017-04-25 09:29:55 +01002350 final Set<String> deviceAffiliationIds = new ArraySet<>();
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002351 deviceAffiliationIds.add("cyan");
2352 deviceAffiliationIds.add("yellow");
2353 deviceAffiliationIds.add("magenta");
2354 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2355 dpm.setAffiliationIds(admin1, deviceAffiliationIds);
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002356 MoreAsserts.assertContentsInAnyOrder(
2357 dpm.getAffiliationIds(admin1), "cyan", "yellow", "magenta");
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002358 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
2359 assertFalse(dpm.isAffiliatedUser());
2360
2361 // Have the profile owner specify a set of affiliation ids that intersect with those
2362 // specified by the device owner. Check that the test user becomes affiliated.
2363 userAffiliationIds.add("yellow");
2364 dpm.setAffiliationIds(admin2, userAffiliationIds);
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002365 MoreAsserts.assertContentsInAnyOrder(
2366 dpm.getAffiliationIds(admin2), "red", "green", "blue", "yellow");
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002367 assertTrue(dpm.isAffiliatedUser());
2368
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002369 // Clear affiliation ids for the profile owner. The user becomes unaffiliated.
Tony Mak31657432017-04-25 09:29:55 +01002370 dpm.setAffiliationIds(admin2, Collections.emptySet());
Esteban Talaverac9bb3782016-11-11 15:41:14 +00002371 assertTrue(dpm.getAffiliationIds(admin2).isEmpty());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002372 assertFalse(dpm.isAffiliatedUser());
2373
Esteban Talaveraa7bd04e2017-02-02 18:28:04 +00002374 // Set affiliation ids again, then clear PO to check that the user becomes unaffiliated
2375 dpm.setAffiliationIds(admin2, userAffiliationIds);
2376 assertTrue(dpm.isAffiliatedUser());
2377 dpm.clearProfileOwner(admin2);
2378 assertFalse(dpm.isAffiliatedUser());
2379
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002380 // Check that the system user remains affiliated.
2381 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2382 assertTrue(dpm.isAffiliatedUser());
Esteban Talaveraa7bd04e2017-02-02 18:28:04 +00002383
2384 // Clear the device owner - the user becomes unaffiliated.
2385 clearDeviceOwner();
2386 assertFalse(dpm.isAffiliatedUser());
Bartosz Fabianowski4c052f22016-01-25 14:18:43 +01002387 }
Alan Treadwayafad8782016-01-19 15:15:08 +00002388
2389 public void testGetUserProvisioningState_defaultResult() {
Eric Sandness3780c092018-03-23 16:16:11 +00002390 mContext.callerPermissions.add(permission.MANAGE_USERS);
Alan Treadwayafad8782016-01-19 15:15:08 +00002391 assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
2392 }
2393
2394 public void testSetUserProvisioningState_permission() throws Exception {
2395 setupProfileOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002396
2397 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2398 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2399 }
2400
2401 public void testSetUserProvisioningState_unprivileged() throws Exception {
2402 setupProfileOwner();
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002403 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
2404 () -> dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
2405 DpmMockContext.CALLER_USER_HANDLE));
Alan Treadwayafad8782016-01-19 15:15:08 +00002406 }
2407
2408 public void testSetUserProvisioningState_noManagement() {
2409 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
Eric Sandness3780c092018-03-23 16:16:11 +00002410 mContext.callerPermissions.add(permission.MANAGE_USERS);
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002411 assertExpectException(IllegalStateException.class,
2412 /* messageRegex= */ "change provisioning state unless a .* owner is set",
2413 () -> dpm.setUserProvisioningState(DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
2414 DpmMockContext.CALLER_USER_HANDLE));
Alan Treadwayafad8782016-01-19 15:15:08 +00002415 assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
2416 }
2417
2418 public void testSetUserProvisioningState_deviceOwnerFromSetupWizard() throws Exception {
2419 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2420 setupDeviceOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002421
2422 exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
2423 DevicePolicyManager.STATE_USER_SETUP_COMPLETE,
2424 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2425 }
2426
2427 public void testSetUserProvisioningState_deviceOwnerFromSetupWizardAlternative()
2428 throws Exception {
2429 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2430 setupDeviceOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002431
2432 exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
2433 DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE,
2434 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2435 }
2436
2437 public void testSetUserProvisioningState_deviceOwnerWithoutSetupWizard() throws Exception {
2438 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2439 setupDeviceOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002440
2441 exerciseUserProvisioningTransitions(UserHandle.USER_SYSTEM,
2442 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2443 }
2444
2445 public void testSetUserProvisioningState_managedProfileFromSetupWizard_primaryUser()
2446 throws Exception {
2447 setupProfileOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002448
2449 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2450 DevicePolicyManager.STATE_USER_PROFILE_COMPLETE,
2451 DevicePolicyManager.STATE_USER_UNMANAGED);
2452 }
2453
2454 public void testSetUserProvisioningState_managedProfileFromSetupWizard_managedProfile()
2455 throws Exception {
2456 setupProfileOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002457
2458 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2459 DevicePolicyManager.STATE_USER_SETUP_COMPLETE,
2460 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2461 }
2462
2463 public void testSetUserProvisioningState_managedProfileWithoutSetupWizard() throws Exception {
2464 setupProfileOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002465
2466 exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2467 DevicePolicyManager.STATE_USER_SETUP_FINALIZED);
2468 }
2469
2470 public void testSetUserProvisioningState_illegalTransitionOutOfFinalized1() throws Exception {
2471 setupProfileOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002472
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002473 assertExpectException(IllegalStateException.class,
2474 /* messageRegex= */ "Cannot move to user provisioning state",
2475 () -> exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2476 DevicePolicyManager.STATE_USER_SETUP_FINALIZED,
2477 DevicePolicyManager.STATE_USER_UNMANAGED));
Alan Treadwayafad8782016-01-19 15:15:08 +00002478 }
2479
2480 public void testSetUserProvisioningState_illegalTransitionToAnotherInProgressState()
2481 throws Exception {
2482 setupProfileOwner();
Alan Treadwayafad8782016-01-19 15:15:08 +00002483
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002484 assertExpectException(IllegalStateException.class,
2485 /* messageRegex= */ "Cannot move to user provisioning state",
2486 () -> exerciseUserProvisioningTransitions(DpmMockContext.CALLER_USER_HANDLE,
2487 DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE,
2488 DevicePolicyManager.STATE_USER_SETUP_COMPLETE));
Alan Treadwayafad8782016-01-19 15:15:08 +00002489 }
2490
2491 private void exerciseUserProvisioningTransitions(int userId, int... states) {
Eric Sandness3780c092018-03-23 16:16:11 +00002492 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2493 mContext.callerPermissions.add(permission.MANAGE_USERS);
2494
Alan Treadwayafad8782016-01-19 15:15:08 +00002495 assertEquals(DevicePolicyManager.STATE_USER_UNMANAGED, dpm.getUserProvisioningState());
2496 for (int state : states) {
2497 dpm.setUserProvisioningState(state, userId);
2498 assertEquals(state, dpm.getUserProvisioningState());
2499 }
2500 }
2501
2502 private void setupProfileOwner() throws Exception {
2503 mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
2504
2505 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_UID);
2506 dpm.setActiveAdmin(admin1, false);
2507 assertTrue(dpm.setProfileOwner(admin1, null, DpmMockContext.CALLER_USER_HANDLE));
2508
2509 mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
2510 }
2511
2512 private void setupDeviceOwner() throws Exception {
2513 mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
2514
2515 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
2516 dpm.setActiveAdmin(admin1, false);
2517 assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM));
2518
2519 mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
2520 }
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002521
2522 public void testSetMaximumTimeToLock() {
2523 mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
2524
2525 dpm.setActiveAdmin(admin1, /* replace =*/ false);
2526 dpm.setActiveAdmin(admin2, /* replace =*/ false);
2527
Pavel Grafov75c0a892017-05-18 17:28:27 +01002528 reset(getServices().powerManagerInternal);
2529 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002530
2531 dpm.setMaximumTimeToLock(admin1, 0);
Pavel Grafov28939982017-10-03 15:11:52 +01002532 verifyScreenTimeoutCall(null, UserHandle.USER_SYSTEM);
2533 verifyStayOnWhilePluggedCleared(false);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002534 reset(getServices().powerManagerInternal);
2535 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002536
2537 dpm.setMaximumTimeToLock(admin1, 1);
Pavel Grafov28939982017-10-03 15:11:52 +01002538 verifyScreenTimeoutCall(1L, UserHandle.USER_SYSTEM);
2539 verifyStayOnWhilePluggedCleared(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002540 reset(getServices().powerManagerInternal);
2541 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002542
2543 dpm.setMaximumTimeToLock(admin2, 10);
Pavel Grafov28939982017-10-03 15:11:52 +01002544 verifyScreenTimeoutCall(null, UserHandle.USER_SYSTEM);
2545 verifyStayOnWhilePluggedCleared(false);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002546 reset(getServices().powerManagerInternal);
2547 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002548
2549 dpm.setMaximumTimeToLock(admin1, 5);
Pavel Grafov28939982017-10-03 15:11:52 +01002550 verifyScreenTimeoutCall(5L, UserHandle.USER_SYSTEM);
2551 verifyStayOnWhilePluggedCleared(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002552 reset(getServices().powerManagerInternal);
2553 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002554
2555 dpm.setMaximumTimeToLock(admin2, 4);
Pavel Grafov28939982017-10-03 15:11:52 +01002556 verifyScreenTimeoutCall(4L, UserHandle.USER_SYSTEM);
2557 verifyStayOnWhilePluggedCleared(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002558 reset(getServices().powerManagerInternal);
2559 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002560
2561 dpm.setMaximumTimeToLock(admin1, 0);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002562 reset(getServices().powerManagerInternal);
2563 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002564
Pavel Grafov28939982017-10-03 15:11:52 +01002565 dpm.setMaximumTimeToLock(admin2, Long.MAX_VALUE);
2566 verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM);
2567 verifyStayOnWhilePluggedCleared(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002568 reset(getServices().powerManagerInternal);
2569 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002570
2571 dpm.setMaximumTimeToLock(admin2, 10);
Pavel Grafov28939982017-10-03 15:11:52 +01002572 verifyScreenTimeoutCall(10L, UserHandle.USER_SYSTEM);
2573 verifyStayOnWhilePluggedCleared(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002574 reset(getServices().powerManagerInternal);
2575 reset(getServices().settings);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002576
Pavel Grafov28939982017-10-03 15:11:52 +01002577 // There's no restriction; should be set to MAX.
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002578 dpm.setMaximumTimeToLock(admin2, 0);
Pavel Grafov28939982017-10-03 15:11:52 +01002579 verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM);
2580 verifyStayOnWhilePluggedCleared(false);
2581 }
2582
2583 // Test if lock timeout on managed profile is handled correctly depending on whether profile
2584 // uses separate challenge.
2585 public void testSetMaximumTimeToLockProfile() throws Exception {
2586 final int PROFILE_USER = 15;
2587 final int PROFILE_ADMIN = UserHandle.getUid(PROFILE_USER, 19436);
2588 addManagedProfile(admin1, PROFILE_ADMIN, admin1);
2589 mContext.binder.callingUid = PROFILE_ADMIN;
2590 final DevicePolicyManagerInternal dpmi =
2591 LocalServices.getService(DevicePolicyManagerInternal.class);
2592
2593 dpm.setMaximumTimeToLock(admin1, 0);
2594
2595 reset(getServices().powerManagerInternal);
2596 reset(getServices().settings);
2597
2598 // First add timeout for the profile.
2599 dpm.setMaximumTimeToLock(admin1, 10);
2600 verifyScreenTimeoutCall(10L, UserHandle.USER_SYSTEM);
2601
2602 reset(getServices().powerManagerInternal);
2603 reset(getServices().settings);
2604
2605 // Add separate challenge
2606 when(getServices().lockPatternUtils
2607 .isSeparateProfileChallengeEnabled(eq(PROFILE_USER))).thenReturn(true);
2608 dpmi.reportSeparateProfileChallengeChanged(PROFILE_USER);
2609
2610 verifyScreenTimeoutCall(10L, PROFILE_USER);
2611 verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM);
2612
2613 reset(getServices().powerManagerInternal);
2614 reset(getServices().settings);
2615
2616 // Remove the timeout.
2617 dpm.setMaximumTimeToLock(admin1, 0);
2618 verifyScreenTimeoutCall(Long.MAX_VALUE, PROFILE_USER);
2619 verifyScreenTimeoutCall(null , UserHandle.USER_SYSTEM);
2620
2621 reset(getServices().powerManagerInternal);
2622 reset(getServices().settings);
2623
2624 // Add it back.
2625 dpm.setMaximumTimeToLock(admin1, 10);
2626 verifyScreenTimeoutCall(10L, PROFILE_USER);
2627 verifyScreenTimeoutCall(null, UserHandle.USER_SYSTEM);
2628
2629 reset(getServices().powerManagerInternal);
2630 reset(getServices().settings);
2631
2632 // Remove separate challenge.
2633 reset(getServices().lockPatternUtils);
2634 when(getServices().lockPatternUtils
2635 .isSeparateProfileChallengeEnabled(eq(PROFILE_USER))).thenReturn(false);
2636 dpmi.reportSeparateProfileChallengeChanged(PROFILE_USER);
2637
2638 verifyScreenTimeoutCall(Long.MAX_VALUE, PROFILE_USER);
2639 verifyScreenTimeoutCall(10L , UserHandle.USER_SYSTEM);
2640
2641 reset(getServices().powerManagerInternal);
2642 reset(getServices().settings);
2643
2644 // Remove the timeout.
2645 dpm.setMaximumTimeToLock(admin1, 0);
2646 verifyScreenTimeoutCall(null, PROFILE_USER);
2647 verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM);
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002648 }
2649
Michal Karpinski943aabd2016-10-06 11:09:25 +01002650 public void testSetRequiredStrongAuthTimeout_DeviceOwner() throws Exception {
2651 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
2652 setupDeviceOwner();
2653 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2654
Michal Karpinskid084ca52017-01-18 15:54:18 +00002655 final long MINIMUM_STRONG_AUTH_TIMEOUT_MS = TimeUnit.HOURS.toMillis(1);
2656 final long ONE_MINUTE = TimeUnit.MINUTES.toMillis(1);
2657 final long MIN_PLUS_ONE_MINUTE = MINIMUM_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE;
2658 final long MAX_MINUS_ONE_MINUTE = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS
2659 - ONE_MINUTE;
2660
2661 // verify that the minimum timeout cannot be modified on user builds (system property is
2662 // not being read)
Pavel Grafov75c0a892017-05-18 17:28:27 +01002663 getServices().buildMock.isDebuggable = false;
Michal Karpinskid084ca52017-01-18 15:54:18 +00002664
2665 dpm.setRequiredStrongAuthTimeout(admin1, MAX_MINUS_ONE_MINUTE);
2666 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MAX_MINUS_ONE_MINUTE);
2667 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MAX_MINUS_ONE_MINUTE);
2668
Pavel Grafov75c0a892017-05-18 17:28:27 +01002669 verify(getServices().systemProperties, never()).getLong(anyString(), anyLong());
Michal Karpinskid084ca52017-01-18 15:54:18 +00002670
2671 // restore to the debuggable build state
Pavel Grafov75c0a892017-05-18 17:28:27 +01002672 getServices().buildMock.isDebuggable = true;
Michal Karpinskid084ca52017-01-18 15:54:18 +00002673
Michal Karpinskid084ca52017-01-18 15:54:18 +00002674 // reset to default (0 means the admin is not participating, so default should be returned)
2675 dpm.setRequiredStrongAuthTimeout(admin1, 0);
Michal Karpinski943aabd2016-10-06 11:09:25 +01002676
2677 // aggregation should be the default if unset by any admin
2678 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2679 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2680
2681 // admin not participating by default
2682 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
2683
2684 //clamping from the top
2685 dpm.setRequiredStrongAuthTimeout(admin1,
2686 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE);
2687 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1),
2688 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2689 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2690 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2691
Michal Karpinskid084ca52017-01-18 15:54:18 +00002692 // 0 means the admin is not participating, so default should be returned
Michal Karpinski943aabd2016-10-06 11:09:25 +01002693 dpm.setRequiredStrongAuthTimeout(admin1, 0);
2694 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
2695 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2696 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2697
2698 // clamping from the bottom
2699 dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS - ONE_MINUTE);
2700 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
2701 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS);
2702
Michal Karpinskid084ca52017-01-18 15:54:18 +00002703 // values within range
2704 dpm.setRequiredStrongAuthTimeout(admin1, MIN_PLUS_ONE_MINUTE);
2705 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MIN_PLUS_ONE_MINUTE);
2706 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MIN_PLUS_ONE_MINUTE);
2707
2708 dpm.setRequiredStrongAuthTimeout(admin1, MAX_MINUS_ONE_MINUTE);
2709 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MAX_MINUS_ONE_MINUTE);
2710 assertEquals(dpm.getRequiredStrongAuthTimeout(null), MAX_MINUS_ONE_MINUTE);
Michal Karpinski943aabd2016-10-06 11:09:25 +01002711
2712 // reset to default
2713 dpm.setRequiredStrongAuthTimeout(admin1, 0);
2714 assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0);
2715 assertEquals(dpm.getRequiredStrongAuthTimeout(null),
2716 DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS);
2717
2718 // negative value
Pavel Grafova1ea8d92017-05-25 21:55:24 +01002719 assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null,
2720 () -> dpm.setRequiredStrongAuthTimeout(admin1, -ONE_MINUTE));
Michal Karpinski943aabd2016-10-06 11:09:25 +01002721 }
2722
Pavel Grafov28939982017-10-03 15:11:52 +01002723 private void verifyScreenTimeoutCall(Long expectedTimeout, int userId) {
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002724 if (expectedTimeout == null) {
Pavel Grafov75c0a892017-05-18 17:28:27 +01002725 verify(getServices().powerManagerInternal, times(0))
Pavel Grafov28939982017-10-03 15:11:52 +01002726 .setMaximumScreenOffTimeoutFromDeviceAdmin(eq(userId), anyLong());
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002727 } else {
Pavel Grafov75c0a892017-05-18 17:28:27 +01002728 verify(getServices().powerManagerInternal, times(1))
Pavel Grafov28939982017-10-03 15:11:52 +01002729 .setMaximumScreenOffTimeoutFromDeviceAdmin(eq(userId), eq(expectedTimeout));
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002730 }
Pavel Grafov28939982017-10-03 15:11:52 +01002731 }
2732
2733 private void verifyStayOnWhilePluggedCleared(boolean cleared) {
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002734 // TODO Verify calls to settingsGlobalPutInt. Tried but somehow mockito threw
2735 // UnfinishedVerificationException.
2736 }
Makoto Onuki2a3c3da2016-02-18 14:25:30 -08002737
Esteban Talavera01576862016-12-15 11:16:44 +00002738 private void setup_DeviceAdminFeatureOff() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01002739 when(getServices().packageManager.hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN))
Victor Chang3e794af2016-03-04 13:48:17 +00002740 .thenReturn(false);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002741 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00002742 .thenReturn(false);
2743 initializeDpms();
Pavel Grafov75c0a892017-05-18 17:28:27 +01002744 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
2745 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00002746 .thenReturn(true);
2747 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2748
2749 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002750 }
Victor Chang3e794af2016-03-04 13:48:17 +00002751
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002752 public void testIsProvisioningAllowed_DeviceAdminFeatureOff() throws Exception {
2753 setup_DeviceAdminFeatureOff();
Esteban Talavera01576862016-12-15 11:16:44 +00002754 mContext.packageName = admin1.getPackageName();
2755 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002756 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, false);
2757 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2758 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2759 false);
2760 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
2761 }
2762
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002763 public void testCheckProvisioningPreCondition_DeviceAdminFeatureOff() throws Exception {
2764 setup_DeviceAdminFeatureOff();
2765 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2766 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2767 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2768 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2769 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2770 assertCheckProvisioningPreCondition(
2771 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2772 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2773 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2774 DevicePolicyManager.CODE_DEVICE_ADMIN_NOT_SUPPORTED);
2775 }
2776
Esteban Talavera01576862016-12-15 11:16:44 +00002777 private void setup_ManagedProfileFeatureOff() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01002778 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00002779 .thenReturn(false);
2780 initializeDpms();
Pavel Grafov75c0a892017-05-18 17:28:27 +01002781 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
2782 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00002783 .thenReturn(true);
2784 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2785
2786 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002787 }
Victor Chang3e794af2016-03-04 13:48:17 +00002788
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002789 public void testIsProvisioningAllowed_ManagedProfileFeatureOff() throws Exception {
2790 setup_ManagedProfileFeatureOff();
Esteban Talavera01576862016-12-15 11:16:44 +00002791 mContext.packageName = admin1.getPackageName();
2792 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002793 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2794 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2795 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2796 false);
2797 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
2798
2799 // Test again when split user is on
Pavel Grafov75c0a892017-05-18 17:28:27 +01002800 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
Victor Chang3e794af2016-03-04 13:48:17 +00002801 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
2802 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2803 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2804 true);
2805 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, false);
2806 }
2807
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002808 public void testCheckProvisioningPreCondition_ManagedProfileFeatureOff() throws Exception {
2809 setup_ManagedProfileFeatureOff();
2810 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2811 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2812 DevicePolicyManager.CODE_OK);
2813 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2814 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2815 assertCheckProvisioningPreCondition(
2816 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2817 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2818 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2819 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2820
2821 // Test again when split user is on
Pavel Grafov75c0a892017-05-18 17:28:27 +01002822 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002823 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2824 DevicePolicyManager.CODE_OK);
2825 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2826 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2827 assertCheckProvisioningPreCondition(
2828 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2829 DevicePolicyManager.CODE_OK);
2830 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2831 DevicePolicyManager.CODE_MANAGED_USERS_NOT_SUPPORTED);
2832 }
2833
Esteban Talavera01576862016-12-15 11:16:44 +00002834 private void setup_nonSplitUser_firstBoot_primaryUser() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01002835 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00002836 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002837 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
2838 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00002839 .thenReturn(true);
2840 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
2841
2842 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002843 }
Victor Chang3e794af2016-03-04 13:48:17 +00002844
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002845 public void testIsProvisioningAllowed_nonSplitUser_firstBoot_primaryUser() throws Exception {
2846 setup_nonSplitUser_firstBoot_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, true);
2850 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2851 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2852 false /* because of non-split user */);
2853 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2854 false /* because of non-split user */);
2855 }
2856
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002857 public void testCheckProvisioningPreCondition_nonSplitUser_firstBoot_primaryUser()
Victor Chang3e794af2016-03-04 13:48:17 +00002858 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002859 setup_nonSplitUser_firstBoot_primaryUser();
2860 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2861 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2862 DevicePolicyManager.CODE_OK);
2863 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2864 DevicePolicyManager.CODE_OK);
2865 assertCheckProvisioningPreCondition(
2866 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2867 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2868 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2869 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2870 }
2871
Esteban Talavera01576862016-12-15 11:16:44 +00002872 private void setup_nonSplitUser_afterDeviceSetup_primaryUser() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01002873 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00002874 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002875 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(false);
2876 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00002877 .thenReturn(true);
2878 setUserSetupCompleteForUser(true, UserHandle.USER_SYSTEM);
2879
2880 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002881 }
Victor Chang3e794af2016-03-04 13:48:17 +00002882
Nicolas Prevot45d29072017-01-18 16:11:19 +00002883 private void setup_nonSplitUser_withDo_primaryUser() throws Exception {
2884 setDeviceOwner();
2885 setup_nonSplitUser_afterDeviceSetup_primaryUser();
2886 setUpPackageManagerForFakeAdmin(adminAnotherPackage, DpmMockContext.ANOTHER_UID, admin2);
2887 }
2888
2889 private void setup_nonSplitUser_withDo_primaryUser_ManagedProfile() throws Exception {
2890 setup_nonSplitUser_withDo_primaryUser();
2891 final int MANAGED_PROFILE_USER_ID = 18;
2892 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 1308);
2893 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002894 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002895 false /* we can't remove a managed profile */)).thenReturn(false);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002896 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002897 true)).thenReturn(true);
2898 }
2899
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002900 public void testIsProvisioningAllowed_nonSplitUser_afterDeviceSetup_primaryUser()
2901 throws Exception {
2902 setup_nonSplitUser_afterDeviceSetup_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002903 mContext.packageName = admin1.getPackageName();
2904 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00002905 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2906 false/* because of completed device setup */);
2907 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
2908 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2909 false/* because of non-split user */);
2910 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2911 false/* because of non-split user */);
2912 }
2913
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00002914 public void testCheckProvisioningPreCondition_nonSplitUser_afterDeviceSetup_primaryUser()
2915 throws Exception {
2916 setup_nonSplitUser_afterDeviceSetup_primaryUser();
2917 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2918 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2919 DevicePolicyManager.CODE_USER_SETUP_COMPLETED);
2920 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2921 DevicePolicyManager.CODE_OK);
2922 assertCheckProvisioningPreCondition(
2923 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
2924 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2925 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
2926 DevicePolicyManager.CODE_NOT_SYSTEM_USER_SPLIT);
2927 }
2928
Nicolas Prevot45d29072017-01-18 16:11:19 +00002929 public void testProvisioning_nonSplitUser_withDo_primaryUser() throws Exception {
2930 setup_nonSplitUser_withDo_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00002931 mContext.packageName = admin1.getPackageName();
Esteban Talavera01576862016-12-15 11:16:44 +00002932 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2933
2934 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
2935 DevicePolicyManager.CODE_HAS_DEVICE_OWNER);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002936 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, false);
Esteban Talavera01576862016-12-15 11:16:44 +00002937
2938 // COMP mode is allowed.
2939 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2940 DevicePolicyManager.CODE_OK);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002941 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
Esteban Talavera01576862016-12-15 11:16:44 +00002942
Nicolas Prevot45d29072017-01-18 16:11:19 +00002943 // And other DPCs can also provision a managed profile (DO + BYOD case).
Esteban Talavera01576862016-12-15 11:16:44 +00002944 assertCheckProvisioningPreCondition(
2945 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002946 DpmMockContext.ANOTHER_PACKAGE_NAME,
Esteban Talavera01576862016-12-15 11:16:44 +00002947 DevicePolicyManager.CODE_OK);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002948 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true,
2949 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
2950 }
Esteban Talavera01576862016-12-15 11:16:44 +00002951
Nicolas Prevot45d29072017-01-18 16:11:19 +00002952 public void testProvisioning_nonSplitUser_withDo_primaryUser_restrictedByDo() throws Exception {
2953 setup_nonSplitUser_withDo_primaryUser();
2954 mContext.packageName = admin1.getPackageName();
2955 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
2956 // The DO should be allowed to initiate provisioning if it set the restriction itself, but
2957 // other packages should be forbidden.
Pavel Grafov75c0a892017-05-18 17:28:27 +01002958 when(getServices().userManager.hasUserRestriction(
Esteban Talavera01576862016-12-15 11:16:44 +00002959 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2960 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2961 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002962 when(getServices().userManager.getUserRestrictionSource(
Esteban Talavera01576862016-12-15 11:16:44 +00002963 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2964 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2965 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
2966 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2967 DevicePolicyManager.CODE_OK);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002968 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
Esteban Talavera01576862016-12-15 11:16:44 +00002969 assertCheckProvisioningPreCondition(
2970 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002971 DpmMockContext.ANOTHER_PACKAGE_NAME,
Esteban Talavera01576862016-12-15 11:16:44 +00002972 DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002973 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false,
2974 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
2975 }
Esteban Talavera01576862016-12-15 11:16:44 +00002976
Nicolas Prevot45d29072017-01-18 16:11:19 +00002977 public void testProvisioning_nonSplitUser_withDo_primaryUser_restrictedBySystem()
2978 throws Exception {
2979 setup_nonSplitUser_withDo_primaryUser();
2980 mContext.packageName = admin1.getPackageName();
2981 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
Esteban Talavera01576862016-12-15 11:16:44 +00002982 // The DO should not be allowed to initiate provisioning if the restriction is set by
2983 // another entity.
Pavel Grafov75c0a892017-05-18 17:28:27 +01002984 when(getServices().userManager.hasUserRestriction(
Nicolas Prevot45d29072017-01-18 16:11:19 +00002985 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2986 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2987 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01002988 when(getServices().userManager.getUserRestrictionSource(
Esteban Talavera01576862016-12-15 11:16:44 +00002989 eq(UserManager.DISALLOW_ADD_MANAGED_PROFILE),
2990 eq(UserHandle.getUserHandleForUid(mContext.binder.callingUid))))
2991 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
2992 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
2993 DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED);
Nicolas Prevot45d29072017-01-18 16:11:19 +00002994 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
2995
2996 assertCheckProvisioningPreCondition(
Esteban Talavera01576862016-12-15 11:16:44 +00002997 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Nicolas Prevot45d29072017-01-18 16:11:19 +00002998 DpmMockContext.ANOTHER_PACKAGE_NAME,
Esteban Talavera01576862016-12-15 11:16:44 +00002999 DevicePolicyManager.CODE_ADD_MANAGED_PROFILE_DISALLOWED);
Nicolas Prevot45d29072017-01-18 16:11:19 +00003000 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false,
3001 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
3002 }
3003
3004 public void testCheckProvisioningPreCondition_nonSplitUser_comp() throws Exception {
3005 setup_nonSplitUser_withDo_primaryUser_ManagedProfile();
3006 mContext.packageName = admin1.getPackageName();
3007 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3008
3009 // We can delete the managed profile to create a new one, so provisioning is allowed.
3010 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3011 DevicePolicyManager.CODE_OK);
3012 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
3013 assertCheckProvisioningPreCondition(
3014 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3015 DpmMockContext.ANOTHER_PACKAGE_NAME,
3016 DevicePolicyManager.CODE_OK);
3017 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true,
3018 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
3019 }
3020
3021 public void testCheckProvisioningPreCondition_nonSplitUser_comp_cannot_remove_profile()
3022 throws Exception {
3023 setup_nonSplitUser_withDo_primaryUser_ManagedProfile();
3024 mContext.packageName = admin1.getPackageName();
3025 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003026 when(getServices().userManager.hasUserRestriction(
Nicolas Prevot45d29072017-01-18 16:11:19 +00003027 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
3028 eq(UserHandle.SYSTEM)))
3029 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003030 when(getServices().userManager.getUserRestrictionSource(
Nicolas Prevotd37c4a92017-01-23 11:56:00 +00003031 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
3032 eq(UserHandle.SYSTEM)))
3033 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
Nicolas Prevot45d29072017-01-18 16:11:19 +00003034
3035 // We can't remove the profile to create a new one.
Nicolas Prevot45d29072017-01-18 16:11:19 +00003036 assertCheckProvisioningPreCondition(
3037 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3038 DpmMockContext.ANOTHER_PACKAGE_NAME,
3039 DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE);
3040 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false,
3041 DpmMockContext.ANOTHER_PACKAGE_NAME, DpmMockContext.ANOTHER_UID);
Nicolas Prevotd37c4a92017-01-23 11:56:00 +00003042
3043 // But the device owner can still do it because it has set the restriction itself.
3044 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3045 DevicePolicyManager.CODE_OK);
3046 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
Esteban Talavera01576862016-12-15 11:16:44 +00003047 }
3048
3049 private void setup_splitUser_firstBoot_systemUser() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01003050 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00003051 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003052 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3053 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00003054 .thenReturn(false);
3055 setUserSetupCompleteForUser(false, UserHandle.USER_SYSTEM);
3056
3057 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003058 }
Victor Chang3e794af2016-03-04 13:48:17 +00003059
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003060 public void testIsProvisioningAllowed_splitUser_firstBoot_systemUser() throws Exception {
3061 setup_splitUser_firstBoot_systemUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003062 mContext.packageName = admin1.getPackageName();
3063 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00003064 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
3065 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3066 false /* because canAddMoreManagedProfiles returns false */);
3067 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3068 true);
3069 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3070 false/* because calling uid is system user */);
Victor Chang3e794af2016-03-04 13:48:17 +00003071 }
3072
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003073 public void testCheckProvisioningPreCondition_splitUser_firstBoot_systemUser()
3074 throws Exception {
3075 setup_splitUser_firstBoot_systemUser();
3076 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3077 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
3078 DevicePolicyManager.CODE_OK);
3079 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Esteban Talavera6c9116a2016-11-24 16:12:44 +00003080 DevicePolicyManager.CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER);
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003081 assertCheckProvisioningPreCondition(
3082 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3083 DevicePolicyManager.CODE_OK);
3084 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3085 DevicePolicyManager.CODE_SYSTEM_USER);
3086 }
3087
Esteban Talavera01576862016-12-15 11:16:44 +00003088 private void setup_splitUser_afterDeviceSetup_systemUser() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01003089 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00003090 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003091 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3092 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00003093 .thenReturn(false);
3094 setUserSetupCompleteForUser(true, UserHandle.USER_SYSTEM);
3095
3096 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003097 }
Victor Chang3e794af2016-03-04 13:48:17 +00003098
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003099 public void testIsProvisioningAllowed_splitUser_afterDeviceSetup_systemUser() throws Exception {
3100 setup_splitUser_afterDeviceSetup_systemUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003101 mContext.packageName = admin1.getPackageName();
3102 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00003103 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
3104 true/* it's undefined behavior. Can be changed into false in the future */);
3105 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3106 false /* because canAddMoreManagedProfiles returns false */);
3107 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3108 true/* it's undefined behavior. Can be changed into false in the future */);
3109 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3110 false/* because calling uid is system user */);
3111 }
3112
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003113 public void testCheckProvisioningPreCondition_splitUser_afterDeviceSetup_systemUser()
3114 throws Exception {
3115 setup_splitUser_afterDeviceSetup_systemUser();
3116 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3117 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
3118 DevicePolicyManager.CODE_OK);
3119 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
Esteban Talavera6c9116a2016-11-24 16:12:44 +00003120 DevicePolicyManager.CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER);
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003121 assertCheckProvisioningPreCondition(
3122 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3123 DevicePolicyManager.CODE_OK);
3124 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3125 DevicePolicyManager.CODE_SYSTEM_USER);
3126 }
3127
Esteban Talavera01576862016-12-15 11:16:44 +00003128 private void setup_splitUser_firstBoot_primaryUser() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01003129 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00003130 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003131 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3132 when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
Victor Chang3e794af2016-03-04 13:48:17 +00003133 true)).thenReturn(true);
3134 setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE);
3135
3136 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003137 }
Victor Chang3e794af2016-03-04 13:48:17 +00003138
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003139 public void testIsProvisioningAllowed_splitUser_firstBoot_primaryUser() throws Exception {
3140 setup_splitUser_firstBoot_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003141 mContext.packageName = admin1.getPackageName();
3142 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00003143 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE, true);
3144 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
3145 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3146 true);
3147 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER, true);
Victor Chang3e794af2016-03-04 13:48:17 +00003148 }
3149
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003150 public void testCheckProvisioningPreCondition_splitUser_firstBoot_primaryUser()
Victor Chang3e794af2016-03-04 13:48:17 +00003151 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003152 setup_splitUser_firstBoot_primaryUser();
3153 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3154 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
3155 DevicePolicyManager.CODE_OK);
3156 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3157 DevicePolicyManager.CODE_OK);
3158 assertCheckProvisioningPreCondition(
3159 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3160 DevicePolicyManager.CODE_OK);
3161 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3162 DevicePolicyManager.CODE_OK);
3163 }
3164
Esteban Talavera01576862016-12-15 11:16:44 +00003165 private void setup_splitUser_afterDeviceSetup_primaryUser() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01003166 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00003167 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003168 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3169 when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
Victor Chang3e794af2016-03-04 13:48:17 +00003170 true)).thenReturn(true);
3171 setUserSetupCompleteForUser(true, DpmMockContext.CALLER_USER_HANDLE);
3172
3173 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003174 }
Victor Chang3e794af2016-03-04 13:48:17 +00003175
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003176 public void testIsProvisioningAllowed_splitUser_afterDeviceSetup_primaryUser()
3177 throws Exception {
3178 setup_splitUser_afterDeviceSetup_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003179 mContext.packageName = admin1.getPackageName();
3180 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00003181 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
3182 true/* it's undefined behavior. Can be changed into false in the future */);
3183 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
3184 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3185 true/* it's undefined behavior. Can be changed into false in the future */);
3186 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3187 false/* because user setup completed */);
3188 }
3189
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003190 public void testCheckProvisioningPreCondition_splitUser_afterDeviceSetup_primaryUser()
Victor Chang3e794af2016-03-04 13:48:17 +00003191 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003192 setup_splitUser_afterDeviceSetup_primaryUser();
3193 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3194 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE,
3195 DevicePolicyManager.CODE_OK);
3196 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3197 DevicePolicyManager.CODE_OK);
3198 assertCheckProvisioningPreCondition(
3199 DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE,
3200 DevicePolicyManager.CODE_OK);
3201 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_USER,
3202 DevicePolicyManager.CODE_USER_SETUP_COMPLETED);
3203 }
3204
Esteban Talavera01576862016-12-15 11:16:44 +00003205 private void setup_provisionManagedProfileWithDeviceOwner_systemUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00003206 setDeviceOwner();
3207
Pavel Grafov75c0a892017-05-18 17:28:27 +01003208 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00003209 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003210 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3211 when(getServices().userManager.canAddMoreManagedProfiles(UserHandle.USER_SYSTEM, true))
Victor Chang3e794af2016-03-04 13:48:17 +00003212 .thenReturn(false);
3213 setUserSetupCompleteForUser(true, UserHandle.USER_SYSTEM);
3214
3215 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003216 }
Victor Chang3e794af2016-03-04 13:48:17 +00003217
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003218 public void testIsProvisioningAllowed_provisionManagedProfileWithDeviceOwner_systemUser()
3219 throws Exception {
3220 setup_provisionManagedProfileWithDeviceOwner_systemUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003221 mContext.packageName = admin1.getPackageName();
3222 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Victor Chang3e794af2016-03-04 13:48:17 +00003223 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3224 false /* can't provision managed profile on system user */);
3225 }
3226
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003227 public void testCheckProvisioningPreCondition_provisionManagedProfileWithDeviceOwner_systemUser()
Victor Chang3e794af2016-03-04 13:48:17 +00003228 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003229 setup_provisionManagedProfileWithDeviceOwner_systemUser();
3230 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3231 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3232 DevicePolicyManager.CODE_SPLIT_SYSTEM_USER_DEVICE_SYSTEM_USER);
3233 }
3234
3235 private void setup_provisionManagedProfileWithDeviceOwner_primaryUser() throws Exception {
Victor Chang3e794af2016-03-04 13:48:17 +00003236 setDeviceOwner();
3237
Pavel Grafov75c0a892017-05-18 17:28:27 +01003238 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Victor Chang3e794af2016-03-04 13:48:17 +00003239 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003240 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3241 when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
Victor Chang3e794af2016-03-04 13:48:17 +00003242 true)).thenReturn(true);
3243 setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE);
3244
3245 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003246 }
Victor Chang3e794af2016-03-04 13:48:17 +00003247
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003248 public void testIsProvisioningAllowed_provisionManagedProfileWithDeviceOwner_primaryUser()
3249 throws Exception {
3250 setup_provisionManagedProfileWithDeviceOwner_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003251 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
3252 mContext.packageName = admin1.getPackageName();
Victor Chang3e794af2016-03-04 13:48:17 +00003253 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, true);
3254 }
3255
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003256 public void testCheckProvisioningPreCondition_provisionManagedProfileWithDeviceOwner_primaryUser()
Nicolas Prevot56400a42016-11-10 12:57:54 +00003257 throws Exception {
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003258 setup_provisionManagedProfileWithDeviceOwner_primaryUser();
3259 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
Esteban Talavera01576862016-12-15 11:16:44 +00003260
3261 // COMP mode is allowed.
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003262 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3263 DevicePolicyManager.CODE_OK);
3264 }
3265
3266 private void setup_provisionManagedProfileCantRemoveUser_primaryUser() throws Exception {
Nicolas Prevot56400a42016-11-10 12:57:54 +00003267 setDeviceOwner();
3268
Pavel Grafov75c0a892017-05-18 17:28:27 +01003269 when(getServices().ipackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0))
Nicolas Prevot56400a42016-11-10 12:57:54 +00003270 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003271 when(getServices().userManagerForMock.isSplitSystemUser()).thenReturn(true);
3272 when(getServices().userManager.hasUserRestriction(
Esteban Talavera01576862016-12-15 11:16:44 +00003273 eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE),
3274 eq(UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))))
Nicolas Prevot56400a42016-11-10 12:57:54 +00003275 .thenReturn(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003276 when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003277 false /* we can't remove a managed profile */)).thenReturn(false);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003278 when(getServices().userManager.canAddMoreManagedProfiles(DpmMockContext.CALLER_USER_HANDLE,
Nicolas Prevot56400a42016-11-10 12:57:54 +00003279 true)).thenReturn(true);
3280 setUserSetupCompleteForUser(false, DpmMockContext.CALLER_USER_HANDLE);
3281
3282 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003283 }
Nicolas Prevot56400a42016-11-10 12:57:54 +00003284
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003285 public void testIsProvisioningAllowed_provisionManagedProfileCantRemoveUser_primaryUser()
3286 throws Exception {
3287 setup_provisionManagedProfileCantRemoveUser_primaryUser();
Esteban Talavera01576862016-12-15 11:16:44 +00003288 mContext.packageName = admin1.getPackageName();
3289 setUpPackageManagerForAdmin(admin1, mContext.binder.callingUid);
Nicolas Prevot56400a42016-11-10 12:57:54 +00003290 assertProvisioningAllowed(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, false);
3291 }
3292
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003293 public void testCheckProvisioningPreCondition_provisionManagedProfileCantRemoveUser_primaryUser()
3294 throws Exception {
3295 setup_provisionManagedProfileCantRemoveUser_primaryUser();
3296 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3297 assertCheckProvisioningPreCondition(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE,
3298 DevicePolicyManager.CODE_CANNOT_ADD_MANAGED_PROFILE);
3299 }
3300
3301 public void testCheckProvisioningPreCondition_permission() {
3302 // GIVEN the permission MANAGE_PROFILE_AND_DEVICE_OWNERS is not granted
Pavel Grafova1ea8d92017-05-25 21:55:24 +01003303 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
3304 () -> dpm.checkProvisioningPreCondition(
3305 DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE, "some.package"));
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00003306 }
3307
Victor Chang3577ed22016-08-25 18:49:26 +01003308 public void testForceUpdateUserSetupComplete_permission() {
3309 // GIVEN the permission MANAGE_PROFILE_AND_DEVICE_OWNERS is not granted
Pavel Grafova1ea8d92017-05-25 21:55:24 +01003310 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
3311 () -> dpm.forceUpdateUserSetupComplete());
Victor Chang3577ed22016-08-25 18:49:26 +01003312 }
3313
3314 public void testForceUpdateUserSetupComplete_systemUser() {
3315 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3316 // GIVEN calling from user 20
3317 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
Pavel Grafova1ea8d92017-05-25 21:55:24 +01003318 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
3319 () -> dpm.forceUpdateUserSetupComplete());
Victor Chang3577ed22016-08-25 18:49:26 +01003320 }
3321
3322 public void testForceUpdateUserSetupComplete_userbuild() {
3323 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3324 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3325
3326 final int userId = UserHandle.USER_SYSTEM;
3327 // GIVEN userComplete is false in SettingsProvider
3328 setUserSetupCompleteForUser(false, userId);
3329
3330 // GIVEN userComplete is true in DPM
3331 DevicePolicyManagerService.DevicePolicyData userData =
3332 new DevicePolicyManagerService.DevicePolicyData(userId);
3333 userData.mUserSetupComplete = true;
3334 dpms.mUserData.put(UserHandle.USER_SYSTEM, userData);
3335
3336 // GIVEN it's user build
Pavel Grafov75c0a892017-05-18 17:28:27 +01003337 getServices().buildMock.isDebuggable = false;
Victor Chang3577ed22016-08-25 18:49:26 +01003338
3339 assertTrue(dpms.hasUserSetupCompleted());
3340
3341 dpm.forceUpdateUserSetupComplete();
3342
3343 // THEN the state in dpms is not changed
3344 assertTrue(dpms.hasUserSetupCompleted());
3345 }
3346
3347 public void testForceUpdateUserSetupComplete_userDebugbuild() {
3348 mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS);
3349 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3350
3351 final int userId = UserHandle.USER_SYSTEM;
3352 // GIVEN userComplete is false in SettingsProvider
3353 setUserSetupCompleteForUser(false, userId);
3354
3355 // GIVEN userComplete is true in DPM
3356 DevicePolicyManagerService.DevicePolicyData userData =
3357 new DevicePolicyManagerService.DevicePolicyData(userId);
3358 userData.mUserSetupComplete = true;
3359 dpms.mUserData.put(UserHandle.USER_SYSTEM, userData);
3360
3361 // GIVEN it's userdebug build
Pavel Grafov75c0a892017-05-18 17:28:27 +01003362 getServices().buildMock.isDebuggable = true;
Victor Chang3577ed22016-08-25 18:49:26 +01003363
3364 assertTrue(dpms.hasUserSetupCompleted());
3365
3366 dpm.forceUpdateUserSetupComplete();
3367
3368 // THEN the state in dpms is not changed
3369 assertFalse(dpms.hasUserSetupCompleted());
3370 }
3371
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003372 private void clearDeviceOwner() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01003373 doReturn(DpmMockContext.CALLER_SYSTEM_USER_UID).when(getServices().packageManager)
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003374 .getPackageUidAsUser(eq(admin1.getPackageName()), anyInt());
Pavel Grafov75c0a892017-05-18 17:28:27 +01003375
3376 mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3377 runAsCaller(mAdmin1Context, dpms, dpm -> {
3378 dpm.clearDeviceOwnerApp(admin1.getPackageName());
3379 });
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003380 }
3381
3382 public void testGetLastSecurityLogRetrievalTime() throws Exception {
3383 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3384 setupDeviceOwner();
Esteban Talaverad36dd152016-12-15 08:51:45 +00003385
3386 // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the
3387 // feature is disabled because there are non-affiliated secondary users.
Pavel Grafov75c0a892017-05-18 17:28:27 +01003388 getServices().removeUser(DpmMockContext.CALLER_USER_HANDLE);
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003389 when(mContext.resources.getBoolean(R.bool.config_supportPreRebootSecurityLogs))
3390 .thenReturn(true);
3391
3392 // No logs were retrieved so far.
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003393 assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003394
3395 // Enabling logging should not change the timestamp.
3396 dpm.setSecurityLoggingEnabled(admin1, true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003397 verify(getServices().settings)
Esteban Talaverad36dd152016-12-15 08:51:45 +00003398 .securityLogSetLoggingEnabledProperty(true);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003399 when(getServices().settings.securityLogGetLoggingEnabledProperty())
Esteban Talaverad36dd152016-12-15 08:51:45 +00003400 .thenReturn(true);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003401 assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003402
3403 // Retrieving the logs should update the timestamp.
3404 final long beforeRetrieval = System.currentTimeMillis();
3405 dpm.retrieveSecurityLogs(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003406 final long firstSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003407 final long afterRetrieval = System.currentTimeMillis();
3408 assertTrue(firstSecurityLogRetrievalTime >= beforeRetrieval);
3409 assertTrue(firstSecurityLogRetrievalTime <= afterRetrieval);
3410
3411 // Retrieving the pre-boot logs should update the timestamp.
3412 Thread.sleep(2);
3413 dpm.retrievePreRebootSecurityLogs(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003414 final long secondSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003415 assertTrue(secondSecurityLogRetrievalTime > firstSecurityLogRetrievalTime);
3416
3417 // Checking the timestamp again should not change it.
3418 Thread.sleep(2);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003419 assertEquals(secondSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003420
3421 // Retrieving the logs again should update the timestamp.
3422 dpm.retrieveSecurityLogs(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003423 final long thirdSecurityLogRetrievalTime = dpm.getLastSecurityLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003424 assertTrue(thirdSecurityLogRetrievalTime > secondSecurityLogRetrievalTime);
3425
3426 // Disabling logging should not change the timestamp.
3427 Thread.sleep(2);
3428 dpm.setSecurityLoggingEnabled(admin1, false);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003429 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003430
3431 // Restarting the DPMS should not lose the timestamp.
3432 initializeDpms();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003433 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003434
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003435 // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
3436 mContext.binder.callingUid = 1234567;
3437 mContext.callerPermissions.add(permission.MANAGE_USERS);
3438 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
3439 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3440
3441 // System can retrieve the timestamp.
3442 mContext.binder.clearCallingIdentity();
3443 assertEquals(thirdSecurityLogRetrievalTime, dpm.getLastSecurityLogRetrievalTime());
3444
3445 // Removing the device owner should clear the timestamp.
3446 clearDeviceOwner();
3447 assertEquals(-1, dpm.getLastSecurityLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003448 }
3449
yuemingw0de748d2017-11-15 19:22:27 +00003450 public void testSetSystemSettingFailWithNonWhitelistedSettings() throws Exception {
3451 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3452 setupDeviceOwner();
3453 assertExpectException(SecurityException.class, null, () ->
3454 dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS_FOR_VR, "0"));
3455 }
3456
yuemingwc0281f12018-03-28 15:58:49 +01003457 public void testSetSystemSettingWithDO() throws Exception {
yuemingw0de748d2017-11-15 19:22:27 +00003458 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3459 setupDeviceOwner();
3460 dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0");
yuemingwc0281f12018-03-28 15:58:49 +01003461 verify(getServices().settings).settingsSystemPutStringForUser(
3462 Settings.System.SCREEN_BRIGHTNESS, "0", UserHandle.USER_SYSTEM);
3463 }
3464
3465 public void testSetSystemSettingWithPO() throws Exception {
3466 setupProfileOwner();
3467 dpm.setSystemSetting(admin1, Settings.System.SCREEN_BRIGHTNESS, "0");
3468 verify(getServices().settings).settingsSystemPutStringForUser(
3469 Settings.System.SCREEN_BRIGHTNESS, "0", DpmMockContext.CALLER_USER_HANDLE);
yuemingw0de748d2017-11-15 19:22:27 +00003470 }
3471
yuemingwe43cdf72017-10-12 16:52:11 +01003472 public void testSetTime() throws Exception {
3473 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3474 setupDeviceOwner();
3475 dpm.setTime(admin1, 0);
3476 verify(getServices().alarmManager).setTime(0);
3477 }
3478
3479 public void testSetTimeFailWithPO() throws Exception {
3480 setupProfileOwner();
3481 assertExpectException(SecurityException.class, null, () -> dpm.setTime(admin1, 0));
3482 }
3483
3484 public void testSetTimeWithAutoTimeOn() throws Exception {
3485 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3486 setupDeviceOwner();
3487 when(getServices().settings.settingsGlobalGetInt(Settings.Global.AUTO_TIME, 0))
3488 .thenReturn(1);
3489 assertFalse(dpm.setTime(admin1, 0));
3490 }
3491
3492 public void testSetTimeZone() throws Exception {
3493 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3494 setupDeviceOwner();
3495 dpm.setTimeZone(admin1, "Asia/Shanghai");
3496 verify(getServices().alarmManager).setTimeZone("Asia/Shanghai");
3497 }
3498
3499 public void testSetTimeZoneFailWithPO() throws Exception {
3500 setupProfileOwner();
3501 assertExpectException(SecurityException.class, null,
3502 () -> dpm.setTimeZone(admin1, "Asia/Shanghai"));
3503 }
3504
3505 public void testSetTimeZoneWithAutoTimeZoneOn() throws Exception {
3506 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3507 setupDeviceOwner();
3508 when(getServices().settings.settingsGlobalGetInt(Settings.Global.AUTO_TIME_ZONE, 0))
3509 .thenReturn(1);
3510 assertFalse(dpm.setTimeZone(admin1, "Asia/Shanghai"));
3511 }
3512
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003513 public void testGetLastBugReportRequestTime() throws Exception {
3514 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3515 setupDeviceOwner();
Esteban Talaverad36dd152016-12-15 08:51:45 +00003516
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003517 mContext.packageName = admin1.getPackageName();
3518 mContext.applicationInfo = new ApplicationInfo();
3519 when(mContext.resources.getColor(eq(R.color.notification_action_list), anyObject()))
3520 .thenReturn(Color.WHITE);
3521 when(mContext.resources.getColor(eq(R.color.notification_material_background_color),
3522 anyObject())).thenReturn(Color.WHITE);
3523
Esteban Talaverad36dd152016-12-15 08:51:45 +00003524 // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the
3525 // feature is disabled because there are non-affiliated secondary users.
Pavel Grafov75c0a892017-05-18 17:28:27 +01003526 getServices().removeUser(DpmMockContext.CALLER_USER_HANDLE);
Esteban Talaverad36dd152016-12-15 08:51:45 +00003527
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003528 // No bug reports were requested so far.
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003529 assertEquals(-1, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003530
3531 // Requesting a bug report should update the timestamp.
3532 final long beforeRequest = System.currentTimeMillis();
3533 dpm.requestBugreport(admin1);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003534 final long bugReportRequestTime = dpm.getLastBugReportRequestTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003535 final long afterRequest = System.currentTimeMillis();
3536 assertTrue(bugReportRequestTime >= beforeRequest);
3537 assertTrue(bugReportRequestTime <= afterRequest);
3538
3539 // Checking the timestamp again should not change it.
3540 Thread.sleep(2);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003541 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003542
3543 // Restarting the DPMS should not lose the timestamp.
3544 initializeDpms();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003545 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003546
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003547 // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
3548 mContext.binder.callingUid = 1234567;
3549 mContext.callerPermissions.add(permission.MANAGE_USERS);
3550 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
3551 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3552
3553 // System can retrieve the timestamp.
3554 mContext.binder.clearCallingIdentity();
3555 assertEquals(bugReportRequestTime, dpm.getLastBugReportRequestTime());
3556
3557 // Removing the device owner should clear the timestamp.
3558 clearDeviceOwner();
3559 assertEquals(-1, dpm.getLastBugReportRequestTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003560 }
3561
3562 public void testGetLastNetworkLogRetrievalTime() throws Exception {
3563 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3564 setupDeviceOwner();
Esteban Talaverad36dd152016-12-15 08:51:45 +00003565 mContext.packageName = admin1.getPackageName();
3566 mContext.applicationInfo = new ApplicationInfo();
3567 when(mContext.resources.getColor(eq(R.color.notification_action_list), anyObject()))
3568 .thenReturn(Color.WHITE);
3569 when(mContext.resources.getColor(eq(R.color.notification_material_background_color),
3570 anyObject())).thenReturn(Color.WHITE);
3571
3572 // setUp() adds a secondary user for CALLER_USER_HANDLE. Remove it as otherwise the
3573 // feature is disabled because there are non-affiliated secondary users.
Pavel Grafov75c0a892017-05-18 17:28:27 +01003574 getServices().removeUser(DpmMockContext.CALLER_USER_HANDLE);
Ricky Wai1a6e6672017-10-27 14:46:01 +01003575 when(getServices().iipConnectivityMetrics.addNetdEventCallback(anyInt(), anyObject()))
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003576 .thenReturn(true);
3577
3578 // No logs were retrieved so far.
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003579 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003580
3581 // Attempting to retrieve logs without enabling logging should not change the timestamp.
3582 dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003583 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003584
3585 // Enabling logging should not change the timestamp.
3586 dpm.setNetworkLoggingEnabled(admin1, true);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003587 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003588
3589 // Retrieving the logs should update the timestamp.
3590 final long beforeRetrieval = System.currentTimeMillis();
3591 dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003592 final long firstNetworkLogRetrievalTime = dpm.getLastNetworkLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003593 final long afterRetrieval = System.currentTimeMillis();
3594 assertTrue(firstNetworkLogRetrievalTime >= beforeRetrieval);
3595 assertTrue(firstNetworkLogRetrievalTime <= afterRetrieval);
3596
3597 // Checking the timestamp again should not change it.
3598 Thread.sleep(2);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003599 assertEquals(firstNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003600
3601 // Retrieving the logs again should update the timestamp.
3602 dpm.retrieveNetworkLogs(admin1, 0 /* batchToken */);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003603 final long secondNetworkLogRetrievalTime = dpm.getLastNetworkLogRetrievalTime();
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003604 assertTrue(secondNetworkLogRetrievalTime > firstNetworkLogRetrievalTime);
3605
3606 // Disabling logging should not change the timestamp.
3607 Thread.sleep(2);
3608 dpm.setNetworkLoggingEnabled(admin1, false);
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003609 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003610
3611 // Restarting the DPMS should not lose the timestamp.
3612 initializeDpms();
Bartosz Fabianowski8d76e722016-11-25 12:36:20 +01003613 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
3614
3615 // Any uid holding MANAGE_USERS permission can retrieve the timestamp.
3616 mContext.binder.callingUid = 1234567;
3617 mContext.callerPermissions.add(permission.MANAGE_USERS);
3618 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
3619 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3620
3621 // System can retrieve the timestamp.
3622 mContext.binder.clearCallingIdentity();
3623 assertEquals(secondNetworkLogRetrievalTime, dpm.getLastNetworkLogRetrievalTime());
3624
3625 // Removing the device owner should clear the timestamp.
3626 clearDeviceOwner();
3627 assertEquals(-1, dpm.getLastNetworkLogRetrievalTime());
Bartosz Fabianowskib21b2412016-11-17 04:53:33 +01003628 }
3629
Tony Mak2f26b792016-11-28 17:54:51 +00003630 public void testGetBindDeviceAdminTargetUsers() throws Exception {
3631 // Setup device owner.
3632 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3633 setupDeviceOwner();
3634
3635 // Only device owner is setup, the result list should be empty.
3636 List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3637 MoreAsserts.assertEmpty(targetUsers);
3638
3639 // Setup a managed profile managed by the same admin.
3640 final int MANAGED_PROFILE_USER_ID = 15;
3641 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456);
3642 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3643
3644 // Add a secondary user, it should never talk with.
3645 final int ANOTHER_USER_ID = 36;
Pavel Grafov75c0a892017-05-18 17:28:27 +01003646 getServices().addUser(ANOTHER_USER_ID, 0);
Tony Mak2f26b792016-11-28 17:54:51 +00003647
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003648 // Since the managed profile is not affiliated, they should not be allowed to talk to each
3649 // other.
3650 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3651 MoreAsserts.assertEmpty(targetUsers);
3652
3653 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3654 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3655 MoreAsserts.assertEmpty(targetUsers);
3656
3657 // Setting affiliation ids
Tony Mak31657432017-04-25 09:29:55 +01003658 final Set<String> userAffiliationIds = Collections.singleton("some.affiliation-id");
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003659 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3660 dpm.setAffiliationIds(admin1, userAffiliationIds);
3661
3662 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3663 dpm.setAffiliationIds(admin1, userAffiliationIds);
3664
Tony Mak2f26b792016-11-28 17:54:51 +00003665 // Calling from device owner admin, the result list should just contain the managed
3666 // profile user id.
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003667 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Tony Mak2f26b792016-11-28 17:54:51 +00003668 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3669 MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.of(MANAGED_PROFILE_USER_ID));
3670
3671 // Calling from managed profile admin, the result list should just contain the system
3672 // user id.
3673 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3674 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3675 MoreAsserts.assertContentsInAnyOrder(targetUsers, UserHandle.SYSTEM);
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003676
3677 // Changing affiliation ids in one
Tony Mak31657432017-04-25 09:29:55 +01003678 dpm.setAffiliationIds(admin1, Collections.singleton("some-different-affiliation-id"));
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003679
3680 // Since the managed profile is not affiliated any more, they should not be allowed to talk
3681 // to each other.
3682 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3683 MoreAsserts.assertEmpty(targetUsers);
3684
3685 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3686 targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3687 MoreAsserts.assertEmpty(targetUsers);
Tony Mak2f26b792016-11-28 17:54:51 +00003688 }
3689
3690 public void testGetBindDeviceAdminTargetUsers_differentPackage() throws Exception {
3691 // Setup a device owner.
3692 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3693 setupDeviceOwner();
3694
3695 // Set up a managed profile managed by different package.
3696 final int MANAGED_PROFILE_USER_ID = 15;
3697 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456);
3698 final ComponentName adminDifferentPackage =
3699 new ComponentName("another.package", "whatever.class");
3700 addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2);
3701
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003702 // Setting affiliation ids
Tony Mak31657432017-04-25 09:29:55 +01003703 final Set<String> userAffiliationIds = Collections.singleton("some-affiliation-id");
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003704 dpm.setAffiliationIds(admin1, userAffiliationIds);
3705
3706 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3707 dpm.setAffiliationIds(adminDifferentPackage, userAffiliationIds);
3708
Tony Mak2f26b792016-11-28 17:54:51 +00003709 // Calling from device owner admin, we should get zero bind device admin target users as
3710 // their packages are different.
Nicolas Prevotd5b03602016-12-06 13:32:22 +00003711 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Tony Mak2f26b792016-11-28 17:54:51 +00003712 List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(admin1);
3713 MoreAsserts.assertEmpty(targetUsers);
3714
3715 // Calling from managed profile admin, we should still get zero target users for the same
3716 // reason.
3717 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3718 targetUsers = dpm.getBindDeviceAdminTargetUsers(adminDifferentPackage);
3719 MoreAsserts.assertEmpty(targetUsers);
3720 }
3721
Jason Parks3c13b642017-11-28 15:39:43 -06003722 private void verifyLockTaskState(int userId) throws Exception {
Benjamin Franz78ae1062018-03-26 11:01:32 +01003723 verifyLockTaskState(userId, new String[0],
3724 DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS);
Jason Parks3c13b642017-11-28 15:39:43 -06003725 }
3726
3727 private void verifyLockTaskState(int userId, String[] packages, int flags) throws Exception {
3728 verify(getServices().iactivityManager).updateLockTaskPackages(userId, packages);
3729 verify(getServices().iactivityManager).updateLockTaskFeatures(userId, flags);
3730 }
3731
3732 private void verifyCanSetLockTask(int uid, int userId, ComponentName who, String[] packages,
3733 int flags) throws Exception {
3734 mContext.binder.callingUid = uid;
3735 dpm.setLockTaskPackages(who, packages);
3736 MoreAsserts.assertEquals(packages, dpm.getLockTaskPackages(who));
3737 for (String p : packages) {
3738 assertTrue(dpm.isLockTaskPermitted(p));
3739 }
3740 assertFalse(dpm.isLockTaskPermitted("anotherPackage"));
3741 // Test to see if set lock task features can be set
3742 dpm.setLockTaskFeatures(who, flags);
3743 verifyLockTaskState(userId, packages, flags);
3744 }
3745
3746 private void verifyCanNotSetLockTask(int uid, ComponentName who, String[] packages,
3747 int flags) throws Exception {
3748 mContext.binder.callingUid = uid;
3749 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
3750 () -> dpm.setLockTaskPackages(who, packages));
3751 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
3752 () -> dpm.getLockTaskPackages(who));
3753 assertFalse(dpm.isLockTaskPermitted("doPackage1"));
3754 assertExpectException(SecurityException.class, /* messageRegex =*/ null,
3755 () -> dpm.setLockTaskFeatures(who, flags));
3756 }
3757
Charles Hee078db72017-10-19 18:03:20 +01003758 public void testLockTaskPolicyAllowedForAffiliatedUsers() throws Exception {
Esteban Talaverabdcada92017-02-01 14:20:06 +00003759 // Setup a device owner.
3760 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3761 setupDeviceOwner();
Charles Hee078db72017-10-19 18:03:20 +01003762 // Lock task policy is updated when loading user data.
Jason Parks3c13b642017-11-28 15:39:43 -06003763 verifyLockTaskState(UserHandle.USER_SYSTEM);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003764
3765 // Set up a managed profile managed by different package (package name shouldn't matter)
3766 final int MANAGED_PROFILE_USER_ID = 15;
3767 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456);
3768 final ComponentName adminDifferentPackage =
3769 new ComponentName("another.package", "whatever.class");
3770 addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2);
Jason Parks3c13b642017-11-28 15:39:43 -06003771 verifyLockTaskState(MANAGED_PROFILE_USER_ID);
3772
3773 // Setup a PO on the secondary user
3774 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
3775 setAsProfileOwner(admin3);
3776 verifyLockTaskState(DpmMockContext.CALLER_USER_HANDLE);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003777
3778 // The DO can still set lock task packages
Esteban Talaverabdcada92017-02-01 14:20:06 +00003779 final String[] doPackages = {"doPackage1", "doPackage2"};
Jason Parks3c13b642017-11-28 15:39:43 -06003780 final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
Benjamin Franzcaffa772018-02-05 16:36:10 +00003781 | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
3782 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
Jason Parks3c13b642017-11-28 15:39:43 -06003783 verifyCanSetLockTask(DpmMockContext.CALLER_SYSTEM_USER_UID, UserHandle.USER_SYSTEM, admin1, doPackages, flags);
3784
3785 final String[] secondaryPoPackages = {"secondaryPoPackage1", "secondaryPoPackage2"};
3786 final int secondaryPoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
Benjamin Franzcaffa772018-02-05 16:36:10 +00003787 | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
3788 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
Jason Parks3c13b642017-11-28 15:39:43 -06003789 verifyCanNotSetLockTask(DpmMockContext.CALLER_UID, admin3, secondaryPoPackages, secondaryPoFlags);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003790
3791 // Managed profile is unaffiliated - shouldn't be able to setLockTaskPackages.
3792 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3793 final String[] poPackages = {"poPackage1", "poPackage2"};
Charles Hee078db72017-10-19 18:03:20 +01003794 final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
Benjamin Franzcaffa772018-02-05 16:36:10 +00003795 | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
3796 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
Jason Parks3c13b642017-11-28 15:39:43 -06003797 verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, poPackages, poFlags);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003798
3799 // Setting same affiliation ids
Tony Mak31657432017-04-25 09:29:55 +01003800 final Set<String> userAffiliationIds = Collections.singleton("some-affiliation-id");
Esteban Talaverabdcada92017-02-01 14:20:06 +00003801 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3802 dpm.setAffiliationIds(admin1, userAffiliationIds);
3803
3804 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3805 dpm.setAffiliationIds(adminDifferentPackage, userAffiliationIds);
3806
3807 // Now the managed profile can set lock task packages.
3808 dpm.setLockTaskPackages(adminDifferentPackage, poPackages);
3809 MoreAsserts.assertEquals(poPackages, dpm.getLockTaskPackages(adminDifferentPackage));
3810 assertTrue(dpm.isLockTaskPermitted("poPackage1"));
3811 assertFalse(dpm.isLockTaskPermitted("doPackage2"));
Charles Hee078db72017-10-19 18:03:20 +01003812 // And it can set lock task features.
3813 dpm.setLockTaskFeatures(adminDifferentPackage, poFlags);
Jason Parks3c13b642017-11-28 15:39:43 -06003814 verifyLockTaskState(MANAGED_PROFILE_USER_ID, poPackages, poFlags);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003815
3816 // Unaffiliate the profile, lock task mode no longer available on the profile.
Tony Mak31657432017-04-25 09:29:55 +01003817 dpm.setAffiliationIds(adminDifferentPackage, Collections.emptySet());
Esteban Talaverabdcada92017-02-01 14:20:06 +00003818 assertFalse(dpm.isLockTaskPermitted("poPackage1"));
3819 // Lock task packages cleared when loading user data and when the user becomes unaffiliated.
Charles Hee078db72017-10-19 18:03:20 +01003820 verify(getServices().iactivityManager, times(2)).updateLockTaskPackages(
3821 MANAGED_PROFILE_USER_ID, new String[0]);
3822 verify(getServices().iactivityManager, times(2)).updateLockTaskFeatures(
3823 MANAGED_PROFILE_USER_ID, DevicePolicyManager.LOCK_TASK_FEATURE_NONE);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003824
Jason Parks3c13b642017-11-28 15:39:43 -06003825 // Verify that lock task packages were not cleared for the DO
Esteban Talaverabdcada92017-02-01 14:20:06 +00003826 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3827 assertTrue(dpm.isLockTaskPermitted("doPackage1"));
Jason Parks3c13b642017-11-28 15:39:43 -06003828
3829 }
3830
3831 public void testLockTaskPolicyForProfileOwner() throws Exception {
3832 // Setup a PO
3833 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
3834 setAsProfileOwner(admin1);
3835 verifyLockTaskState(DpmMockContext.CALLER_USER_HANDLE);
3836
3837 final String[] poPackages = {"poPackage1", "poPackage2"};
3838 final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
Benjamin Franzcaffa772018-02-05 16:36:10 +00003839 | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
3840 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
Jason Parks3c13b642017-11-28 15:39:43 -06003841 verifyCanSetLockTask(DpmMockContext.CALLER_UID, DpmMockContext.CALLER_USER_HANDLE, admin1,
3842 poPackages, poFlags);
3843
3844 // Set up a managed profile managed by different package (package name shouldn't matter)
3845 final int MANAGED_PROFILE_USER_ID = 15;
3846 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 20456);
3847 final ComponentName adminDifferentPackage =
3848 new ComponentName("another.package", "whatever.class");
3849 addManagedProfile(adminDifferentPackage, MANAGED_PROFILE_ADMIN_UID, admin2);
3850 verifyLockTaskState(MANAGED_PROFILE_USER_ID);
3851
3852 // Managed profile is unaffiliated - shouldn't be able to setLockTaskPackages.
3853 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3854 final String[] mpoPackages = {"poPackage1", "poPackage2"};
3855 final int mpoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
Benjamin Franzcaffa772018-02-05 16:36:10 +00003856 | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
3857 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
Jason Parks3c13b642017-11-28 15:39:43 -06003858 verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, mpoPackages, mpoFlags);
Esteban Talaverabdcada92017-02-01 14:20:06 +00003859 }
3860
Benjamin Franzcaffa772018-02-05 16:36:10 +00003861 public void testLockTaskFeatures_IllegalArgumentException() throws Exception {
3862 // Setup a device owner.
3863 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3864 setupDeviceOwner();
3865 // Lock task policy is updated when loading user data.
3866 verifyLockTaskState(UserHandle.USER_SYSTEM);
3867
3868 final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
3869 | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
3870 assertExpectException(IllegalArgumentException.class,
3871 "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME",
3872 () -> dpm.setLockTaskFeatures(admin1, flags));
3873 }
3874
Bartosz Fabianowskidd7f8da2016-11-30 11:09:22 +01003875 public void testIsDeviceManaged() throws Exception {
3876 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3877 setupDeviceOwner();
3878
3879 // The device owner itself, any uid holding MANAGE_USERS permission and the system can
3880 // find out that the device has a device owner.
3881 assertTrue(dpm.isDeviceManaged());
3882 mContext.binder.callingUid = 1234567;
3883 mContext.callerPermissions.add(permission.MANAGE_USERS);
3884 assertTrue(dpm.isDeviceManaged());
3885 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3886 mContext.binder.clearCallingIdentity();
3887 assertTrue(dpm.isDeviceManaged());
3888
3889 clearDeviceOwner();
3890
3891 // Any uid holding MANAGE_USERS permission and the system can find out that the device does
3892 // not have a device owner.
3893 mContext.binder.callingUid = 1234567;
3894 mContext.callerPermissions.add(permission.MANAGE_USERS);
3895 assertFalse(dpm.isDeviceManaged());
3896 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3897 mContext.binder.clearCallingIdentity();
3898 assertFalse(dpm.isDeviceManaged());
3899 }
3900
Bartosz Fabianowski365a3db2016-11-30 18:28:10 +01003901 public void testDeviceOwnerOrganizationName() throws Exception {
3902 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
3903 setupDeviceOwner();
3904
3905 dpm.setOrganizationName(admin1, "organization");
3906
3907 // Device owner can retrieve organization managing the device.
3908 assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
3909
3910 // Any uid holding MANAGE_USERS permission can retrieve organization managing the device.
3911 mContext.binder.callingUid = 1234567;
3912 mContext.callerPermissions.add(permission.MANAGE_USERS);
3913 assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
3914 mContext.callerPermissions.remove(permission.MANAGE_USERS);
3915
3916 // System can retrieve organization managing the device.
3917 mContext.binder.clearCallingIdentity();
3918 assertEquals("organization", dpm.getDeviceOwnerOrganizationName());
3919
3920 // Removing the device owner clears the organization managing the device.
3921 clearDeviceOwner();
3922 assertNull(dpm.getDeviceOwnerOrganizationName());
3923 }
3924
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003925 public void testWipeDataManagedProfile() throws Exception {
3926 final int MANAGED_PROFILE_USER_ID = 15;
3927 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
3928 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3929 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
3930
3931 // Even if the caller is the managed profile, the current user is the user 0
Pavel Grafov75c0a892017-05-18 17:28:27 +01003932 when(getServices().iactivityManager.getCurrentUser())
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003933 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
yuemingwf7f67dc2017-09-08 14:23:53 +01003934 // Get mock reason string since we throw an IAE with empty string input.
3935 when(mContext.getResources().getString(R.string.work_profile_deleted_description_dpm_wipe)).
3936 thenReturn("Just a test string.");
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003937
3938 dpm.wipeData(0);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003939 verify(getServices().userManagerInternal).removeUserEvenWhenDisallowed(
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003940 MANAGED_PROFILE_USER_ID);
3941 }
3942
3943 public void testWipeDataManagedProfileDisallowed() throws Exception {
3944 final int MANAGED_PROFILE_USER_ID = 15;
3945 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
3946 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
3947
3948 // Even if the caller is the managed profile, the current user is the user 0
Pavel Grafov75c0a892017-05-18 17:28:27 +01003949 when(getServices().iactivityManager.getCurrentUser())
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003950 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
3951
Pavel Grafov75c0a892017-05-18 17:28:27 +01003952 when(getServices().userManager.getUserRestrictionSource(
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003953 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
3954 UserHandle.of(MANAGED_PROFILE_USER_ID)))
3955 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
yuemingwf7f67dc2017-09-08 14:23:53 +01003956 when(mContext.getResources().getString(R.string.work_profile_deleted_description_dpm_wipe)).
3957 thenReturn("Just a test string.");
3958
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003959 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
Pavel Grafova1ea8d92017-05-25 21:55:24 +01003960 // The PO is not allowed to remove the profile if the user restriction was set on the
3961 // profile by the system
3962 assertExpectException(SecurityException.class, /* messageRegex= */ null,
3963 () -> dpm.wipeData(0));
Nicolas Prevotc9c1b2f2017-01-12 10:52:50 +00003964 }
3965
Esteban Talaverab88f42b2017-01-24 16:47:16 +00003966 public void testWipeDataDeviceOwner() throws Exception {
3967 setDeviceOwner();
Pavel Grafov75c0a892017-05-18 17:28:27 +01003968 when(getServices().userManager.getUserRestrictionSource(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00003969 UserManager.DISALLOW_FACTORY_RESET,
3970 UserHandle.SYSTEM))
3971 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
yuemingwf7f67dc2017-09-08 14:23:53 +01003972 when(mContext.getResources().getString(R.string.work_profile_deleted_description_dpm_wipe)).
3973 thenReturn("Just a test string.");
Esteban Talaverab88f42b2017-01-24 16:47:16 +00003974
3975 dpm.wipeData(0);
Pavel Grafov75c0a892017-05-18 17:28:27 +01003976 verify(getServices().recoverySystem).rebootWipeUserData(
yinxuf4f9cec2017-06-19 10:28:19 -07003977 /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true),
3978 /*wipeEuicc=*/ eq(false));
3979 }
3980
3981 public void testWipeEuiccDataEnabled() throws Exception {
3982 setDeviceOwner();
3983 when(getServices().userManager.getUserRestrictionSource(
3984 UserManager.DISALLOW_FACTORY_RESET,
3985 UserHandle.SYSTEM))
3986 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
yuemingwf7f67dc2017-09-08 14:23:53 +01003987 when(mContext.getResources().getString(R.string.work_profile_deleted_description_dpm_wipe)).
3988 thenReturn("Just a test string.");
yinxuf4f9cec2017-06-19 10:28:19 -07003989
3990 dpm.wipeData(WIPE_EUICC);
3991 verify(getServices().recoverySystem).rebootWipeUserData(
3992 /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true),
3993 /*wipeEuicc=*/ eq(true));
Esteban Talaverab88f42b2017-01-24 16:47:16 +00003994 }
3995
3996 public void testWipeDataDeviceOwnerDisallowed() throws Exception {
3997 setDeviceOwner();
Pavel Grafov75c0a892017-05-18 17:28:27 +01003998 when(getServices().userManager.getUserRestrictionSource(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00003999 UserManager.DISALLOW_FACTORY_RESET,
4000 UserHandle.SYSTEM))
4001 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
yuemingwf7f67dc2017-09-08 14:23:53 +01004002 when(mContext.getResources().getString(R.string.work_profile_deleted_description_dpm_wipe)).
4003 thenReturn("Just a test string.");
Pavel Grafova1ea8d92017-05-25 21:55:24 +01004004 // The DO is not allowed to wipe the device if the user restriction was set
4005 // by the system
4006 assertExpectException(SecurityException.class, /* messageRegex= */ null,
4007 () -> dpm.wipeData(0));
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004008 }
4009
4010 public void testMaximumFailedPasswordAttemptsReachedManagedProfile() throws Exception {
4011 final int MANAGED_PROFILE_USER_ID = 15;
4012 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
4013 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
4014
4015 // Even if the caller is the managed profile, the current user is the user 0
Pavel Grafov75c0a892017-05-18 17:28:27 +01004016 when(getServices().iactivityManager.getCurrentUser())
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004017 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
4018
Pavel Grafov75c0a892017-05-18 17:28:27 +01004019 when(getServices().userManager.getUserRestrictionSource(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004020 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
4021 UserHandle.of(MANAGED_PROFILE_USER_ID)))
4022 .thenReturn(UserManager.RESTRICTION_SOURCE_PROFILE_OWNER);
4023
4024 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4025 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
4026
4027 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4028 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
4029 // Failed password attempts on the parent user are taken into account, as there isn't a
4030 // separate work challenge.
4031 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4032 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4033 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4034
4035 // The profile should be wiped even if DISALLOW_REMOVE_MANAGED_PROFILE is enabled, because
4036 // both the user restriction and the policy were set by the PO.
Pavel Grafov75c0a892017-05-18 17:28:27 +01004037 verify(getServices().userManagerInternal).removeUserEvenWhenDisallowed(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004038 MANAGED_PROFILE_USER_ID);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004039 verifyZeroInteractions(getServices().recoverySystem);
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004040 }
4041
4042 public void testMaximumFailedPasswordAttemptsReachedManagedProfileDisallowed()
4043 throws Exception {
4044 final int MANAGED_PROFILE_USER_ID = 15;
4045 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
4046 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
4047
4048 // Even if the caller is the managed profile, the current user is the user 0
Pavel Grafov75c0a892017-05-18 17:28:27 +01004049 when(getServices().iactivityManager.getCurrentUser())
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004050 .thenReturn(new UserInfo(UserHandle.USER_SYSTEM, "user system", 0));
4051
Pavel Grafov75c0a892017-05-18 17:28:27 +01004052 when(getServices().userManager.getUserRestrictionSource(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004053 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
4054 UserHandle.of(MANAGED_PROFILE_USER_ID)))
4055 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
4056
4057 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4058 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
4059
4060 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4061 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
4062 // Failed password attempts on the parent user are taken into account, as there isn't a
4063 // separate work challenge.
4064 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4065 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4066 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4067
4068 // DISALLOW_REMOVE_MANAGED_PROFILE was set by the system, not the PO, so the profile is
4069 // not wiped.
Pavel Grafov75c0a892017-05-18 17:28:27 +01004070 verify(getServices().userManagerInternal, never())
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004071 .removeUserEvenWhenDisallowed(anyInt());
Pavel Grafov75c0a892017-05-18 17:28:27 +01004072 verifyZeroInteractions(getServices().recoverySystem);
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004073 }
4074
4075 public void testMaximumFailedPasswordAttemptsReachedDeviceOwner() throws Exception {
4076 setDeviceOwner();
Pavel Grafov75c0a892017-05-18 17:28:27 +01004077 when(getServices().userManager.getUserRestrictionSource(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004078 UserManager.DISALLOW_FACTORY_RESET,
4079 UserHandle.SYSTEM))
4080 .thenReturn(UserManager.RESTRICTION_SOURCE_DEVICE_OWNER);
4081
4082 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
4083
4084 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4085 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
4086 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4087 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4088 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4089
4090 // The device should be wiped even if DISALLOW_FACTORY_RESET is enabled, because both the
4091 // user restriction and the policy were set by the DO.
Pavel Grafov75c0a892017-05-18 17:28:27 +01004092 verify(getServices().recoverySystem).rebootWipeUserData(
yinxuf4f9cec2017-06-19 10:28:19 -07004093 /*shutdown=*/ eq(false), anyString(), /*force=*/ eq(true),
4094 /*wipeEuicc=*/ eq(false));
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004095 }
4096
4097 public void testMaximumFailedPasswordAttemptsReachedDeviceOwnerDisallowed() throws Exception {
4098 setDeviceOwner();
Pavel Grafov75c0a892017-05-18 17:28:27 +01004099 when(getServices().userManager.getUserRestrictionSource(
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004100 UserManager.DISALLOW_FACTORY_RESET,
4101 UserHandle.SYSTEM))
4102 .thenReturn(UserManager.RESTRICTION_SOURCE_SYSTEM);
4103
4104 dpm.setMaximumFailedPasswordsForWipe(admin1, 3);
4105
4106 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4107 mContext.callerPermissions.add(permission.BIND_DEVICE_ADMIN);
4108 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4109 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4110 dpm.reportFailedPasswordAttempt(UserHandle.USER_SYSTEM);
4111
4112 // DISALLOW_FACTORY_RESET was set by the system, not the DO, so the device is not wiped.
Pavel Grafov75c0a892017-05-18 17:28:27 +01004113 verifyZeroInteractions(getServices().recoverySystem);
4114 verify(getServices().userManagerInternal, never())
Esteban Talaverab88f42b2017-01-24 16:47:16 +00004115 .removeUserEvenWhenDisallowed(anyInt());
4116 }
4117
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004118 public void testGetPermissionGrantState() throws Exception {
4119 final String permission = "some.permission";
4120 final String app1 = "com.example.app1";
4121 final String app2 = "com.example.app2";
4122
Pavel Grafov75c0a892017-05-18 17:28:27 +01004123 when(getServices().ipackageManager.checkPermission(eq(permission), eq(app1), anyInt()))
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004124 .thenReturn(PackageManager.PERMISSION_GRANTED);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004125 doReturn(PackageManager.FLAG_PERMISSION_POLICY_FIXED).when(getServices().packageManager)
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004126 .getPermissionFlags(permission, app1, UserHandle.SYSTEM);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004127 when(getServices().packageManager.getPermissionFlags(permission, app1,
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004128 UserHandle.of(DpmMockContext.CALLER_USER_HANDLE)))
4129 .thenReturn(PackageManager.FLAG_PERMISSION_POLICY_FIXED);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004130 when(getServices().ipackageManager.checkPermission(eq(permission), eq(app2), anyInt()))
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004131 .thenReturn(PackageManager.PERMISSION_DENIED);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004132 doReturn(0).when(getServices().packageManager).getPermissionFlags(permission, app2,
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004133 UserHandle.SYSTEM);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004134 when(getServices().packageManager.getPermissionFlags(permission, app2,
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004135 UserHandle.of(DpmMockContext.CALLER_USER_HANDLE))).thenReturn(0);
4136
4137 // System can retrieve permission grant state.
4138 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01004139 mContext.packageName = "com.example.system";
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004140 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED,
4141 dpm.getPermissionGrantState(null, app1, permission));
4142 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT,
4143 dpm.getPermissionGrantState(null, app2, permission));
4144
4145 // A regular app cannot retrieve permission grant state.
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01004146 mContext.binder.callingUid = setupPackageInPackageManager(app1, 1);
4147 mContext.packageName = app1;
Pavel Grafova1ea8d92017-05-25 21:55:24 +01004148 assertExpectException(SecurityException.class, /* messageRegex= */ null,
4149 () -> dpm.getPermissionGrantState(null, app1, permission));
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004150
4151 // Profile owner can retrieve permission grant state.
Bartosz Fabianowski2dbf9ae2017-01-27 14:47:17 +01004152 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
4153 mContext.packageName = admin1.getPackageName();
Bartosz Fabianowski4b0624f2017-01-16 11:47:28 +01004154 setAsProfileOwner(admin1);
4155 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED,
4156 dpm.getPermissionGrantState(admin1, app1, permission));
4157 assertEquals(DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT,
4158 dpm.getPermissionGrantState(admin1, app2, permission));
4159 }
4160
Rubin Xuaab7a412016-12-30 21:13:29 +00004161 public void testResetPasswordWithToken() throws Exception {
4162 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
4163 setupDeviceOwner();
4164 // test token validation
Pavel Grafova1ea8d92017-05-25 21:55:24 +01004165 assertExpectException(IllegalArgumentException.class, /* messageRegex= */ null,
4166 () -> dpm.setResetPasswordToken(admin1, new byte[31]));
4167
Rubin Xuaab7a412016-12-30 21:13:29 +00004168 // test adding a token
4169 final byte[] token = new byte[32];
4170 final long handle = 123456;
4171 final String password = "password";
Pavel Grafov75c0a892017-05-18 17:28:27 +01004172 when(getServices().lockPatternUtils.addEscrowToken(eq(token), eq(UserHandle.USER_SYSTEM)))
Rubin Xuaab7a412016-12-30 21:13:29 +00004173 .thenReturn(handle);
4174 assertTrue(dpm.setResetPasswordToken(admin1, token));
4175
4176 // test password activation
Pavel Grafov75c0a892017-05-18 17:28:27 +01004177 when(getServices().lockPatternUtils.isEscrowTokenActive(eq(handle), eq(UserHandle.USER_SYSTEM)))
Rubin Xuaab7a412016-12-30 21:13:29 +00004178 .thenReturn(true);
4179 assertTrue(dpm.isResetPasswordTokenActive(admin1));
4180
4181 // test reset password with token
Pavel Grafov75c0a892017-05-18 17:28:27 +01004182 when(getServices().lockPatternUtils.setLockCredentialWithToken(eq(password),
Rubin Xu7cf45092017-08-28 11:47:35 +01004183 eq(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD),
4184 eq(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED), eq(handle), eq(token),
Rubin Xuaab7a412016-12-30 21:13:29 +00004185 eq(UserHandle.USER_SYSTEM)))
4186 .thenReturn(true);
4187 assertTrue(dpm.resetPasswordWithToken(admin1, password, token, 0));
4188
4189 // test removing a token
Pavel Grafov75c0a892017-05-18 17:28:27 +01004190 when(getServices().lockPatternUtils.removeEscrowToken(eq(handle), eq(UserHandle.USER_SYSTEM)))
Rubin Xuaab7a412016-12-30 21:13:29 +00004191 .thenReturn(true);
4192 assertTrue(dpm.clearResetPasswordToken(admin1));
4193 }
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004194
Alexandru-Andrei Rotaru7f31bb02017-09-07 16:29:48 +01004195 public void testSetPasswordBlacklistCannotBeCalledByNonAdmin() throws Exception {
4196 assertExpectException(SecurityException.class, /* messageRegex= */ null,
4197 () -> dpm.setPasswordBlacklist(admin1, null, null));
4198 verifyZeroInteractions(getServices().passwordBlacklist);
4199 }
4200
4201 public void testClearingPasswordBlacklistDoesNotCreateNewBlacklist() throws Exception {
4202 setupProfileOwner();
4203 dpm.setPasswordBlacklist(admin1, null, null);
4204 verifyZeroInteractions(getServices().passwordBlacklist);
4205 }
4206
4207 public void testSetPasswordBlacklistCreatesNewBlacklist() throws Exception {
4208 final String name = "myblacklist";
4209 final List<String> explicit = Arrays.asList("password", "letmein");
4210 setupProfileOwner();
4211 dpm.setPasswordBlacklist(admin1, name, explicit);
4212 verify(getServices().passwordBlacklist).savePasswordBlacklist(name, explicit);
4213 }
4214
4215 public void testSetPasswordBlacklistOnlyConvertsExplicitToLowerCase() throws Exception {
4216 final List<String> mixedCase = Arrays.asList("password", "LETMEIN", "FooTBAll");
4217 final List<String> lowerCase = Arrays.asList("password", "letmein", "football");
4218 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
4219 setupDeviceOwner();
4220 final String name = "Name of the Blacklist";
4221 dpm.setPasswordBlacklist(admin1, name, mixedCase);
4222 verify(getServices().passwordBlacklist).savePasswordBlacklist(name, lowerCase);
4223 }
4224
Eric Sandnessfabfcb02017-05-03 18:28:56 +01004225 public void testIsActivePasswordSufficient() throws Exception {
4226 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
4227 mContext.packageName = admin1.getPackageName();
4228 setupDeviceOwner();
4229
4230 dpm.setPasswordQuality(admin1, DevicePolicyManager.PASSWORD_QUALITY_COMPLEX);
4231 dpm.setPasswordMinimumLength(admin1, 8);
4232 dpm.setPasswordMinimumLetters(admin1, 6);
4233 dpm.setPasswordMinimumLowerCase(admin1, 3);
4234 dpm.setPasswordMinimumUpperCase(admin1, 1);
4235 dpm.setPasswordMinimumNonLetter(admin1, 1);
4236 dpm.setPasswordMinimumNumeric(admin1, 1);
4237 dpm.setPasswordMinimumSymbols(admin1, 0);
4238
Rubin Xucc391c22018-01-02 20:37:35 +00004239 reset(mContext.spiedContext);
4240
Eric Sandnessfabfcb02017-05-03 18:28:56 +01004241 PasswordMetrics passwordMetricsNoSymbols = new PasswordMetrics(
4242 DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, 9,
4243 8, 2,
4244 6, 1,
4245 0, 1);
4246
4247 setActivePasswordState(passwordMetricsNoSymbols);
4248 assertTrue(dpm.isActivePasswordSufficient());
4249
4250 initializeDpms();
4251 reset(mContext.spiedContext);
4252 assertTrue(dpm.isActivePasswordSufficient());
4253
4254 // This call simulates the user entering the password for the first time after a reboot.
4255 // This causes password metrics to be reloaded into memory. Until this happens,
4256 // dpm.isActivePasswordSufficient() will continue to return its last checkpointed value,
4257 // even if the DPC changes password requirements so that the password no longer meets the
4258 // requirements. This is a known limitation of the current implementation of
4259 // isActivePasswordSufficient() - see b/34218769.
4260 setActivePasswordState(passwordMetricsNoSymbols);
4261 assertTrue(dpm.isActivePasswordSufficient());
4262
4263 dpm.setPasswordMinimumSymbols(admin1, 1);
4264 // This assertion would fail if we had not called setActivePasswordState() again after
4265 // initializeDpms() - see previous comment.
4266 assertFalse(dpm.isActivePasswordSufficient());
4267
4268 initializeDpms();
4269 reset(mContext.spiedContext);
4270 assertFalse(dpm.isActivePasswordSufficient());
4271
4272 PasswordMetrics passwordMetricsWithSymbols = new PasswordMetrics(
4273 DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, 9,
4274 7, 2,
4275 5, 1,
4276 1, 2);
4277
4278 setActivePasswordState(passwordMetricsWithSymbols);
4279 assertTrue(dpm.isActivePasswordSufficient());
4280 }
4281
Pavel Grafov75c0a892017-05-18 17:28:27 +01004282 private void setActivePasswordState(PasswordMetrics passwordMetrics)
4283 throws Exception {
4284 final int userHandle = UserHandle.getUserId(mContext.binder.callingUid);
Eric Sandnessfabfcb02017-05-03 18:28:56 +01004285 final long ident = mContext.binder.clearCallingIdentity();
Eric Sandnessfabfcb02017-05-03 18:28:56 +01004286
Pavel Grafov75c0a892017-05-18 17:28:27 +01004287 dpm.setActivePasswordState(passwordMetrics, userHandle);
4288 dpm.reportPasswordChanged(userHandle);
Eric Sandnessfabfcb02017-05-03 18:28:56 +01004289
Rubin Xucc391c22018-01-02 20:37:35 +00004290 // Drain ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED broadcasts as part of
4291 // reportPasswordChanged()
4292 verify(mContext.spiedContext, times(3)).sendBroadcastAsUser(
4293 MockUtils.checkIntentAction(
4294 DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED),
4295 MockUtils.checkUserHandle(userHandle));
4296
Pavel Grafov75c0a892017-05-18 17:28:27 +01004297 final Intent intent = new Intent(DeviceAdminReceiver.ACTION_PASSWORD_CHANGED);
4298 intent.setComponent(admin1);
Rubin Xucc391c22018-01-02 20:37:35 +00004299 intent.putExtra(Intent.EXTRA_USER, UserHandle.of(userHandle));
Pavel Grafov75c0a892017-05-18 17:28:27 +01004300
4301 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
4302 MockUtils.checkIntent(intent),
4303 MockUtils.checkUserHandle(userHandle));
4304
4305 // CertificateMonitor.updateInstalledCertificates is called on the background thread,
4306 // let it finish with system uid, otherwise it will throw and crash.
4307 flushTasks();
4308
4309 mContext.binder.restoreCallingIdentity(ident);
Eric Sandnessfabfcb02017-05-03 18:28:56 +01004310 }
4311
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004312 public void testIsCurrentInputMethodSetByOwnerForDeviceOwner() throws Exception {
4313 final String currentIme = Settings.Secure.DEFAULT_INPUT_METHOD;
4314 final Uri currentImeUri = Settings.Secure.getUriFor(currentIme);
4315 final int deviceOwnerUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
4316 final int firstUserSystemUid = UserHandle.getUid(UserHandle.USER_SYSTEM,
4317 DpmMockContext.SYSTEM_UID);
4318 final int secondUserSystemUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE,
4319 DpmMockContext.SYSTEM_UID);
4320
4321 // Set up a device owner.
4322 mContext.binder.callingUid = deviceOwnerUid;
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004323 setupDeviceOwner();
4324
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004325 // First and second user set IMEs manually.
4326 mContext.binder.callingUid = firstUserSystemUid;
4327 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4328 mContext.binder.callingUid = secondUserSystemUid;
4329 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004330
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004331 // Device owner changes IME for first user.
4332 mContext.binder.callingUid = deviceOwnerUid;
Pavel Grafov75c0a892017-05-18 17:28:27 +01004333 when(getServices().settings.settingsSecureGetStringForUser(currentIme, UserHandle.USER_SYSTEM))
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004334 .thenReturn("ime1");
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004335 dpm.setSecureSetting(admin1, currentIme, "ime2");
Pavel Grafov75c0a892017-05-18 17:28:27 +01004336 verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime2",
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004337 UserHandle.USER_SYSTEM);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004338 reset(getServices().settings);
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004339 dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
4340 mContext.binder.callingUid = firstUserSystemUid;
4341 assertTrue(dpm.isCurrentInputMethodSetByOwner());
4342 mContext.binder.callingUid = secondUserSystemUid;
4343 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004344
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004345 // Second user changes IME manually.
4346 dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
4347 mContext.binder.callingUid = firstUserSystemUid;
4348 assertTrue(dpm.isCurrentInputMethodSetByOwner());
4349 mContext.binder.callingUid = secondUserSystemUid;
4350 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004351
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004352 // First user changes IME manually.
4353 dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
4354 mContext.binder.callingUid = firstUserSystemUid;
4355 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4356 mContext.binder.callingUid = secondUserSystemUid;
4357 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004358
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004359 // Device owner changes IME for first user again.
4360 mContext.binder.callingUid = deviceOwnerUid;
Pavel Grafov75c0a892017-05-18 17:28:27 +01004361 when(getServices().settings.settingsSecureGetStringForUser(currentIme, UserHandle.USER_SYSTEM))
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004362 .thenReturn("ime2");
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004363 dpm.setSecureSetting(admin1, currentIme, "ime3");
Pavel Grafov75c0a892017-05-18 17:28:27 +01004364 verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime3",
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004365 UserHandle.USER_SYSTEM);
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004366 dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
4367 mContext.binder.callingUid = firstUserSystemUid;
4368 assertTrue(dpm.isCurrentInputMethodSetByOwner());
4369 mContext.binder.callingUid = secondUserSystemUid;
4370 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004371
4372 // Restarting the DPMS should not lose information.
4373 initializeDpms();
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004374 mContext.binder.callingUid = firstUserSystemUid;
4375 assertTrue(dpm.isCurrentInputMethodSetByOwner());
4376 mContext.binder.callingUid = secondUserSystemUid;
4377 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004378
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004379 // Device owner can find out whether it set the current IME itself.
4380 mContext.binder.callingUid = deviceOwnerUid;
4381 assertTrue(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004382
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004383 // Removing the device owner should clear the information that it set the current IME.
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004384 clearDeviceOwner();
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004385 mContext.binder.callingUid = firstUserSystemUid;
4386 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4387 mContext.binder.callingUid = secondUserSystemUid;
4388 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004389 }
4390
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004391 public void testIsCurrentInputMethodSetByOwnerForProfileOwner() throws Exception {
4392 final String currentIme = Settings.Secure.DEFAULT_INPUT_METHOD;
4393 final Uri currentImeUri = Settings.Secure.getUriFor(currentIme);
4394 final int profileOwnerUid = DpmMockContext.CALLER_UID;
4395 final int firstUserSystemUid = UserHandle.getUid(UserHandle.USER_SYSTEM,
4396 DpmMockContext.SYSTEM_UID);
4397 final int secondUserSystemUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE,
4398 DpmMockContext.SYSTEM_UID);
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004399
4400 // Set up a profile owner.
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004401 mContext.binder.callingUid = profileOwnerUid;
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004402 setupProfileOwner();
4403
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004404 // First and second user set IMEs manually.
4405 mContext.binder.callingUid = firstUserSystemUid;
4406 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4407 mContext.binder.callingUid = secondUserSystemUid;
4408 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004409
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004410 // Profile owner changes IME for second user.
4411 mContext.binder.callingUid = profileOwnerUid;
Pavel Grafov75c0a892017-05-18 17:28:27 +01004412 when(getServices().settings.settingsSecureGetStringForUser(currentIme,
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004413 DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime1");
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004414 dpm.setSecureSetting(admin1, currentIme, "ime2");
Pavel Grafov75c0a892017-05-18 17:28:27 +01004415 verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime2",
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004416 DpmMockContext.CALLER_USER_HANDLE);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004417 reset(getServices().settings);
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004418 dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
4419 mContext.binder.callingUid = firstUserSystemUid;
4420 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4421 mContext.binder.callingUid = secondUserSystemUid;
4422 assertTrue(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004423
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004424 // First user changes IME manually.
4425 dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
4426 mContext.binder.callingUid = firstUserSystemUid;
4427 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4428 mContext.binder.callingUid = secondUserSystemUid;
4429 assertTrue(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004430
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004431 // Second user changes IME manually.
4432 dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
4433 mContext.binder.callingUid = firstUserSystemUid;
4434 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4435 mContext.binder.callingUid = secondUserSystemUid;
4436 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004437
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004438 // Profile owner changes IME for second user again.
4439 mContext.binder.callingUid = profileOwnerUid;
Pavel Grafov75c0a892017-05-18 17:28:27 +01004440 when(getServices().settings.settingsSecureGetStringForUser(currentIme,
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004441 DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime2");
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004442 dpm.setSecureSetting(admin1, currentIme, "ime3");
Pavel Grafov75c0a892017-05-18 17:28:27 +01004443 verify(getServices().settings).settingsSecurePutStringForUser(currentIme, "ime3",
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004444 DpmMockContext.CALLER_USER_HANDLE);
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004445 dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
4446 mContext.binder.callingUid = firstUserSystemUid;
4447 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4448 mContext.binder.callingUid = secondUserSystemUid;
4449 assertTrue(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004450
4451 // Restarting the DPMS should not lose information.
4452 initializeDpms();
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004453 mContext.binder.callingUid = firstUserSystemUid;
4454 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4455 mContext.binder.callingUid = secondUserSystemUid;
4456 assertTrue(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004457
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004458 // Profile owner can find out whether it set the current IME itself.
4459 mContext.binder.callingUid = profileOwnerUid;
4460 assertTrue(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004461
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004462 // Removing the profile owner should clear the information that it set the current IME.
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004463 dpm.clearProfileOwner(admin1);
Bartosz Fabianowski172f7802017-03-06 12:07:57 +01004464 mContext.binder.callingUid = firstUserSystemUid;
4465 assertFalse(dpm.isCurrentInputMethodSetByOwner());
4466 mContext.binder.callingUid = secondUserSystemUid;
4467 assertFalse(dpm.isCurrentInputMethodSetByOwner());
Bartosz Fabianowskiaff5e9c2017-01-25 06:09:13 +01004468 }
Rubin Xuaab7a412016-12-30 21:13:29 +00004469
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01004470 public void testSetPermittedCrossProfileNotificationListeners_unavailableForDo()
4471 throws Exception {
4472 // Set up a device owner.
4473 mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
4474 setupDeviceOwner();
4475 assertSetPermittedCrossProfileNotificationListenersUnavailable(mContext.binder.callingUid);
4476 }
4477
4478 public void testSetPermittedCrossProfileNotificationListeners_unavailableForPoOnUser()
4479 throws Exception {
4480 // Set up a profile owner.
4481 mContext.binder.callingUid = DpmMockContext.CALLER_UID;
4482 setupProfileOwner();
4483 assertSetPermittedCrossProfileNotificationListenersUnavailable(mContext.binder.callingUid);
4484 }
4485
4486 private void assertSetPermittedCrossProfileNotificationListenersUnavailable(
4487 int adminUid) throws Exception {
4488 mContext.binder.callingUid = adminUid;
4489 final int userId = UserHandle.getUserId(adminUid);
4490
4491 final String packageName = "some.package";
4492 assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
4493 admin1, Collections.singletonList(packageName)));
4494 assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
4495
4496 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4497 assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
4498
4499 // Attempt to set to empty list (which means no listener is whitelisted)
4500 mContext.binder.callingUid = adminUid;
4501 assertFalse(dpms.setPermittedCrossProfileNotificationListeners(
Pavel Grafov75c0a892017-05-18 17:28:27 +01004502 admin1, Collections.emptyList()));
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01004503 assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
4504
4505 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4506 assertTrue(dpms.isNotificationListenerServicePermitted(packageName, userId));
4507 }
4508
4509 public void testIsNotificationListenerServicePermitted_onlySystemCanCall() throws Exception {
4510 // Set up a managed profile
4511 final int MANAGED_PROFILE_USER_ID = 15;
4512 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
4513 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
4514 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4515
4516 final String permittedListener = "some.package";
4517 setupPackageInPackageManager(
4518 permittedListener,
4519 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
4520 /*appId=*/ 12345, /*flags=*/ 0);
4521
4522 assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
4523 admin1, Collections.singletonList(permittedListener)));
4524
Pavel Grafova1ea8d92017-05-25 21:55:24 +01004525 // isNotificationListenerServicePermitted should throw if not called from System.
4526 assertExpectException(SecurityException.class, /* messageRegex= */ null,
4527 () -> dpms.isNotificationListenerServicePermitted(
4528 permittedListener, MANAGED_PROFILE_USER_ID));
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01004529
4530 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4531 assertTrue(dpms.isNotificationListenerServicePermitted(
4532 permittedListener, MANAGED_PROFILE_USER_ID));
4533 }
4534
4535 public void testSetPermittedCrossProfileNotificationListeners_managedProfile()
4536 throws Exception {
4537 // Set up a managed profile
4538 final int MANAGED_PROFILE_USER_ID = 15;
4539 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
4540 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
4541 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4542
4543 final String permittedListener = "permitted.package";
4544 int appId = 12345;
4545 setupPackageInPackageManager(
4546 permittedListener,
4547 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
4548 appId, /*flags=*/ 0);
4549
4550 final String notPermittedListener = "not.permitted.package";
4551 setupPackageInPackageManager(
4552 notPermittedListener,
4553 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
4554 ++appId, /*flags=*/ 0);
4555
4556 final String systemListener = "system.package";
4557 setupPackageInPackageManager(
4558 systemListener,
4559 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
4560 ++appId, ApplicationInfo.FLAG_SYSTEM);
4561
4562 // By default all packages are allowed
4563 assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
4564
4565 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4566 assertTrue(dpms.isNotificationListenerServicePermitted(
4567 permittedListener, MANAGED_PROFILE_USER_ID));
4568 assertTrue(dpms.isNotificationListenerServicePermitted(
4569 notPermittedListener, MANAGED_PROFILE_USER_ID));
4570 assertTrue(dpms.isNotificationListenerServicePermitted(
4571 systemListener, MANAGED_PROFILE_USER_ID));
4572
4573 // Setting only one package in the whitelist
4574 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4575 assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
4576 admin1, Collections.singletonList(permittedListener)));
Pavel Grafov75c0a892017-05-18 17:28:27 +01004577 final List<String> permittedListeners =
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01004578 dpms.getPermittedCrossProfileNotificationListeners(admin1);
4579 assertEquals(1, permittedListeners.size());
4580 assertEquals(permittedListener, permittedListeners.get(0));
4581
4582 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4583 assertTrue(dpms.isNotificationListenerServicePermitted(
4584 permittedListener, MANAGED_PROFILE_USER_ID));
4585 assertFalse(dpms.isNotificationListenerServicePermitted(
4586 notPermittedListener, MANAGED_PROFILE_USER_ID));
4587 // System packages are always allowed (even if not in the whitelist)
4588 assertTrue(dpms.isNotificationListenerServicePermitted(
4589 systemListener, MANAGED_PROFILE_USER_ID));
4590
4591 // Setting an empty whitelist - only system listeners allowed
4592 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4593 assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
Pavel Grafov75c0a892017-05-18 17:28:27 +01004594 admin1, Collections.emptyList()));
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01004595 assertEquals(0, dpms.getPermittedCrossProfileNotificationListeners(admin1).size());
4596
4597 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4598 assertFalse(dpms.isNotificationListenerServicePermitted(
4599 permittedListener, MANAGED_PROFILE_USER_ID));
4600 assertFalse(dpms.isNotificationListenerServicePermitted(
4601 notPermittedListener, MANAGED_PROFILE_USER_ID));
4602 // System packages are always allowed (even if not in the whitelist)
4603 assertTrue(dpms.isNotificationListenerServicePermitted(
4604 systemListener, MANAGED_PROFILE_USER_ID));
4605
4606 // Setting a null whitelist - all listeners allowed
4607 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4608 assertTrue(dpms.setPermittedCrossProfileNotificationListeners(admin1, null));
4609 assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
4610
4611 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4612 assertTrue(dpms.isNotificationListenerServicePermitted(
4613 permittedListener, MANAGED_PROFILE_USER_ID));
4614 assertTrue(dpms.isNotificationListenerServicePermitted(
4615 notPermittedListener, MANAGED_PROFILE_USER_ID));
4616 assertTrue(dpms.isNotificationListenerServicePermitted(
4617 systemListener, MANAGED_PROFILE_USER_ID));
4618 }
4619
4620 public void testSetPermittedCrossProfileNotificationListeners_doesNotAffectPrimaryProfile()
4621 throws Exception {
4622 // Set up a managed profile
4623 final int MANAGED_PROFILE_USER_ID = 15;
4624 final int MANAGED_PROFILE_ADMIN_UID = UserHandle.getUid(MANAGED_PROFILE_USER_ID, 19436);
4625 addManagedProfile(admin1, MANAGED_PROFILE_ADMIN_UID, admin1);
4626 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4627
4628 final String nonSystemPackage = "non.system.package";
4629 int appId = 12345;
4630 setupPackageInPackageManager(
4631 nonSystemPackage,
4632 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
4633 appId, /*flags=*/ 0);
4634
4635 final String systemListener = "system.package";
4636 setupPackageInPackageManager(
4637 systemListener,
4638 UserHandle.USER_SYSTEM, // We check the packageInfo from the primary user.
4639 ++appId, ApplicationInfo.FLAG_SYSTEM);
4640
4641 // By default all packages are allowed (for all profiles)
4642 assertNull(dpms.getPermittedCrossProfileNotificationListeners(admin1));
4643
4644 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4645 assertTrue(dpms.isNotificationListenerServicePermitted(
4646 nonSystemPackage, MANAGED_PROFILE_USER_ID));
4647 assertTrue(dpms.isNotificationListenerServicePermitted(
4648 systemListener, MANAGED_PROFILE_USER_ID));
4649 assertTrue(dpms.isNotificationListenerServicePermitted(
4650 nonSystemPackage, UserHandle.USER_SYSTEM));
4651 assertTrue(dpms.isNotificationListenerServicePermitted(
4652 systemListener, UserHandle.USER_SYSTEM));
4653
4654 // Setting an empty whitelist - only system listeners allowed in managed profile, but
4655 // all allowed in primary profile
4656 mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
4657 assertTrue(dpms.setPermittedCrossProfileNotificationListeners(
Pavel Grafov75c0a892017-05-18 17:28:27 +01004658 admin1, Collections.emptyList()));
Esteban Talavera7e4cbad2017-03-30 17:59:50 +01004659 assertEquals(0, dpms.getPermittedCrossProfileNotificationListeners(admin1).size());
4660
4661 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4662 assertFalse(dpms.isNotificationListenerServicePermitted(
4663 nonSystemPackage, MANAGED_PROFILE_USER_ID));
4664 assertTrue(dpms.isNotificationListenerServicePermitted(
4665 systemListener, MANAGED_PROFILE_USER_ID));
4666 assertTrue(dpms.isNotificationListenerServicePermitted(
4667 nonSystemPackage, UserHandle.USER_SYSTEM));
4668 assertTrue(dpms.isNotificationListenerServicePermitted(
4669 systemListener, UserHandle.USER_SYSTEM));
4670 }
4671
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004672 public void testGetOwnerInstalledCaCertsForDeviceOwner() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01004673 mServiceContext.packageName = mRealTestContext.getPackageName();
4674 mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4675 mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004676 setDeviceOwner();
4677
Pavel Grafov75c0a892017-05-18 17:28:27 +01004678 verifyCanGetOwnerInstalledCaCerts(admin1, mAdmin1Context);
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004679 }
4680
4681 public void testGetOwnerInstalledCaCertsForProfileOwner() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01004682 mServiceContext.packageName = mRealTestContext.getPackageName();
4683 mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4684 mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_UID;
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004685 setAsProfileOwner(admin1);
4686
Pavel Grafov75c0a892017-05-18 17:28:27 +01004687 verifyCanGetOwnerInstalledCaCerts(admin1, mAdmin1Context);
4688 verifyCantGetOwnerInstalledCaCertsProfileOwnerRemoval(admin1, mAdmin1Context);
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004689 }
4690
4691 public void testGetOwnerInstalledCaCertsForDelegate() throws Exception {
Pavel Grafov75c0a892017-05-18 17:28:27 +01004692 mServiceContext.packageName = mRealTestContext.getPackageName();
4693 mServiceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4694 mAdmin1Context.binder.callingUid = DpmMockContext.CALLER_UID;
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004695 setAsProfileOwner(admin1);
4696
Pavel Grafov75c0a892017-05-18 17:28:27 +01004697 final DpmMockContext caller = new DpmMockContext(getServices(), mRealTestContext);
4698 caller.packageName = "com.example.delegate";
4699 caller.binder.callingUid = setupPackageInPackageManager(caller.packageName,
4700 DpmMockContext.CALLER_USER_HANDLE, 20988, ApplicationInfo.FLAG_HAS_CODE);
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004701
Pavel Grafov75c0a892017-05-18 17:28:27 +01004702 // Make caller a delegated cert installer.
4703 runAsCaller(mAdmin1Context, dpms,
4704 dpm -> dpm.setCertInstallerPackage(admin1, caller.packageName));
Robin Lee2c68dad2017-03-17 12:50:24 +00004705
4706 verifyCanGetOwnerInstalledCaCerts(null, caller);
4707 verifyCantGetOwnerInstalledCaCertsProfileOwnerRemoval(null, caller);
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004708 }
4709
Rubin Xucc391c22018-01-02 20:37:35 +00004710 public void testDisallowSharingIntoProfileSetRestriction() {
Rubin Xu255cb7712018-03-02 16:56:09 +00004711 when(mServiceContext.resources.getString(R.string.config_managed_provisioning_package))
4712 .thenReturn("com.android.managedprovisioning");
Rubin Xucc391c22018-01-02 20:37:35 +00004713 Bundle restriction = new Bundle();
4714 restriction.putBoolean(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, true);
4715
4716 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4717 RestrictionsListener listener = new RestrictionsListener(mContext);
4718 listener.onUserRestrictionsChanged(DpmMockContext.CALLER_USER_HANDLE, restriction,
4719 new Bundle());
4720 verifyDataSharingChangedBroadcast();
4721 }
4722
4723 public void testDisallowSharingIntoProfileClearRestriction() {
Rubin Xu255cb7712018-03-02 16:56:09 +00004724 when(mServiceContext.resources.getString(R.string.config_managed_provisioning_package))
4725 .thenReturn("com.android.managedprovisioning");
Rubin Xucc391c22018-01-02 20:37:35 +00004726 Bundle restriction = new Bundle();
4727 restriction.putBoolean(UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, true);
4728
4729 mContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
4730 RestrictionsListener listener = new RestrictionsListener(mContext);
4731 listener.onUserRestrictionsChanged(DpmMockContext.CALLER_USER_HANDLE, new Bundle(),
4732 restriction);
4733 verifyDataSharingChangedBroadcast();
4734 }
4735
4736 public void testDisallowSharingIntoProfileUnchanged() {
4737 RestrictionsListener listener = new RestrictionsListener(mContext);
4738 listener.onUserRestrictionsChanged(DpmMockContext.CALLER_USER_HANDLE, new Bundle(),
4739 new Bundle());
4740 verify(mContext.spiedContext, never()).sendBroadcastAsUser(any(), any());
4741 }
4742
4743 private void verifyDataSharingChangedBroadcast() {
4744 Intent expectedIntent = new Intent(
4745 DevicePolicyManager.ACTION_DATA_SHARING_RESTRICTION_CHANGED);
4746 expectedIntent.setPackage("com.android.managedprovisioning");
4747 expectedIntent.putExtra(Intent.EXTRA_USER_ID, DpmMockContext.CALLER_USER_HANDLE);
4748 verify(mContext.spiedContext, times(1)).sendBroadcastAsUser(
4749 MockUtils.checkIntent(expectedIntent),
4750 MockUtils.checkUserHandle(UserHandle.USER_SYSTEM));
4751 }
4752
yuemingwe3d9c092018-01-11 12:11:44 +00004753 public void testOverrideApnAPIsFailWithPO() throws Exception {
4754 setupProfileOwner();
yuemingw7e1298f2018-03-01 14:42:57 +00004755 ApnSetting apn = (new ApnSetting.Builder())
4756 .setApnName("test")
4757 .setEntryName("test")
4758 .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
4759 .build();
yuemingwe3d9c092018-01-11 12:11:44 +00004760 assertExpectException(SecurityException.class, null, () ->
4761 dpm.addOverrideApn(admin1, apn));
4762 assertExpectException(SecurityException.class, null, () ->
4763 dpm.updateOverrideApn(admin1, 0, apn));
4764 assertExpectException(SecurityException.class, null, () ->
4765 dpm.removeOverrideApn(admin1, 0));
4766 assertExpectException(SecurityException.class, null, () ->
4767 dpm.getOverrideApns(admin1));
4768 assertExpectException(SecurityException.class, null, () ->
4769 dpm.setOverrideApnsEnabled(admin1, false));
4770 assertExpectException(SecurityException.class, null, () ->
4771 dpm.isOverrideApnEnabled(admin1));
4772 }
4773
Robin Lee2c68dad2017-03-17 12:50:24 +00004774 private void verifyCanGetOwnerInstalledCaCerts(
4775 final ComponentName caller, final DpmMockContext callerContext) throws Exception {
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004776 final String alias = "cert";
4777 final byte[] caCert = TEST_CA.getBytes();
Robin Lee2c68dad2017-03-17 12:50:24 +00004778
4779 // device admin (used for posting the tls notification)
Pavel Grafov75c0a892017-05-18 17:28:27 +01004780 DpmMockContext admin1Context = mAdmin1Context;
Robin Lee2c68dad2017-03-17 12:50:24 +00004781 if (admin1.getPackageName().equals(callerContext.getPackageName())) {
4782 admin1Context = callerContext;
Robin Lee2c68dad2017-03-17 12:50:24 +00004783 }
4784 when(admin1Context.resources.getColor(anyInt(), anyObject())).thenReturn(Color.WHITE);
4785
4786 // caller: device admin or delegated certificate installer
4787 callerContext.applicationInfo = new ApplicationInfo();
4788 final UserHandle callerUser = callerContext.binder.getCallingUserHandle();
4789
4790 // system_server
4791 final DpmMockContext serviceContext = mContext;
4792 serviceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
Pavel Grafov75c0a892017-05-18 17:28:27 +01004793 getServices().addPackageContext(callerUser, admin1Context);
4794 getServices().addPackageContext(callerUser, callerContext);
Robin Lee2c68dad2017-03-17 12:50:24 +00004795
4796 // Install a CA cert.
4797 runAsCaller(callerContext, dpms, (dpm) -> {
Pavel Grafov75c0a892017-05-18 17:28:27 +01004798 when(getServices().keyChainConnection.getService().installCaCertificate(caCert))
Robin Lee2c68dad2017-03-17 12:50:24 +00004799 .thenReturn(alias);
4800 assertTrue(dpm.installCaCert(caller, caCert));
Pavel Grafov75c0a892017-05-18 17:28:27 +01004801 when(getServices().keyChainConnection.getService().getUserCaAliases())
Robin Lee2c68dad2017-03-17 12:50:24 +00004802 .thenReturn(asSlice(new String[] {alias}));
Robin Lee2c68dad2017-03-17 12:50:24 +00004803 });
4804
Pavel Grafov75c0a892017-05-18 17:28:27 +01004805 getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
4806 .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
4807 callerUser.getIdentifier());
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004808 flushTasks();
4809
Robin Lee2c68dad2017-03-17 12:50:24 +00004810 final List<String> ownerInstalledCaCerts = new ArrayList<>();
4811
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004812 // Device Owner / Profile Owner can find out which CA certs were installed by itself.
Robin Lee2c68dad2017-03-17 12:50:24 +00004813 runAsCaller(admin1Context, dpms, (dpm) -> {
4814 final List<String> installedCaCerts = dpm.getOwnerInstalledCaCerts(callerUser);
Pavel Grafov75c0a892017-05-18 17:28:27 +01004815 assertEquals(Collections.singletonList(alias), installedCaCerts);
Robin Lee2c68dad2017-03-17 12:50:24 +00004816 ownerInstalledCaCerts.addAll(installedCaCerts);
4817 });
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004818
4819 // Restarting the DPMS should not lose information.
4820 initializeDpms();
Pavel Grafov75c0a892017-05-18 17:28:27 +01004821 runAsCaller(admin1Context, dpms, (dpm) ->
4822 assertEquals(ownerInstalledCaCerts, dpm.getOwnerInstalledCaCerts(callerUser)));
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004823
4824 // System can find out which CA certs were installed by the Device Owner / Profile Owner.
Robin Lee2c68dad2017-03-17 12:50:24 +00004825 runAsCaller(serviceContext, dpms, (dpm) -> {
4826 assertEquals(ownerInstalledCaCerts, dpm.getOwnerInstalledCaCerts(callerUser));
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004827
Robin Lee2c68dad2017-03-17 12:50:24 +00004828 // Remove the CA cert.
Pavel Grafov75c0a892017-05-18 17:28:27 +01004829 reset(getServices().keyChainConnection.getService());
Robin Lee2c68dad2017-03-17 12:50:24 +00004830 });
4831
Pavel Grafov75c0a892017-05-18 17:28:27 +01004832 getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
4833 .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
4834 callerUser.getIdentifier());
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004835 flushTasks();
4836
4837 // Verify that the CA cert is no longer reported as installed by the Device Owner / Profile
4838 // Owner.
Robin Lee2c68dad2017-03-17 12:50:24 +00004839 runAsCaller(admin1Context, dpms, (dpm) -> {
4840 MoreAsserts.assertEmpty(dpm.getOwnerInstalledCaCerts(callerUser));
4841 });
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004842 }
4843
Robin Lee2c68dad2017-03-17 12:50:24 +00004844 private void verifyCantGetOwnerInstalledCaCertsProfileOwnerRemoval(
4845 final ComponentName callerName, final DpmMockContext callerContext) throws Exception {
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004846 final String alias = "cert";
4847 final byte[] caCert = TEST_CA.getBytes();
Robin Lee2c68dad2017-03-17 12:50:24 +00004848
4849 // device admin (used for posting the tls notification)
Pavel Grafov75c0a892017-05-18 17:28:27 +01004850 DpmMockContext admin1Context = mAdmin1Context;
Robin Lee2c68dad2017-03-17 12:50:24 +00004851 if (admin1.getPackageName().equals(callerContext.getPackageName())) {
4852 admin1Context = callerContext;
Robin Lee2c68dad2017-03-17 12:50:24 +00004853 }
4854 when(admin1Context.resources.getColor(anyInt(), anyObject())).thenReturn(Color.WHITE);
4855
4856 // caller: device admin or delegated certificate installer
4857 callerContext.applicationInfo = new ApplicationInfo();
4858 final UserHandle callerUser = callerContext.binder.getCallingUserHandle();
4859
4860 // system_server
4861 final DpmMockContext serviceContext = mContext;
4862 serviceContext.binder.callingUid = DpmMockContext.SYSTEM_UID;
Pavel Grafov75c0a892017-05-18 17:28:27 +01004863 getServices().addPackageContext(callerUser, admin1Context);
4864 getServices().addPackageContext(callerUser, callerContext);
Robin Lee2c68dad2017-03-17 12:50:24 +00004865
4866 // Install a CA cert as caller
4867 runAsCaller(callerContext, dpms, (dpm) -> {
Pavel Grafov75c0a892017-05-18 17:28:27 +01004868 when(getServices().keyChainConnection.getService().installCaCertificate(caCert))
Robin Lee2c68dad2017-03-17 12:50:24 +00004869 .thenReturn(alias);
4870 assertTrue(dpm.installCaCert(callerName, caCert));
4871 });
4872
4873 // Fake the CA cert as having been installed
Pavel Grafov75c0a892017-05-18 17:28:27 +01004874 when(getServices().keyChainConnection.getService().getUserCaAliases())
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004875 .thenReturn(asSlice(new String[] {alias}));
Pavel Grafov75c0a892017-05-18 17:28:27 +01004876 getServices().injectBroadcast(mServiceContext, new Intent(KeyChain.ACTION_TRUST_STORE_CHANGED)
4877 .putExtra(Intent.EXTRA_USER_HANDLE, callerUser.getIdentifier()),
4878 callerUser.getIdentifier());
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004879 flushTasks();
4880
Robin Lee2c68dad2017-03-17 12:50:24 +00004881 // Removing the Profile Owner should clear the information on which CA certs were installed
Pavel Grafov75c0a892017-05-18 17:28:27 +01004882 runAsCaller(admin1Context, dpms, dpm -> dpm.clearProfileOwner(admin1));
Robin Lee2c68dad2017-03-17 12:50:24 +00004883
4884 runAsCaller(serviceContext, dpms, (dpm) -> {
4885 final List<String> ownerInstalledCaCerts = dpm.getOwnerInstalledCaCerts(callerUser);
4886 assertNotNull(ownerInstalledCaCerts);
4887 assertTrue(ownerInstalledCaCerts.isEmpty());
4888 });
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01004889 }
4890
Eran Messeri94d56762017-12-21 20:50:54 +00004891 private void assertAttestationFlags(int attestationFlags, int[] expectedFlags) {
4892 int[] gotFlags = DevicePolicyManagerService.translateIdAttestationFlags(attestationFlags);
4893 Arrays.sort(gotFlags);
4894 Arrays.sort(expectedFlags);
4895 assertTrue(Arrays.equals(expectedFlags, gotFlags));
4896 }
4897
4898 public void testTranslationOfIdAttestationFlag() {
4899 int[] allIdTypes = new int[]{ID_TYPE_SERIAL, ID_TYPE_IMEI, ID_TYPE_MEID};
4900 int[] correspondingAttUtilsTypes = new int[]{
4901 AttestationUtils.ID_TYPE_SERIAL, AttestationUtils.ID_TYPE_IMEI,
4902 AttestationUtils.ID_TYPE_MEID};
4903
4904 // Test translation of zero flags
4905 assertNull(DevicePolicyManagerService.translateIdAttestationFlags(0));
4906
4907 // Test translation of the ID_TYPE_BASE_INFO flag, which should yield an empty, but
4908 // non-null array
4909 assertAttestationFlags(ID_TYPE_BASE_INFO, new int[] {});
4910
4911 // Test translation of a single flag
4912 assertAttestationFlags(ID_TYPE_BASE_INFO | ID_TYPE_SERIAL,
4913 new int[] {AttestationUtils.ID_TYPE_SERIAL});
4914 assertAttestationFlags(ID_TYPE_SERIAL, new int[] {AttestationUtils.ID_TYPE_SERIAL});
4915
4916 // Test translation of two flags
4917 assertAttestationFlags(ID_TYPE_SERIAL | ID_TYPE_IMEI,
4918 new int[] {AttestationUtils.ID_TYPE_IMEI, AttestationUtils.ID_TYPE_SERIAL});
4919 assertAttestationFlags(ID_TYPE_BASE_INFO | ID_TYPE_MEID | ID_TYPE_SERIAL,
4920 new int[] {AttestationUtils.ID_TYPE_MEID, AttestationUtils.ID_TYPE_SERIAL});
4921
4922 // Test translation of all three flags
4923 assertAttestationFlags(ID_TYPE_SERIAL | ID_TYPE_IMEI | ID_TYPE_MEID,
4924 new int[] {AttestationUtils.ID_TYPE_IMEI, AttestationUtils.ID_TYPE_SERIAL,
4925 AttestationUtils.ID_TYPE_MEID});
4926 // Test translation of all three flags
4927 assertAttestationFlags(ID_TYPE_SERIAL | ID_TYPE_IMEI | ID_TYPE_MEID | ID_TYPE_BASE_INFO,
4928 new int[] {AttestationUtils.ID_TYPE_IMEI, AttestationUtils.ID_TYPE_SERIAL,
4929 AttestationUtils.ID_TYPE_MEID});
4930 }
4931
arangelov08d534b2018-01-22 15:20:53 +00004932 public void testRevertDeviceOwnership_noMetadataFile() throws Exception {
4933 setDeviceOwner();
4934 initializeDpms();
4935 assertFalse(getMockTransferMetadataManager().metadataFileExists());
4936 assertTrue(dpms.isDeviceOwner(admin1, UserHandle.USER_SYSTEM));
4937 assertTrue(dpms.isAdminActive(admin1, UserHandle.USER_SYSTEM));
4938 }
4939
4940 public void testRevertDeviceOwnership_adminAndDeviceMigrated() throws Exception {
4941 DpmTestUtils.writeInputStreamToFile(
4942 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
4943 getDeviceOwnerPoliciesFile());
4944 DpmTestUtils.writeInputStreamToFile(
4945 getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_migrated),
4946 getDeviceOwnerFile());
4947 assertDeviceOwnershipRevertedWithFakeTransferMetadata();
4948 }
4949
4950 public void testRevertDeviceOwnership_deviceNotMigrated()
4951 throws Exception {
4952 DpmTestUtils.writeInputStreamToFile(
4953 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
4954 getDeviceOwnerPoliciesFile());
4955 DpmTestUtils.writeInputStreamToFile(
4956 getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_not_migrated),
4957 getDeviceOwnerFile());
4958 assertDeviceOwnershipRevertedWithFakeTransferMetadata();
4959 }
4960
4961 public void testRevertDeviceOwnership_adminAndDeviceNotMigrated()
4962 throws Exception {
4963 DpmTestUtils.writeInputStreamToFile(
4964 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_not_migrated),
4965 getDeviceOwnerPoliciesFile());
4966 DpmTestUtils.writeInputStreamToFile(
4967 getRawStream(com.android.frameworks.servicestests.R.raw.device_owner_not_migrated),
4968 getDeviceOwnerFile());
4969 assertDeviceOwnershipRevertedWithFakeTransferMetadata();
4970 }
4971
4972 public void testRevertProfileOwnership_noMetadataFile() throws Exception {
4973 setupProfileOwner();
4974 initializeDpms();
4975 assertFalse(getMockTransferMetadataManager().metadataFileExists());
4976 assertTrue(dpms.isProfileOwner(admin1, DpmMockContext.CALLER_USER_HANDLE));
4977 assertTrue(dpms.isAdminActive(admin1, DpmMockContext.CALLER_USER_HANDLE));
4978 UserHandle userHandle = UserHandle.of(DpmMockContext.CALLER_USER_HANDLE);
4979 }
4980
4981 public void testRevertProfileOwnership_adminAndProfileMigrated() throws Exception {
4982 getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, UserInfo.FLAG_MANAGED_PROFILE,
4983 UserHandle.USER_SYSTEM);
4984 DpmTestUtils.writeInputStreamToFile(
4985 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
4986 getProfileOwnerPoliciesFile());
4987 DpmTestUtils.writeInputStreamToFile(
4988 getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_migrated),
4989 getProfileOwnerFile());
4990 assertProfileOwnershipRevertedWithFakeTransferMetadata();
4991 }
4992
4993 public void testRevertProfileOwnership_profileNotMigrated() throws Exception {
4994 getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, UserInfo.FLAG_MANAGED_PROFILE,
4995 UserHandle.USER_SYSTEM);
4996 DpmTestUtils.writeInputStreamToFile(
4997 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_migrated),
4998 getProfileOwnerPoliciesFile());
4999 DpmTestUtils.writeInputStreamToFile(
5000 getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_not_migrated),
5001 getProfileOwnerFile());
5002 assertProfileOwnershipRevertedWithFakeTransferMetadata();
5003 }
5004
5005 public void testRevertProfileOwnership_adminAndProfileNotMigrated() throws Exception {
5006 getServices().addUser(DpmMockContext.CALLER_USER_HANDLE, UserInfo.FLAG_MANAGED_PROFILE,
5007 UserHandle.USER_SYSTEM);
5008 DpmTestUtils.writeInputStreamToFile(
5009 getRawStream(com.android.frameworks.servicestests.R.raw.active_admin_not_migrated),
5010 getProfileOwnerPoliciesFile());
5011 DpmTestUtils.writeInputStreamToFile(
5012 getRawStream(com.android.frameworks.servicestests.R.raw.profile_owner_not_migrated),
5013 getProfileOwnerFile());
5014 assertProfileOwnershipRevertedWithFakeTransferMetadata();
5015 }
5016
5017 // admin1 is the outgoing DPC, adminAnotherPakcage is the incoming one.
5018 private void assertDeviceOwnershipRevertedWithFakeTransferMetadata() throws Exception {
5019 writeFakeTransferMetadataFile(UserHandle.USER_SYSTEM,
5020 TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER);
5021
5022 final long ident = mServiceContext.binder.clearCallingIdentity();
5023 setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID);
5024 setUpPackageManagerForFakeAdmin(adminAnotherPackage,
5025 DpmMockContext.CALLER_SYSTEM_USER_UID, admin1);
5026 // To simulate a reboot, we just reinitialize dpms and call systemReady
5027 initializeDpms();
5028
5029 assertTrue(dpm.isDeviceOwnerApp(admin1.getPackageName()));
5030 assertFalse(dpm.isDeviceOwnerApp(adminAnotherPackage.getPackageName()));
5031 assertFalse(dpm.isAdminActive(adminAnotherPackage));
5032 assertTrue(dpm.isAdminActive(admin1));
5033 assertTrue(dpm.isDeviceOwnerAppOnCallingUser(admin1.getPackageName()));
5034 assertEquals(admin1, dpm.getDeviceOwnerComponentOnCallingUser());
5035
5036 assertTrue(dpm.isDeviceOwnerAppOnAnyUser(admin1.getPackageName()));
5037 assertEquals(admin1, dpm.getDeviceOwnerComponentOnAnyUser());
5038 assertEquals(UserHandle.USER_SYSTEM, dpm.getDeviceOwnerUserId());
5039 assertFalse(getMockTransferMetadataManager().metadataFileExists());
5040
5041 mServiceContext.binder.restoreCallingIdentity(ident);
5042 }
5043
5044 // admin1 is the outgoing DPC, adminAnotherPakcage is the incoming one.
5045 private void assertProfileOwnershipRevertedWithFakeTransferMetadata() throws Exception {
5046 writeFakeTransferMetadataFile(DpmMockContext.CALLER_USER_HANDLE,
5047 TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER);
5048
5049 int uid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE,
5050 DpmMockContext.CALLER_SYSTEM_USER_UID);
5051 setUpPackageManagerForAdmin(admin1, uid);
5052 setUpPackageManagerForFakeAdmin(adminAnotherPackage, uid, admin1);
5053 // To simulate a reboot, we just reinitialize dpms and call systemReady
5054 initializeDpms();
5055
5056 assertTrue(dpm.isProfileOwnerApp(admin1.getPackageName()));
5057 assertTrue(dpm.isAdminActive(admin1));
5058 assertFalse(dpm.isProfileOwnerApp(adminAnotherPackage.getPackageName()));
5059 assertFalse(dpm.isAdminActive(adminAnotherPackage));
5060 assertEquals(dpm.getProfileOwnerAsUser(DpmMockContext.CALLER_USER_HANDLE), admin1);
5061 assertFalse(getMockTransferMetadataManager().metadataFileExists());
5062 }
5063
5064 private void writeFakeTransferMetadataFile(int callerUserHandle, String adminType) {
5065 TransferOwnershipMetadataManager metadataManager = getMockTransferMetadataManager();
5066 metadataManager.deleteMetadataFile();
5067
5068 final TransferOwnershipMetadataManager.Metadata metadata =
5069 new TransferOwnershipMetadataManager.Metadata(
5070 admin1.flattenToString(), adminAnotherPackage.flattenToString(),
5071 callerUserHandle,
5072 adminType);
5073 metadataManager.saveMetadataFile(metadata);
5074 }
5075
5076 private File getDeviceOwnerFile() {
5077 return dpms.mOwners.getDeviceOwnerFile();
5078 }
5079
5080 private File getProfileOwnerFile() {
5081 return dpms.mOwners.getProfileOwnerFile(DpmMockContext.CALLER_USER_HANDLE);
5082 }
5083
5084 private File getProfileOwnerPoliciesFile() {
5085 File parentDir = dpms.mMockInjector.environmentGetUserSystemDirectory(
5086 DpmMockContext.CALLER_USER_HANDLE);
5087 return getPoliciesFile(parentDir);
5088 }
5089
5090 private File getDeviceOwnerPoliciesFile() {
5091 return getPoliciesFile(getServices().systemUserDataDir);
5092 }
5093
5094 private File getPoliciesFile(File parentDir) {
5095 return new File(parentDir, "device_policies.xml");
5096 }
5097
5098 private InputStream getRawStream(@RawRes int id) {
5099 return mRealTestContext.getResources().openRawResource(id);
5100 }
5101
Victor Chang3e794af2016-03-04 13:48:17 +00005102 private void setUserSetupCompleteForUser(boolean isUserSetupComplete, int userhandle) {
Pavel Grafov75c0a892017-05-18 17:28:27 +01005103 when(getServices().settings.settingsSecureGetIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0,
Victor Chang3e794af2016-03-04 13:48:17 +00005104 userhandle)).thenReturn(isUserSetupComplete ? 1 : 0);
5105 dpms.notifyChangeToContentObserver(
5106 Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), userhandle);
5107 }
5108
5109 private void assertProvisioningAllowed(String action, boolean expected) {
5110 assertEquals("isProvisioningAllowed(" + action + ") returning unexpected result", expected,
5111 dpm.isProvisioningAllowed(action));
5112 }
Tony Mak2f26b792016-11-28 17:54:51 +00005113
Nicolas Prevot45d29072017-01-18 16:11:19 +00005114 private void assertProvisioningAllowed(String action, boolean expected, String packageName,
5115 int uid) {
Pavel Grafov75c0a892017-05-18 17:28:27 +01005116 final String previousPackageName = mContext.packageName;
5117 final int previousUid = mMockContext.binder.callingUid;
Nicolas Prevot45d29072017-01-18 16:11:19 +00005118
5119 // Call assertProvisioningAllowed with the packageName / uid passed as arguments.
5120 mContext.packageName = packageName;
5121 mMockContext.binder.callingUid = uid;
5122 assertProvisioningAllowed(action, expected);
5123
5124 // Set the previous package name / calling uid to go back to the initial state.
5125 mContext.packageName = previousPackageName;
5126 mMockContext.binder.callingUid = previousUid;
5127 }
5128
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00005129 private void assertCheckProvisioningPreCondition(String action, int provisioningCondition) {
Esteban Talavera01576862016-12-15 11:16:44 +00005130 assertCheckProvisioningPreCondition(action, admin1.getPackageName(), provisioningCondition);
5131 }
5132
5133 private void assertCheckProvisioningPreCondition(
5134 String action, String packageName, int provisioningCondition) {
5135 assertEquals("checkProvisioningPreCondition("
5136 + action + ", " + packageName + ") returning unexpected result",
5137 provisioningCondition, dpm.checkProvisioningPreCondition(action, packageName));
Mahaver Chopra849fd6f2016-11-03 20:28:10 +00005138 }
5139
Tony Mak2f26b792016-11-28 17:54:51 +00005140 /**
5141 * Setup a managed profile with the specified admin and its uid.
5142 * @param admin ComponentName that's visible to the test code, which doesn't have to exist.
5143 * @param adminUid uid of the admin package.
5144 * @param copyFromAdmin package information for {@code admin} will be built based on this
5145 * component's information.
5146 */
5147 private void addManagedProfile(
5148 ComponentName admin, int adminUid, ComponentName copyFromAdmin) throws Exception {
5149 final int userId = UserHandle.getUserId(adminUid);
Pavel Grafov75c0a892017-05-18 17:28:27 +01005150 getServices().addUser(userId, UserInfo.FLAG_MANAGED_PROFILE, UserHandle.USER_SYSTEM);
Tony Mak2f26b792016-11-28 17:54:51 +00005151 mContext.callerPermissions.addAll(OWNER_SETUP_PERMISSIONS);
5152 setUpPackageManagerForFakeAdmin(admin, adminUid, copyFromAdmin);
5153 dpm.setActiveAdmin(admin, false, userId);
5154 assertTrue(dpm.setProfileOwner(admin, null, userId));
5155 mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
5156 }
Robin Lee7f5c91c2017-02-08 21:27:02 +00005157
5158 /**
Robin Leeabaa0692017-02-20 20:54:22 +00005159 * Convert String[] to StringParceledListSlice.
Robin Lee7f5c91c2017-02-08 21:27:02 +00005160 */
Robin Leeabaa0692017-02-20 20:54:22 +00005161 private static StringParceledListSlice asSlice(String[] s) {
5162 return new StringParceledListSlice(Arrays.asList(s));
Robin Lee7f5c91c2017-02-08 21:27:02 +00005163 }
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01005164
5165 private void flushTasks() throws Exception {
Robin Lee2c68dad2017-03-17 12:50:24 +00005166 dpms.mHandler.runWithScissors(() -> {}, 0 /*now*/);
5167 dpms.mBackgroundHandler.runWithScissors(() -> {}, 0 /*now*/);
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01005168
Robin Lee2c68dad2017-03-17 12:50:24 +00005169 // We can't let exceptions happen on the background thread. Throw them here if they happen
5170 // so they still cause the test to fail despite being suppressed.
Pavel Grafov75c0a892017-05-18 17:28:27 +01005171 getServices().rethrowBackgroundBroadcastExceptions();
Bartosz Fabianowski05dc9f72017-02-22 23:41:14 +01005172 }
Victor Chang3e794af2016-03-04 13:48:17 +00005173}