Browse Source

Merge branch '2.5' into 2.6

mark_story 12 years ago
parent
commit
6de35a357b

+ 3 - 1
lib/Cake/Console/ConsoleOutput.php

@@ -295,7 +295,9 @@ class ConsoleOutput {
  * Clean up and close handles
  */
 	public function __destruct() {
-		fclose($this->_output);
+		if (is_resource($this->_output)) {
+			fclose($this->_output);
+		}
 	}
 
 }

+ 3 - 1
lib/Cake/Console/Templates/default/classes/controller.ctp

@@ -74,7 +74,9 @@ class <?php echo $controllerName; ?>Controller extends <?php echo $plugin; ?>App
 		echo ");\n\n";
 	endif;
 
-	echo trim($actions);
+	if (!empty($actions)) {
+		echo trim($actions) . "\n";
+	}
 
 endif; ?>
 }

+ 1 - 1
lib/Cake/Controller/Component/Acl/IniAcl.php

@@ -43,7 +43,7 @@ class IniAcl extends Object implements AclInterface {
 /**
  * Initialize method
  *
- * @param AclBase $component
+ * @param Component $component
  * @return void
  */
 	public function initialize(Component $component) {

+ 2 - 2
lib/Cake/Controller/Component/AclComponent.php

@@ -21,8 +21,8 @@ App::uses('AclInterface', 'Controller/Component/Acl');
  * Access Control List factory class.
  *
  * Uses a strategy pattern to allow custom ACL implementations to be used with the same component interface.
- * You can define by changing `Configure::write('Acl.classname', 'DbAcl');` in your core.php. Concrete ACL
- * implementations should extend `AclBase` and implement the methods it defines.
+ * You can define by changing `Configure::write('Acl.classname', 'DbAcl');` in your core.php. The adapter
+ * you specify must implement `AclInterface`
  *
  * @package       Cake.Controller.Component
  * @link http://book.cakephp.org/2.0/en/core-libraries/components/access-control-lists.html

+ 1 - 0
lib/Cake/Model/Datasource/Database/Sqlserver.php

@@ -767,6 +767,7 @@ class Sqlserver extends DboSource {
  */
 	protected function _execute($sql, $params = array(), $prepareOptions = array()) {
 		$this->_lastAffected = false;
+		$sql = trim($sql);
 		if (strncasecmp($sql, 'SELECT', 6) === 0 || preg_match('/^EXEC(?:UTE)?\s/mi', $sql) > 0) {
 			$prepareOptions += array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL);
 			return parent::_execute($sql, $params, $prepareOptions);

+ 2 - 8
lib/Cake/Routing/Filter/AssetDispatcher.php

@@ -51,19 +51,12 @@ class AssetDispatcher extends DispatcherFilter {
 		}
 
 		$assetFile = $this->_getAssetFile($url);
-		if ($assetFile === null) {
+		if ($assetFile === null || !file_exists($assetFile)) {
 			return null;
 		}
-
 		$response = $event->data['response'];
 		$event->stopPropagation();
 
-		if (!file_exists($assetFile)) {
-			$response->statusCode(404);
-			$response->send();
-			return $response;
-		}
-
 		$response->modified(filemtime($assetFile));
 		if ($response->checkNotModified($event->data['request'])) {
 			return $response;
@@ -71,6 +64,7 @@ class AssetDispatcher extends DispatcherFilter {
 
 		$pathSegments = explode('.', $url);
 		$ext = array_pop($pathSegments);
+
 		$this->_deliverAsset($response, $assetFile, $ext);
 		return $response;
 	}

+ 1 - 1
lib/Cake/Test/Case/Controller/Component/AclComponentTest.php

@@ -78,7 +78,7 @@ class AclComponentTest extends CakeTestCase {
 	}
 
 /**
- * test that adapter() whines when the class is not an AclBase
+ * test that adapter() whines when the class does not implement AclInterface
  *
  * @expectedException CakeException
  * @return void

+ 27 - 17
lib/Cake/Test/Case/Routing/Filter/AssetDispatcherTest.php

@@ -84,6 +84,33 @@ class AssetDispatcherTest extends CakeTestCase {
 	}
 
 /**
+ * AssetDispatcher should not 404 extensions that could be handled
+ * by Routing.
+ *
+ * @return void
+ */
+	public function testNoHandleRoutedExtension() {
+		$filter = new AssetDispatcher();
+		$response = $this->getMock('CakeResponse', array('_sendHeader'));
+		Configure::write('Asset.filter', array(
+			'js' => '',
+			'css' => ''
+		));
+		App::build(array(
+			'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS),
+			'View' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'View' . DS)
+		), App::RESET);
+		Router::parseExtensions('json');
+		Router::connect('/test_plugin/api/v1/:action', array('controller' => 'api'));
+		CakePlugin::load('TestPlugin');
+
+		$request = new CakeRequest('test_plugin/api/v1/forwarding.json');
+		$event = new CakeEvent('DispatcherTest', $this, compact('request', 'response'));
+		$this->assertNull($filter->beforeDispatch($event));
+		$this->assertFalse($event->isStopped(), 'Events for routed extensions should not be stopped');
+	}
+
+/**
  * Tests that $response->checkNotModified() is called and bypasses
  * file dispatching
  *
@@ -130,23 +157,6 @@ class AssetDispatcherTest extends CakeTestCase {
 	}
 
 /**
- * Test 404 status code is set on missing asset.
- *
- * @return void
- */
-	public function test404OnMissingFile() {
-		$filter = new AssetDispatcher();
-
-		$response = $this->getMock('CakeResponse', array('_sendHeader'));
-		$request = new CakeRequest('/theme/test_theme/img/nope.gif');
-		$event = new CakeEvent('Dispatcher.beforeRequest', $this, compact('request', 'response'));
-
-		$response = $filter->beforeDispatch($event);
-		$this->assertTrue($event->isStopped());
-		$this->assertEquals(404, $response->statusCode());
-	}
-
-/**
  * Test that no exceptions are thrown for //index.php type URLs.
  *
  * @return void

+ 1 - 1
lib/Cake/TestSuite/Reporter/CakeHtmlReporter.php

@@ -264,7 +264,7 @@ class CakeHtmlReporter extends CakeBaseReporter {
 		echo "<div class='msg'><pre>" . $this->_htmlEntities($message->toString());
 
 		if ((is_string($actualMsg) && is_string($expectedMsg)) || (is_array($actualMsg) && is_array($expectedMsg))) {
-			echo "<br />" . PHPUnit_Util_Diff::diff($expectedMsg, $actualMsg);
+			echo "<br />" . $this->_htmlEntities(PHPUnit_Util_Diff::diff($expectedMsg, $actualMsg));
 		}
 
 		echo "</pre></div>\n";

+ 2 - 2
lib/Cake/Utility/Validation.php

@@ -719,8 +719,8 @@ class Validation {
  * $check is a legal finite on this platform
  *
  * @param string $check Value to check
- * @param integer $lower Lower limit
- * @param integer $upper Upper limit
+ * @param int|float $lower Lower limit
+ * @param int|float $upper Upper limit
  * @return boolean Success
  */
 	public static function range($check, $lower = null, $upper = null) {