function tearDown()
 {
     // Preserve memory settings
     ini_set('memory_limit', $this->originalMemoryLimit ? $this->originalMemoryLimit : -1);
     // Restore email configuration
     Email::set_mailer($this->originalMailer);
     $this->originalMailer = null;
     $this->mailer = null;
     // Restore password validation
     Member::set_password_validator($this->originalMemberPasswordValidator);
     // Restore requirements
     Requirements::set_backend($this->originalRequirements);
     // Mark test as no longer being run - we use originalIsRunningTest to allow for nested SapphireTest calls
     self::$is_running_test = $this->originalIsRunningTest;
     $this->originalIsRunningTest = null;
     // Reset theme setting
     SSViewer::set_theme($this->originalTheme);
     // Reset mocked datetime
     SS_Datetime::clear_mock_now();
     // Restore nested_urls state
     if ($this->originalNestedURLsState) {
         SiteTree::enable_nested_urls();
     } else {
         SiteTree::disable_nested_urls();
     }
     // Stop the redirection that might have been requested in the test.
     // Note: Ideally a clean Controller should be created for each test.
     // Now all tests executed in a batch share the same controller.
     $controller = Controller::has_curr() ? Controller::curr() : null;
     if ($controller && $controller->response && $controller->response->getHeader('Location')) {
         $controller->response->setStatusCode(200);
         $controller->response->removeHeader('Location');
     }
 }
 /**
  * Test that passwords validate against NZ e-government guidelines
  *  - don't allow the use of the last 6 passwords
  *  - require at least 3 of lowercase, uppercase, digits and punctuation
  *  - at least 7 characters long
  */
 public function testValidatePassword()
 {
     $member = $this->objFromFixture('Member', 'test');
     $this->assertNotNull($member);
     Member::set_password_validator(new MemberTest_PasswordValidator());
     // BAD PASSWORDS
     $valid = $member->changePassword('shorty');
     $this->assertFalse($valid->valid());
     $this->assertContains("TOO_SHORT", $valid->codeList());
     $valid = $member->changePassword('longone');
     $this->assertNotContains("TOO_SHORT", $valid->codeList());
     $this->assertContains("LOW_CHARACTER_STRENGTH", $valid->codeList());
     $this->assertFalse($valid->valid());
     $valid = $member->changePassword('w1thNumb3rs');
     $this->assertNotContains("LOW_CHARACTER_STRENGTH", $valid->codeList());
     $this->assertTrue($valid->valid());
     // Clear out the MemberPassword table to ensure that the system functions properly in that situation
     DB::query("DELETE FROM \"MemberPassword\"");
     // GOOD PASSWORDS
     $valid = $member->changePassword('withSym###Ls');
     $this->assertNotContains("LOW_CHARACTER_STRENGTH", $valid->codeList());
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls2');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls3');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls4');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls5');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls6');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls7');
     $this->assertTrue($valid->valid());
     // CAN'T USE PASSWORDS 2-7, but I can use pasword 1
     $valid = $member->changePassword('withSym###Ls2');
     $this->assertFalse($valid->valid());
     $this->assertContains("PREVIOUS_PASSWORD", $valid->codeList());
     $valid = $member->changePassword('withSym###Ls5');
     $this->assertFalse($valid->valid());
     $this->assertContains("PREVIOUS_PASSWORD", $valid->codeList());
     $valid = $member->changePassword('withSym###Ls7');
     $this->assertFalse($valid->valid());
     $this->assertContains("PREVIOUS_PASSWORD", $valid->codeList());
     $valid = $member->changePassword('withSym###Ls');
     $this->assertTrue($valid->valid());
     // HAVING DONE THAT, PASSWORD 2 is now available from the list
     $valid = $member->changePassword('withSym###Ls2');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls3');
     $this->assertTrue($valid->valid());
     $valid = $member->changePassword('withSym###Ls4');
     $this->assertTrue($valid->valid());
     Member::set_password_validator(null);
 }
 public function tearDown()
 {
     // Preserve memory settings
     ini_set('memory_limit', $this->originalMemoryLimit ? $this->originalMemoryLimit : -1);
     // Restore email configuration
     $this->originalMailer = null;
     $this->mailer = null;
     // Restore password validation
     if ($this->originalMemberPasswordValidator) {
         Member::set_password_validator($this->originalMemberPasswordValidator);
     }
     // Restore requirements
     if ($this->originalRequirements) {
         Requirements::set_backend($this->originalRequirements);
     }
     // Mark test as no longer being run - we use originalIsRunningTest to allow for nested SapphireTest calls
     self::$is_running_test = $this->originalIsRunningTest;
     $this->originalIsRunningTest = null;
     // Reset mocked datetime
     SS_Datetime::clear_mock_now();
     // Stop the redirection that might have been requested in the test.
     // Note: Ideally a clean Controller should be created for each test.
     // Now all tests executed in a batch share the same controller.
     $controller = Controller::has_curr() ? Controller::curr() : null;
     if ($controller && $controller->response && $controller->response->getHeader('Location')) {
         $controller->response->setStatusCode(200);
         $controller->response->removeHeader('Location');
     }
     //unnest injector / config now that tests are over
     Injector::unnest();
     Config::unnest();
 }
 /**
  * Creates a member in a group with the correct permissions.
  * Example: Given I am logged in with "ADMIN" permissions
  * 
  * @Given /^I am logged in with "([^"]*)" permissions$/
  */
 function iAmLoggedInWithPermissions($permCode)
 {
     if (!isset($this->cache_generatedMembers[$permCode])) {
         $group = \Group::get()->filter('Title', "{$permCode} group")->first();
         if (!$group) {
             $group = \Injector::inst()->create('Group');
         }
         $group->Title = "{$permCode} group";
         $group->write();
         $permission = \Injector::inst()->create('Permission');
         $permission->Code = $permCode;
         $permission->write();
         $group->Permissions()->add($permission);
         $member = \DataObject::get_one('Member', sprintf('"Email" = \'%s\'', "{$permCode}@example.org"));
         if (!$member) {
             $member = \Injector::inst()->create('Member');
         }
         // make sure any validation for password is skipped, since we're not testing complexity here
         $validator = \Member::password_validator();
         \Member::set_password_validator(null);
         $member->FirstName = $permCode;
         $member->Surname = "User";
         $member->Email = "{$permCode}@example.org";
         $member->PasswordEncryption = "none";
         $member->changePassword('Secret!123');
         $member->write();
         $group->Members()->add($member);
         \Member::set_password_validator($validator);
         $this->cache_generatedMembers[$permCode] = $member;
     }
     return new Step\Given(sprintf('I log in with "%s" and "%s"', "{$permCode}@example.org", 'Secret!123'));
 }
