]> source.dussan.org Git - nextcloud-server.git/commitdiff
Read from IRequest instead of reading twice
authorLukas Reschke <lukas@owncloud.com>
Fri, 27 Feb 2015 12:05:57 +0000 (13:05 +0100)
committerLukas Reschke <lukas@owncloud.com>
Fri, 27 Feb 2015 13:22:35 +0000 (14:22 +0100)
Potentially fixes https://github.com/owncloud/core/issues/14541 and https://github.com/owncloud/core/issues/14506

lib/private/api.php
lib/private/ocs.php
lib/private/server.php
tests/lib/templatelayout.php [deleted file]

index c58d262068414c334e46cb141fb64529d4ba72cb..804d934684270d035c275fbacc813e58c56ff306 100644 (file)
@@ -84,11 +84,13 @@ class OC_API {
         * @param array $parameters
         */
        public static function call($parameters) {
+               $request = \OC::$server->getRequest();
+
                // Prepare the request variables
-               if($_SERVER['REQUEST_METHOD'] == 'PUT') {
-                       parse_str(file_get_contents("php://input"), $parameters['_put']);
-               } else if($_SERVER['REQUEST_METHOD'] == 'DELETE') {
-                       parse_str(file_get_contents("php://input"), $parameters['_delete']);
+               if($request->getMethod() === 'PUT') {
+                       $parameters['_put'] = $request->getParams();
+               } else if($request->getMethod() === 'DELETE') {
+                       $parameters['_delete'] = $request->getParams();
                }
                $name = $parameters['_route'];
                // Foreach registered action
index bbe642a247d29e8e49a8e64f9abc6cddd1cd8e3b..d43811e339b9ec9f843f7508a21f9ce1d030e03d 100644 (file)
@@ -76,7 +76,6 @@ class OC_OCS {
                        $method='get';
                }elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
                        $method='put';
-                       parse_str(file_get_contents("php://input"), $put_vars);
                }elseif($_SERVER['REQUEST_METHOD'] == 'POST') {
                        $method='post';
                }else{
index a16854d628858f7fb5530fa59c3f2e7985d63f7f..18d996537e295d42b531fca0b4d7aa50175e6209 100644 (file)
@@ -268,6 +268,46 @@ class Server extends SimpleContainer implements IServerContainer {
                $this->registerService('TrustedDomainHelper', function ($c) {
                        return new TrustedDomainHelper($this->getConfig());
                });
+               $this->registerService('Request', function ($c) {
+                       if (isset($this['urlParams'])) {
+                               $urlParams = $this['urlParams'];
+                       } else {
+                               $urlParams = [];
+                       }
+
+                       if ($this->getSession()->exists('requesttoken')) {
+                               $requestToken = $this->getSession()->get('requesttoken');
+                       } else {
+                               $requestToken = false;
+                       }
+
+                       if (defined('PHPUNIT_RUN') && PHPUNIT_RUN
+                               && in_array('fakeinput', stream_get_wrappers())
+                       ) {
+                               $stream = 'fakeinput://data';
+                       } else {
+                               $stream = 'php://input';
+                       }
+
+                       return new Request(
+                               [
+                                       'get' => $_GET,
+                                       'post' => $_POST,
+                                       'files' => $_FILES,
+                                       'server' => $_SERVER,
+                                       'env' => $_ENV,
+                                       'cookies' => $_COOKIE,
+                                       'method' => (isset($_SERVER) && isset($_SERVER['REQUEST_METHOD']))
+                                               ? $_SERVER['REQUEST_METHOD']
+                                               : null,
+                                       'urlParams' => $urlParams,
+                                       'requesttoken' => $requestToken,
+                               ],
+                               $this->getSecureRandom(),
+                               $this->getConfig(),
+                               $stream
+                       );
+               });
        }
 
        /**
@@ -282,54 +322,10 @@ class Server extends SimpleContainer implements IServerContainer {
         * currently being processed is returned from this method.
         * In case the current execution was not initiated by a web request null is returned
         *
-        * FIXME: This should be queried as well. However, due to our totally awesome
-        * static code a lot of tests do stuff like $_SERVER['foo'] which obviously
-        * will not work with that approach. We even have some integration tests in our
-        * unit tests which setup a complete webserver. Once the code is all non-static
-        * or we don't have such mixed integration/unit tests setup anymore this can
-        * get moved out again.
-        *
         * @return \OCP\IRequest|null
         */
        function getRequest() {
-               if (isset($this['urlParams'])) {
-                       $urlParams = $this['urlParams'];
-               } else {
-                       $urlParams = array();
-               }
-
-               if ($this->getSession()->exists('requesttoken')) {
-                       $requestToken = $this->getSession()->get('requesttoken');
-               } else {
-                       $requestToken = false;
-               }
-
-               if (defined('PHPUNIT_RUN') && PHPUNIT_RUN
-                       && in_array('fakeinput', stream_get_wrappers())
-               ) {
-                       $stream = 'fakeinput://data';
-               } else {
-                       $stream = 'php://input';
-               }
-
-               return new Request(
-                       [
-                               'get' => $_GET,
-                               'post' => $_POST,
-                               'files' => $_FILES,
-                               'server' => $_SERVER,
-                               'env' => $_ENV,
-                               'cookies' => $_COOKIE,
-                               'method' => (isset($_SERVER) && isset($_SERVER['REQUEST_METHOD']))
-                                       ? $_SERVER['REQUEST_METHOD']
-                                       : null,
-                               'urlParams' => $urlParams,
-                               'requesttoken' => $requestToken,
-                       ],
-                       $this->getSecureRandom(),
-                       $this->getConfig(),
-                       $stream
-               );
+               return $this->query('Request');
        }
 
        /**
diff --git a/tests/lib/templatelayout.php b/tests/lib/templatelayout.php
deleted file mode 100644 (file)
index c23aaa9..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/**
- * Copyright (c) 2014 Lukas Reschke <lukas@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-namespace OC\Test;
-
-/**
- * @package OC\Test
- */
-class OC_TemplateLayout extends \Test\TestCase {
-
-       private $oldServerURI;
-       private $oldScriptName;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->oldServerURI = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null;
-               $this->oldScriptName = $_SERVER['SCRIPT_NAME'];
-       }
-
-       protected function tearDown() {
-               if ($this->oldServerURI === null) {
-                       unset($_SERVER['REQUEST_URI']);
-               } else {
-                       $_SERVER['REQUEST_URI'] = $this->oldServerURI;
-               }
-               $_SERVER['SCRIPT_NAME'] = $this->oldScriptName;
-
-               parent::tearDown();
-       }
-
-       /**
-        * Contains valid file paths in the scheme array($absolutePath, $expectedPath)
-        * @return array
-        */
-       public function validFilePathProvider() {
-               return array(
-                       array(\OC::$SERVERROOT . '/apps/files/js/fancyJS.js', '/apps/files/js/fancyJS.js'),
-                       array(\OC::$SERVERROOT. '/test.js', '/test.js'),
-                       array(\OC::$SERVERROOT . '/core/test.js', '/core/test.js'),
-                       array(\OC::$SERVERROOT, ''),
-               );
-       }
-
-       /**
-        * @dataProvider validFilePathProvider
-        */
-       public function testConvertToRelativePath($absolutePath, $expected) {
-               $_SERVER['REQUEST_URI'] = $expected;
-               $_SERVER['SCRIPT_NAME'] = $expected;
-
-               $relativePath = \Test_Helper::invokePrivate(new \OC_TemplateLayout('user'), 'convertToRelativePath', array($absolutePath));
-               $this->assertEquals($expected, $relativePath);
-       }
-
-       /**
-        * @expectedException \Exception
-        * @expectedExceptionMessage $filePath is not under the \OC::$SERVERROOT
-        */
-       public function testInvalidConvertToRelativePath() {
-               $invalidFile = '/this/file/is/invalid';
-               $_SERVER['REQUEST_URI'] = $invalidFile;
-               $_SERVER['SCRIPT_NAME'] = '/';
-
-               \Test_Helper::invokePrivate(new \OC_TemplateLayout('user'), 'convertToRelativePath', array($invalidFile));
-       }
-}