]> source.dussan.org Git - nextcloud-server.git/commitdiff
Check if open_basedir is set
authorLukas Reschke <lukas@owncloud.com>
Fri, 5 Dec 2014 18:57:06 +0000 (19:57 +0100)
committerMorris Jobke <hey@morrisjobke.de>
Wed, 10 Dec 2014 23:09:55 +0000 (00:09 +0100)
The file:// protocol does not work with curl when an open_basedir is set.

This fixes https://github.com/owncloud/core/issues/12016

core/setup/controller.php
lib/base.php
lib/private/largefilehelper.php
lib/private/server.php
tests/lib/largefilehelpergetfilesize.php

index 5a52b18f73b00fb9e050cf2c082af2e89ff0fb96..ab4c351b1a084bd38053736bc0dcf18e7474d3b9 100644 (file)
@@ -9,13 +9,21 @@
 
 namespace OC\Core\Setup;
 
+use bantu\IniGetWrapper\IniGetWrapper;
 use OCP\IConfig;
+use OCP\IL10N;
 
 class Controller {
        /**
         * @var \OCP\IConfig
         */
        protected $config;
+       /** @var IniGetWrapper */
+       protected $iniWrapper;
+       /** @var IL10N */
+       protected $l10n;
+       /** @var \OC_Defaults */
+       protected $defaults;
 
        /**
         * @var string
@@ -24,12 +32,24 @@ class Controller {
 
        /**
         * @param IConfig $config
+        * @param IniGetWrapper $iniWrapper
+        * @param IL10N $l10n
+        * @param \OC_Defaults $defaults
         */
-       function __construct(IConfig $config) {
+       function __construct(IConfig $config,
+                                                IniGetWrapper $iniWrapper,
+                                                IL10N $l10n,
+                                                \OC_Defaults $defaults) {
                $this->autoConfigFile = \OC::$SERVERROOT.'/config/autoconfig.php';
                $this->config = $config;
+               $this->iniWrapper = $iniWrapper;
+               $this->l10n = $l10n;
+               $this->defaults = $defaults;
        }
 
+       /**
+        * @param $post
+        */
        public function run($post) {
                // Check for autosetup:
                $post = $this->loadAutoConfig($post);
@@ -138,16 +158,36 @@ class Controller {
                        }
                }
 
+
                if (\OC_Util::runningOnMac()) {
-                       $l10n = \OC::$server->getL10N('core');
-                       $theme = new \OC_Defaults();
                        $errors[] = array(
-                               'error' => $l10n->t(
+                               'error' => $this->l10n->t(
                                        'Mac OS X is not supported and %s will not work properly on this platform. ' .
                                        'Use it at your own risk! ',
-                                       $theme->getName()
+                                       $this->defaults->getName()
+                               ),
+                               'hint' => $this->l10n->t('For the best results, please consider using a GNU/Linux server instead.')
+                       );
+               }
+
+               if($this->iniWrapper->getString('open_basedir') !== '' && PHP_INT_SIZE === 4) {
+                       $errors[] = array(
+                               'error' => $this->l10n->t(
+                                       'It seems that this %s instance is running on a 32bit PHP environment and the open_basedir has been configured in php.ini. ' .
+                                       'This will lead to problems with files over 4GB and is highly discouraged.',
+                                       $this->defaults->getName()
+                               ),
+                               'hint' => $this->l10n->t('Please remove the open_basedir setting within your php.ini or switch to  64bit PHP.')
+                       );
+               }
+               if(!function_exists('curl_init') && PHP_INT_SIZE === 4) {
+                       $errors[] = array(
+                               'error' => $this->l10n->t(
+                                       'It seems that this %s instance is running on a 32bit PHP environment and cURL is not installed. ' .
+                                       'This will lead to problems with files over 4GB and is highly discouraged.',
+                                       $this->defaults->getName()
                                ),
-                               'hint' => $l10n->t('For the best results, please consider using a GNU/Linux server instead.')
+                               'hint' => $this->l10n->t('Please install the cURL extension and restart your webserver.')
                        );
                }
 
index af2474c7d763fa8f047f3eda74d5084fe9e49e72..f2ff3bb48491e7f6280ebdb0fcc502bbfbd507a8 100644 (file)
@@ -717,7 +717,7 @@ class OC {
                // Check if ownCloud is installed or in maintenance (update) mode
                if (!$systemConfig->getValue('installed', false)) {
                        \OC::$server->getSession()->clear();
-                       $controller = new OC\Core\Setup\Controller(\OC::$server->getConfig());
+                       $controller = new OC\Core\Setup\Controller(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('core'), new \OC_Defaults());
                        $controller->run($_POST);
                        exit();
                }
index 750ba1d23de9a2ae26eb3f3f8e33a00d08b74abc..b6a8c536e9bbf000e2e752c93122a52292f83df7 100644 (file)
@@ -100,7 +100,7 @@ class LargeFileHelper {
        *                        null on failure.
        */
        public function getFileSizeViaCurl($filename) {
-               if (function_exists('curl_init')) {
+               if (function_exists('curl_init') && \OC::$server->getIniWrapper()->getString('open_basedir') === '') {
                        $fencoded = rawurlencode($filename);
                        $ch = curl_init("file://$fencoded");
                        curl_setopt($ch, CURLOPT_NOBODY, true);
index c0606fc4fe6e751351ea85aee63682d01b51d10b..4107a0eeec8ef3d5803d9eee905a15d815f57190 100644 (file)
@@ -286,7 +286,7 @@ class Server extends SimpleContainer implements IServerContainer {
                        return new \OC\Files\Config\MountProviderCollection($loader);
                });
                $this->registerService('IniWrapper', function ($c) {
-                                               return new IniGetWrapper();
+                       return new IniGetWrapper();
                });
        }
 
@@ -730,9 +730,9 @@ class Server extends SimpleContainer implements IServerContainer {
        /**
         * Get the IniWrapper
         *
-        * @return \bantu\IniGetWrapper\IniGetWrapper
+        * @return IniGetWrapper
         */
        public function getIniWrapper() {
-                       return $this->query('IniWrapper');
+               return $this->query('IniWrapper');
        }
 }
index c97b7b32b0faae8cba3904f78fdc6e7bd33e3f7f..57bc23819668baf106e4935ff2b82f1d8dbe6955 100644 (file)
@@ -13,6 +13,10 @@ namespace Test;
 * Large files are not considered yet.
 */
 class LargeFileHelperGetFileSize extends TestCase {
+       /** @var string */
+       protected $filename;
+       /** @var int */
+       protected $fileSize;
        /** @var \OC\LargeFileHelper */
        protected $helper;
 
@@ -41,6 +45,11 @@ class LargeFileHelperGetFileSize extends TestCase {
                                'The PHP curl extension is required for this test.'
                        );
                }
+               if (\OC::$server->getIniWrapper()->getString('open_basedir') !== '') {
+                       $this->markTestSkipped(
+                               'The PHP curl extension does not work with the file:// protocol when open_basedir is enabled.'
+                       );
+               }
                $this->assertSame(
                        $fileSize,
                        $this->helper->getFileSizeViaCurl($filename)