Browse Source

Fix loading of PasswordHasher class from plugin.

Fixes #4919
ADmad 11 years ago
parent
commit
655f3b5e70

+ 4 - 5
src/Auth/PasswordHasherFactory.php

@@ -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 = [];
@@ -41,9 +41,8 @@ class PasswordHasherFactory {
 			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));
 		}
 

+ 59 - 0
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 - 0
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 {
+}