Skip to content

Commit

Permalink
Fix loading of PasswordHasher class from plugin.
Browse files Browse the repository at this point in the history
Fixes #4919
  • Loading branch information
ADmad committed Oct 18, 2014
1 parent f1f55e0 commit 655f3b5
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 5 deletions.
9 changes: 4 additions & 5 deletions src/Auth/PasswordHasherFactory.php
Expand Up @@ -25,11 +25,11 @@ class PasswordHasherFactory {
/**
* Returns password hasher object out of a hasher name or a configuration array
*
* @param string|array $passwordHasher name of the password hasher or an array with
* @param string|array $passwordHasher Name of the password hasher or an array with
* at least the key `className` set to the name of the class to use
* @return AbstractPasswordHasher Password hasher instance
* @return \Cake\Auth\AbstractPasswordHasher Password hasher instance
* @throws \RuntimeException If password hasher class not found or
* it does not extend AbstractPasswordHasher
* it does not extend Cake\Auth\AbstractPasswordHasher
*/
public static function build($passwordHasher) {
$config = [];
Expand All @@ -41,9 +41,8 @@ public static function build($passwordHasher) {
unset($config['className']);
}

list($plugin, $class) = pluginSplit($class, true);
$className = App::className($class, 'Auth', 'PasswordHasher');
if (!class_exists($className)) {
if (!$className) {
throw new \RuntimeException(sprintf('Password hasher class "%s" was not found.', $class));
}

Expand Down
59 changes: 59 additions & 0 deletions tests/TestCase/Auth/PasswordHasherFactoryTest.php
@@ -0,0 +1,59 @@
<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 3.0.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Cake\Test\TestCase\Auth;

use Cake\Core\Plugin;
use Cake\Auth\PasswordHasherFactory;
use Cake\TestSuite\TestCase;

/**
* Test case for PasswordHasherFactory
*
*/
class PasswordHasherFactoryTest extends TestCase {

/**
* test passwordhasher instance building
*
* @return void
*/
public function testBuild() {
$hasher = PasswordHasherFactory::build('Default');
$this->assertInstanceof('Cake\Auth\DefaultPasswordHasher', $hasher);

$hasher = PasswordHasherFactory::build([
'className' => 'Default',
'hashOptions' => ['foo' =>' bar']
]);
$this->assertInstanceof('Cake\Auth\DefaultPasswordHasher', $hasher);
$this->assertEquals(['foo' =>' bar'], $hasher->config('hashOptions'));

Plugin::load('TestPlugin');
$hasher = PasswordHasherFactory::build('TestPlugin.Legacy');
$this->assertInstanceof('TestPlugin\Auth\LegacyPasswordHasher', $hasher);
}

/**
* test build() throws exception for non existent hasher
*
* @expectedException \RuntimeException
* @expectedExceptionMessage Password hasher class "FooBar" was not found.
* @return void
*/
public function testBuildException() {
$hasher = PasswordHasherFactory::build('FooBar');
}

}
21 changes: 21 additions & 0 deletions tests/test_app/Plugin/TestPlugin/src/Auth/LegacyPasswordHasher.php
@@ -0,0 +1,21 @@
<?php
/**
* CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
* @since 3.0.0
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/

namespace TestPlugin\Auth;

use Cake\Auth\DefaultPasswordHasher;

class LegacyPasswordHasher extends DefaultPasswordHasher {
}

0 comments on commit 655f3b5

Please sign in to comment.