diff --git a/app/webroot/index.php b/app/webroot/index.php
index a6481b24a..2bf59fd46 100644
--- a/app/webroot/index.php
+++ b/app/webroot/index.php
@@ -1,7 +1,5 @@
fetchRow($sql);
@@ -3209,7 +3209,7 @@ class DboSource extends DataSource {
*
* @param string $table The name of the table to update.
* @param string $column The column to use when resetting the sequence value.
- * @return bool|void success.
+ * @return bool Success.
*/
public function resetSequence($table, $column) {
}
diff --git a/lib/Cake/Model/Model.php b/lib/Cake/Model/Model.php
index 254b31492..4b4b83d47 100644
--- a/lib/Cake/Model/Model.php
+++ b/lib/Cake/Model/Model.php
@@ -1636,13 +1636,13 @@ class Model extends Object implements CakeEventListener {
}
/**
- * Returns the contents of a single field given the supplied conditions, in the
- * supplied order.
+ * Returns the content of a single field given the supplied conditions,
+ * of the first record in the supplied order.
*
- * @param string $name Name of field to get
- * @param array $conditions SQL conditions (defaults to NULL)
- * @param string $order SQL ORDER BY fragment
- * @return string field contents, or false if not found
+ * @param string $name The name of the field to get.
+ * @param array $conditions SQL conditions (defaults to NULL).
+ * @param string $order SQL ORDER BY fragment.
+ * @return string|false Field content, or false if not found.
* @link http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#model-field
*/
public function field($name, $conditions = null, $order = null) {
diff --git a/lib/Cake/Network/CakeSocket.php b/lib/Cake/Network/CakeSocket.php
index aebdee191..74f2b60c0 100644
--- a/lib/Cake/Network/CakeSocket.php
+++ b/lib/Cake/Network/CakeSocket.php
@@ -134,6 +134,7 @@ class CakeSocket {
$scheme = $this->config['protocol'] . '://';
}
+ $this->_setSslContext($this->config['host']);
if (!empty($this->config['context'])) {
$context = stream_context_create($this->config['context']);
} else {
@@ -195,6 +196,45 @@ class CakeSocket {
return $this->connected;
}
+/**
+ * Configure the SSL context options.
+ *
+ * @param string $host The host name being connected to.
+ */
+ protected function _setSslContext($host) {
+ foreach ($this->config as $key => $value) {
+ if (substr($key, 0, 4) !== 'ssl_') {
+ continue;
+ }
+ $contextKey = substr($key, 4);
+ if (empty($this->config['context']['ssl'][$contextKey])) {
+ $this->config['context']['ssl'][$contextKey] = $value;
+ }
+ unset($this->config[$key]);
+ }
+ if (version_compare(PHP_VERSION, '5.3.2', '>=')) {
+ if (!isset($this->config['context']['ssl']['SNI_enabled'])) {
+ $this->config['context']['ssl']['SNI_enabled'] = true;
+ }
+ if (version_compare(PHP_VERSION, '5.6.0', '>=')) {
+ if (empty($this->config['context']['ssl']['peer_name'])) {
+ $this->config['context']['ssl']['peer_name'] = $host;
+ }
+ } else {
+ if (empty($this->config['context']['ssl']['SNI_server_name'])) {
+ $this->config['context']['ssl']['SNI_server_name'] = $host;
+ }
+ }
+ }
+ if (empty($this->config['context']['ssl']['cafile'])) {
+ $this->config['context']['ssl']['cafile'] = CAKE . 'Config' . DS . 'cacert.pem';
+ }
+ if (!empty($this->config['context']['ssl']['verify_host'])) {
+ $this->config['context']['ssl']['CN_match'] = $host;
+ }
+ unset($this->config['context']['ssl']['verify_host']);
+ }
+
/**
* socket_stream_client() does not populate errNum, or $errStr when there are
* connection errors, as in the case of SSL verification failure.
@@ -405,6 +445,4 @@ class CakeSocket {
$this->setLastError(null, $errorMessage);
throw new SocketException($errorMessage);
}
-
}
-
diff --git a/lib/Cake/Network/Email/SmtpTransport.php b/lib/Cake/Network/Email/SmtpTransport.php
index 73af32b46..f37dadf99 100644
--- a/lib/Cake/Network/Email/SmtpTransport.php
+++ b/lib/Cake/Network/Email/SmtpTransport.php
@@ -118,7 +118,8 @@ class SmtpTransport extends AbstractTransport {
'username' => null,
'password' => null,
'client' => null,
- 'tls' => false
+ 'tls' => false,
+ 'ssl_allow_self_signed' => false
);
$this->_config = array_merge($default, $this->_config, $config);
return $this->_config;
diff --git a/lib/Cake/Network/Http/HttpSocket.php b/lib/Cake/Network/Http/HttpSocket.php
index 0fdf4a12d..4c6c25675 100644
--- a/lib/Cake/Network/Http/HttpSocket.php
+++ b/lib/Cake/Network/Http/HttpSocket.php
@@ -72,7 +72,7 @@ class HttpSocket extends CakeSocket {
* Contain information about the last response (read only)
*
* @var array
- */
+*/
public $response = null;
/**
@@ -361,8 +361,6 @@ class HttpSocket extends CakeSocket {
return false;
}
- $this->_configContext($this->request['uri']['host']);
-
$this->request['raw'] = '';
if ($this->request['line'] !== false) {
$this->request['raw'] = $this->request['line'];
@@ -374,6 +372,8 @@ class HttpSocket extends CakeSocket {
$this->request['raw'] .= "\r\n";
$this->request['raw'] .= $this->request['body'];
+
+ // SSL context is set during the connect() method.
$this->write($this->request['raw']);
$response = null;
@@ -700,47 +700,6 @@ class HttpSocket extends CakeSocket {
return true;
}
-/**
- * Configure the socket's context. Adds in configuration
- * that can not be declared in the class definition.
- *
- * @param string $host The host you're connecting to.
- * @return void
- */
- protected function _configContext($host) {
- foreach ($this->config as $key => $value) {
- if (substr($key, 0, 4) !== 'ssl_') {
- continue;
- }
- $contextKey = substr($key, 4);
- if (empty($this->config['context']['ssl'][$contextKey])) {
- $this->config['context']['ssl'][$contextKey] = $value;
- }
- unset($this->config[$key]);
- }
- if (version_compare(PHP_VERSION, '5.3.2', '>=')) {
- if (!isset($this->config['context']['ssl']['SNI_enabled'])) {
- $this->config['context']['ssl']['SNI_enabled'] = true;
- }
- if (version_compare(PHP_VERSION, '5.6.0', '>=')) {
- if (empty($this->config['context']['ssl']['peer_name'])) {
- $this->config['context']['ssl']['peer_name'] = $host;
- }
- } else {
- if (empty($this->config['context']['ssl']['SNI_server_name'])) {
- $this->config['context']['ssl']['SNI_server_name'] = $host;
- }
- }
- }
- if (empty($this->config['context']['ssl']['cafile'])) {
- $this->config['context']['ssl']['cafile'] = CAKE . 'Config' . DS . 'cacert.pem';
- }
- if (!empty($this->config['context']['ssl']['verify_host'])) {
- $this->config['context']['ssl']['CN_match'] = $host;
- }
- unset($this->config['context']['ssl']['verify_host']);
- }
-
/**
* Takes a $uri array and turns it into a fully qualified URL string
*
diff --git a/lib/Cake/Routing/Router.php b/lib/Cake/Routing/Router.php
index cfc9bbd1c..5575fb6f0 100644
--- a/lib/Cake/Routing/Router.php
+++ b/lib/Cake/Routing/Router.php
@@ -207,8 +207,8 @@ class Router {
/**
* Set the default route class to use or return the current one
*
- * @param string $routeClass to set as default
- * @return mixed void|string
+ * @param string $routeClass The route class to set as default.
+ * @return string|null The default route class.
* @throws RouterException
*/
public static function defaultRouteClass($routeClass = null) {
diff --git a/lib/Cake/Test/Case/Network/CakeSocketTest.php b/lib/Cake/Test/Case/Network/CakeSocketTest.php
index 1d095e8da..d68774fe0 100644
--- a/lib/Cake/Test/Case/Network/CakeSocketTest.php
+++ b/lib/Cake/Test/Case/Network/CakeSocketTest.php
@@ -367,7 +367,37 @@ class CakeSocketTest extends CakeTestCase {
$this->Socket = new CakeSocket($config);
$this->Socket->connect();
$result = $this->Socket->context();
- $this->assertEquals($config['context'], $result);
+ $this->assertSame($config['context']['ssl']['capture_peer'], $result['ssl']['capture_peer']);
}
+/**
+ * test configuring the context from the flat keys.
+ *
+ * @return void
+ */
+ public function testConfigContext() {
+ $this->skipIf(!extension_loaded('openssl'), 'OpenSSL is not enabled cannot test SSL.');
+ $config = array(
+ 'host' => 'smtp.gmail.com',
+ 'port' => 465,
+ 'timeout' => 5,
+ 'ssl_verify_peer' => true,
+ 'ssl_allow_self_signed' => false,
+ 'ssl_verify_depth' => 5,
+ 'ssl_verify_host' => true,
+ );
+ $this->Socket = new CakeSocket($config);
+
+ $this->Socket->connect();
+ $result = $this->Socket->context();
+
+ $this->assertTrue($result['ssl']['verify_peer']);
+ $this->assertFalse($result['ssl']['allow_self_signed']);
+ $this->assertEquals(5, $result['ssl']['verify_depth']);
+ $this->assertEquals('smtp.gmail.com', $result['ssl']['CN_match']);
+ $this->assertArrayNotHasKey('ssl_verify_peer', $this->Socket->config);
+ $this->assertArrayNotHasKey('ssl_allow_self_signed', $this->Socket->config);
+ $this->assertArrayNotHasKey('ssl_verify_host', $this->Socket->config);
+ $this->assertArrayNotHasKey('ssl_verify_depth', $this->Socket->config);
+ }
}
diff --git a/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php b/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php
index a86412ce6..d27f2f709 100644
--- a/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php
+++ b/lib/Cake/Test/Case/Network/Email/CakeEmailTest.php
@@ -946,7 +946,8 @@ class CakeEmailTest extends CakeTestCase {
'username' => null,
'password' => null,
'client' => null,
- 'tls' => false
+ 'tls' => false,
+ 'ssl_allow_self_signed' => false
);
$this->assertEquals($expected, $this->CakeEmail->transportClass()->config());
diff --git a/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php b/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
index 318e43401..559980494 100644
--- a/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
+++ b/lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
@@ -314,23 +314,6 @@ class HttpSocketTest extends CakeTestCase {
$response = $this->Socket->request(true);
$this->assertFalse($response);
- $context = array(
- 'ssl' => array(
- 'verify_peer' => true,
- 'allow_self_signed' => false,
- 'verify_depth' => 5,
- 'SNI_enabled' => true,
- 'CN_match' => 'www.cakephp.org',
- 'cafile' => CAKE . 'Config' . DS . 'cacert.pem'
- )
- );
-
- if (version_compare(PHP_VERSION, '5.6.0', '>=')) {
- $context['ssl']['peer_name'] = 'www.cakephp.org';
- } else {
- $context['ssl']['SNI_server_name'] = 'www.cakephp.org';
- }
-
$tests = array(
array(
'request' => 'http://www.cakephp.org/?foo=bar',
@@ -341,7 +324,10 @@ class HttpSocketTest extends CakeTestCase {
'protocol' => 'tcp',
'port' => 80,
'timeout' => 30,
- 'context' => $context,
+ 'ssl_verify_peer' => true,
+ 'ssl_allow_self_signed' => false,
+ 'ssl_verify_depth' => 5,
+ 'ssl_verify_host' => true,
'request' => array(
'uri' => array(
'scheme' => 'http',
@@ -1843,27 +1829,6 @@ class HttpSocketTest extends CakeTestCase {
$this->assertEquals(true, $return);
}
-/**
- * test configuring the context from the flat keys.
- *
- * @return void
- */
- public function testConfigContext() {
- $this->Socket->expects($this->any())
- ->method('read')->will($this->returnValue(false));
-
- $this->Socket->reset();
- $this->Socket->request('http://example.com');
- $this->assertTrue($this->Socket->config['context']['ssl']['verify_peer']);
- $this->assertFalse($this->Socket->config['context']['ssl']['allow_self_signed']);
- $this->assertEquals(5, $this->Socket->config['context']['ssl']['verify_depth']);
- $this->assertEquals('example.com', $this->Socket->config['context']['ssl']['CN_match']);
- $this->assertArrayNotHasKey('ssl_verify_peer', $this->Socket->config);
- $this->assertArrayNotHasKey('ssl_allow_self_signed', $this->Socket->config);
- $this->assertArrayNotHasKey('ssl_verify_host', $this->Socket->config);
- $this->assertArrayNotHasKey('ssl_verify_depth', $this->Socket->config);
- }
-
/**
* Test that requests fail when peer verification fails.
*
diff --git a/lib/Cake/Test/Case/View/Helper/FormHelperTest.php b/lib/Cake/Test/Case/View/Helper/FormHelperTest.php
index 1058bc72f..535396b6b 100644
--- a/lib/Cake/Test/Case/View/Helper/FormHelperTest.php
+++ b/lib/Cake/Test/Case/View/Helper/FormHelperTest.php
@@ -353,6 +353,7 @@ class ValidateUser extends CakeTestModel {
'email' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'),
'balance' => array('type' => 'float', 'null' => false, 'length' => '5,2'),
'cost_decimal' => array('type' => 'decimal', 'null' => false, 'length' => '6,3'),
+ 'null_decimal' => array('type' => 'decimal', 'null' => false, 'length' => null),
'ratio' => array('type' => 'decimal', 'null' => false, 'length' => '10,6'),
'population' => array('type' => 'decimal', 'null' => false, 'length' => '15,0'),
'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''),
@@ -2045,6 +2046,17 @@ class FormHelperTest extends CakeTestCase {
);
$this->assertTags($result, $expected);
+ $result = $this->Form->input('ValidateUser.null_decimal');
+ $expected = array(
+ 'div' => array('class'),
+ 'label' => array('for'),
+ 'Null Decimal',
+ '/label',
+ 'input' => array('name', 'type' => 'number', 'step' => 'any', 'id'),
+ '/div',
+ );
+ $this->assertTags($result, $expected);
+
$result = $this->Form->input('ValidateUser.ratio');
$expected = array(
'div' => array('class'),
diff --git a/lib/Cake/Test/Case/View/Helper/PaginatorHelperTest.php b/lib/Cake/Test/Case/View/Helper/PaginatorHelperTest.php
index cb271c6b0..f536ed596 100644
--- a/lib/Cake/Test/Case/View/Helper/PaginatorHelperTest.php
+++ b/lib/Cake/Test/Case/View/Helper/PaginatorHelperTest.php
@@ -2927,4 +2927,29 @@ class PaginatorHelperTest extends CakeTestCase {
$this->assertSame($expected, $result);
}
+/**
+ * Verify that meta() uses URL options
+ *
+ * @return void
+ */
+ public function testMetaPageUrlOptions() {
+ $this->Paginator->options(array(
+ 'url' => array('?' => array('a' => 'b'))
+ ));
+ $this->Paginator->request['paging'] = array(
+ 'Article' => array(
+ 'page' => 5,
+ 'prevPage' => true,
+ 'nextPage' => true,
+ 'pageCount' => 10,
+ 'options' => array(),
+ 'paramType' => 'querystring'
+ )
+ );
+ $expected = '';
+ $expected .= '';
+ $result = $this->Paginator->meta();
+ $this->assertSame($expected, $result);
+ }
+
}
diff --git a/lib/Cake/TestSuite/Reporter/CakeHtmlReporter.php b/lib/Cake/TestSuite/Reporter/CakeHtmlReporter.php
index d877d556f..3e68005f3 100644
--- a/lib/Cake/TestSuite/Reporter/CakeHtmlReporter.php
+++ b/lib/Cake/TestSuite/Reporter/CakeHtmlReporter.php
@@ -58,7 +58,7 @@ class CakeHtmlReporter extends CakeBaseReporter {
*/
public function paintDocumentStart() {
ob_start();
- $this->params['baseDir'];
+ $baseDir = $this->params['baseDir'];
include CAKE . 'TestSuite' . DS . 'templates' . DS . 'header.php';
}
@@ -69,7 +69,7 @@ class CakeHtmlReporter extends CakeBaseReporter {
* @return void
*/
public function paintTestMenu() {
- $this->baseUrl() . '?show=cases';
+ $cases = $this->baseUrl() . '?show=cases';
$plugins = App::objects('plugin', null, false);
sort($plugins);
include CAKE . 'TestSuite' . DS . 'templates' . DS . 'menu.php';
diff --git a/lib/Cake/View/Helper/FormHelper.php b/lib/Cake/View/Helper/FormHelper.php
index 4f56e515b..3d1860688 100644
--- a/lib/Cake/View/Helper/FormHelper.php
+++ b/lib/Cake/View/Helper/FormHelper.php
@@ -1209,10 +1209,10 @@ class FormHelper extends AppHelper {
if ($options['type'] === 'number' &&
!isset($options['step'])
) {
- if ($type === 'decimal') {
+ if ($type === 'decimal' && isset($fieldDef['length'])) {
$decimalPlaces = substr($fieldDef['length'], strpos($fieldDef['length'], ',') + 1);
$options['step'] = sprintf('%.' . $decimalPlaces . 'F', pow(10, -1 * $decimalPlaces));
- } elseif ($type === 'float') {
+ } elseif ($type === 'float' || $type === 'decimal') {
$options['step'] = 'any';
}
}
diff --git a/lib/Cake/View/Helper/PaginatorHelper.php b/lib/Cake/View/Helper/PaginatorHelper.php
index f5e3e72f2..488a27166 100644
--- a/lib/Cake/View/Helper/PaginatorHelper.php
+++ b/lib/Cake/View/Helper/PaginatorHelper.php
@@ -980,25 +980,26 @@ class PaginatorHelper extends AppHelper {
* ### Options:
*
* - `model` The model to use defaults to PaginatorHelper::defaultModel()
- * - `block` The block name to append the output to, or false/absenst to return as a string
+ * - `block` The block name to append the output to, or false/absent to return as a string
*
- * @param array $options Array of options
- * @return string|void Meta links
+ * @param array $options Array of options.
+ * @return string|null Meta links.
*/
public function meta($options = array()) {
$model = isset($options['model']) ? $options['model'] : null;
$params = $this->params($model);
+ $urlOptions = isset($this->options['url']) ? $this->options['url'] : array();
$links = array();
if ($this->hasPrev()) {
$links[] = $this->Html->meta(array(
'rel' => 'prev',
- 'link' => $this->url(array('page' => $params['page'] - 1), true)
+ 'link' => $this->url(array_merge($urlOptions, array('page' => $params['page'] - 1)), true)
));
}
if ($this->hasNext()) {
$links[] = $this->Html->meta(array(
'rel' => 'next',
- 'link' => $this->url(array('page' => $params['page'] + 1), true)
+ 'link' => $this->url(array_merge($urlOptions, array('page' => $params['page'] + 1)), true)
));
}
$out = implode($links);