From 22759bacd95385d95d3d9321f490763df1aba89d Mon Sep 17 00:00:00 2001 From: Andy Stadler Date: Wed, 16 Mar 2011 09:48:08 -0700 Subject: [PATCH] Handle complex chars policy correctly * We needed to set DevicePolicyMnager.PASSWORD_QUALITY_COMPLEX * Setting this, we also need to clear some of the defaults for complex mode that are not correct for Exchange's definition of "complex". * Unit tests Bug: 4092218 Change-Id: Iea7bd05d48f1aa9406222c1db5937cfd7f2662b8 --- .../emailcommon/service/PolicySet.java | 6 +++- src/com/android/email/SecurityPolicy.java | 8 ++++- .../android/email/SecurityPolicyTests.java | 29 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/emailcommon/src/com/android/emailcommon/service/PolicySet.java b/emailcommon/src/com/android/emailcommon/service/PolicySet.java index 2bc3ee9d0..70538b440 100644 --- a/emailcommon/src/com/android/emailcommon/service/PolicySet.java +++ b/emailcommon/src/com/android/emailcommon/service/PolicySet.java @@ -222,7 +222,11 @@ public class PolicySet implements Parcelable { case PASSWORD_MODE_SIMPLE: return DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; case PASSWORD_MODE_STRONG: - return DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC; + if (mPasswordComplexChars == 0) { + return DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC; + } else { + return DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; + } default: return DevicePolicyManager .PASSWORD_QUALITY_UNSPECIFIED; } diff --git a/src/com/android/email/SecurityPolicy.java b/src/com/android/email/SecurityPolicy.java index 7734b82f1..2362faa9d 100644 --- a/src/com/android/email/SecurityPolicy.java +++ b/src/com/android/email/SecurityPolicy.java @@ -439,7 +439,13 @@ public class SecurityPolicy { policies.getDPManagerPasswordExpirationTimeout()); // password history length (number of previous passwords that may not be reused) dpm.setPasswordHistoryLength(mAdminName, policies.mPasswordHistory); - // password minimum complex characters + // password minimum complex characters. + // Note, in Exchange, "complex chars" simply means "non alpha", but in the DPM, + // setting the quality to complex also defaults min symbols=1 and min numeric=1. + // We always / safely clear minSymbols & minNumeric to zero (there is no policy + // configuration in which we explicitly require a minimum number of digits or symbols.) + dpm.setPasswordMinimumSymbols(mAdminName, 0); + dpm.setPasswordMinimumNumeric(mAdminName, 0); dpm.setPasswordMinimumNonLetter(mAdminName, policies.mPasswordComplexChars); // encryption required dpm.setStorageEncryption(mAdminName, policies.mRequireEncryption); diff --git a/tests/src/com/android/email/SecurityPolicyTests.java b/tests/src/com/android/email/SecurityPolicyTests.java index 0536139ed..f1f8039c0 100644 --- a/tests/src/com/android/email/SecurityPolicyTests.java +++ b/tests/src/com/android/email/SecurityPolicyTests.java @@ -688,4 +688,33 @@ public class SecurityPolicyTests extends ProviderTestCase2 { assertEquals(policyExpect, p3Result); } } + + /** + * Test the code that converts from exchange-style quality to DPM/Lockscreen style quality. + */ + public void testGetDPManagerPasswordQuality() { + // PolicySet.PASSWORD_MODE_NONE -> DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED + PolicySet p1 = new PolicySet(0, PolicySet.PASSWORD_MODE_NONE, + 0, 0, false, 0, 0, 0, false, false); + assertEquals(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, + p1.getDPManagerPasswordQuality()); + + // PASSWORD_MODE_SIMPLE -> PASSWORD_QUALITY_NUMERIC + PolicySet p2 = new PolicySet(4, PolicySet.PASSWORD_MODE_SIMPLE, + 0, 0, false, 0, 0, 0, false, false); + assertEquals(DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, + p2.getDPManagerPasswordQuality()); + + // PASSWORD_MODE_STRONG -> PASSWORD_QUALITY_ALPHANUMERIC + PolicySet p3 = new PolicySet(4, PolicySet.PASSWORD_MODE_STRONG, + 0, 0, false, 0, 0, 0, false, false); + assertEquals(DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, + p3.getDPManagerPasswordQuality()); + + // PASSWORD_MODE_STRONG + complex chars -> PASSWORD_QUALITY_COMPLEX + PolicySet p4 = new PolicySet(4, PolicySet.PASSWORD_MODE_STRONG, + 0, 0, false, 0, 0 , 2, false, false); + assertEquals(DevicePolicyManager.PASSWORD_QUALITY_COMPLEX, + p4.getDPManagerPasswordQuality()); + } }