<?php

// Add a password complexity validator.
$validator = new PasswordValidator();
// The minimum length may be lowered when required.
$validator->minLength(10);
$validator->characterStrength(2, array('lowercase', 'uppercase', 'digits'));
Member::set_password_validator($validator);
// Remove the duplicate broken link reports.
SS_Report::add_excluded_reports(array('Multisites_SideReport_BrokenLinks', 'Multisites_SideReport_BrokenFiles', 'Multisites_SideReport_BrokenVirtualPages', 'Multisites_SideReport_BrokenRedirectorPages'));
 public static function applyToMember()
 {
     Member::set_password_validator(new StrongPasswordValidator());
 }
	function tearDown() {
		// Restore email configuration
		Email::set_mailer($this->originalMailer);
		$this->originalMailer = null;
		$this->mailer = null;

		// Restore password validation
		Member::set_password_validator($this->originalMemberPasswordValidator);
		
		// Restore requirements
		Requirements::set_backend($this->originalRequirements);

		// Mark test as no longer being run - we use originalIsRunningTest to allow for nested SapphireTest calls
		self::$is_running_test = $this->originalIsRunningTest;
		$this->originalIsRunningTest = null;
	}
 static function applyToMember()
 {
     Member::set_password_validator(new MediumPasswordValidator());
 }
 public function setUp()
 {
     //nest config and injector for each test so they are effectively sandboxed per test
     Config::nest();
     Injector::nest();
     // We cannot run the tests on this abstract class.
     if (get_class($this) == "SapphireTest") {
         $this->skipTest = true;
     }
     if ($this->skipTest) {
         $this->markTestSkipped(sprintf('Skipping %s ', get_class($this)));
         return;
     }
     // Mark test as being run
     $this->originalIsRunningTest = self::$is_running_test;
     self::$is_running_test = true;
     // i18n needs to be set to the defaults or tests fail
     i18n::set_locale(i18n::default_locale());
     i18n::config()->date_format = null;
     i18n::config()->time_format = null;
     // Set default timezone consistently to avoid NZ-specific dependencies
     date_default_timezone_set('UTC');
     // Remove password validation
     $this->originalMemberPasswordValidator = Member::password_validator();
     $this->originalRequirements = Requirements::backend();
     Member::set_password_validator(null);
     Config::inst()->update('Cookie', 'report_errors', false);
     if (class_exists('RootURLController')) {
         RootURLController::reset();
     }
     if (class_exists('Translatable')) {
         Translatable::reset();
     }
     Versioned::reset();
     DataObject::reset();
     if (class_exists('SiteTree')) {
         SiteTree::reset();
     }
     Hierarchy::reset();
     if (Controller::has_curr()) {
         Controller::curr()->setSession(Injector::inst()->create('Session', array()));
     }
     Security::$database_is_ready = null;
     // Add controller-name auto-routing
     Config::inst()->update('Director', 'rules', array('$Controller//$Action/$ID/$OtherID' => '*'));
     $fixtureFile = static::get_fixture_file();
     $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_';
     // Set up email
     $this->originalMailer = Email::mailer();
     $this->mailer = new TestMailer();
     Injector::inst()->registerService($this->mailer, 'Mailer');
     Config::inst()->remove('Email', 'send_all_emails_to');
     // Todo: this could be a special test model
     $this->model = DataModel::inst();
     // Set up fixture
     if ($fixtureFile || $this->usesDatabase || !self::using_temp_db()) {
         if (substr(DB::get_conn()->getSelectedDatabase(), 0, strlen($prefix) + 5) != strtolower(sprintf('%stmpdb', $prefix))) {
             //echo "Re-creating temp database... ";
             self::create_temp_db();
             //echo "done.\n";
         }
         singleton('DataObject')->flushCache();
         self::empty_temp_db();
         foreach ($this->requireDefaultRecordsFrom as $className) {
             $instance = singleton($className);
             if (method_exists($instance, 'requireDefaultRecords')) {
                 $instance->requireDefaultRecords();
             }
             if (method_exists($instance, 'augmentDefaultRecords')) {
                 $instance->augmentDefaultRecords();
             }
         }
         if ($fixtureFile) {
             $pathForClass = $this->getCurrentAbsolutePath();
             $fixtureFiles = is_array($fixtureFile) ? $fixtureFile : array($fixtureFile);
             $i = 0;
             foreach ($fixtureFiles as $fixtureFilePath) {
                 // Support fixture paths relative to the test class, rather than relative to webroot
                 // String checking is faster than file_exists() calls.
                 $isRelativeToFile = strpos('/', $fixtureFilePath) === false || preg_match('/^\\.\\./', $fixtureFilePath);
                 if ($isRelativeToFile) {
                     $resolvedPath = realpath($pathForClass . '/' . $fixtureFilePath);
                     if ($resolvedPath) {
                         $fixtureFilePath = $resolvedPath;
                     }
                 }
                 $fixture = Injector::inst()->create('YamlFixture', $fixtureFilePath);
                 $fixture->writeInto($this->getFixtureFactory());
                 $this->fixtures[] = $fixture;
                 // backwards compatibility: Load first fixture into $this->fixture
                 if ($i == 0) {
                     $this->fixture = $fixture;
                 }
                 $i++;
             }
         }
         $this->logInWithPermission("ADMIN");
     }
     // Preserve memory settings
     $this->originalMemoryLimit = ini_get('memory_limit');
     // turn off template debugging
     Config::inst()->update('SSViewer', 'source_file_comments', false);
     // Clear requirements
     Requirements::clear();
 }