diff --git a/password_policy.test b/password_policy.test index 7e6e4c1..f968341 100644 --- a/password_policy.test +++ b/password_policy.test @@ -306,7 +306,18 @@ class PasswordPolicyTestUICase extends DrupalWebTestCase { $password_policy->api_version = 1; $password_policy->name = 'strong'; $password_policy->export_type = NULL; - $password_policy->config = 'a:9:{s:11:"alpha_count";a:1:{s:11:"alpha_count";s:1:"1";}s:10:"char_count";a:1:{s:10:"char_count";s:1:"8";}s:11:"consecutive";a:1:{s:22:"consecutive_char_count";s:0:"";}s:9:"int_count";a:1:{s:9:"int_count";s:1:"1";}s:14:"past_passwords";a:1:{s:14:"past_passwords";s:1:"2";}s:12:"symbol_count";a:2:{s:12:"symbol_count";s:1:"0";s:20:"symbol_count_symbols";s:30:"!@#$%^&*()_+=-|}{"?:><,./;\'\\[]";}s:8:"username";a:1:{s:7:"enabled";b:1;}s:4:"role";a:1:{s:5:"roles";a:2:{i:2;i:0;i:3;i:0;}}s:6:"expire";a:4:{s:12:"expire_limit";s:1:"0";s:25:"expire_warning_email_sent";s:8:"-14 days";s:28:"expire_warning_email_message";s:0:"";s:28:"expire_warning_email_subject";s:92:"[user:name] you password on [site:name] shall expire in [password_expiration_date:interval] ";}}'; + $password_policy->config = 'a:9:{s:11:"alpha_count";a:1:{s:11:"alpha_count";s:1:"1";}s:10:"char_count";a:1:{s:10:"char_count";s:1:"8";}s:11:"consecutive";a:1:{s:22:"consecutive_char_count";s:0:"";}s:9:"int_count";a:1:{s:9:"int_count";s:1:"1";}s:14:"past_passwords";a:1:{s:14:"past_passwords";s:1:"2";}s:12:"symbol_count";a:2:{s:12:"symbol_count";s:1:"0";s:20:"symbol_count_symbols";s:30:"!@#$%^&*()_+=-|}{"?:><,./;\'\\[]";}s:8:"username";a:1:{s:7:"enabled";b:1;}s:4:"role";a:1:{s:5:"roles";a:2:{i:2;i:0;i:3;i:0;}}s:6:"expire";a:4:{s:12:"expire_limit";s:1:"0";s:25:"expire_warning_email_sent";s:0:"";s:28:"expire_warning_email_message";s:0:"";s:28:"expire_warning_email_subject";s:92:"[user:name] you password on [site:name] shall expire in [password_expiration_date:interval] ";}}'; + ctools_export_crud_save('password_policy', $password_policy); + } + + protected function createExpirePolicy() { + // Setup expire policy. + $password_policy = new stdClass(); + $password_policy->disabled = FALSE; + $password_policy->api_version = 1; + $password_policy->name = 'expire'; + $password_policy->export_type = NULL; + $password_policy->config = 'a:9:{s:11:"alpha_count";a:1:{s:11:"alpha_count";s:0:"";}s:10:"char_count";a:1:{s:10:"char_count";s:0:"";}s:11:"consecutive";a:1:{s:22:"consecutive_char_count";s:0:"";}s:9:"int_count";a:1:{s:9:"int_count";s:0:"";}s:14:"past_passwords";a:1:{s:14:"past_passwords";s:0:"";}s:12:"symbol_count";a:2:{s:12:"symbol_count";s:1:"0";s:20:"symbol_count_symbols";s:30:"!@#$%^&*()_+=-|}{"?:><,./;\'\\[]";}s:8:"username";a:1:{s:7:"enabled";b:1;}s:4:"role";a:1:{s:5:"roles";a:2:{i:2;i:0;i:3;i:0;}}s:6:"expire";a:4:{s:12:"expire_limit";s:8:"1 second";s:25:"expire_warning_email_sent";s:0:"";s:28:"expire_warning_email_message";s:0:"";s:28:"expire_warning_email_subject";s:92:"[user:name] you password on [site:name] shall expire in [password_expiration_date:interval] ";}}'; ctools_export_crud_save('password_policy', $password_policy); } @@ -333,4 +344,110 @@ class PasswordPolicyTestUICase extends DrupalWebTestCase { $this->assertText('Password must have at least 1 digit(s).'); $this->assertText('Password must have at least 8 character(s).'); } + + /** + * Tests setting passwords. + */ + public function testPasswordSet() { + // Use password_policy_test module form_alter to prevent extraneous policy + // text on user edit page. @todo figure out another way to do this. + variable_set('password_policy_test_no_description', TRUE); + + // Setup strong policy. + $this->createStrongPolicy(); + + $user = $this->drupalCreateUser(); + $this->drupalLogin($user); + + // Hold onto first password. + $password0 = $user->pass_raw; + // Try weak password. + $edit = array(); + $edit['current_pass'] = $password0; + $edit['pass[pass1]'] = 'pass'; + $edit['pass[pass2]'] = 'pass'; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertText('Password must have at least 1 digit(s).'); + $this->assertText('Password must have at least 8 character(s).'); + + // Try username. + $edit = array(); + $edit['current_pass'] = $password0; + $edit['pass[pass1]'] = $user->name; + $edit['pass[pass2]'] = $user->name; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertText('Password must not contain their username'); + + // Change password twice. + $password1 = $this->randomName() . '9'; + $edit = array(); + $edit['current_pass'] = $password0; + $edit['pass[pass1]'] = $password1; + $edit['pass[pass2]'] = $password1; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $password2 = $this->randomName() . '9'; + $edit = array(); + $edit['current_pass'] = $password1; + $edit['pass[pass1]'] = $password2; + $edit['pass[pass2]'] = $password2; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertText('The changes have been saved.'); + + // Try to save old $password1; + $edit = array(); + $edit['current_pass'] = $password2; + $edit['pass[pass1]'] = $password1; + $edit['pass[pass2]'] = $password1; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertNoText('The changes have been saved.'); + $this->assertText('Password cannot match 2 past passwords.'); + + // Save a new random password. + $password3 = $this->randomName() . '9'; + $edit = array(); + $edit['current_pass'] = $password2; + $edit['pass[pass1]'] = $password3; + $edit['pass[pass2]'] = $password3; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertText('The changes have been saved.'); + + // Try and save $password1. + $password2 = $this->randomName() . '9'; + $edit = array(); + $edit['current_pass'] = $password3; + $edit['pass[pass1]'] = $password1; + $edit['pass[pass2]'] = $password1; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertText('The changes have been saved.'); + } + + /** + * Test expire functionality. + */ + public function testExpire() { + // Use password_policy_test module form_alter to prevent extraneous policy + // text on user edit page. @todo figure out another way to do this. + variable_set('password_policy_test_no_description', TRUE); + + $user = $this->drupalCreateUser(); + $this->drupalLogin($user); + + // Setup expire policy. + $this->createExpirePolicy(); + + sleep(2); // Sleep to force simpletest to exceed 1 second expire. + $this->drupalGet('filter/tips'); + $this->assertText('Your Password has expired please change it now'); + $this->assertFieldByName('pass[pass1]', '', 'Password entry field appears.'); + + // Change password. + $password1 = $this->randomName() . '9'; + $edit = array(); + $edit['current_pass'] = $user->pass_raw; + $edit['pass[pass1]'] = $password1; + $edit['pass[pass2]'] = $password1; + $this->drupalPost("user/$user->uid/edit", $edit, t('Save')); + $this->assertText('The changes have been saved.'); + + } } diff --git a/password_policy_test/password_policy_test.module b/password_policy_test/password_policy_test.module index 23c903c..d2691bd 100644 --- a/password_policy_test/password_policy_test.module +++ b/password_policy_test/password_policy_test.module @@ -25,3 +25,9 @@ function password_policy_test_default_password_policy() { return $policies; } +function password_policy_test_form_user_profile_form_alter(&$form, $form_state) { + // Remove description so assertText()s can match errors. + if (variable_get('password_policy_test_no_description', FALSE)) { + $form['account']['pass']['#description'] = ''; + } +}