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);