1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.cts.deviceadmin; 17 18 import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; 19 20 import android.app.admin.DevicePolicyManager; 21 22 /** 23 * Tests for {@link DevicePolicyManager#resetPassword} for complex cases. 24 * 25 * This needs to be run as device owner, because in NYC DA can't clear or change the password. 26 */ 27 public class DeviceOwnerPasswordTest extends BaseDeviceAdminTest { 28 29 @Override 30 protected void setUp() throws Exception { 31 super.setUp(); 32 33 assertDeviceOwner(); 34 clearPassword(); 35 } 36 37 @Override 38 protected void tearDown() throws Exception { 39 clearPassword(); 40 41 super.tearDown(); 42 } 43 44 public void testPasswordQuality_something() { 45 dpm.setPasswordQuality(mAdminComponent, 46 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING); 47 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 48 dpm.getPasswordQuality(mAdminComponent)); 49 assertFalse(dpm.isActivePasswordSufficient()); 50 51 String caseDescription = "initial"; 52 assertPasswordSucceeds("1234", caseDescription); 53 assertPasswordSucceeds("abcd", caseDescription); // can't change. 54 assertPasswordSucceeds("abcd1234", caseDescription); 55 56 dpm.setPasswordMinimumLength(mAdminComponent, 10); 57 caseDescription = "minimum password length = 10"; 58 assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent)); 59 assertFalse(dpm.isActivePasswordSufficient()); 60 61 assertPasswordFails("1234", caseDescription); 62 assertPasswordFails("abcd", caseDescription); 63 assertPasswordFails("abcd1234", caseDescription); 64 65 dpm.setPasswordMinimumLength(mAdminComponent, 4); 66 caseDescription = "minimum password length = 4"; 67 assertEquals(4, dpm.getPasswordMinimumLength( 68 mAdminComponent)); 69 assertTrue(dpm.isActivePasswordSufficient()); 70 71 assertPasswordSucceeds("1234", caseDescription); 72 assertPasswordSucceeds("abcd", caseDescription); 73 assertPasswordSucceeds("abcd1234", caseDescription); 74 } 75 76 public void testPasswordQuality_numeric() { 77 dpm.setPasswordQuality(mAdminComponent, 78 DevicePolicyManager.PASSWORD_QUALITY_NUMERIC); 79 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, 80 dpm.getPasswordQuality(mAdminComponent)); 81 assertFalse(dpm.isActivePasswordSufficient()); // failure 82 83 String caseDescription = "initial"; 84 assertPasswordSucceeds("1234", caseDescription); 85 assertPasswordSucceeds("abcd", caseDescription); 86 assertPasswordSucceeds("abcd1234", caseDescription); 87 88 dpm.setPasswordMinimumLength(mAdminComponent, 10); 89 caseDescription = "minimum password length = 10"; 90 assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent)); 91 assertFalse(dpm.isActivePasswordSufficient()); 92 93 assertPasswordFails("1234", caseDescription); 94 assertPasswordFails("abcd", caseDescription); 95 assertPasswordFails("abcd1234", caseDescription); 96 97 dpm.setPasswordMinimumLength(mAdminComponent, 4); 98 caseDescription = "minimum password length = 4"; 99 assertEquals(4, dpm.getPasswordMinimumLength( 100 mAdminComponent)); 101 assertTrue(dpm.isActivePasswordSufficient()); 102 103 assertPasswordSucceeds("1234", caseDescription); 104 assertPasswordSucceeds("abcd", caseDescription); 105 assertPasswordSucceeds("abcd1234", caseDescription); 106 } 107 108 public void testPasswordQuality_alphabetic() { 109 dpm.setPasswordQuality(mAdminComponent, 110 DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC); 111 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, 112 dpm.getPasswordQuality(mAdminComponent)); 113 assertFalse(dpm.isActivePasswordSufficient()); 114 115 String caseDescription = "initial"; 116 assertPasswordFails("1234", caseDescription); // can't change 117 assertPasswordSucceeds("abcd", caseDescription); 118 assertPasswordSucceeds("abcd1234", caseDescription); 119 120 dpm.setPasswordMinimumLength(mAdminComponent, 10); 121 caseDescription = "minimum password length = 10"; 122 assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent)); 123 assertFalse(dpm.isActivePasswordSufficient()); 124 125 assertPasswordFails("1234", caseDescription); 126 assertPasswordFails("abcd", caseDescription); 127 assertPasswordFails("abcd1234", caseDescription); 128 129 dpm.setPasswordMinimumLength(mAdminComponent, 4); 130 caseDescription = "minimum password length = 4"; 131 assertEquals(4, dpm.getPasswordMinimumLength( 132 mAdminComponent)); 133 assertTrue(dpm.isActivePasswordSufficient()); 134 135 assertPasswordFails("1234", caseDescription); 136 assertPasswordSucceeds("abcd", caseDescription); 137 assertPasswordSucceeds("abcd1234", caseDescription); 138 } 139 140 public void testPasswordQuality_alphanumeric() { 141 dpm.setPasswordQuality(mAdminComponent, 142 DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC); 143 assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, 144 dpm.getPasswordQuality(mAdminComponent)); 145 assertFalse(dpm.isActivePasswordSufficient()); 146 147 String caseDescription = "initial"; 148 assertPasswordFails("1234", caseDescription); 149 assertPasswordFails("abcd", caseDescription); 150 assertPasswordSucceeds("abcd1234", caseDescription); 151 152 dpm.setPasswordMinimumLength(mAdminComponent, 10); 153 caseDescription = "minimum password length = 10"; 154 assertEquals(10, dpm.getPasswordMinimumLength(mAdminComponent)); 155 assertFalse(dpm.isActivePasswordSufficient()); 156 157 assertPasswordFails("1234", caseDescription); 158 assertPasswordFails("abcd", caseDescription); 159 assertPasswordFails("abcd1234", caseDescription); 160 161 dpm.setPasswordMinimumLength(mAdminComponent, 4); 162 caseDescription = "minimum password length = 4"; 163 assertEquals(4, dpm.getPasswordMinimumLength( 164 mAdminComponent)); 165 assertTrue(dpm.isActivePasswordSufficient()); 166 167 assertPasswordFails("1234", caseDescription); 168 assertPasswordFails("abcd", caseDescription); 169 assertPasswordSucceeds("abcd1234", caseDescription); 170 } 171 172 public void testPasswordQuality_complexUpperCase() { 173 dpm.setPasswordQuality(mAdminComponent, PASSWORD_QUALITY_COMPLEX); 174 assertEquals(PASSWORD_QUALITY_COMPLEX, dpm.getPasswordQuality(mAdminComponent)); 175 resetComplexPasswordRestrictions(); 176 177 String caseDescription = "minimum UpperCase=0"; 178 assertPasswordSucceeds("abc1", caseDescription); 179 assertPasswordSucceeds("aBc1", caseDescription); 180 assertPasswordSucceeds("ABC1", caseDescription); 181 assertPasswordSucceeds("ABCD", caseDescription); 182 assertPasswordFails("123", caseDescription); // too short 183 184 dpm.setPasswordMinimumUpperCase(mAdminComponent, 1); 185 assertEquals(1, dpm.getPasswordMinimumUpperCase(mAdminComponent)); 186 caseDescription = "minimum UpperCase=1"; 187 assertPasswordFails("abc1", caseDescription); 188 assertPasswordSucceeds("aBc1", caseDescription); 189 assertPasswordSucceeds("ABC1", caseDescription); 190 assertPasswordSucceeds("ABCD", caseDescription); 191 assertPasswordFails("123", caseDescription); // too short 192 193 dpm.setPasswordMinimumUpperCase(mAdminComponent, 3); 194 assertEquals(3, dpm.getPasswordMinimumUpperCase(mAdminComponent)); 195 caseDescription = "minimum UpperCase=3"; 196 assertPasswordFails("abc1", caseDescription); 197 assertPasswordFails("aBC1", caseDescription); 198 assertPasswordSucceeds("ABC1", caseDescription); 199 assertPasswordSucceeds("ABCD", caseDescription); 200 assertPasswordFails("123", caseDescription); // too short 201 } 202 203 public void testPasswordQuality_complexLowerCase() { 204 dpm.setPasswordQuality(mAdminComponent, PASSWORD_QUALITY_COMPLEX); 205 assertEquals(PASSWORD_QUALITY_COMPLEX, dpm.getPasswordQuality(mAdminComponent)); 206 resetComplexPasswordRestrictions(); 207 208 String caseDescription = "minimum LowerCase=0"; 209 assertPasswordSucceeds("ABCD", caseDescription); 210 assertPasswordSucceeds("aBC1", caseDescription); 211 assertPasswordSucceeds("abc1", caseDescription); 212 assertPasswordSucceeds("abcd", caseDescription); 213 assertPasswordFails("123", caseDescription); // too short 214 215 dpm.setPasswordMinimumLowerCase(mAdminComponent, 1); 216 assertEquals(1, dpm.getPasswordMinimumLowerCase(mAdminComponent)); 217 caseDescription = "minimum LowerCase=1"; 218 assertPasswordFails("ABCD", caseDescription); 219 assertPasswordSucceeds("aBC1", caseDescription); 220 assertPasswordSucceeds("abc1", caseDescription); 221 assertPasswordSucceeds("abcd", caseDescription); 222 assertPasswordFails("123", caseDescription); // too short 223 224 dpm.setPasswordMinimumLowerCase(mAdminComponent, 3); 225 assertEquals(3, dpm.getPasswordMinimumLowerCase(mAdminComponent)); 226 caseDescription = "minimum LowerCase=3"; 227 assertPasswordFails("ABCD", caseDescription); 228 assertPasswordFails("aBC1", caseDescription); 229 assertPasswordSucceeds("abc1", caseDescription); 230 assertPasswordSucceeds("abcd", caseDescription); 231 assertPasswordFails("123", caseDescription); // too short 232 } 233 234 public void testPasswordQuality_complexLetters() { 235 dpm.setPasswordQuality(mAdminComponent, PASSWORD_QUALITY_COMPLEX); 236 assertEquals(PASSWORD_QUALITY_COMPLEX, dpm.getPasswordQuality(mAdminComponent)); 237 resetComplexPasswordRestrictions(); 238 239 String caseDescription = "minimum Letters=0"; 240 assertPasswordSucceeds("1234", caseDescription); 241 assertPasswordSucceeds("a123", caseDescription); 242 assertPasswordSucceeds("abc1", caseDescription); 243 assertPasswordSucceeds("abcd", caseDescription); 244 assertPasswordFails("123", caseDescription); // too short 245 246 dpm.setPasswordMinimumLetters(mAdminComponent, 1); 247 assertEquals(1, dpm.getPasswordMinimumLetters(mAdminComponent)); 248 caseDescription = "minimum Letters=1"; 249 assertPasswordFails("1234", caseDescription); 250 assertPasswordSucceeds("a123", caseDescription); 251 assertPasswordSucceeds("abc1", caseDescription); 252 assertPasswordSucceeds("abcd", caseDescription); 253 assertPasswordFails("123", caseDescription); // too short 254 255 dpm.setPasswordMinimumLetters(mAdminComponent, 3); 256 assertEquals(3, dpm.getPasswordMinimumLetters(mAdminComponent)); 257 caseDescription = "minimum Letters=3"; 258 assertPasswordFails("1234", caseDescription); 259 assertPasswordFails("a123", caseDescription); 260 assertPasswordSucceeds("abc1", caseDescription); 261 assertPasswordSucceeds("abcd", caseDescription); 262 assertPasswordFails("123", caseDescription); // too short 263 } 264 265 public void testPasswordQuality_complexNumeric() { 266 dpm.setPasswordQuality(mAdminComponent, PASSWORD_QUALITY_COMPLEX); 267 assertEquals(PASSWORD_QUALITY_COMPLEX, dpm.getPasswordQuality(mAdminComponent)); 268 resetComplexPasswordRestrictions(); 269 270 String caseDescription = "minimum Numeric=0"; 271 assertPasswordSucceeds("abcd", caseDescription); 272 assertPasswordSucceeds("1abc", caseDescription); 273 assertPasswordSucceeds("123a", caseDescription); 274 assertPasswordSucceeds("1234", caseDescription); 275 assertPasswordFails("123", caseDescription); // too short 276 277 dpm.setPasswordMinimumNumeric(mAdminComponent, 1); 278 assertEquals(1, dpm.getPasswordMinimumNumeric(mAdminComponent)); 279 caseDescription = "minimum Numeric=1"; 280 assertPasswordFails("abcd", caseDescription); 281 assertPasswordSucceeds("1abc", caseDescription); 282 assertPasswordSucceeds("123a", caseDescription); 283 assertPasswordSucceeds("1234", caseDescription); 284 assertPasswordFails("123", caseDescription); // too short 285 286 dpm.setPasswordMinimumNumeric(mAdminComponent, 3); 287 assertEquals(3, dpm.getPasswordMinimumNumeric(mAdminComponent)); 288 caseDescription = "minimum Numeric=3"; 289 assertPasswordFails("abcd", caseDescription); 290 assertPasswordFails("1abc", caseDescription); 291 assertPasswordSucceeds("123a", caseDescription); 292 assertPasswordSucceeds("1234", caseDescription); 293 assertPasswordFails("123", caseDescription); // too short 294 } 295 296 public void testPasswordQuality_complexSymbols() { 297 dpm.setPasswordQuality(mAdminComponent, PASSWORD_QUALITY_COMPLEX); 298 assertEquals(PASSWORD_QUALITY_COMPLEX, dpm.getPasswordQuality(mAdminComponent)); 299 resetComplexPasswordRestrictions(); 300 301 String caseDescription = "minimum Symbols=0"; 302 assertPasswordSucceeds("abcd", caseDescription); 303 assertPasswordSucceeds("_bc1", caseDescription); 304 assertPasswordSucceeds("@#!1", caseDescription); 305 assertPasswordSucceeds("_@#!", caseDescription); 306 assertPasswordFails("123", caseDescription); // too short 307 308 dpm.setPasswordMinimumSymbols(mAdminComponent, 1); 309 assertEquals(1, dpm.getPasswordMinimumSymbols(mAdminComponent)); 310 caseDescription = "minimum Symbols=1"; 311 assertPasswordFails("abcd", caseDescription); 312 assertPasswordSucceeds("_bc1", caseDescription); 313 assertPasswordSucceeds("@#!1", caseDescription); 314 assertPasswordSucceeds("_@#!", caseDescription); 315 assertPasswordFails("123", caseDescription); // too short 316 317 dpm.setPasswordMinimumSymbols(mAdminComponent, 3); 318 assertEquals(3, dpm.getPasswordMinimumSymbols(mAdminComponent)); 319 caseDescription = "minimum Symbols=3"; 320 assertPasswordFails("abcd", caseDescription); 321 assertPasswordFails("_bc1", caseDescription); 322 assertPasswordSucceeds("@#!1", caseDescription); 323 assertPasswordSucceeds("_@#!", caseDescription); 324 assertPasswordFails("123", caseDescription); // too short 325 } 326 327 public void testPasswordQuality_complexNonLetter() { 328 dpm.setPasswordQuality(mAdminComponent, PASSWORD_QUALITY_COMPLEX); 329 assertEquals(PASSWORD_QUALITY_COMPLEX, dpm.getPasswordQuality(mAdminComponent)); 330 resetComplexPasswordRestrictions(); 331 332 String caseDescription = "minimum NonLetter=0"; 333 assertPasswordSucceeds("Abcd", caseDescription); 334 assertPasswordSucceeds("_bcd", caseDescription); 335 assertPasswordSucceeds("3bcd", caseDescription); 336 assertPasswordSucceeds("_@3c", caseDescription); 337 assertPasswordSucceeds("_25!", caseDescription); 338 assertPasswordFails("123", caseDescription); // too short 339 340 dpm.setPasswordMinimumNonLetter(mAdminComponent, 1); 341 assertEquals(1, dpm.getPasswordMinimumNonLetter(mAdminComponent)); 342 caseDescription = "minimum NonLetter=1"; 343 assertPasswordFails("Abcd", caseDescription); 344 assertPasswordSucceeds("_bcd", caseDescription); 345 assertPasswordSucceeds("3bcd", caseDescription); 346 assertPasswordSucceeds("_@3c", caseDescription); 347 assertPasswordSucceeds("_25!", caseDescription); 348 assertPasswordFails("123", caseDescription); // too short 349 350 dpm.setPasswordMinimumNonLetter(mAdminComponent, 3); 351 assertEquals(3, dpm.getPasswordMinimumNonLetter(mAdminComponent)); 352 caseDescription = "minimum NonLetter=3"; 353 assertPasswordFails("Abcd", caseDescription); 354 assertPasswordFails("_bcd", caseDescription); 355 assertPasswordFails("3bcd", caseDescription); 356 assertPasswordSucceeds("_@3c", caseDescription); 357 assertPasswordSucceeds("_25!", caseDescription); 358 assertPasswordFails("123", caseDescription); // too short 359 } 360 361 private void assertPasswordFails(String password, String restriction) { 362 try { 363 boolean passwordResetResult = dpm.resetPassword(password, /* flags= */0); 364 assertFalse("Password '" + password + "' should have failed on " + restriction, 365 passwordResetResult); 366 } catch (IllegalArgumentException e) { 367 // yesss, we have failed! 368 } 369 } 370 371 private void assertPasswordSucceeds(String password, String restriction) { 372 boolean passwordResetResult = dpm.resetPassword(password, /* flags= */0); 373 assertTrue("Password '" + password + "' failed on " + restriction, passwordResetResult); 374 assertTrue(dpm.isActivePasswordSufficient()); 375 } 376 } 377